From f5c463e3d7deb1b80aacdc2b7d8c96a0add6897b Mon Sep 17 00:00:00 2001 From: Thomas Steur <thomas.steur@gmail.com> Date: Tue, 10 Feb 2015 02:56:47 +0000 Subject: [PATCH] refs #6705 added some tests and some code tweaks --- plugins/CoreHome/Columns/UserId.php | 2 +- .../tests/Integration/Column/UserIdTest.php | 68 ++++++++ plugins/VisitsSummary/Reports/Get.php | 27 ++- plugins/VisitsSummary/VisitsSummary.php | 49 ++---- .../tests/Integration/VisitsSummaryTest.php | 165 ++++++++++++++++++ .../tests/Unit/Reports/GetTest.php | 100 +++++++++++ 6 files changed, 378 insertions(+), 33 deletions(-) create mode 100644 plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php create mode 100644 plugins/VisitsSummary/tests/Unit/Reports/GetTest.php diff --git a/plugins/CoreHome/Columns/UserId.php b/plugins/CoreHome/Columns/UserId.php index c556407a61..4cdc13c5d1 100644 --- a/plugins/CoreHome/Columns/UserId.php +++ b/plugins/CoreHome/Columns/UserId.php @@ -95,7 +95,7 @@ class UserId extends VisitDimension return $this->hasDataTableUsers($result); } - public function hasDataTableUsers(DataTable $result) + public function hasDataTableUsers(DataTable\DataTableInterface $result) { if ($result instanceof Map) { $result = $result->mergeChildren(); diff --git a/plugins/CoreHome/tests/Integration/Column/UserIdTest.php b/plugins/CoreHome/tests/Integration/Column/UserIdTest.php index 7861a4a65b..f2ca415b5a 100644 --- a/plugins/CoreHome/tests/Integration/Column/UserIdTest.php +++ b/plugins/CoreHome/tests/Integration/Column/UserIdTest.php @@ -131,6 +131,74 @@ class UserIdTest extends IntegrationTestCase $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); diff --git a/plugins/VisitsSummary/Reports/Get.php b/plugins/VisitsSummary/Reports/Get.php index bced863b07..cbd7ddab35 100644 --- a/plugins/VisitsSummary/Reports/Get.php +++ b/plugins/VisitsSummary/Reports/Get.php @@ -8,14 +8,16 @@ */ 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; use Piwik\Plugins\CoreHome\Columns\Metrics\BounceRate; -use Piwik\Plugins\CoreHome\Columns\UserId; class Get extends \Piwik\Plugin\Report { + private $usersColumn = 'nb_users'; + protected function init() { parent::init(); @@ -30,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' ); @@ -57,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); + } + } + } \ No newline at end of file diff --git a/plugins/VisitsSummary/VisitsSummary.php b/plugins/VisitsSummary/VisitsSummary.php index 4150f7dfaf..5db1cb33e7 100644 --- a/plugins/VisitsSummary/VisitsSummary.php +++ b/plugins/VisitsSummary/VisitsSummary.php @@ -9,6 +9,7 @@ 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 @@ -30,50 +31,38 @@ class VisitsSummary extends \Piwik\Plugin ); } - public function enrichProcessedReportIfVisitsSummaryGet(&$response, $infos) + private function isRequestingVisitsSummaryGet($module, $method) { - $params = $infos['parameters']; - $module = $params[3]; - $method = $params[4]; + return ($module === 'VisitsSummary' && $method === 'get'); + } - if ($module !== 'VisitsSummary' || $method !== 'get') { + public function enrichProcessedReportIfVisitsSummaryGet(&$response, $infos) + { + if (empty($infos['parameters'][4]) || empty($response['reportData'])) { return; } - $userId = new UserId(); + $params = $infos['parameters']; + $idSites = array($params[0]); + $period = $params[1]; + $date = $params[2]; + $module = $params[3]; + $method = $params[4]; /** @var DataTable|DataTable\Map $dataTable */ $dataTable = $response['reportData']; - if ($userId->hasDataTableUsers($dataTable)) { - return; - } - - $idSites = $params[0]; - if (!is_array($idSites)) { - $idSites = array($idSites); - } - - $period = $params[1]; - $date = $params[2]; - - if ($userId->isUsedInAtLeastOneSite($idSites, $period, $date)) { + if (!$this->isRequestingVisitsSummaryGet($module, $method)) { return; } - if (!empty($response['metadata']['metrics']['nb_users'])) { - unset($response['metadata']['metrics']['nb_users']); - } - - if (!empty($response['metadata']['metricsDocumentation']['nb_users'])) { - unset($response['metadata']['metricsDocumentation']['nb_users']); - } + $userId = new UserId(); - if (!empty($response['columns']['nb_users'])) { - unset($response['columns']['nb_users']); + if (!$userId->hasDataTableUsers($dataTable) && + !$userId->isUsedInAtLeastOneSite($idSites, $period, $date)) { + $report = new Get(); + $report->removeUsersFromProcessedReport($response, $dataTable); } - - $dataTable->deleteColumn('nb_users'); } public function getStylesheetFiles(&$stylesheets) diff --git a/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php b/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php new file mode 100644 index 0000000000..cc30bbc345 --- /dev/null +++ b/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php @@ -0,0 +1,165 @@ +<?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\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'); + 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 = 2); + } + + 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, $numUsers) + { + $table = $response['reportData']; + $this->assertEquals(array($numUsers), $table->getColumn($this->column)); + $this->assertEquals(array(3), $table->getColumn('nb_visits')); + $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)); + $this->assertEquals(array(3), $table->getColumn('nb_visits')); + $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) + { + $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/VisitsSummary/tests/Unit/Reports/GetTest.php b/plugins/VisitsSummary/tests/Unit/Reports/GetTest.php new file mode 100644 index 0000000000..df185a971e --- /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; + } +} -- GitLab