Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordiosmosis <diosmosis@users.noreply.github.com>2019-05-10 11:50:56 +0300
committerGitHub <noreply@github.com>2019-05-10 11:50:56 +0300
commitc6eb52339f3fc496ac43b55c4a0de8d161edbff4 (patch)
treec05d34d97ea14cdb454e5ca3ff961c9449e53095 /plugins/Referrers
parenta4c8dc92994ccfd5775d080a4f63cb095ab95e19 (diff)
Overwrite direct entry referrer information if campaign referrer is found in later request. (#14273)
* Overwrite direct entry referrer information if campaign referrer is found in later request. * Update for non-campaign referrers as well. * test comment tweaks * Add current tracking URL into site urls in case website has no main url. * Fix a couple issues and start adding tests. * More tests and a fix. * Apply review feedback. * Fix couple tests. * Fix referrer tests. * try to fix random failure * Add note to README.
Diffstat (limited to 'plugins/Referrers')
-rw-r--r--plugins/Referrers/Columns/Base.php14
-rw-r--r--plugins/Referrers/Columns/Campaign.php4
-rw-r--r--plugins/Referrers/Columns/Keyword.php12
-rw-r--r--plugins/Referrers/Columns/ReferrerName.php12
-rw-r--r--plugins/Referrers/Columns/ReferrerType.php12
-rw-r--r--plugins/Referrers/Columns/ReferrerUrl.php13
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php50
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php58
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php65
9 files changed, 223 insertions, 17 deletions
diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php
index 0abe38c8fe..31f4562ad5 100644
--- a/plugins/Referrers/Columns/Base.php
+++ b/plugins/Referrers/Columns/Base.php
@@ -96,7 +96,7 @@ abstract class Base extends VisitDimension
$referrerDetected = $this->detectReferrerCampaign($request, $visitor);
if (!$referrerDetected) {
- if ($this->detectReferrerDirectEntry()
+ if ($this->detectReferrerDirectEntry($request)
|| $this->detectReferrerSearchEngine()
|| $this->detectReferrerSocialNetwork()
) {
@@ -111,6 +111,8 @@ abstract class Base extends VisitDimension
$urlsByHost = $this->getCachedUrlsByHostAndIdSite();
$directEntry = new SiteUrls();
+ $directEntry->addRequestUrlToSiteUrls($urlsByHost, $request);
+
$path = $directEntry->getPathMatchingUrl($this->referrerUrlParse, $urlsByHost);
if (!empty($path) && $path !== '/') {
$this->nameReferrerAnalyzed .= rtrim($path, '/');
@@ -337,7 +339,7 @@ abstract class Base extends VisitDimension
* it is considered a direct entry
* @return bool
*/
- protected function detectReferrerDirectEntry()
+ protected function detectReferrerDirectEntry(Request $request)
{
if (empty($this->referrerHost)) {
return false;
@@ -346,6 +348,8 @@ abstract class Base extends VisitDimension
$urlsByHost = $this->getCachedUrlsByHostAndIdSite();
$directEntry = new SiteUrls();
+ $directEntry->addRequestUrlToSiteUrls($urlsByHost, $request);
+
$matchingSites = $directEntry->getIdSitesMatchingUrl($this->referrerUrlParse, $urlsByHost);
if (isset($matchingSites) && is_array($matchingSites) && in_array($this->idsite, $matchingSites)) {
@@ -602,4 +606,10 @@ abstract class Base extends VisitDimension
{
return Common::mb_substr($refererKeyword, 0, 255);
}
+
+ protected function isCurrentReferrerDirectEntry(Visitor $visitor)
+ {
+ $referrerType = $visitor->getVisitorColumn('referer_type');
+ return $referrerType == Common::REFERRER_TYPE_DIRECT_ENTRY;
+ }
}
diff --git a/plugins/Referrers/Columns/Campaign.php b/plugins/Referrers/Columns/Campaign.php
index 158876a7ef..30c7cc609a 100644
--- a/plugins/Referrers/Columns/Campaign.php
+++ b/plugins/Referrers/Columns/Campaign.php
@@ -48,8 +48,12 @@ class Campaign extends Base
$information = $this->getReferrerInformationFromRequest($request, $visitor);
+ // we force a new visit if the referrer is a campaign and it's different than the currently recorded referrer.
+ // if the current referrer is 'direct entry', however, we assume the referrer information was sent in a later request, and
+ // we just update the existing referrer information instead of creating a visit.
if ($information['referer_type'] == Common::REFERRER_TYPE_CAMPAIGN
&& $this->isReferrerInformationNew($visitor, $information)
+ && !$this->isCurrentReferrerDirectEntry($visitor)
) {
Common::printDebug("Existing visit detected, but creating new visit because campaign information is different than last action.");
diff --git a/plugins/Referrers/Columns/Keyword.php b/plugins/Referrers/Columns/Keyword.php
index 777965023a..523f0d16b1 100644
--- a/plugins/Referrers/Columns/Keyword.php
+++ b/plugins/Referrers/Columns/Keyword.php
@@ -36,6 +36,18 @@ class Keyword extends Base
return $information['referer_keyword'];
}
+ public function onExistingVisit(Request $request, Visitor $visitor, $action)
+ {
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
+ if ($this->isCurrentReferrerDirectEntry($visitor)
+ && $information['referer_type'] != Common::REFERRER_TYPE_DIRECT_ENTRY
+ ) {
+ return $information['referer_keyword'];
+ }
+
+ return false;
+ }
+
/**
* @param Request $request
* @param Visitor $visitor
diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php
index 3420c36ea8..fbf38804b2 100644
--- a/plugins/Referrers/Columns/ReferrerName.php
+++ b/plugins/Referrers/Columns/ReferrerName.php
@@ -37,6 +37,18 @@ class ReferrerName extends Base
return $information['referer_name'];
}
+ public function onExistingVisit(Request $request, Visitor $visitor, $action)
+ {
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
+ if ($this->isCurrentReferrerDirectEntry($visitor)
+ && $information['referer_type'] != Common::REFERRER_TYPE_DIRECT_ENTRY
+ ) {
+ return $information['referer_name'];
+ }
+
+ return false;
+ }
+
/**
* @param Request $request
* @param Visitor $visitor
diff --git a/plugins/Referrers/Columns/ReferrerType.php b/plugins/Referrers/Columns/ReferrerType.php
index e7a237ee82..1156a44d5c 100644
--- a/plugins/Referrers/Columns/ReferrerType.php
+++ b/plugins/Referrers/Columns/ReferrerType.php
@@ -55,6 +55,18 @@ class ReferrerType extends Base
return $information['referer_type'];
}
+ public function onExistingVisit(Request $request, Visitor $visitor, $action)
+ {
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
+ if ($this->isCurrentReferrerDirectEntry($visitor)
+ && $information['referer_type'] != Common::REFERRER_TYPE_DIRECT_ENTRY
+ ) {
+ return $information['referer_type'];
+ }
+
+ return false;
+ }
+
/**
* @param Request $request
* @param Visitor $visitor
diff --git a/plugins/Referrers/Columns/ReferrerUrl.php b/plugins/Referrers/Columns/ReferrerUrl.php
index 2e7aa0ba63..738ba3d868 100644
--- a/plugins/Referrers/Columns/ReferrerUrl.php
+++ b/plugins/Referrers/Columns/ReferrerUrl.php
@@ -8,6 +8,7 @@
*/
namespace Piwik\Plugins\Referrers\Columns;
+use Piwik\Common;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
use Piwik\Tracker\Action;
@@ -35,4 +36,16 @@ class ReferrerUrl extends Base
return $information['referer_url'];
}
+
+ public function onExistingVisit(Request $request, Visitor $visitor, $action)
+ {
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
+ if ($this->isCurrentReferrerDirectEntry($visitor)
+ && $information['referer_type'] != Common::REFERRER_TYPE_DIRECT_ENTRY
+ ) {
+ return $information['referer_url'];
+ }
+
+ return false;
+ }
}
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
index 1e7e4af8cb..8bb3685b8f 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
@@ -8,6 +8,7 @@
namespace Piwik\Plugins\Referrers\tests\Integration\Columns;
+use Piwik\Common;
use Piwik\Plugins\Referrers\Columns\Keyword;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
@@ -29,6 +30,7 @@ class ReferrerKeywordTest extends IntegrationTestCase
private $keyword;
private $idSite1 = 1;
private $idSite2 = 2;
+ private $idSite3 = 3;
public function setUp()
{
@@ -38,7 +40,8 @@ class ReferrerKeywordTest extends IntegrationTestCase
$ecommerce = false;
Fixture::createWebsite($date, $ecommerce, $name = 'test1', $url = 'http://piwik.org/');
- Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.xyz/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test2', $url = 'http://piwik.xyz/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = null);
$this->keyword = new Keyword();
}
@@ -84,9 +87,54 @@ class ReferrerKeywordTest extends IntegrationTestCase
// search engine should have keyword the search term
array('piwik', $this->idSite2, $url, 'http://google.com/search?q=piwik'),
+
+ // site w/o url
+ array($noReferrerKeyword, $this->idSite3, $url, $directReferrer . '/'),
);
}
+ /**
+ * @dataProvider getTestDataForOnExistingVisit
+ */
+ public function test_onExistingVisit_shouldSometimesOverwriteReferrerInfo($expectedKeyword, $idSite, $url, $referrerUrl, $existingType)
+ {
+ $request = $this->getRequest(array('idsite' => $idSite, 'url' => $url, 'urlref' => $referrerUrl));
+ $visitor = $this->getNewVisitor();
+ $visitor->setVisitorColumn('referer_type', $existingType);
+ $keyword = $this->keyword->onExistingVisit($request, $visitor, $action = null);
+
+ $this->assertSame($expectedKeyword, $keyword);
+ }
+
+ public function getTestDataForOnExistingVisit()
+ {
+ return [
+ // direct entry => campaign
+ ['campaignkey1', $this->idSite2, 'http://piwik.xyz/abc?pk_campaign=testfoobar&pk_keyword=campaignkey1', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => website
+ ['piwik2', $this->idSite2, 'http://piwik.xyz/abc', 'http://google.com/search?q=piwik2', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => direct entry
+ [false, $this->idSite2, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // website => direct entry
+ [false, $this->idSite2, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE],
+
+ // campaign => direct entry
+ [false, $this->idSite2, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_CAMPAIGN],
+
+ // direct entry => website (site w/o url)
+ ['piwik3', $this->idSite3, 'http://piwik.xyz/abc', 'http://google.com/search?q=piwik3', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => direct entry (site w/o url)
+ [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // website => direct entry (site w/o url)
+ [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE],
+ ];
+ }
+
private function getRequest($params)
{
return new Request($params);
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
index cd1610a178..d2d638d980 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
@@ -8,6 +8,7 @@
namespace Piwik\Plugins\Referrers\tests\Integration\Columns;
+use Piwik\Common;
use Piwik\Plugins\Referrers\Columns\ReferrerName;
use Piwik\Plugins\Referrers\Columns\ReferrerType;
use Piwik\Tests\Framework\Fixture;
@@ -32,6 +33,7 @@ class ReferrerNameTest extends IntegrationTestCase
private $idSite1 = 1;
private $idSite2 = 2;
private $idSite3 = 3;
+ private $idSite4 = 4;
public function setUp()
{
@@ -45,6 +47,7 @@ class ReferrerNameTest extends IntegrationTestCase
Fixture::createWebsite($date, $ecommerce, $name = 'test1', $url = 'http://piwik.org/foo/bar');
Fixture::createWebsite($date, $ecommerce, $name = 'test2', $url = 'http://piwik.org/');
Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.xyz/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test4', $url = null);
$this->referrerName = new ReferrerName();
}
@@ -77,21 +80,21 @@ class ReferrerNameTest extends IntegrationTestCase
return array(
// domain matches but path does not match for idsite1
- array('piwik.org', $this->idSite1, $url, $referrer),
- array('piwik.org', $this->idSite1, $url, $referrer . '/'),
+ array(null, $this->idSite1, $url, $referrer),
+ array(null, $this->idSite1, $url, $referrer . '/'),
// idSite2 matches any piwik.org path so this is a direct entry for it
array($directEntryReferrerName, $this->idSite2, $url, $referrer),
array($directEntryReferrerName, $this->idSite2, $url, $referrer . '/'),
// idSite3 has different domain so it is coming from different website
- array('piwik.org', $this->idSite3, $url, $referrer),
- array('piwik.org', $this->idSite3, $url, $referrer . '/'),
+ array(null, $this->idSite3, $url, $referrer),
+ array(null, $this->idSite3, $url, $referrer . '/'),
array($directEntryReferrerName, $this->idSite1, $url, $referrer . '/foo/bar/baz'),
array($directEntryReferrerName, $this->idSite1, $url, $referrer . '/foo/bar/baz/'),
array($directEntryReferrerName, $this->idSite1, $url, $referrer . '/foo/bar/baz?x=5'),
array($directEntryReferrerName, $this->idSite1, $url, $referrer . '/fOo/BaR/baz?x=5'),
// /not/xyz belongs to different website
- array('piwik.org', $this->idSite1, $url, $referrer . '/not/xyz'),
+ array(null, $this->idSite1, $url, $referrer . '/not/xyz'),
array($directEntryReferrerName, $this->idSite2, $url, $referrer . '/not/xyz'),
// /foo/bar/baz belongs to different website
@@ -113,9 +116,54 @@ class ReferrerNameTest extends IntegrationTestCase
// testing case where domain of referrer is not known to any site but neither is the URL, url != urlref
array('example.com', $this->idSite3, 'http://example.org', 'http://example.com/bar'),
+
+ // site w/o url
+ array($directEntryReferrerName, $this->idSite4, $url, $referrer . '/'),
);
}
+ /**
+ * @dataProvider getTestDataForOnExistingVisit
+ */
+ public function test_onExistingVisit_shouldSometimesOverwriteReferrerInfo($expectedName, $idSite, $url, $referrerUrl, $existingType)
+ {
+ $request = $this->getRequest(array('idsite' => $idSite, 'url' => $url, 'urlref' => $referrerUrl));
+ $visitor = $this->getNewVisitor();
+ $visitor->setVisitorColumn('referer_type', $existingType);
+ $name = $this->referrerName->onExistingVisit($request, $visitor, $action = null);
+
+ $this->assertSame($expectedName, $name);
+ }
+
+ public function getTestDataForOnExistingVisit()
+ {
+ return [
+ // direct entry => campaign
+ ['testfoobar', $this->idSite3, 'http://piwik.xyz/abc?pk_campaign=testfoobar', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => website
+ ['piwik.org', $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => direct entry
+ [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // website => direct entry
+ [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE],
+
+ // campaign => direct entry
+ [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_CAMPAIGN],
+
+ // direct entry => website (site w/o url)
+ ['piwik.org', $this->idSite4, 'http://piwik.xyz/abc', 'http://piwik.org/', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => direct entry (site w/o url)
+ [false, $this->idSite4, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // website => direct entry (site w/o url)
+ [false, $this->idSite4, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE],
+ ];
+ }
+
private function getRequest($params)
{
return new Request($params);
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
index 207736934e..fb9323754d 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
@@ -33,6 +33,7 @@ class ReferrerTypeTest extends IntegrationTestCase
private $idSite2 = 2;
private $idSite3 = 3;
private $idSite4 = 4;
+ private $idSite5 = 5;
public function setUp()
{
@@ -47,6 +48,7 @@ class ReferrerTypeTest extends IntegrationTestCase
Fixture::createWebsite($date, $ecommerce, $name = 'test2', $url = 'http://piwik.org/');
Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.xyz/');
Fixture::createWebsite($date, $ecommerce, $name = 'test4', $url = 'http://google.com/subdir/', 1, null, null, null, null, $excludeUnknownUrls = 1);
+ Fixture::createWebsite($date, $ecommerce, $name = 'test5', $url = null);
$this->referrerType = new ReferrerType();
}
@@ -78,20 +80,20 @@ class ReferrerTypeTest extends IntegrationTestCase
// $expectedType, $idSite, $url, $referrerUrl
return array(
// domain matches but path does not match for idsite1
- array(Common::REFERRER_TYPE_WEBSITE, $this->idSite1, $url, $referrer),
- array(Common::REFERRER_TYPE_WEBSITE, $this->idSite1, $url, $referrer . '/'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer . '/'),
// idSite2 matches any piwik.org path so this is a direct entry for it
array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite2, $url, $referrer),
array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite2, $url, $referrer . '/'),
// idSite3 has different domain so it is coming from different website
- array(Common::REFERRER_TYPE_WEBSITE, $this->idSite3, $url, $referrer),
- array(Common::REFERRER_TYPE_WEBSITE, $this->idSite3, $url, $referrer . '/'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite3, $url, $referrer),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite3, $url, $referrer . '/'),
array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer . '/foo/bar/baz'),
array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer . '/foo/bar/baz/'),
array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer . '/foo/bar/baz?x=5'),
// /not/xyz belongs to different website
- array(Common::REFERRER_TYPE_WEBSITE, $this->idSite1, $url, $referrer . '/not/xyz'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite1, $url, $referrer . '/not/xyz'),
array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite2, $url, $referrer . '/not/xyz'),
// /foo/bar/baz belongs to different website
@@ -120,18 +122,63 @@ class ReferrerTypeTest extends IntegrationTestCase
####### testing specific case:
## - ignore unknown urls is activated for idSite4
- // referrer comes from another subdir, but same host => external website
- array(Common::REFERRER_TYPE_WEBSITE, $this->idSite4, 'http://google.com/subdir/site', 'http://google.com/base'),
+ // referrer comes from another subdir, but same host => direct entry
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/site', 'http://google.com/base'),
// referrer comes from same subdir and host => direct entry
array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/page', 'http://google.com/subdir/x'),
array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/', 'http://google.com/subdir/?q=test'),
// referrer comes from another subdir, but same host, query matches search engine definition => search engine
- array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.com/search?q=test'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.com/search?q=test'),
// referrer comes from search engine not matching site
- array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.fr/search?q=test')
+ array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.fr/search?q=test'),
+
+ // site w/o url
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite5, $url, $referrer . '/'),
);
}
+ /**
+ * @dataProvider getTestDataForOnExistingVisit
+ */
+ public function test_onExistingVisit_shouldSometimesOverwriteReferrerInfo($expectedType, $idSite, $url, $referrerUrl, $existingType)
+ {
+ $request = $this->getRequest(array('idsite' => $idSite, 'url' => $url, 'urlref' => $referrerUrl));
+ $visitor = $this->getNewVisitor();
+ $visitor->setVisitorColumn('referer_type', $existingType);
+ $type = $this->referrerType->onExistingVisit($request, $visitor, $action = null);
+
+ $this->assertSame($expectedType, $type);
+ }
+
+ public function getTestDataForOnExistingVisit()
+ {
+ return [
+ // direct entry => campaign
+ [Common::REFERRER_TYPE_CAMPAIGN, $this->idSite3, 'http://piwik.xyz/abc?pk_campaign=testfoobar', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => website
+ [Common::REFERRER_TYPE_WEBSITE, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.org', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => direct entry
+ [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // website => direct entry
+ [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE],
+
+ // campaign => direct entry
+ [false, $this->idSite3, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_CAMPAIGN],
+
+ // direct entry => website (site w/o url)
+ [Common::REFERRER_TYPE_WEBSITE, $this->idSite5, 'http://piwik.xyz/abc', 'http://piwik.org/', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // direct entry => direct entry (site w/o url)
+ [false, $this->idSite5, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_DIRECT_ENTRY],
+
+ // website => direct entry (site w/o url)
+ [false, $this->idSite5, 'http://piwik.xyz/abc', 'http://piwik.xyz/def', Common::REFERRER_TYPE_WEBSITE],
+ ];
+ }
+
private function getRequest($params)
{
return new Request($params);