From a68ed87a60f246e97073c202413a3ce0575dce7b Mon Sep 17 00:00:00 2001
From: diosmosis <benakamoorthi@fastmail.fm>
Date: Sat, 14 Dec 2013 23:14:58 +0000
Subject: [PATCH] Refs #4189, use new Omni test fixture for UI tests that
 combines all other fixtures.

---
 tests/PHPUnit/BaseFixture.php                 | 12 ++-
 .../Fixtures/FewVisitsWithSetVisitorId.php    |  4 +-
 tests/PHPUnit/Fixtures/InvalidVisits.php      |  4 +-
 .../Fixtures/ManySitesImportedLogs.php        | 16 +++-
 .../ManySitesImportedLogsWithXssAttempts.php  | 21 +++--
 .../PHPUnit/Fixtures/ManyVisitsWithGeoIP.php  | 14 +++-
 .../ManyVisitsWithMockLocationProvider.php    |  4 +-
 ...VisitsWithSubDirReferrersAndCustomVars.php |  4 +-
 tests/PHPUnit/Fixtures/OmniFixture.php        | 81 +++++++++++++++++++
 .../Fixtures/OneVisitSeveralPageViews.php     |  4 +-
 .../OneVisitWithAbnormalPageviewUrls.php      |  4 +-
 .../PHPUnit/Fixtures/OneVisitorTwoVisits.php  | 23 ++++--
 .../Fixtures/SomeVisitsAllConversions.php     | 24 +++---
 ...sCustomVariablesCampaignsNotHeuristics.php |  9 ++-
 ...SomeVisitsManyPageviewsWithTransitions.php |  6 +-
 .../Fixtures/SomeVisitsWithLongUrls.php       |  4 +-
 .../SomeVisitsWithNonUnicodePageTitles.php    |  5 +-
 .../Fixtures/ThreeGoalsOnePageview.php        | 33 +++++---
 ...ThreeSitesWithManyVisitsWithSiteSearch.php | 15 +++-
 .../TwoSitesEcommerceOrderWithItems.php       | 20 +++--
 ...erSeveralDaysWithSearchEngineReferrers.php | 26 ++++--
 .../TwoSitesTwoVisitorsDifferentDays.php      | 18 ++++-
 .../PHPUnit/Fixtures/TwoSitesVisitsInPast.php |  9 ++-
 .../Fixtures/TwoSitesWithAnnotations.php      |  9 ++-
 .../Fixtures/TwoVisitsNoKeywordWithBot.php    |  9 ++-
 .../Fixtures/TwoVisitsWithCustomEvents.php    |  9 ++-
 .../Fixtures/TwoVisitsWithCustomVariables.php | 14 +++-
 .../VisitOverSeveralDaysImportedLogs.php      |  4 +-
 .../Fixtures/VisitsOverSeveralDays.php        |  9 ++-
 .../PHPUnit/Integration/RowEvolutionTest.php  | 14 ++--
 tests/PHPUnit/UI                              |  2 +-
 tests/PHPUnit/UITest.php                      |  2 +
 32 files changed, 336 insertions(+), 96 deletions(-)
 create mode 100644 tests/PHPUnit/Fixtures/OmniFixture.php

diff --git a/tests/PHPUnit/BaseFixture.php b/tests/PHPUnit/BaseFixture.php
index b94dbabd6c..fffe2aa4a4 100644
--- a/tests/PHPUnit/BaseFixture.php
+++ b/tests/PHPUnit/BaseFixture.php
@@ -400,4 +400,14 @@ abstract class Test_Piwik_BaseFixture extends PHPUnit_Framework_Assert
 
         return $output;
     }
-}
+
+    public static function siteCreated($idSite)
+    {
+        return Db::fetchOne("SELECT COUNT(*) FROM " . Common::prefixTable('site') . " WHERE idsite = ?", array($idSite)) != 0;
+    }
+
+    public static function goalExists($idSite, $idGoal)
+    {
+        return Db::fetchOne("SELECT COUNT(*) FROM " . Common::prefixTable('goal') . " WHERE idgoal = ? AND idsite = ?", array($idGoal, $idSite)) != 0;
+    }
+}
\ No newline at end of file
diff --git a/tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php b/tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php
index 2284a14aa9..189a5ce1d3 100644
--- a/tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php
+++ b/tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php
@@ -30,7 +30,9 @@ class Test_Piwik_Fixture_FewVisitsWithSetVisitorId extends Test_Piwik_BaseFixtur
     private function setUpWebsitesAndGoals()
     {
         // tests run in UTC, the Tracker in UTC
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/InvalidVisits.php b/tests/PHPUnit/Fixtures/InvalidVisits.php
index b2938b6b2d..14aafc7911 100644
--- a/tests/PHPUnit/Fixtures/InvalidVisits.php
+++ b/tests/PHPUnit/Fixtures/InvalidVisits.php
@@ -32,7 +32,9 @@ class Test_Piwik_Fixture_InvalidVisits extends Test_Piwik_BaseFixture
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/ManySitesImportedLogs.php b/tests/PHPUnit/Fixtures/ManySitesImportedLogs.php
index eb3ee16ed9..d4f66a67d0 100644
--- a/tests/PHPUnit/Fixtures/ManySitesImportedLogs.php
+++ b/tests/PHPUnit/Fixtures/ManySitesImportedLogs.php
@@ -47,10 +47,18 @@ class Test_Piwik_Fixture_ManySitesImportedLogs extends Test_Piwik_BaseFixture
     public function setUpWebsitesAndGoals()
     {
         // for conversion testing
-        self::createWebsite($this->dateTime);
-        APIGoals::getInstance()->addGoal($this->idSite, 'all', 'url', 'http', 'contains', false, 5);
-        self::createWebsite($this->dateTime, $ecommerce = 0, $siteName = 'Piwik test two',
-            $siteUrl = 'http://example-site-two.com');
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            APIGoals::getInstance()->addGoal($this->idSite, 'all', 'url', 'http', 'contains', false, 5);
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            self::createWebsite($this->dateTime, $ecommerce = 0, $siteName = 'Piwik test two',
+                $siteUrl = 'http://example-site-two.com');
+        }
     }
     
     public function getDefaultSegments()
diff --git a/tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php b/tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php
index 1f268e0f39..ea78fba9c1 100644
--- a/tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php
+++ b/tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php
@@ -49,13 +49,20 @@ class Test_Piwik_Fixture_ManySitesImportedLogsWithXssAttempts extends Test_Piwik
     public function setUpWebsitesAndGoals()
     {
         // for conversion testing
-        $siteName = self::makeXssContent("site name", $sanitize = true);
-        self::createWebsite($this->dateTime, $ecommerce = 1, $siteName);
-        APIGoals::getInstance()->addGoal(
-            $this->idSite, self::makeXssContent("goal name"), 'url', 'http', 'contains', false, 5);
-        
-        self::createWebsite($this->dateTime, $ecommerce = 0, $siteName = 'Piwik test two',
-            $siteUrl = 'http://example-site-two.com');
+        if (!self::siteCreated($idSite = 1)) {
+            $siteName = self::makeXssContent("site name", $sanitize = true);
+            self::createWebsite($this->dateTime, $ecommerce = 1, $siteName);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            APIGoals::getInstance()->addGoal(
+                $this->idSite, self::makeXssContent("goal name"), 'url', 'http', 'contains', false, 5);
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            self::createWebsite($this->dateTime, $ecommerce = 0, $siteName = 'Piwik test two',
+                $siteUrl = 'http://example-site-two.com');
+        }
     }
     
     /** Creates two dashboards that split the widgets up into different groups. */
diff --git a/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php b/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php
index 29176789d6..524c92bdd1 100644
--- a/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php
+++ b/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php
@@ -65,9 +65,17 @@ class Test_Piwik_Fixture_ManyVisitsWithGeoIP extends Test_Piwik_BaseFixture
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime, 0, "Site 1");
-        $this->idGoal = API::getInstance()->addGoal($this->idSite, 'all', 'url', 'http', 'contains', false, 5);
-        $this->idGoal2 = API::getInstance()->addGoal($this->idSite, 'two', 'url', 'xxxxxxxxxxxxx', 'contains', false, 5);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime, 0, "Site 1");
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            $this->idGoal = API::getInstance()->addGoal($this->idSite, 'all', 'url', 'http', 'contains', false, 5);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 2)) {
+            $this->idGoal2 = API::getInstance()->addGoal($this->idSite, 'two', 'url', 'xxxxxxxxxxxxx', 'contains', false, 5);
+        }
     }
 
     private function trackVisits($visitorCount, $setIp = false, $useLocal = true, $doBulk = false)
diff --git a/tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php b/tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php
index b34cca1ad3..9a4a228f47 100644
--- a/tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php
+++ b/tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php
@@ -39,7 +39,9 @@ class Test_Piwik_Fixture_ManyVisitsWithMockLocationProvider extends Test_Piwik_B
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php b/tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php
index abbe2b13ee..f933df190d 100644
--- a/tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php
+++ b/tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php
@@ -30,7 +30,9 @@ class Test_Piwik_Fixture_ManyVisitsWithSubDirReferrersAndCustomVars extends Test
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/OmniFixture.php b/tests/PHPUnit/Fixtures/OmniFixture.php
new file mode 100644
index 0000000000..061f2f4e4b
--- /dev/null
+++ b/tests/PHPUnit/Fixtures/OmniFixture.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+use Piwik\Date;
+use Piwik\Tracker\Visit;
+
+/**
+ * This fixture is the combination of every other fixture defined by Piwik. Should be used
+ * with year periods.
+ */
+class Test_Piwik_Fixture_OmniFixture extends Test_Piwik_BaseFixture
+{
+    public $month = '2012-01';
+    public $idSite = 'all';
+    public $dateTime = '2012-02-01';
+    public $now = null;
+
+    public $fixtures = array();
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $date = $this->month . '-01';
+
+        $classes = get_declared_classes();
+        foreach ($classes as $className) {
+            if (is_subclass_of($className, 'Test_Piwik_BaseFixture')
+                && $className != __CLASS__
+            ) {
+                $fixture = new $className();
+                if (!property_exists($fixture, 'dateTime')) {
+                    continue;
+                }
+
+                $fixture->dateTime = $this->adjustDateTime($fixture->dateTime, $date);
+
+                $this->fixtures[$className] = $fixture;
+
+                $date = Date::factory($date)->addDay(1)->toString();
+            }
+        }
+
+        $this->now = $this->fixtures['Test_Piwik_Fixture_ManySitesImportedLogsWithXssAttempts']->now;
+
+        // make sure Test_Piwik_Fixture_ManySitesImportedLogsWithXssAttempts is the first fixture
+        $fixture = $this->fixtures['Test_Piwik_Fixture_ManySitesImportedLogsWithXssAttempts'];
+        unset($this->fixtures['Test_Piwik_Fixture_ManySitesImportedLogsWithXssAttempts']);
+        $this->fixtures = array_merge(array('Test_Piwik_Fixture_ManySitesImportedLogsWithXssAttempts' => $fixture), $this->fixtures);
+    }
+
+    private function adjustDateTime($dateTime, $adjustToDate)
+    {
+        $parts = explode(' ', $dateTime);
+
+        $result = $adjustToDate . ' ';
+        $result .= isset($parts[1]) ? $parts[1] : '11:22:33';
+
+        return $result;
+    }
+
+    public function setUp()
+    {
+        foreach ($this->fixtures as $name => $fixture) {
+            $fixture->setUp();
+        }
+    }
+
+    public function tearDown()
+    {
+        foreach ($this->fixtures as $fixture) {
+            $fixture->tearDown();
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php b/tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php
index 2f2341dd82..f4268ee911 100644
--- a/tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php
+++ b/tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php
@@ -28,7 +28,9 @@ class Test_Piwik_Fixture_OneVisitSeveralPageViews extends Test_Piwik_BaseFixture
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php b/tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php
index 638a35d5b2..ab3fe5278a 100644
--- a/tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php
+++ b/tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php
@@ -29,7 +29,9 @@ class Test_Piwik_Fixture_OneVisitWithAbnormalPageviewUrls extends Test_Piwik_Bas
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php b/tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php
index cc150e4482..955abedf56 100644
--- a/tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php
+++ b/tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php
@@ -36,10 +36,17 @@ class Test_Piwik_Fixture_OneVisitorTwoVisits extends Test_Piwik_BaseFixture
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            $this->idSiteEmptyBis = $this->createWebsite($this->dateTime);
+        }
 
-        $this->idSiteEmptyBis = $this->createWebsite($this->dateTime);
-        $this->idSiteEmptyTer = $this->createWebsite($this->dateTime);
+        if (!self::siteCreated($idStie = 3)) {
+            $this->idSiteEmptyTer = $this->createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
@@ -109,7 +116,11 @@ class Test_Piwik_Fixture_OneVisitorTwoVisits extends Test_Piwik_BaseFixture
         self::checkResponse($t->doTrackAction('http://dev.piwik.org/svn', 'link'));
 
         // Create Goal 1: Triggered by JS, after 18 minutes
-        $idGoal = APIGoals::getInstance()->addGoal($idSite, 'triggered js', 'manually', '', '');
+        $idGoal = 1;
+        if (!self::goalExists($idSite, $idGoal)) {
+            $idGoal = APIGoals::getInstance()->addGoal($idSite, 'triggered js', 'manually', '', '');
+        }
+
         $t->setForceVisitDateTime(Date::factory($dateTime)->addHour(0.3)->getDatetime());
 
         // Change to Thai  browser to ensure the conversion is credited to FR instead (the visitor initial country)
@@ -146,7 +157,9 @@ class Test_Piwik_Fixture_OneVisitorTwoVisits extends Test_Piwik_BaseFixture
         // End of first visit: 24min
 
         // Create Goal 2: Matching on URL
-        APIGoals::getInstance()->addGoal($idSite, 'matching purchase.htm', 'url', '(.*)store\/purchase\.(.*)', 'regex', false, $revenue = 1);
+        if (!self::goalExists($idSite, $idGoal = 2)) {
+            APIGoals::getInstance()->addGoal($idSite, 'matching purchase.htm', 'url', '(.*)store\/purchase\.(.*)', 'regex', false, $revenue = 1);
+        }
 
         // -
         // Start of returning visit, 1 hour after first page view
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php b/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
index 272a809154..6fef9443d5 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
@@ -31,19 +31,25 @@ class Piwik_Test_Fixture_SomeVisitsAllConversions extends Test_Piwik_BaseFixture
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
 
         // First, a goal that is only recorded once per visit
-        API::getInstance()->addGoal(
-            $this->idSite, 'triggered js ONCE', 'title', 'Thank you', 'contains', $caseSensitive = false,
-            $revenue = 10, $allowMultipleConversions = false
-        );
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            API::getInstance()->addGoal(
+                $this->idSite, 'triggered js ONCE', 'title', 'Thank you', 'contains', $caseSensitive = false,
+                $revenue = 10, $allowMultipleConversions = false
+            );
+        }
 
         // Second, a goal allowing multiple conversions
-        API::getInstance()->addGoal(
-            $this->idSite, 'triggered js MULTIPLE ALLOWED', 'manually', '', '', $caseSensitive = false,
-            $revenue = 10, $allowMultipleConversions = true
-        );
+        if (!self::goalExists($idSite = 1, $idGoal = 2)) {
+            API::getInstance()->addGoal(
+                $this->idSite, 'triggered js MULTIPLE ALLOWED', 'manually', '', '', $caseSensitive = false,
+                $revenue = 10, $allowMultipleConversions = true
+            );
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php b/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
index bd15390b10..70c8bb3f49 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
@@ -31,8 +31,13 @@ class Test_Piwik_Fixture_SomeVisitsCustomVariablesCampaignsNotHeuristics extends
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
-        API::getInstance()->addGoal($this->idSite, 'triggered js', 'manually', '', '');
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            API::getInstance()->addGoal($this->idSite, 'triggered js', 'manually', '', '');
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php b/tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php
index ba7032f177..68f09c06e0 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php
@@ -31,8 +31,10 @@ class Test_Piwik_Fixture_SomeVisitsManyPageviewsWithTransitions extends Test_Piw
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime, $ecommerce = 0, $siteName = 'Piwik test', $siteUrl = false,
-                            $siteSearch = 1);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime, $ecommerce = 0, $siteName = 'Piwik test', $siteUrl = false,
+                                $siteSearch = 1);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php b/tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php
index c78a3fb9da..0284ff05ea 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php
@@ -29,7 +29,9 @@ class Test_Piwik_Fixture_SomeVisitsWithLongUrls extends Test_Piwik_BaseFixture
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php b/tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php
index 23819ec4e3..96758636a9 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php
@@ -35,7 +35,10 @@ class Test_Piwik_Fixture_SomeVisitsWithNonUnicodePageTitles extends Test_Piwik_B
     private function setUpWebsites()
     {
         API::getInstance()->setGlobalSearchParameters($searchKeywordParameters = 'gkwd', $searchCategoryParameters = 'gcat');
-        self::createWebsite(Date::factory($this->dateTime)->getDatetime(), 0, "Site 1 - Site search", $siteurl = false, $search = 1, $searchKwd = 'q,mykwd,p', $searchCat = 'cats');
+
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite(Date::factory($this->dateTime)->getDatetime(), 0, "Site 1 - Site search", $siteurl = false, $search = 1, $searchKwd = 'q,mykwd,p', $searchCat = 'cats');
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php b/tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php
index 71d0be9fb0..fbb3579c39 100644
--- a/tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php
+++ b/tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php
@@ -33,18 +33,27 @@ class Test_Piwik_Fixture_ThreeGoalsOnePageview extends Test_Piwik_BaseFixture
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime, $ecommerce = 1);
-        API::getInstance()->addGoal(
-            $this->idSite, 'Goal 1 - Thank you', 'title', 'Thank you', 'contains', $caseSensitive = false,
-            $revenue = 10, $allowMultipleConversions = 1
-        );
-
-        API::getInstance()->addGoal(
-            $this->idSite, 'Goal 2 - Hello', 'url', 'hellow', 'contains', $caseSensitive = false,
-            $revenue = 10, $allowMultipleConversions = 0
-        );
-
-        API::getInstance()->addGoal($this->idSite, 'triggered js', 'manually', '', '');
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime, $ecommerce = 1);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            API::getInstance()->addGoal(
+                $this->idSite, 'Goal 1 - Thank you', 'title', 'Thank you', 'contains', $caseSensitive = false,
+                $revenue = 10, $allowMultipleConversions = 1
+            );
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 2)) {
+            API::getInstance()->addGoal(
+                $this->idSite, 'Goal 2 - Hello', 'url', 'hellow', 'contains', $caseSensitive = false,
+                $revenue = 10, $allowMultipleConversions = 0
+            );
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 3)) {
+            API::getInstance()->addGoal($this->idSite, 'triggered js', 'manually', '', '');
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php b/tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php
index 353ad4ec31..7fe9816173 100644
--- a/tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php
+++ b/tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php
@@ -38,9 +38,18 @@ class Test_Piwik_Fixture_ThreeSitesWithManyVisitsWithSiteSearch extends Test_Piw
     protected function setUpWebsites()
     {
         API::getInstance()->setGlobalSearchParameters($searchKeywordParameters = 'gkwd', $searchCategoryParameters = 'gcat');
-        self::createWebsite(Date::factory($this->dateTime)->subHour(200)->getDatetime(), 0, "Site 1 - Site search", $siteurl = false, $search = 1, $searchKwd = 'q,mykwd,p', $searchCat = 'cats');
-        self::createWebsite(Date::factory($this->dateTime)->subHour(400)->getDatetime(), 0, "Site 2 - Site search use default", $siteurl = false, $search = 1, $searchKwd = '', $searchCat = '');
-        self::createWebsite(Date::factory($this->dateTime)->subHour(600)->getDatetime(), 0, "Site 3 - No site search", $siteurl = false, $search = 0);
+
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite(Date::factory($this->dateTime)->subHour(200)->getDatetime(), 0, "Site 1 - Site search", $siteurl = false, $search = 1, $searchKwd = 'q,mykwd,p', $searchCat = 'cats');
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            self::createWebsite(Date::factory($this->dateTime)->subHour(400)->getDatetime(), 0, "Site 2 - Site search use default", $siteurl = false, $search = 1, $searchKwd = '', $searchCat = '');
+        }
+
+        if (!self::siteCreated($idSite = 3)) {
+            self::createWebsite(Date::factory($this->dateTime)->subHour(600)->getDatetime(), 0, "Site 3 - No site search", $siteurl = false, $search = 0);
+        }
     }
 
     protected function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php b/tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php
index 0402a16325..d83a201809 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php
@@ -34,12 +34,20 @@ class Test_Piwik_Fixture_TwoSitesEcommerceOrderWithItems extends Test_Piwik_Base
 
     private function setUpWebsitesAndGoals()
     {
-        $this->idSite = self::createWebsite($this->dateTime, $ecommerce = 1);
-        $this->idSite2 = self::createWebsite($this->dateTime);
-        API::getInstance()->addGoal(
-            $this->idSite, 'title match, triggered ONCE', 'title', 'incredible', 'contains',
-            $caseSensitive = false, $revenue = 10, $allowMultipleConversions = true
-        );
+        if (!self::siteCreated($idSite = 1)) {
+            $this->idSite = self::createWebsite($this->dateTime, $ecommerce = 1);
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            $this->idSite2 = self::createWebsite($this->dateTime);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            API::getInstance()->addGoal(
+                $this->idSite, 'title match, triggered ONCE', 'title', 'incredible', 'contains',
+                $caseSensitive = false, $revenue = 10, $allowMultipleConversions = true
+            );
+        }
     }
 
     protected function trackVisitsSite1($url, $orderId = '937nsjusu 3894', $orderId2 = '1037nsjusu4s3894', $orderId3 = '666', $orderId4 = '777')
diff --git a/tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php b/tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php
index 29a29c39c8..318b18594c 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php
@@ -14,7 +14,7 @@ use Piwik\Plugins\Goals\API;
  */
 class Test_Piwik_Fixture_TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers extends Test_Piwik_BaseFixture
 {
-    public $today = '2010-03-06 11:22:33';
+    public $dateTime = '2010-02-01 11:22:33';
     public $idSite = 1;
     public $idSite2 = 2;
     public $keywords = array(
@@ -36,19 +36,29 @@ class Test_Piwik_Fixture_TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferr
 
     private function setUpWebsitesAndGoals()
     {
-        $siteCreated = '2010-02-01 11:22:33';
+        $siteCreated = $this->dateTime;
 
-        self::createWebsite($siteCreated);
-        API::getInstance()->addGoal($this->idSite, 'triggered php', 'manually', '', '');
-        API::getInstance()->addGoal(
-            $this->idSite, 'another triggered php', 'manually', '', '', false, false, true);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($siteCreated);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            API::getInstance()->addGoal($this->idSite, 'triggered php', 'manually', '', '');
+        }
 
-        self::createWebsite($siteCreated);
+        if (!self::goalExists($idSite = 1, $idGoal = 2)) {
+            API::getInstance()->addGoal(
+                $this->idSite, 'another triggered php', 'manually', '', '', false, false, true);
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            self::createWebsite($siteCreated);
+        }
     }
 
     private function trackVisits()
     {
-        $dateTime = $this->today;
+        $dateTime = Date::factory($this->dateTime)->addPeriod(1, 'MONTH')->addDay(5)->getDatetime();
         $idSite = $this->idSite;
         $idSite2 = $this->idSite2;
 
diff --git a/tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php b/tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php
index 36b384d978..bb4071b1cb 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php
@@ -39,12 +39,22 @@ class Test_Piwik_Fixture_TwoSitesTwoVisitorsDifferentDays extends Test_Piwik_Bas
         $ecommerce = $this->allowConversions ? 1 : 0;
 
         // tests run in UTC, the Tracker in UTC
-        self::createWebsite($this->dateTime, $ecommerce, "Site 1");
-        self::createWebsite($this->dateTime, 0, "Site 2");
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime, $ecommerce, "Site 1");
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            self::createWebsite($this->dateTime, 0, "Site 2");
+        }
 
         if ($this->allowConversions) {
-            APIGoals::getInstance()->addGoal($this->idSite1, 'all', 'url', 'http', 'contains', false, 5);
-            APIGoals::getInstance()->addGoal($this->idSite2, 'all', 'url', 'http', 'contains');
+            if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+                APIGoals::getInstance()->addGoal($this->idSite1, 'all', 'url', 'http', 'contains', false, 5);
+            }
+
+            if (!self::goalExists($idSite = 1, $idGoal = 2)) {
+                APIGoals::getInstance()->addGoal($this->idSite2, 'all', 'url', 'http', 'contains');
+            }
         }
 
         APISitesManager::getInstance()->updateSite(
diff --git a/tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php b/tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php
index eae1b9749f..5b1ddfc0a0 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php
@@ -32,8 +32,13 @@ class Test_Piwik_Fixture_TwoSitesVisitsInPast extends Test_Piwik_BaseFixture
 
     public function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTimeFirstDateWebsite1);
-        self::createWebsite($this->dateTimeFirstDateWebsite2);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTimeFirstDateWebsite1);
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            self::createWebsite($this->dateTimeFirstDateWebsite2);
+        }
     }
 
     protected function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php b/tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php
index 29f9d75da8..26cd3a2092 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php
@@ -67,7 +67,12 @@ class Test_Piwik_Fixture_TwoSitesWithAnnotations extends Test_Piwik_BaseFixture
     private function setUpWebsitesAndGoals()
     {
         // add two websites
-        self::createWebsite($this->dateTime, $ecommerce = 1);
-        self::createWebsite($this->dateTime, $ecommerce = 1);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime, $ecommerce = 1);
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            self::createWebsite($this->dateTime, $ecommerce = 1);
+        }
     }
 }
diff --git a/tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php b/tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php
index 2e69bacded..51a9ef8651 100644
--- a/tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php
+++ b/tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php
@@ -30,7 +30,9 @@ class Test_Piwik_Fixture_TwoVisitsNoKeywordWithBot extends Test_Piwik_BaseFixtur
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
@@ -50,7 +52,10 @@ class Test_Piwik_Fixture_TwoVisitsNoKeywordWithBot extends Test_Piwik_BaseFixtur
         $t->setUrlReferrer('http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CC&url=http%3A%2F%2Fpiwik.org%2F&ei=&usg=');
         $t->setUrl('http://example.org/this%20is%20cool!');
         self::checkResponse($t->doTrackPageView('incredible title!'));
-        $idGoal = API::getInstance()->addGoal($idSite, 'triggered js', 'manually', '', '');
+        $idGoal = 1;
+        if (!self::goalExists($idSite, $idGoal)) {
+            $idGoal = API::getInstance()->addGoal($idSite, 'triggered js', 'manually', '', '');
+        }
         $t->setForceVisitDateTime(Date::factory($dateTime)->addHour(0.3)->getDatetime());
         self::checkResponse($t->doTrackGoal($idGoal, $revenue = 42));
 
diff --git a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php b/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php
index 303d32c3e6..88ba17670c 100644
--- a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php
+++ b/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php
@@ -26,8 +26,13 @@ class Test_Piwik_Fixture_TwoVisitsWithCustomEvents extends Test_Piwik_BaseFixtur
     private function setUpWebsitesAndGoals()
     {
         // tests run in UTC, the Tracker in UTC
-        self::createWebsite($this->dateTime);
-        APIGoals::getInstance()->addGoal($this->idSite, 'triggered js', 'manually', '', '');
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            APIGoals::getInstance()->addGoal($this->idSite, 'triggered js', 'manually', '', '');
+        }
     }
 
     public function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php b/tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php
index 46ef24c36d..a707b22ef2 100644
--- a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php
+++ b/tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php
@@ -39,9 +39,17 @@ class Test_Piwik_Fixture_TwoVisitsWithCustomVariables extends Test_Piwik_BaseFix
     private function setUpWebsitesAndGoals()
     {
         // tests run in UTC, the Tracker in UTC
-        self::createWebsite($this->dateTime);
-        API::getInstance()->addGoal($this->idSite, 'triggered js', 'manually', '', '');
-        API::getInstance()->addGoal($this->idSite, 'second goal', 'manually', '', '');
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 1)) {
+            API::getInstance()->addGoal($this->idSite, 'triggered js', 'manually', '', '');
+        }
+
+        if (!self::goalExists($idSite = 1, $idGoal = 2)) {
+            API::getInstance()->addGoal($this->idSite, 'second goal', 'manually', '', '');
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php b/tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php
index f6fd4a223f..6a4ad7393a 100644
--- a/tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php
+++ b/tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php
@@ -29,7 +29,9 @@ class Test_Piwik_Fixture_VisitOverSeveralDaysImportedLogs extends Test_Piwik_Bas
 
     public function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTime);
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTime);
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php b/tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php
index c845fabbf1..90f01e3547 100644
--- a/tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php
+++ b/tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php
@@ -52,8 +52,13 @@ class Test_Piwik_Fixture_VisitsOverSeveralDays extends Test_Piwik_BaseFixture
 
     private function setUpWebsitesAndGoals()
     {
-        self::createWebsite($this->dateTimes[0], $ecommerce = 0, $siteName = 'Site AAAAAA');
-        self::createWebsite($this->dateTimes[0], $ecommerce = 0, $siteName = 'SITE BBbbBB');
+        if (!self::siteCreated($idSite = 1)) {
+            self::createWebsite($this->dateTimes[0], $ecommerce = 0, $siteName = 'Site AAAAAA');
+        }
+
+        if (!self::siteCreated($idSite = 2)) {
+            self::createWebsite($this->dateTimes[0], $ecommerce = 0, $siteName = 'SITE BBbbBB');
+        }
     }
 
     private function trackVisits()
diff --git a/tests/PHPUnit/Integration/RowEvolutionTest.php b/tests/PHPUnit/Integration/RowEvolutionTest.php
index 5d34aeced6..a3cb495692 100755
--- a/tests/PHPUnit/Integration/RowEvolutionTest.php
+++ b/tests/PHPUnit/Integration/RowEvolutionTest.php
@@ -26,7 +26,7 @@ class Test_Piwik_Integration_RowEvolution extends IntegrationTestCase
     {
         $idSite = self::$fixture->idSite;
         $idSite2 = self::$fixture->idSite2;
-        $today = self::$fixture->today;
+        $dateTime = self::$fixture->dateTime;
         $keywords = self::$fixture->keywords;
 
         $return = array();
@@ -34,7 +34,7 @@ class Test_Piwik_Integration_RowEvolution extends IntegrationTestCase
         $config = array(
             'testSuffix'             => '_referrer1',
             'idSite'                 => $idSite,
-            'date'                   => $today,
+            'date'                   => $dateTime,
             'otherRequestParameters' => array(
                 'date'      => '2010-02-06,2010-03-06',
                 'period'    => 'day',
@@ -138,7 +138,7 @@ class Test_Piwik_Integration_RowEvolution extends IntegrationTestCase
             'testSuffix'             => '_multipleDates_lastNoData',
             'periods'                => 'month',
             'idSite'                 => $idSite,
-            'date'                   => $today,
+            'date'                   => $dateTime,
             'otherRequestParameters' => array(
                 'date'      => '2010-02-01,2010-04-08',
                 'period'    => 'month',
@@ -153,7 +153,7 @@ class Test_Piwik_Integration_RowEvolution extends IntegrationTestCase
             'testSuffix'             => '_processedRowLabel',
             'periods'                => 'day',
             'idSite'                 => $idSite2,
-            'date'                   => $today,
+            'date'                   => $dateTime,
             'otherRequestParameters' => array(
                 'date'      => '2010-03-01,2010-03-06',
                 'period'    => 'month',
@@ -168,7 +168,7 @@ class Test_Piwik_Integration_RowEvolution extends IntegrationTestCase
             'testSuffix'             => '_mobileDesktop',
             'periods'                => 'day',
             'idSite'                 => $idSite2,
-            'date'                   => $today,
+            'date'                   => $dateTime,
             'otherRequestParameters' => array(
                 'date'      => '2010-03-01,2010-03-06',
                 'period'    => 'month',
@@ -183,7 +183,7 @@ class Test_Piwik_Integration_RowEvolution extends IntegrationTestCase
             'testSuffix'             => '_multiWithFilterLimit',
             'periods'                => 'day',
             'idSite'                 => $idSite,
-            'date'                   => $today,
+            'date'                   => $dateTime,
             'otherRequestParameters' => array(
                 'date'         => '2010-03-01,2010-03-06',
                 'period'       => 'day',
@@ -198,7 +198,7 @@ class Test_Piwik_Integration_RowEvolution extends IntegrationTestCase
             'testSuffix'             => '_multiWithNoData',
             'periods'                => 'day',
             'idSite'                 => $idSite,
-            'date'                   => $today,
+            'date'                   => $dateTime,
             'otherRequestParameters' => array(
                 'date'      => '2010-04-01,2010-04-06',
                 'period'    => 'day',
diff --git a/tests/PHPUnit/UI b/tests/PHPUnit/UI
index 673d21c6a7..c316d4b07f 160000
--- a/tests/PHPUnit/UI
+++ b/tests/PHPUnit/UI
@@ -1 +1 @@
-Subproject commit 673d21c6a750d8280f4e9ab9d203072dd8d844d2
+Subproject commit c316d4b07f69cb153605b095eb74279ed7aad218
diff --git a/tests/PHPUnit/UITest.php b/tests/PHPUnit/UITest.php
index da6811205f..5d7c555a32 100644
--- a/tests/PHPUnit/UITest.php
+++ b/tests/PHPUnit/UITest.php
@@ -11,6 +11,7 @@ use Piwik\Date;
 use Piwik\Db;
 use Piwik\DbHelper;
 use Piwik\Plugins\VisitsSummary\API;
+use Piwik\ArchiveProcessor\Rules;
 
 abstract class UITest extends IntegrationTestCase
 {
@@ -51,6 +52,7 @@ abstract class UITest extends IntegrationTestCase
         AssetManager::removeMergedAssets();
         
         // launch archiving so tests don't run out of time
+        Rules::$purgeDisabledByTests = true;
         $date = Date::factory(static::$fixture->dateTime)->toString();
         API::getInstance()->get(static::$fixture->idSite, 'year', $date);
 
-- 
GitLab