diff options
3 files changed, 135 insertions, 102 deletions
diff --git a/plugins/CoreHome/Tracker/VisitRequestProcessor.php b/plugins/CoreHome/Tracker/VisitRequestProcessor.php index 8830b2402f..ee7493c68d 100644 --- a/plugins/CoreHome/Tracker/VisitRequestProcessor.php +++ b/plugins/CoreHome/Tracker/VisitRequestProcessor.php @@ -104,7 +104,7 @@ class VisitRequestProcessor extends RequestProcessor return false; } - public function afterRequestProcessed(VisitProperties $visitProperties) + public function afterRequestProcessed(VisitProperties $visitProperties, Request $request) { /** * Triggered after visits are tested for exclusion so plugins can modify the IP address @@ -121,11 +121,13 @@ class VisitRequestProcessor extends RequestProcessor * Determines if the tracker if the current action should be treated as the start of a new visit or * an action in an existing visit. * + * Note: public only for tests. + * * @param VisitProperties $visitProperties The current visit/visitor information. * @param Request $request * @return bool */ - private function isVisitNew(VisitProperties $visitProperties, Request $request) + public function isVisitNew(VisitProperties $visitProperties, Request $request) { $isKnown = $visitProperties->getRequestMetadata('CoreHome', 'isVisitorKnown'); if (!$isKnown) { diff --git a/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php b/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php new file mode 100644 index 0000000000..fc9e9ad423 --- /dev/null +++ b/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php @@ -0,0 +1,131 @@ +<?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\Tracker; + +use Piwik\Cache; +use Piwik\CacheId; +use Piwik\Date; +use Piwik\Plugins\CoreHome\Tracker\VisitRequestProcessor; +use Piwik\Tests\Framework\TestCase\IntegrationTestCase; +use Piwik\Plugins\SitesManager\API; +use Piwik\Tracker\Request; +use Piwik\Tracker\Visit; +use Piwik\Tracker\Visit\VisitProperties; + +/** + * @group CoreHome + * @group CoreHome_Integration + */ +class VisitRequestProcessorTest extends IntegrationTestCase +{ + public function test_isVisitNew_ReturnsFalse_IfLastActionTimestampIsWithinVisitTimeLength_AndNoDimensionForcesVisit_AndVisitorKnown() + { + $this->setDimensionsWithOnNewVisit(array(false, false, false)); + + /** @var VisitRequestProcessor $visit */ + list($visit, $visitProperties, $request) = $this->makeVisitorAndAction( + $lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45', $isVisitorKnown = true); + + $result = $visit->isVisitNew($visitProperties, $request); + + $this->assertFalse($result); + } + + public function test_isVisitNew_ReturnsTrue_IfLastActionTimestampWasYesterday() + { + $this->setDimensionsWithOnNewVisit(array(false, false, false)); + + // test same day + /** @var VisitRequestProcessor $visit */ + list($visit, $visitProperties, $request) = $this->makeVisitorAndAction( + $lastActionTime = '2012-01-01 23:59:58', $thisActionTime = '2012-01-01 23:59:59', $isVisitorKnown = true); + $result = $visit->isVisitNew($visitProperties, $request); + $this->assertFalse($result); + + // test different day + list($visit, $visitProperties, $request) = $this->makeVisitorAndAction( + $lastActionTime = '2012-01-01 23:59:58', $thisActionTime = '2012-01-02 00:00:01', $isVisitorKnown = true); + $result = $visit->isVisitNew($visitProperties, $request); + $this->assertTrue($result); + } + + + public function test_isVisitNew_ReturnsTrue_IfLastActionTimestampIsNotWithinVisitTimeLength_AndNoDimensionForcesVisit_AndVisitorNotKnown() + { + $this->setDimensionsWithOnNewVisit(array(false, false, false)); + + /** @var VisitRequestProcessor $visit */ + list($visit, $visitProperties, $request) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 09:12:45'); + + $result = $visit->isVisitNew($visitProperties, $request); + + $this->assertTrue($result); + } + + public function test_isVisitNew_ReturnsTrue_IfLastActionTimestampIsWithinVisitTimeLength_AndDimensionForcesVisit() + { + $this->setDimensionsWithOnNewVisit(array(false, false, true)); + + /** @var VisitRequestProcessor $visit */ + list($visit, $visitProperties, $request) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45'); + + $result = $visit->isVisitNew($visitProperties, $request); + + $this->assertTrue($result); + } + + public function test_isVisitNew_ReturnsTrue_IfDimensionForcesVisit_AndVisitorKnown() + { + $this->setDimensionsWithOnNewVisit(array(false, false, true)); + + /** @var VisitRequestProcessor $visit */ + list($visit, $visitProperties, $request) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45'); + + $result = $visit->isVisitNew($visitProperties, $request); + + $this->assertTrue($result); + } + + private function makeVisitorAndAction($lastActionTimestamp, $currentActionTime, $isVisitorKnown = false) + { + $idsite = API::getInstance()->addSite("name", "http://piwik.net/"); + + list($visit, $request) = $this->prepareVisitWithRequest(array('idsite' => $idsite), $currentActionTime); + + $visitProperties = new VisitProperties(); + $visitProperties->visitorInfo = array('visit_last_action_time' => Date::factory($lastActionTimestamp)->getTimestamp()); + $visitProperties->setRequestMetadata('CoreHome', 'isVisitorKnown', $isVisitorKnown); + + return array($visit, $visitProperties, $request); + } + + private function setDimensionsWithOnNewVisit($dimensionOnNewVisitResults) + { + $dimensions = array(); + foreach ($dimensionOnNewVisitResults as $onNewVisitResult) { + $dim = $this->getMock('Piwik\\Plugin\\Dimension', array('shouldForceNewVisit', 'getColumnName')); + $dim->expects($this->any())->method('shouldForceNewVisit')->will($this->returnValue($onNewVisitResult)); + $dimensions[] = $dim; + } + + $cache = Cache::getTransientCache(); + $cache->save(CacheId::pluginAware('VisitDimensions'), $dimensions); + Visit::$dimensions = null; + } + + private function prepareVisitWithRequest($requestParams, $requestDate) + { + $request = new Request($requestParams); + $request->setCurrentTimestamp(Date::factory($requestDate)->getTimestamp()); + + $visit = self::$fixture->piwikEnvironment->getContainer()->get('Piwik\Plugins\CoreHome\Tracker\VisitRequestProcessor'); + + return array($visit, $request); + } +} diff --git a/tests/PHPUnit/Integration/Tracker/VisitTest.php b/tests/PHPUnit/Integration/Tracker/VisitTest.php index c5aec2995c..b89800e705 100644 --- a/tests/PHPUnit/Integration/Tracker/VisitTest.php +++ b/tests/PHPUnit/Integration/Tracker/VisitTest.php @@ -9,7 +9,6 @@ namespace Piwik\Tests\Integration\Tracker; use Piwik\Cache; -use Piwik\CacheId; use Piwik\Archive\ArchiveInvalidator; use Piwik\Date; use Piwik\Network\IPUtils; @@ -17,12 +16,10 @@ use Piwik\Plugin\Manager; use Piwik\Plugins\SitesManager\API; use Piwik\Tests\Framework\Fixture; use Piwik\Tests\Framework\Mock\FakeAccess; -use Piwik\Tracker\ActionPageview; use Piwik\Tracker\Request; use Piwik\Tracker\Visit; use Piwik\Tracker\VisitExcluded; use Piwik\Tests\Framework\TestCase\IntegrationTestCase; -use Piwik\Tracker\Visitor; /** * @group Core @@ -271,37 +268,6 @@ class VisitTest extends IntegrationTestCase } } - public function test_isVisitNew_ReturnsFalse_IfLastActionTimestampIsWithinVisitTimeLength_AndNoDimensionForcesVisit_AndVisitorKnown() - { - $this->setDimensionsWithOnNewVisit(array(false, false, false)); - - /** @var Visit $visit */ - list($visit, $visitor, $action) = $this->makeVisitorAndAction( - $lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45', $isVisitorKnown = true); - - $result = $visit->isVisitNew($visitor, $action); - - $this->assertFalse($result); - } - - public function test_isVisitNew_ReturnsTrue_IfLastActionTimestampWasYesterday() - { - $this->setDimensionsWithOnNewVisit(array(false, false, false)); - - // test same day - /** @var Visit $visit */ - list($visit, $visitor, $action) = $this->makeVisitorAndAction( - $lastActionTime = '2012-01-01 23:59:58', $thisActionTime = '2012-01-01 23:59:59', $isVisitorKnown = true); - $result = $visit->isVisitNew($visitor, $action); - $this->assertFalse($result); - - // test different day - list($visit, $visitor, $action) = $this->makeVisitorAndAction( - $lastActionTime = '2012-01-01 23:59:58', $thisActionTime = '2012-01-02 00:00:01', $isVisitorKnown = true); - $result = $visit->isVisitNew($visitor, $action); - $this->assertTrue($result); - } - public function test_markArchivedReportsAsInvalidIfArchiveAlreadyFinished_ShouldRemember_IfRequestWasDoneLongAgo() { $currentActionTime = '2012-01-02 08:12:45'; @@ -389,72 +355,6 @@ class VisitTest extends IntegrationTestCase return array($visit, $request); } - public function test_isVisitNew_ReturnsTrue_IfLastActionTimestampIsNotWithinVisitTimeLength_AndNoDimensionForcesVisit_AndVisitorNotKnown() - { - $this->setDimensionsWithOnNewVisit(array(false, false, false)); - - /** @var Visit $visit */ - list($visit, $visitor, $action) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 09:12:45'); - - $result = $visit->isVisitNew($visitor, $action); - - $this->assertTrue($result); - } - - public function test_isVisitNew_ReturnsTrue_IfLastActionTimestampIsWithinVisitTimeLength_AndDimensionForcesVisit() - { - $this->setDimensionsWithOnNewVisit(array(false, false, true)); - - /** @var Visit $visit */ - list($visit, $visitor, $action) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45'); - - $result = $visit->isVisitNew($visitor, $action); - - $this->assertTrue($result); - } - - public function test_isVisitNew_ReturnsTrue_IfDimensionForcesVisit_AndVisitorKnown() - { - $this->setDimensionsWithOnNewVisit(array(false, false, true)); - - /** @var Visit $visit */ - list($visit, $visitor, $action) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45'); - - $result = $visit->isVisitNew($visitor, $action); - - $this->assertTrue($result); - } - - private function makeVisitorAndAction($lastActionTimestamp, $currentActionTime, $isVisitorKnown = false) - { - $idsite = API::getInstance()->addSite("name", "http://piwik.net/"); - - list($visit, $request) = $this->prepareVisitWithRequest(array('idsite' => $idsite), $currentActionTime); - - $visitProperties = new Visit\VisitProperties(); - $visitProperties->visitorInfo = array('visit_last_action_time' => Date::factory($lastActionTimestamp)->getTimestamp()); - - $visitor = new Visitor($request, 'configid', $visitProperties, $isVisitorKnown); - - $action = new ActionPageview($request); - - return array($visit, $visitor, $action); - } - - private function setDimensionsWithOnNewVisit($dimensionOnNewVisitResults) - { - $dimensions = array(); - foreach ($dimensionOnNewVisitResults as $onNewVisitResult) { - $dim = $this->getMock('Piwik\\Plugin\\Dimension', array('shouldForceNewVisit', 'getColumnName')); - $dim->expects($this->any())->method('shouldForceNewVisit')->will($this->returnValue($onNewVisitResult)); - $dimensions[] = $dim; - } - - $cache = Cache::getTransientCache(); - $cache->save(CacheId::pluginAware('VisitDimensions'), $dimensions); - Visit::$dimensions = null; - } - public function provideContainerConfig() { return array( |