diff --git a/plugins/CoreHome/Columns/UserId.php b/plugins/CoreHome/Columns/UserId.php index 55fea6b5173fe6345efde2730c5510a5268eeabe..d4c438c47a35ab0c0a4d39a0bf02307348362b21 100644 --- a/plugins/CoreHome/Columns/UserId.php +++ b/plugins/CoreHome/Columns/UserId.php @@ -8,7 +8,12 @@ */ namespace Piwik\Plugins\CoreHome\Columns; +use Piwik\Cache; +use Piwik\DataTable; +use Piwik\DataTable\Map; +use Piwik\Period\Range; use Piwik\Plugin\Dimension\VisitDimension; +use Piwik\Plugins\VisitsSummary\API as VisitsSummaryApi; use Piwik\Tracker\Request; use Piwik\Tracker\Visitor; use Piwik\Tracker\Action; @@ -51,4 +56,63 @@ class UserId extends VisitDimension return $request->getForcedUserId(); } + public function isUsedInAtLeastOneSite($idSites, $period, $date) + { + if ($period === 'day' || $period === 'week') { + $period = 'month'; + } + + if ($period === 'range') { + $period = 'day'; + } + + foreach ($idSites as $idSite) { + if ($this->isUsedInSiteCached($idSite, $period, $date)) { + return true; + } + } + + return false; + } + + private function isUsedInSiteCached($idSite, $period, $date) + { + $cache = Cache::getTransientCache(); + $key = sprintf('%d.%s.%s', $idSite, $period, $date); + + if (!$cache->contains($key)) { + $result = $this->isUsedInSite($idSite, $period, $date); + $cache->save($key, $result); + } + + return $cache->fetch($key); + } + + private function isUsedInSite($idSite, $period, $date) + { + $result = VisitsSummaryApi::getInstance()->get($idSite, $period, $date, false, 'nb_users'); + + return $this->hasDataTableUsers($result); + } + + public function hasDataTableUsers(DataTable\DataTableInterface $result) + { + if ($result instanceof Map) { + foreach ($result->getDataTables() as $table) { + if ($this->hasDataTableUsers($table)) { + return true; + } + } + } + + if (!$result->getRowsCount()) { + return false; + } + + $numUsers = $result->getColumn('nb_users'); + $numUsers = array_sum($numUsers); + + return !empty($numUsers); + } + } \ No newline at end of file diff --git a/plugins/CoreHome/tests/Integration/Column/UserIdTest.php b/plugins/CoreHome/tests/Integration/Column/UserIdTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f2ca415b5a70414665922c6d999047682e2e0753 --- /dev/null +++ b/plugins/CoreHome/tests/Integration/Column/UserIdTest.php @@ -0,0 +1,263 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\CoreHome\tests\Integration\Column; + +use Piwik\Access; +use Piwik\Cache; +use Piwik\DataAccess\ArchiveTableCreator; +use Piwik\Db; +use Piwik\Plugins\CoreHome\Columns\UserId; +use Piwik\Tests\Framework\Fixture; +use Piwik\Tests\Framework\Mock\FakeAccess; +use Piwik\Tests\Framework\TestCase\IntegrationTestCase; +use Piwik\DataTable; + +/** + * @group CoreHome + * @group UserIdTest + * @group Plugins + * @group Column + */ +class UserIdTest extends IntegrationTestCase +{ + /** + * @var UserId + */ + private $userId; + + protected $date = '2014-04-04'; + + public function setUp() + { + parent::setUp(); + $this->userId = new UserId(); + + $this->setSuperUser(); + + Fixture::createSuperUser(); + Fixture::createWebsite('2014-01-01 00:00:00'); + Fixture::createWebsite('2014-01-01 00:00:00'); + } + + public function tearDown() + { + // clean up your test here if needed + $tables = ArchiveTableCreator::getTablesArchivesInstalled(); + if (!empty($tables)) { + Db::dropTables($tables); + } + parent::tearDown(); + } + + public function test_isUsedInAtLeastOneSite_shouldReturnFalseByDefault_WhenNothingIsTracked() + { + $this->assertNotUsedInAtLeastOneSite($idSites = array(1), 'day', $this->date); + } + + public function test_isUsedInAtLeastOneSite_shouldCache() + { + $key = '1.month.' . $this->date; + $cache = Cache::getTransientCache(); + $this->assertFalse($cache->contains($key)); + + $this->userId->isUsedInAtLeastOneSite($idSites = array(1), 'day', $this->date); + + $this->assertTrue($cache->contains($key)); + $this->assertFalse($cache->fetch($key)); + } + + public function test_isUsedInAtLeastOneSite_shouldDetectUserIdWasUsedInAllSites_WhenOneSiteGiven() + { + $this->trackPageviewsWithUsers(); + + $this->assertUsedInAtLeastOneSite($idSites = array(1), 'day', $this->date); + } + + public function test_isUsedInAtLeastOneSite_shouldDetectUserIdWasUsedInAtLeastOneSite_WhenMultipleSitesGiven() + { + $this->trackPageviewsWithUsers(); + + $this->assertUsedInAtLeastOneSite($idSites = array(1,2), 'day', $this->date); + } + + public function test_isUsedInAtLeastOneSite_shouldDetectUserIdWasNotUsedInAtLeastOneSite_WhenMultipleSitesGiven() + { + $this->trackPageviewsWithoutUsers(); + + $this->assertNotUsedInAtLeastOneSite($idSites = array(1,2), 'day', $this->date); + } + + public function test_isUsedInAtLeastOneSite_shouldDetectUserIdWasNotUsed_WhenOneSiteGiven() + { + $this->trackPageviewsWithUsers(); + + $this->assertNotUsedInAtLeastOneSite($idSites = array(2), 'day', $this->date); + } + + public function test_isUsedInAtLeastOneSite_shouldDefaultToMonthPeriodAndDetectUserIdIsUsedAlthoughNotTodayButYesterday() + { + $this->trackPageviewsWithUsers(); + + $this->assertUsedInAtLeastOneSite($idSites = array(1), 'day', '2014-04-03'); + } + + public function test_isUsedInAtLeastOneSite_shouldDefaultToMonthPeriodAndDetectUserIdIsUsedAlthoughNotTodayButTomorrow() + { + $this->trackPageviewsWithUsers(); + + $this->assertUsedInAtLeastOneSite($idSites = array(1), 'day', '2014-04-05'); + } + + public function test_isUsedInAtLeastOneSite_shouldDetectItWasNotUsedInMarchAlthoughItWasUsedInApril() + { + $this->trackPageviewsWithUsers(); + + $this->assertNotUsedInAtLeastOneSite($idSites = array(1), 'day', '2014-03-04'); + } + + public function test_isUsedInAtLeastOneSite_shouldDetectItCorrectWithRangeDates() + { + $this->trackPageviewsWithUsers(); + + $this->assertUsedInAtLeastOneSite($idSites = array(1), 'range', '2014-04-01,2014-05-05'); + + // not used in that range date + $this->assertNotUsedInAtLeastOneSite($idSites = array(1), 'range', '2014-04-01,2014-04-03'); + } + + public function test_hasDataTableUsers_shouldReturnFalse_IfEmptyTablesAreGiven() + { + $this->assertNotDataTableHasUsers(new DataTable\Map()); + $this->assertNotDataTableHasUsers(new DataTable()); + } + + public function test_hasDataTableUsers_shouldHandleADataTableMap() + { + $map = new DataTable\Map(); + $map->addTable(new DataTable(), 'label1'); + $map->addTable(new DataTable(), 'label2'); + $map->addTable($this->getDataTableWithoutUsersColumn(), 'label3'); + + $this->assertNotDataTableHasUsers($map); + + $map->addTable($this->getDataTableWithZeroUsers(), 'label4'); + $map->addTable(new DataTable(), 'label5'); + + $this->assertNotDataTableHasUsers($map); + + $map->addTable($this->getDataTableWithUsers(), 'label6'); + + $this->assertDataTableHasUsers($map); + } + + public function test_hasDataTableUsers_shouldHandleADataTable() + { + $this->assertNotDataTableHasUsers($this->getDataTableWithoutUsersColumn()); + $this->assertNotDataTableHasUsers($this->getDataTableWithZeroUsers()); + $this->assertDataTableHasUsers($this->getDataTableWithUsers()); + } + + private function getDataTableWithoutUsersColumn() + { + $tableWithoutUsers = new DataTable(); + $tableWithoutUsers->addRowFromSimpleArray(array('label' => 'test', 'nb_visits' => 0)); + + return $tableWithoutUsers; + } + + private function getDataTableWithZeroUsers() + { + $tableWithZeroUsers = new DataTable(); + $tableWithZeroUsers->addRowFromSimpleArray(array('label' => 'test', 'nb_users' => 0)); + + return $tableWithZeroUsers; + } + + private function getDataTableWithUsers() + { + $tableWithUsers = new DataTable(); + $tableWithUsers->addRowFromSimpleArray(array('label' => 'test', 'nb_users' => 10)); + + return $tableWithUsers; + } + + private function assertNotDataTableHasUsers($table) + { + $has = $this->userId->hasDataTableUsers($table); + $this->assertFalse($has); + } + + private function assertDataTableHasUsers($table) + { + $has = $this->userId->hasDataTableUsers($table); + $this->assertTrue($has); + } + + private function assertUsedInAtLeastOneSite($idSites, $period, $date) + { + $result = $this->userId->isUsedInAtLeastOneSite($idSites, $period, $date); + + $this->assertTrue($result); + } + + private function assertNotUsedInAtLeastOneSite($idSites, $period, $date) + { + $result = $this->userId->isUsedInAtLeastOneSite($idSites, $period, $date); + + $this->assertFalse($result); + } + + private function trackPageviewsWithUsers() + { + $this->trackPageviewsWithDifferentUsers(array('user1', false, 'user3')); + } + + private function trackPageviewsWithoutUsers() + { + $this->trackPageviewsWithDifferentUsers(array(false, false, false)); + } + + private function trackPageviewsWithDifferentUsers($userIds) + { + $tracker = $this->getTracker(); + + foreach ($userIds as $index => $userId) { + $tracker->setForceNewVisit(); + $this->trackPageview($tracker, $userId, '/index/' . $index . '.html'); + } + } + + private function trackPageview(\PiwikTracker $tracker, $userId, $url = null) + { + if (null !== $url) { + $tracker->setUrl('http://www.example.org' . $url); + } + + $tracker->setUserId($userId); + + $title = $url ? : 'test'; + + $tracker->doTrackPageView($title); + } + + private function getTracker() + { + $tracker = Fixture::getTracker(1, $this->date . ' 00:01:01', true, true); + $tracker->setTokenAuth(Fixture::getTokenAuth()); + return $tracker; + } + + private function setSuperUser() + { + $pseudoMockAccess = new FakeAccess(); + $pseudoMockAccess::setSuperUserAccess(true); + Access::setSingletonInstance($pseudoMockAccess); + } + +} diff --git a/plugins/ScheduledReports/API.php b/plugins/ScheduledReports/API.php index 123cdc9223dc94401491531eac2e7314f4875009..8cb890da67e9157850e769846e155e6adde76f90 100644 --- a/plugins/ScheduledReports/API.php +++ b/plugins/ScheduledReports/API.php @@ -9,6 +9,7 @@ namespace Piwik\Plugins\ScheduledReports; use Exception; +use Piwik\API\Request; use Piwik\Common; use Piwik\Config; use Piwik\Container\StaticContainer; @@ -357,12 +358,26 @@ class API extends \Piwik\Plugin\API } } - $processedReport = \Piwik\Plugins\API\API::getInstance()->getProcessedReport( - $idSite, $period, $date, $apiModule, $apiAction, - $segment != null ? urlencode($segment['definition']) : false, - $apiParameters, $idGoal = false, $language + $params = array( + 'idSite' => $idSite, + 'period' => $period, + 'date' => $date, + 'apiModule' => $apiModule, + 'apiAction' => $apiAction, + 'apiParameters' => $apiParameters, + 'idGoal' => false, + 'language' => $language, + 'serialize' => 0, + 'format' => 'original' ); + if ($segment != null) { + $params['segment'] = urlencode($segment['definition']); + } else { + $params['segment'] = false; + } + + $processedReport = Request::processRequest('API.getProcessedReport', $params); $processedReport['segment'] = $segment; // TODO add static method getPrettyDate($period, $date) in Period diff --git a/plugins/VisitsSummary/Reports/Get.php b/plugins/VisitsSummary/Reports/Get.php index f2a087a517eee4d476337a0619c136ca9fcb2778..55696873be61753f41546e8e2eb89592fd00dcf7 100644 --- a/plugins/VisitsSummary/Reports/Get.php +++ b/plugins/VisitsSummary/Reports/Get.php @@ -8,6 +8,7 @@ */ namespace Piwik\Plugins\VisitsSummary\Reports; +use Piwik\DataTable\DataTableInterface; use Piwik\Piwik; use Piwik\Plugins\CoreHome\Columns\Metrics\ActionsPerVisit; use Piwik\Plugins\CoreHome\Columns\Metrics\AverageTimeOnSite; @@ -15,6 +16,8 @@ use Piwik\Plugins\CoreHome\Columns\Metrics\BounceRate; class Get extends \Piwik\Plugin\Report { + private $usersColumn = 'nb_users'; + protected function init() { parent::init(); @@ -29,7 +32,7 @@ class Get extends \Piwik\Plugin\Report $this->metrics = array( 'nb_uniq_visitors', 'nb_visits', - 'nb_users', + $this->usersColumn, 'nb_actions', 'max_actions' ); @@ -43,7 +46,7 @@ class Get extends \Piwik\Plugin\Report { $metrics = parent::getMetrics(); - $metrics['max_actions'] = Piwik::translate('General_ColumnMaxActions'); + $metrics['max_actions'] = Piwik::translate('General_ColumnMaxActions'); return $metrics; } @@ -56,4 +59,25 @@ class Get extends \Piwik\Plugin\Report return $metrics; } + + public function removeUsersFromProcessedReport(&$response) + { + if (!empty($response['metadata']['metrics'][$this->usersColumn])) { + unset($response['metadata']['metrics'][$this->usersColumn]); + } + + if (!empty($response['metadata']['metricsDocumentation'][$this->usersColumn])) { + unset($response['metadata']['metricsDocumentation'][$this->usersColumn]); + } + + if (!empty($response['columns'][$this->usersColumn])) { + unset($response['columns'][$this->usersColumn]); + } + + if (!empty($response['reportData'])) { + $dataTable = $response['reportData']; + $dataTable->deleteColumn($this->usersColumn, true); + } + } + } \ No newline at end of file diff --git a/plugins/VisitsSummary/VisitsSummary.php b/plugins/VisitsSummary/VisitsSummary.php index cc6782f216f0d273217c06699a16952b9628a7e5..f0e7215aac68c2c0c26e039a9886ba3a671bde11 100644 --- a/plugins/VisitsSummary/VisitsSummary.php +++ b/plugins/VisitsSummary/VisitsSummary.php @@ -7,6 +7,9 @@ * */ namespace Piwik\Plugins\VisitsSummary; +use Piwik\DataTable; +use Piwik\Plugins\CoreHome\Columns\UserId; +use Piwik\Plugins\VisitsSummary\Reports\Get; /** * Note: This plugin does not hook on Daily and Period Archiving like other Plugins because it reports the @@ -23,10 +26,45 @@ class VisitsSummary extends \Piwik\Plugin public function getListHooksRegistered() { return array( - 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles' + 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', + 'API.API.getProcessedReport.end' => 'enrichProcessedReportIfVisitsSummaryGet', ); } + private function isRequestingVisitsSummaryGet($module, $method) + { + return ($module === 'VisitsSummary' && $method === 'get'); + } + + public function enrichProcessedReportIfVisitsSummaryGet(&$response, $infos) + { + if (empty($infos['parameters'][4]) || empty($response['reportData'])) { + return; + } + + $params = $infos['parameters']; + $idSites = array($params[0]); + $period = $params[1]; + $date = $params[2]; + $module = $params[3]; + $method = $params[4]; + + if (!$this->isRequestingVisitsSummaryGet($module, $method)) { + return; + } + + $userId = new UserId(); + + /** @var DataTable|DataTable\Map $dataTable */ + $dataTable = $response['reportData']; + + if (!$userId->hasDataTableUsers($dataTable) && + !$userId->isUsedInAtLeastOneSite($idSites, $period, $date)) { + $report = new Get(); + $report->removeUsersFromProcessedReport($response); + } + } + public function getStylesheetFiles(&$stylesheets) { $stylesheets[] = "plugins/VisitsSummary/stylesheets/datatable.less"; diff --git a/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php b/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..dc71cc4848e2b19649a240bec93835ea64ec0b18 --- /dev/null +++ b/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php @@ -0,0 +1,182 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\VisitsSummary\tests\Integration; + +use Piwik\Access; +use Piwik\API\Request; +use Piwik\DataAccess\ArchiveTableCreator; +use Piwik\Db; +use Piwik\Plugins\Live\API; +use Piwik\Plugins\VisitsSummary\VisitsSummary; +use Piwik\Tests\Framework\Fixture; +use Piwik\Tests\Framework\Mock\FakeAccess; +use Piwik\Tests\Framework\TestCase\IntegrationTestCase; + +/** + * @group VisitsSummary + * @group VisitsSummaryTest + * @group Plugins + */ +class VisitsSummaryTest extends IntegrationTestCase +{ + /** + * @var VisitsSummary + */ + private $plugin; + + protected $date = '2014-04-04'; + private $column = 'nb_users'; + + public function setUp() + { + parent::setUp(); + $this->plugin = new VisitsSummary(); + + $this->setSuperUser(); + + Fixture::createSuperUser(); + Fixture::createWebsite('2014-01-01 00:00:00'); + } + + public function tearDown() + { + // clean up your test here if needed + $tables = ArchiveTableCreator::getTablesArchivesInstalled(); + if (!empty($tables)) { + Db::dropTables($tables); + } + parent::tearDown(); + } + + public function test_enrichProcessedReportIfVisitsSummaryGet_shouldNotRemoveUsers_IfSomeWereTracked() + { + $this->trackPageviewsWithUsers(); + + $response = $this->requestProcessedGetReport(); + + $this->assertUsersNotRemovedFromProcessedReport($response, $expectedUsers = null, $minExpectedUsers = 1); + } + + public function test_enrichProcessedReportIfVisitsSummaryGet_shouldNotRemoveUsers_IfNoneWereTrackedThatDay_ButThatMonth() + { + $this->date = '2014-04-04'; + $this->trackPageviewsWithUsers(); + + $this->date = '2014-04-05'; + $this->trackPageviewsWithoutUsers(); + + $response = $this->requestProcessedGetReport(); + + $this->assertUsersNotRemovedFromProcessedReport($response, $expectedUsers = 0); + } + + public function test_isUsedInAtLeastOneSite_shouldRemoveUsers_IfNoneWereTracked() + { + $this->trackPageviewsWithoutUsers(); + + $response = $this->requestProcessedGetReport(); + + $this->assertUsersRemovedFromProcessedReport($response); + } + + private function assertUsersNotRemovedFromProcessedReport($response, $exactNumUsers = null, $minNumUsers = 0) + { + $table = $response['reportData']; + + if ($exactNumUsers !== null) { + $this->assertSame(array($exactNumUsers), $table->getColumn($this->column)); + } + + if ($minNumUsers != 0) { + $users = $table->getColumn($this->column); + $user = array_shift($users); + $this->assertGreaterThanOrEqual($minNumUsers, $user); + } + + $numVisits = $table->getColumn('nb_visits'); + $numVisits = array_shift($numVisits); + $this->assertGreaterThanOrEqual(2, $numVisits); + + $this->assertNotEmpty($response['metadata']['metrics'][$this->column]); + $this->assertNotEmpty($response['metadata']['metricsDocumentation'][$this->column]); + $this->assertNotEmpty($response['columns'][$this->column]); + } + + private function assertUsersRemovedFromProcessedReport($response) + { + $table = $response['reportData']; + $this->assertEquals(array(false), $table->getColumn($this->column)); + + $numVisits = $table->getColumn('nb_visits'); + $numVisits = array_shift($numVisits); + $this->assertGreaterThanOrEqual(2, $numVisits); + + $this->assertArrayNotHasKey($this->column, $response['metadata']['metrics']); + $this->assertArrayNotHasKey($this->column, $response['metadata']['metricsDocumentation']); + $this->assertArrayNotHasKey($this->column, $response['columns']); + } + + private function requestProcessedGetReport() + { + return Request::processRequest('API.getProcessedReport', array( + 'idSite' => 1, + 'period' => 'day', + 'date' => $this->date, + 'apiModule' => 'VisitsSummary', + 'apiAction' => 'get' + )); + } + + private function trackPageviewsWithUsers() + { + $this->trackPageviewsWithDifferentUsers(array('user1', false, 'user3')); + } + + private function trackPageviewsWithoutUsers() + { + $this->trackPageviewsWithDifferentUsers(array(false, false, false)); + } + + private function trackPageviewsWithDifferentUsers($userIds) + { + foreach ($userIds as $index => $userId) { + $tracker = $this->getTracker($index); + $tracker->setForceNewVisit(); + $this->trackPageview($tracker, $userId, '/index/' . $index . '.html'); + } + } + + private function trackPageview(\PiwikTracker $tracker, $userId, $url) + { + $tracker->setUrl('http://www.example.org' . $url); + $tracker->setUserId($userId); + $tracker->doTrackPageView($url); + } + + private function getTracker($hoursOffset = 0) + { + $hour = 10; + if ($hoursOffset) { + $hour += $hoursOffset; + } + + $date = sprintf('%s %d:20:01', $this->date, $hour); + + $tracker = Fixture::getTracker(1, $date, true, true); + $tracker->setTokenAuth(Fixture::getTokenAuth()); + return $tracker; + } + + private function setSuperUser() + { + $pseudoMockAccess = new FakeAccess(); + $pseudoMockAccess::setSuperUserAccess(true); + Access::setSingletonInstance($pseudoMockAccess); + } +} diff --git a/plugins/VisitsSummary/tests/Unit/Reports/GetTest.php b/plugins/VisitsSummary/tests/Unit/Reports/GetTest.php new file mode 100644 index 0000000000000000000000000000000000000000..df185a971e8e52d81d34c4ec4aeacf12d57efc5a --- /dev/null +++ b/plugins/VisitsSummary/tests/Unit/Reports/GetTest.php @@ -0,0 +1,100 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\VisitsSummary\tests\Unit\Reports; + +use Piwik\DataTable; +use Piwik\Plugins\VisitsSummary\Reports\Get; +use Piwik\Tests\Framework\TestCase\UnitTestCase; + +/** + * @group VisitsSummary + * @group Reports + * @group GetTest + * @group Plugins + */ +class GetTest extends UnitTestCase +{ + /** + * @var Get + */ + private $get; + + private $column = 'nb_users'; + + public function setUp() + { + parent::setUp(); + $this->get = new Get(); + } + + public function test_removeUsersFromProcessedReport_shouldNotDoAnything_IfNothingRelatedToUsersIsGiven() + { + $response = array(); + $this->get->removeUsersFromProcessedReport($response); + $this->assertSame(array(), $response); + + $response = array($this->column => '10', 'test' => 'whatever', 'columns' => array($this->column)); + $this->get->removeUsersFromProcessedReport($response); + $this->assertSame(array($this->column => '10', 'test' => 'whatever', 'columns' => array($this->column)), $response); + } + + public function test_removeUsersFromProcessedReport_shouldRemoveMetrics_IfUserIsGiven() + { + $response = array('metadata' => array('metrics' => array('nb_visits' => 'Visits', $this->column => 'Users'))); + $this->get->removeUsersFromProcessedReport($response); + $this->assertSame(array('metadata' => array('metrics' => array('nb_visits' => 'Visits'))), $response); + } + + public function test_removeUsersFromProcessedReport_shouldRemoveMetricsDocumentation_IfUserIsGiven() + { + $response = array('metadata' => array('metricsDocumentation' => array('nb_visits' => 'Visits', $this->column => 'Users'))); + $this->get->removeUsersFromProcessedReport($response); + $this->assertSame(array('metadata' => array('metricsDocumentation' => array('nb_visits' => 'Visits'))), $response); + } + + public function test_removeUsersFromProcessedReport_shouldRemoveColumn_IfUserIsGiven() + { + $response = array('columns' => array('nb_visits' => 'Visits', $this->column => 'Users')); + $this->get->removeUsersFromProcessedReport($response); + $this->assertSame(array('columns' => array('nb_visits' => 'Visits')), $response); + } + + public function test_removeUsersFromProcessedReport_shouldRemoveUsersColumnFromDataTable_IfUserIsGiven() + { + $table = $this->getDataTableWithUsers(); + $this->assertSame(array(20), $table->getColumn($this->column)); // verify column present + + $response = array('reportData' => $table); + $this->get->removeUsersFromProcessedReport($response); + + $this->assertSame(array(false), $table->getColumn($this->column)); + $this->assertSame(array(10), $table->getColumn('nb_visits')); + } + + public function test_removeUsersFromProcessedReport_shouldRemoveUsersColumnFromDataTableMap_IfUserIsGiven() + { + $table = new DataTable\Map(); + $table->addTable($this->getDataTableWithUsers(), 'label'); + $this->assertSame(array(20), $table->getColumn($this->column)); // verify column present + + $response = array('reportData' => $table); + $this->get->removeUsersFromProcessedReport($response); + + $this->assertSame(array(false), $table->getColumn($this->column)); + $this->assertSame(array(10), $table->getColumn('nb_visits')); + } + + private function getDataTableWithUsers() + { + $table = new DataTable(); + $table->addRowFromSimpleArray(array('nb_visits' => 10, $this->column => 20)); + + return $table; + } +} diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_VisitsSummary.get_firstSite_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_VisitsSummary.get_firstSite_lastN__API.getProcessedReport_day.xml index eb6b70ce41cc4ab3ba7450f1c71fec40b02a141d..63b6741a624daef093b1dd07adbcbb0cf1b2278a 100644 --- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_VisitsSummary.get_firstSite_lastN__API.getProcessedReport_day.xml +++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_VisitsSummary.get_firstSite_lastN__API.getProcessedReport_day.xml @@ -10,14 +10,12 @@ <metrics> <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> <nb_visits>Visits</nb_visits> - <nb_users>Users</nb_users> <nb_actions>Actions</nb_actions> <max_actions>Maximum actions in one visit</max_actions> </metrics> <metricsDocumentation> <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> - <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> @@ -35,7 +33,6 @@ <columns> <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> <nb_visits>Visits</nb_visits> - <nb_users>Users</nb_users> <nb_actions>Actions</nb_actions> <max_actions>Maximum actions in one visit</max_actions> <bounce_rate>Bounce Rate</bounce_rate> @@ -45,7 +42,6 @@ <reportData> <result prettyDate="Sunday 3 January 2010"> <nb_uniq_visitors>2</nb_uniq_visitors> - <nb_users>0</nb_users> <nb_visits>2</nb_visits> <nb_actions>2</nb_actions> <max_actions>1</max_actions> @@ -55,7 +51,6 @@ </result> <result prettyDate="Monday 4 January 2010"> <nb_uniq_visitors>1</nb_uniq_visitors> - <nb_users>0</nb_users> <nb_visits>1</nb_visits> <nb_actions>1</nb_actions> <max_actions>1</max_actions> @@ -65,7 +60,6 @@ </result> <result prettyDate="Tuesday 5 January 2010"> <nb_uniq_visitors>1</nb_uniq_visitors> - <nb_users>0</nb_users> <nb_visits>1</nb_visits> <nb_actions>5</nb_actions> <max_actions>5</max_actions> @@ -75,7 +69,6 @@ </result> <result prettyDate="Wednesday 6 January 2010"> <nb_uniq_visitors>1</nb_uniq_visitors> - <nb_users>0</nb_users> <nb_visits>1</nb_visits> <nb_actions>5</nb_actions> <max_actions>5</max_actions> @@ -85,7 +78,6 @@ </result> <result prettyDate="Thursday 7 January 2010"> <nb_uniq_visitors>1</nb_uniq_visitors> - <nb_users>0</nb_users> <nb_visits>1</nb_visits> <nb_actions>5</nb_actions> <max_actions>5</max_actions> @@ -95,7 +87,6 @@ </result> <result prettyDate="Friday 8 January 2010"> <nb_uniq_visitors>1</nb_uniq_visitors> - <nb_users>0</nb_users> <nb_visits>1</nb_visits> <nb_actions>5</nb_actions> <max_actions>5</max_actions> @@ -105,7 +96,6 @@ </result> <result prettyDate="Saturday 9 January 2010"> <nb_uniq_visitors>1</nb_uniq_visitors> - <nb_users>0</nb_users> <nb_visits>1</nb_visits> <nb_actions>5</nb_actions> <max_actions>5</max_actions> diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv index 519512fcf8584e80996e195a67b1ea51d7573dba..bab09c3b040ebe1d028f2b23617cbe7a3b4432c0 100644 --- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv +++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv @@ -4,8 +4,8 @@ Site 1,11,43,43,$ 0,0,100%,100%,100%,0%,0%,0,$ 0,0,0 Site 2,1,3,3,$ 0,0,100%,100%,100%,0%,0%,0,$ 0,0,0 Visits Summary -nb_uniq_visitors,nb_users,nb_visits,nb_actions,max_actions,nb_actions_per_visit,avg_time_on_site,bounce_rate -2,0,11,43,5,3.9,00:10:55,27% +nb_uniq_visitors,nb_visits,nb_actions,max_actions,nb_actions_per_visit,avg_time_on_site,bounce_rate +2,11,43,5,3.9,00:10:55,27% Visits by Server Time label,nb_visits,nb_actions,nb_actions_per_visit,avg_time_on_site,bounce_rate,revenue diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html index 1442ad9c23a8b80fca49bfe0f21595abe1e7dbe7..83950954a477fafe99f40e6c032a4e95254a83d9 100644 --- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html +++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html @@ -428,14 +428,6 @@ </tr> <tr style=";line-height: 22px;"> - <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> - Users </td> - <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> - 0 - </td> - </tr> - - <tr style="background-color: rgb(242,242,242);line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Visits </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -443,7 +435,7 @@ </td> </tr> - <tr style=";line-height: 22px;"> + <tr style="background-color: rgb(242,242,242);line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Actions </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -451,7 +443,7 @@ </td> </tr> - <tr style="background-color: rgb(242,242,242);line-height: 22px;"> + <tr style=";line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Maximum actions in one visit </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -459,7 +451,7 @@ </td> </tr> - <tr style=";line-height: 22px;"> + <tr style="background-color: rgb(242,242,242);line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Actions per Visit </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -467,7 +459,7 @@ </td> </tr> - <tr style="background-color: rgb(242,242,242);line-height: 22px;"> + <tr style=";line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Avg. Visit Duration (in seconds) </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -475,7 +467,7 @@ </td> </tr> - <tr style=";line-height: 22px;"> + <tr style="background-color: rgb(242,242,242);line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Bounce Rate </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv index 1cf8d1b08f53a6933eecb64670f1153f975a4119..dc3af2db1ae150219bd8ec87500950f1c4ac5bfd 100644 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv @@ -4,8 +4,8 @@ Piwik test,5,16,16,$ 13361.11,5,4,$ 13351.11,100%,100%,100%,100%,100%,100%,100% Piwik test,2,1,1,$ 250,1,0,$ 0,100%,100%,100%,100%,100%,0,0 Visits Summary -nb_uniq_visitors,nb_users,nb_visits,nb_actions,max_actions,nb_actions_per_visit,avg_time_on_site,bounce_rate -1,0,5,16,6,3.2,00:22:49,20% +nb_uniq_visitors,nb_visits,nb_actions,max_actions,nb_actions_per_visit,avg_time_on_site,bounce_rate +1,5,16,6,3.2,00:22:49,20% Visits by Server Time label,nb_visits,nb_actions,revenue,nb_actions_per_visit,avg_time_on_site,bounce_rate diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html index 6b23888c1270ec74b3d944c439983c7dda75808e..eed4308fdec7408812ad3ed4a602e743b22a459a 100644 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html @@ -488,14 +488,6 @@ </tr> <tr style=";line-height: 22px;"> - <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> - Users </td> - <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> - 0 - </td> - </tr> - - <tr style="background-color: rgb(242,242,242);line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Visits </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -503,7 +495,7 @@ </td> </tr> - <tr style=";line-height: 22px;"> + <tr style="background-color: rgb(242,242,242);line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Actions </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -511,7 +503,7 @@ </td> </tr> - <tr style="background-color: rgb(242,242,242);line-height: 22px;"> + <tr style=";line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Maximum actions in one visit </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -519,7 +511,7 @@ </td> </tr> - <tr style=";line-height: 22px;"> + <tr style="background-color: rgb(242,242,242);line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Actions per Visit </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -527,7 +519,7 @@ </td> </tr> - <tr style="background-color: rgb(242,242,242);line-height: 22px;"> + <tr style=";line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Avg. Visit Duration (in seconds) </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> @@ -535,7 +527,7 @@ </td> </tr> - <tr style=";line-height: 22px;"> + <tr style="background-color: rgb(242,242,242);line-height: 22px;"> <td style="font-size: 13px; border-right: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;"> Bounce Rate </td> <td style="font-size: 13px; border-left: 1px solid rgb(217,217,217); padding: 5px 0 5px 5px;">