From ecfe8b37d9806dc779036bb61b4eb32a8e240899 Mon Sep 17 00:00:00 2001
From: sgiehl <stefangiehl@gmail.com>
Date: Sun, 24 Jun 2012 19:56:27 +0000
Subject: [PATCH] refs #3227 added first database tests

git-svn-id: http://dev.piwik.org/svn/trunk@6502 59fd770c-687e-43c8-a1e3-f5a4ff64c105
---
 tests/PHPUnit/Core/OptionTest.php            | 190 ++++
 tests/PHPUnit/Core/TablePartitioningTest.php |  89 ++
 tests/PHPUnit/Core/UpdaterTest.php           |  71 ++
 tests/PHPUnit/DatabaseTestCase.php           |  78 ++
 tests/PHPUnit/Plugins/LoginTest.php          | 524 ++++++++++
 tests/PHPUnit/Plugins/SitesManagerTest.php   | 945 +++++++++++++++++++
 tests/PHPUnit/bootstrap.php                  |   2 +-
 7 files changed, 1898 insertions(+), 1 deletion(-)
 create mode 100644 tests/PHPUnit/Core/OptionTest.php
 create mode 100644 tests/PHPUnit/Core/TablePartitioningTest.php
 create mode 100644 tests/PHPUnit/Core/UpdaterTest.php
 create mode 100644 tests/PHPUnit/DatabaseTestCase.php
 create mode 100644 tests/PHPUnit/Plugins/LoginTest.php
 create mode 100644 tests/PHPUnit/Plugins/SitesManagerTest.php

diff --git a/tests/PHPUnit/Core/OptionTest.php b/tests/PHPUnit/Core/OptionTest.php
new file mode 100644
index 0000000000..9ca95e4068
--- /dev/null
+++ b/tests/PHPUnit/Core/OptionTest.php
@@ -0,0 +1,190 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ * @version $Id$
+ */
+require_once "Option.php";
+
+class OptionTest extends DatabaseTestCase
+{
+    /**
+     * @group Core
+     * @group Option
+     */
+    public function testGet()
+    {
+        // empty table, expect false (i.e., not found)
+        $this->assertFalse(Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+
+        // populate table, expect '1' (i.e., found)
+        Piwik_Query("INSERT INTO ".Piwik_Common::prefixTable('option')." VALUES ('anonymous_defaultReport', '1', false)");
+        $this->assertSame('1', Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+
+        // delete row (bypassing API), expect '1' (i.e., from cache)
+        Piwik_Query("DELETE FROM ".Piwik_Common::prefixTable('option')." WHERE option_name = ?", array('anonymous_defaultReport'));
+        $this->assertSame('1', Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+
+        // force cache reload, expect false (i.e., not found)
+        Piwik_Option::getInstance()->clearCache();
+        $this->assertFalse(Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+    }
+
+    /**
+     * @group Core
+     * @group Option
+     */
+    public function testGetOption()
+    {
+        // empty table, expect false (i.e., not found)
+        $this->assertFalse(Piwik_GetOption('anonymous_defaultReport'));
+
+        // populate table, expect '1' (i.e., found)
+        Piwik_Query("INSERT INTO ".Piwik_Common::prefixTable('option')." VALUES ('anonymous_defaultReport', '1',true)");
+        $this->assertSame('1', Piwik_GetOption('anonymous_defaultReport'));
+
+        // delete row (bypassing API), expect '1' (i.e., from cache)
+        Piwik_Query("DELETE FROM ".Piwik_Common::prefixTable('option')." WHERE option_name = ?", array('anonymous_defaultReport'));
+        $this->assertSame('1', Piwik_GetOption('anonymous_defaultReport'));
+
+        // force cache reload, expect false (i.e., not found)
+        Piwik_Option::getInstance()->clearCache();
+        $this->assertFalse(Piwik_GetOption('anonymous_defaultReport'));
+    }
+
+    /**
+     * @group Core
+     * @group Option
+     */
+    public function testSet()
+    {
+        // empty table, expect false (i.e., not found)
+        $this->assertFalse( Piwik_GetOption('anonymous_defaultReport'));
+
+        // populate table, expect '1'
+        Piwik_Option::getInstance()->set('anonymous_defaultReport', '1', true);
+        $this->assertSame('1', Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+    }
+
+    /**
+     * @group Core
+     * @group Option
+     */
+    public function testSetOption()
+    {
+        // empty table, expect false (i.e., not found)
+        $this->assertFalse(Piwik_GetOption('anonymous_defaultReport'));
+
+        // populate table, expect '1'
+        Piwik_SetOption('anonymous_defaultReport', '1', false);
+        $this->assertSame('1', Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+    }
+
+    /**
+     * @group Core
+     * @group Option
+     */
+    public function testDelete()
+    {
+        // empty table, expect false (i.e., not found)
+        $this->assertFalse(Piwik_GetOption('anonymous_defaultReport'));
+        $this->assertFalse(Piwik_GetOption('admin_defaultReport'));
+
+        // populate table, expect '1'
+        Piwik_SetOption('anonymous_defaultReport', '1', true);
+        Piwik_Option::getInstance()->delete('_defaultReport');
+        $this->assertSame('1', Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+
+        // populate table, expect '2'
+        Piwik_SetOption('admin_defaultReport', '2', false);
+        Piwik_Option::getInstance()->delete('_defaultReport');
+        $this->assertSame('2', Piwik_Option::getInstance()->get('admin_defaultReport'));
+
+        // delete with non-matching value, expect '1'
+        Piwik_Option::getInstance()->delete('anonymous_defaultReport', '2');
+        $this->assertSame('1', Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+
+        // delete with matching value, expect false
+        Piwik_Option::getInstance()->delete('anonymous_defaultReport', '1');
+        $this->assertFalse(Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+
+        // this shouldn't have been deleted, expect '2'
+        $this->assertSame('2', Piwik_Option::getInstance()->get('admin_defaultReport'));
+
+        // deleted, expect false
+        Piwik_Option::getInstance()->delete('admin_defaultReport');
+        $this->assertFalse( Piwik_Option::getInstance()->get('admin_defaultReport'));
+    }
+
+    /**
+     * @group Core
+     * @group Option
+     */
+    public function testDeleteLike()
+    {
+        // empty table, expect false (i.e., not found)
+        $this->assertFalse(Piwik_GetOption('anonymous_defaultReport'));
+        $this->assertFalse(Piwik_GetOption('admin_defaultReport'));
+        $this->assertFalse(Piwik_GetOption('visitor_defaultReport'));
+
+        // insert guard - to test unescaped underscore
+        Piwik_SetOption('adefaultReport', '0', true);
+        $this->assertTrue( Piwik_GetOption('adefaultReport') === '0' );
+
+        // populate table, expect '1'
+        Piwik_SetOption('anonymous_defaultReport', '1', true);
+        Piwik_Option::getInstance()->deleteLike('\_defaultReport');
+        $this->assertSame('1', Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // populate table, expect '2'
+        Piwik_SetOption('admin_defaultReport', '2', false);
+        Piwik_Option::getInstance()->deleteLike('\_defaultReport');
+        $this->assertSame('2', Piwik_Option::getInstance()->get('admin_defaultReport'));
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // populate table, expect '3'
+        Piwik_SetOption('visitor_defaultReport', '3', false);
+        Piwik_Option::getInstance()->deleteLike('\_defaultReport');
+        $this->assertSame('3', Piwik_Option::getInstance()->get('visitor_defaultReport'));
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // delete with non-matching value, expect '1'
+        Piwik_Option::getInstance()->deleteLike('%\_defaultReport', '4');
+        $this->assertSame('1', Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // delete with matching pattern, expect false
+        Piwik_Option::getInstance()->deleteLike('%\_defaultReport', '1');
+        $this->assertFalse(Piwik_Option::getInstance()->get('anonymous_defaultReport'));
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // this shouldn't have been deleted, expect '2' and '3'
+        $this->assertSame('2', Piwik_Option::getInstance()->get('admin_defaultReport'));
+        $this->assertSame('3', Piwik_Option::getInstance()->get('visitor_defaultReport'));
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // deleted, expect false (except for the guard)
+        Piwik_Option::getInstance()->deleteLike('%\_defaultReport');
+        $this->assertFalse(Piwik_Option::getInstance()->get('admin_defaultReport'));
+        $this->assertFalse(Piwik_Option::getInstance()->get('visitor_defaultReport'));
+
+        // unescaped backslash (single quotes)
+        Piwik_Option::getInstance()->deleteLike('%\_defaultReport');
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // escaped backslash (single quotes)
+        Piwik_Option::getInstance()->deleteLike('%\\_defaultReport');
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // unescaped backslash (double quotes)
+        Piwik_Option::getInstance()->deleteLike("%\_defaultReport");
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+
+        // escaped backslash (double quotes)
+        Piwik_Option::getInstance()->deleteLike("%\\_defaultReport");
+        $this->assertSame('0', Piwik_GetOption('adefaultReport'));
+    }
+}
diff --git a/tests/PHPUnit/Core/TablePartitioningTest.php b/tests/PHPUnit/Core/TablePartitioningTest.php
new file mode 100644
index 0000000000..f298b3166b
--- /dev/null
+++ b/tests/PHPUnit/Core/TablePartitioningTest.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ * @version $Id$
+ */
+class TablePartitioningTest extends DatabaseTestCase
+{
+    /**
+     * test no timestamp => exception
+     * @group Core
+     * @group TablePartitioning
+     * @expectedException Exception
+     */
+    function testNoTimestamp()
+    {
+        $p = new Piwik_TablePartitioning_Monthly('testtable');
+        $p->getTableName();
+    }
+    
+    /**
+     * test table absent => create
+     * @group Core
+     * @group TablePartitioning
+     */
+    function testNoTable()
+    {
+        $tableName ='archive_numeric';
+        $p = new Piwik_TablePartitioning_Monthly($tableName);
+        $timestamp = strtotime("10 September 2000");
+        $suffixShouldBe = "_2000_09";
+        $prefixTables = Piwik_Config::getInstance()->database['tables_prefix'];
+        $tablename = $prefixTables.$tableName.$suffixShouldBe;
+        
+        $p->setTimestamp( $timestamp );
+        
+        $allTablesInstalled = Piwik::getTablesInstalled($forceReload = true);
+        
+        $this->assertContains($tablename, $allTablesInstalled);
+        $this->assertEquals($tablename, $p->getTableName());
+        $this->assertEquals($tablename, (string)$p->__toString());
+    }
+    
+    /**
+     * test monthly
+     * @group Core
+     * @group TablePartitioning
+     */
+    function testMonthlyPartition()
+    {
+        $tableName ='archive_numeric';
+        $p = new Piwik_TablePartitioning_Monthly($tableName);
+        $timestamp = strtotime("10 September 2000");
+        $suffixShouldBe = "_2000_09";
+        $prefixTables = Piwik_Config::getInstance()->database['tables_prefix'];
+        $tablename = $prefixTables.$tableName.$suffixShouldBe;
+        
+        $p->setTimestamp( $timestamp );
+        
+        $allTablesInstalled = Piwik::getTablesInstalled( $forceReload = true );
+        $this->assertContains($tablename, $allTablesInstalled);
+        $this->assertEquals($tablename, $p->getTableName());
+        $this->assertEquals($tablename, (string)$p->__toString());
+    }
+    
+    /**
+     * test daily
+     * @group Core
+     * @group TablePartitioning
+     */
+    function testDailyPartition()
+    {
+        $tableName ='archive_numeric';
+        $p = new Piwik_TablePartitioning_Daily($tableName);
+        $timestamp = strtotime("10 September 2000");
+        $suffixShouldBe = "_2000_09_10";
+        $prefixTables = Piwik_Config::getInstance()->database['tables_prefix'];
+        $tablename = $prefixTables.$tableName.$suffixShouldBe;
+        
+        $p->setTimestamp( $timestamp );
+        
+        $allTablesInstalled = Piwik::getTablesInstalled();
+        $this->assertContains($tablename, $allTablesInstalled);
+        $this->assertEquals($tablename, $p->getTableName());
+        $this->assertEquals($tablename, (string)$p->__toString());
+    }
+}
diff --git a/tests/PHPUnit/Core/UpdaterTest.php b/tests/PHPUnit/Core/UpdaterTest.php
new file mode 100644
index 0000000000..44a58181b4
--- /dev/null
+++ b/tests/PHPUnit/Core/UpdaterTest.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ * @version $Id$
+ */
+class UpdaterTest extends DatabaseTestCase 
+{
+    /**
+     * @group Core
+     * @group Updater
+     */
+    public function testUpdaterChecksCoreVersionAndDetectsUpdateFile()
+    {
+        $updater = new Piwik_Updater();
+        $updater->pathUpdateFileCore = PIWIK_INCLUDE_PATH . '/tests/resources/Updater/core/';
+        $updater->recordComponentSuccessfullyUpdated('core', '0.1');
+        $updater->addComponentToCheck('core', '0.3');
+        $componentsWithUpdateFile = $updater->getComponentsWithUpdateFile();
+        $this->assertEquals(1, count($componentsWithUpdateFile));
+    }
+
+    /**
+     * @group Core
+     * @group Updater
+     */
+    public function testUpdaterChecksGivenPluginVersionAndDetectsMultipleUpdateFileInOrder()
+    {
+        $updater = new Piwik_Updater();
+        $updater->pathUpdateFilePlugins = PIWIK_INCLUDE_PATH . '/tests/resources/Updater/%s/';
+        $updater->recordComponentSuccessfullyUpdated('testpluginUpdates', '0.1beta');
+        $updater->addComponentToCheck('testpluginUpdates', '0.1');
+        $componentsWithUpdateFile = $updater->getComponentsWithUpdateFile();
+
+        $this->assertEquals(1, count($componentsWithUpdateFile));
+        $updateFiles = $componentsWithUpdateFile['testpluginUpdates'];
+        $this->assertEquals(2, count($updateFiles));
+        
+        $path = PIWIK_INCLUDE_PATH . '/tests/resources/Updater/testpluginUpdates/';
+        $expectedInOrder = array(
+            $path . '0.1beta2.php' => '0.1beta2',
+            $path . '0.1.php' => '0.1'
+        );
+        $this->assertEquals($expectedInOrder, array_map("basename", $updateFiles));
+        
+    }
+
+    /**
+     * @group Core
+     * @group Updater
+     */
+    public function testUpdaterChecksCoreAndPluginCheckThatCoreIsRanFirst()
+    {
+        $updater = new Piwik_Updater();
+        $updater->pathUpdateFilePlugins = PIWIK_INCLUDE_PATH . '/tests/resources/Updater/%s/';
+        $updater->pathUpdateFileCore = PIWIK_INCLUDE_PATH . '/tests/resources/Updater/core/';
+        
+        $updater->recordComponentSuccessfullyUpdated('testpluginUpdates', '0.1beta');
+        $updater->addComponentToCheck('testpluginUpdates', '0.1');
+        
+        $updater->recordComponentSuccessfullyUpdated('core', '0.1');
+        $updater->addComponentToCheck('core', '0.3');
+        
+        $componentsWithUpdateFile = $updater->getComponentsWithUpdateFile();
+        $this->assertEquals(2, count($componentsWithUpdateFile));
+        reset($componentsWithUpdateFile);
+        $this->assertEquals('core', key($componentsWithUpdateFile));
+    }
+}
diff --git a/tests/PHPUnit/DatabaseTestCase.php b/tests/PHPUnit/DatabaseTestCase.php
new file mode 100644
index 0000000000..16b9c1b533
--- /dev/null
+++ b/tests/PHPUnit/DatabaseTestCase.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ * @version $Id$
+ */
+/**
+ * Tests extending DatabaseTestCase are much slower to run: the setUp will
+ * create all Piwik tables in a freshly empty test database.
+ * 
+ * This allows each test method to start from a clean DB and setup initial state to 
+ * then test it.
+ * 
+ */
+class DatabaseTestCase extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Setup the database and create the base tables for all tests
+     */
+    public function setUp()
+    {
+        parent::setUp();
+        try {
+            Piwik::createConfigObject();
+            Piwik_Config::getInstance()->setTestEnvironment();
+
+            $dbConfig = Piwik_Config::getInstance()->database;
+            $dbName = $dbConfig['dbname'];
+            $dbConfig['dbname'] = null;
+
+            Piwik::createDatabaseObject($dbConfig);
+
+            Piwik::dropDatabase();
+            Piwik::createDatabase($dbName);
+            Piwik::disconnectDatabase();
+
+            Piwik::createDatabaseObject();
+            Piwik::createTables();
+            Piwik::createLogObject();
+
+        Piwik_PluginsManager::getInstance()->loadPlugins(array());
+            
+        } catch(Exception $e) {
+            $this->fail("TEST INITIALIZATION FAILED: " .$e->getMessage());
+        }
+        
+        include "DataFiles/SearchEngines.php";
+        include "DataFiles/Languages.php";
+        include "DataFiles/Countries.php";
+        include "DataFiles/Currencies.php";
+        include "DataFiles/LanguageToCountry.php";
+    }
+
+    /**
+     * Resets all caches and drops the database
+     */
+    public function tearDown()
+    {
+        parent::tearDown();
+        try {
+            $plugins = Piwik_PluginsManager::getInstance()->getLoadedPlugins();
+            foreach($plugins AS $plugin) {
+                $plugin->uninstall();
+            }
+            Piwik_PluginsManager::getInstance()->unloadPlugins();
+        } catch (Exception $e) {}
+        Piwik::dropDatabase();
+        Piwik_DataTable_Manager::getInstance()->deleteAll();
+        Piwik_Option::getInstance()->clearCache();
+        Piwik_Site::clearCache();
+        Piwik_Common::deleteTrackerCache();
+        Piwik_Config::getInstance()->clear();
+        Piwik_TablePartitioning::$tablesAlreadyInstalled = null;
+        Zend_Registry::_unsetInstance();
+    }
+}
diff --git a/tests/PHPUnit/Plugins/LoginTest.php b/tests/PHPUnit/Plugins/LoginTest.php
new file mode 100644
index 0000000000..6afe8e1ccf
--- /dev/null
+++ b/tests/PHPUnit/Plugins/LoginTest.php
@@ -0,0 +1,524 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ * @version $Id$
+ */
+require_once 'Login/Auth.php';
+
+class LoginTest extends DatabaseTestCase
+{
+    function setUp()
+    {
+        parent::setUp();
+        
+        // setup the access layer
+        $pseudoMockAccess = new FakeAccess;
+        FakeAccess::setIdSitesView( array(1,2));
+        FakeAccess::setIdSitesAdmin( array(3,4));
+        
+        //finally we set the user as a super user by default
+        FakeAccess::$superUser = true;
+        Zend_Registry::set('access', $pseudoMockAccess);
+        
+        // we make sure the tests don't depend on the config file content
+        Piwik_Config::getInstance()->superuser = array(
+            'login'=>'superusertest',
+            'password'=>md5('passwordsuperusertest'),
+            'email'=>'superuser@example.com'
+        );
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureNoLoginNoTokenAuth()
+    {
+        // no login; no token auth
+        $auth = new Piwik_Login_Auth();
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureEmptyLoginNoTokenAuth()
+    {
+        // empty login; no token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureNonExistentUser()
+    {
+        // non-existent user
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('nobody');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureAnonymousNotExisting()
+    {
+        // anonymous user doesn't exist yet
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('anonymous');
+        $auth->setTokenAuth('');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureAnonymousNotExistentEmptyLogin()
+    {
+        // empty login; anonymous user doesn't exist yet
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('');
+        $auth->setTokenAuth('anonymous');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureAnonymousNotExistentEmptyLoginWithTokenAuth()
+    {
+        // API authentication; anonymous user doesn't exist yet
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin(null);
+        $auth->setTokenAuth('anonymous');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureAnonymousNotExistentWithLoginAndTokenAuth()
+    {
+        // anonymous user doesn't exist yet
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('anonymous');
+        $auth->setTokenAuth('anonymous');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureAnonymousWithLogin()
+    {
+        Piwik::createAnonymousUser();
+
+        // missing token_auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('anonymous');
+        $auth->setTokenAuth('');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureAnonymousEmptyLoginWithTokenAuth()
+    {
+        Piwik::createAnonymousUser();
+
+        // empty login
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('');
+        $auth->setTokenAuth('anonymous');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureAnonymousLoginTokenAuthMissmatch()
+    {
+        Piwik::createAnonymousUser();
+
+        // not equal
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('anonymous');
+        $auth->setTokenAuth(0);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateSuccessAnonymousWithTokenAuth()
+    {
+        Piwik::createAnonymousUser();
+
+        // API authentication
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin(null);
+        $auth->setTokenAuth('anonymous');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::SUCCESS, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateSuccessAnonymous()
+    {
+        Piwik::createAnonymousUser();
+
+        // valid login & token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('anonymous');
+        $auth->setTokenAuth('anonymous');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::SUCCESS, $rc->getCode());
+    }
+
+    protected function _setUpUser() {
+        $user = array( 'login'=>'user',
+            'password'=>"geqgeagae",
+            'email'=>"test@test.com",
+            'alias'=>"alias");
+        Piwik_UsersManager_API::getInstance()->addUser($user['login'],$user['password'] ,$user['email'] ,$user['alias'] );
+        $password = md5($user['password']);
+        $user['tokenAuth'] = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+        return $user;
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureUserEmptyTokenAuth()
+    {
+        $user = $this->_setUpUser();
+
+        // empty token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth('');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureUserInvalidTokenAuth()
+    {
+        $user = $this->_setUpUser();
+
+        // not a token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth($user['password']);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureUserInvalidTokenAuth2()
+    {
+        $user = $this->_setUpUser();
+
+        // not a token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth(md5($user['password']));
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureUserEmptyLogin()
+    {
+        $user = $this->_setUpUser();
+
+        // empty login
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('');
+        $auth->setTokenAuth($user['tokenAuth']);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureUserLoginTokenAuthMissmatch()
+    {
+        $user = $this->_setUpUser();
+
+        // not equal
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin(0);
+        $auth->setTokenAuth(0);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureUserLoginTokenAuthMissmatch2()
+    {
+        $user = $this->_setUpUser();
+
+        // not equal
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin(0);
+        $auth->setTokenAuth($user['tokenAuth']);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureUserLoginTokenAuthMissmatch3()
+    {
+        $user = $this->_setUpUser();
+
+        // not equal
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth(0);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateSuccessUserTokenAuth()
+    {
+        $user = $this->_setUpUser();
+
+        // API authentication
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin(null);
+        $auth->setTokenAuth($user['tokenAuth']);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::SUCCESS, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateSuccessUserLoginAndTokenAuth()
+    {
+        $user = $this->_setUpUser();
+
+        // valid login & token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth($user['tokenAuth']);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::SUCCESS, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateSuccessLoginAndHashedTokenAuth()
+    {
+        $user = $this->_setUpUser();
+
+        // valid login & hashed token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $hash = $auth->getHashTokenAuth($user['login'], $user['tokenAuth']);
+        $auth->setTokenAuth($hash);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::SUCCESS, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureSuperUserEmptyTokenAuth()
+    {
+        $user = Piwik_Config::getInstance()->superuser;
+        $password = $user['password'];
+        $tokenAuth = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+
+        // empty token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth('');
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureSuperUserInvalidTokenAuth()
+    {
+        $user = Piwik_Config::getInstance()->superuser;
+        $password = $user['password'];
+        $tokenAuth = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+
+        // not a token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth($user['password']);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureSuperUserInvalidTokenAuth2()
+    {
+        $user = Piwik_Config::getInstance()->superuser;
+        $password = $user['password'];
+        $tokenAuth = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+
+        // not a token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth($password);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureSuperUserEmptyLogin()
+    {
+        $user = Piwik_Config::getInstance()->superuser;
+        $password = $user['password'];
+        $tokenAuth = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+
+        // empty login
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin('');
+        $auth->setTokenAuth($tokenAuth);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateFailureSuperUserLoginTokenAuthMissmatch()
+    {
+        $user = Piwik_Config::getInstance()->superuser;
+        $password = $user['password'];
+        $tokenAuth = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+
+        // not equal
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth(0);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::FAILURE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateSuccessSuperUserTokenAuth()
+    {
+        $user = Piwik_Config::getInstance()->superuser;
+        $password = $user['password'];
+        $tokenAuth = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+
+        // API authentication
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin(null);
+        $auth->setTokenAuth($tokenAuth);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::SUCCESS_SUPERUSER_AUTH_CODE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateSuccessSuperLoginAndTokenAuth()
+    {
+        $user = Piwik_Config::getInstance()->superuser;
+        $password = $user['password'];
+        $tokenAuth = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+
+        // valid login & token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $auth->setTokenAuth($tokenAuth);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::SUCCESS_SUPERUSER_AUTH_CODE, $rc->getCode());
+    }
+
+    /**
+     * @group Plugins
+     * @group Login
+     */
+    public function testAuthenticateSuccessSuperUserLoginAndHashedTokenAuth()
+    {
+        $user = Piwik_Config::getInstance()->superuser;
+        $password = $user['password'];
+        $tokenAuth = Piwik_UsersManager_API::getInstance()->getTokenAuth($user['login'], $password);
+
+        // valid login & hashed token auth
+        $auth = new Piwik_Login_Auth();
+        $auth->setLogin($user['login']);
+        $hash = $auth->getHashTokenAuth($user['login'], $tokenAuth);
+        $auth->setTokenAuth($hash);
+        $rc = $auth->authenticate();
+        $this->assertEquals(Piwik_Auth_Result::SUCCESS_SUPERUSER_AUTH_CODE, $rc->getCode());
+    }
+}
diff --git a/tests/PHPUnit/Plugins/SitesManagerTest.php b/tests/PHPUnit/Plugins/SitesManagerTest.php
new file mode 100644
index 0000000000..ec8e284dcf
--- /dev/null
+++ b/tests/PHPUnit/Plugins/SitesManagerTest.php
@@ -0,0 +1,945 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ * @version $Id$
+ */
+class SitesManagerTest extends DatabaseTestCase
+{
+    public function setUp()
+    {
+        parent::setUp();
+
+        // setup the access layer
+        $pseudoMockAccess = new FakeAccess;
+        FakeAccess::$superUser = true;
+        Zend_Registry::set('access', $pseudoMockAccess);
+    }
+    
+    /**
+     * empty name -> exception
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    public function testAddSiteEmptyName()
+    {
+        Piwik_SitesManager_API::getInstance()->addSite("",array("http://piwik.net"));
+    }
+    
+    /**
+     * DataProvider for testAddSiteWrongUrls
+     */
+    public function getInvalidUrlData()
+    {
+        return array(
+            array(array()),  // no urls
+            array(array("")),
+            array(""),
+            array("httpww://piwik.net"),
+            array("httpww://piwik.net/gqg~#"),
+        );
+    }
+    
+    /**
+     * wrong urls -> exception
+     * 
+     * @dataProvider getInvalidUrlData
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    public function testAddSiteWrongUrls($url)
+    {
+        Piwik_SitesManager_API::getInstance()->addSite("name", $url);
+    }
+    
+    /**
+     * Test with valid IPs
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    public function testAddSiteExcludedIpsAndtimezoneAndCurrencyAndExcludedQueryParametersValid()
+    {
+        $ips = '1.2.3.4,1.1.1.*,1.2.*.*,1.*.*.*';
+        $timezone = 'Europe/Paris'; 
+        $currency = 'EUR';
+        $excludedQueryParameters = 'p1,P2, P33333';
+        $expectedExcludedQueryParameters = 'p1,P2,P33333';
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("name","http://piwik.net/", $ecommerce = 1, $ips, $excludedQueryParameters,$timezone, $currency);
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite);
+        $this->assertEquals($ips, $siteInfo['excluded_ips']);
+        $this->assertEquals($timezone, $siteInfo['timezone']);
+        $this->assertEquals($currency, $siteInfo['currency']);
+        $this->assertEquals($ecommerce, $siteInfo['ecommerce']);
+        $this->assertEquals($expectedExcludedQueryParameters, $siteInfo['excluded_parameters']);
+    }
+    
+    /**
+     * dataProvider for testAddSiteExcludedIpsNotValid
+     */
+    public function getInvalidIPsData()
+    {
+        return array(
+            array('35817587341'),
+            array('ieagieha'),
+            array('1.2.3'),
+            array('*.1.1.1'),
+            array('*.*.1.1'),
+            array('*.*.*.1'),
+            array('1.1.1.1.1'),
+        ); 
+    }
+    
+    /**
+     * Test with invalid IPs
+     * 
+     * @dataProvider getInvalidIPsData
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    public function testAddSiteExcludedIpsNotValid($ip)
+    {
+        Piwik_SitesManager_API::getInstance()->addSite("name","http://piwik.net/", $ecommerce = 0,$ip);
+    }
+    
+    /**
+     * one url -> one main_url and nothing inserted as alias urls
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    public function testAddSiteOneUrl()
+    {
+        $url = "http://piwik.net/";
+        $urlOK = "http://piwik.net";
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("name",$url);
+        $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+        
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite);
+        $this->assertEquals($urlOK, $siteInfo['main_url']);
+        $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($siteInfo['ts_created'])));
+        
+        $siteUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        $this->assertEquals(1, count($siteUrls));
+    }
+    
+    /**
+     * several urls -> one main_url and others as alias urls
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    public function testAddSiteSeveralUrls()
+    {
+        $urls = array("http://piwik.net/","http://piwik.com","https://piwik.net/test/");
+        $urlsOK = array("http://piwik.net","http://piwik.com","https://piwik.net/test");
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("super website",$urls);
+        $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+        
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite);
+        $this->assertEquals($urlsOK[0], $siteInfo['main_url']);
+        
+        $siteUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        $this->assertEquals($urlsOK, $siteUrls);
+    }
+    
+    /**
+     * strange name
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    public function testAddSiteStrangeName()
+    {
+        $name = "supertest(); ~@@()''!£\$'%%^'!£ போ";
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite($name,"http://piwik.net");
+        $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+        
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite);
+        $this->assertEquals($name, $siteInfo['name']);
+        
+    }
+    /**
+     * adds a site
+     * use by several other unit tests
+     */
+    protected function _addSite()
+    {
+        $name = "website ";
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/"));
+        $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+        
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite);
+        $this->assertEquals($name, $siteInfo['name']);
+        $this->assertEquals("http://piwik.net", $siteInfo['main_url']);
+        
+        $siteUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        $this->assertEquals(array("http://piwik.net","http://piwik.com/test"), $siteUrls);
+        
+        return $idsite;
+    }
+    
+    /**
+     * no duplicate -> all the urls are saved
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    public function testAddSiteUrlsnoDuplicate()
+    {
+        $idsite = $this->_addSite();
+        
+        $siteUrlsBefore = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        $toAdd = array(    "http://piwik1.net",
+                        "http://piwik2.net", 
+                        "http://piwik3.net/test/", 
+                        "http://localhost/test", 
+                        "http://localho5.st/test", 
+                        "http://l42578gqege.f4", 
+                        "http://super.com/test/test/atqata675675/te"
+                        );
+        $toAddValid = array("http://piwik1.net",
+                            "http://piwik2.net", 
+                            "http://piwik3.net/test",
+                            "http://localhost/test", 
+                            "http://localho5.st/test", 
+                            "http://l42578gqege.f4", 
+                            "http://super.com/test/test/atqata675675/te");
+        
+        $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
+        $this->assertEquals(count($toAdd), $insertedUrls);
+        
+        $siteUrlsAfter = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        $shouldHave = array_merge($siteUrlsBefore, $toAddValid);
+        sort($shouldHave);
+        
+        sort($siteUrlsAfter);
+        
+        $this->assertEquals($shouldHave, $siteUrlsAfter);
+    }
+    
+    /**
+     * duplicate -> don't save the already existing URLs
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    public function testAddSiteUrlsDuplicate()
+    {        
+        $idsite = $this->_addSite();
+        
+        $siteUrlsBefore = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        $toAdd = array_merge($siteUrlsBefore, array("http://piwik1.net","http://piwik2.net"));
+        
+        $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
+        $this->assertEquals(count($toAdd) - count($siteUrlsBefore), $insertedUrls);
+        
+        $siteUrlsAfter = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        $shouldHave = $toAdd;
+        sort($shouldHave);
+        
+        sort($siteUrlsAfter);
+        
+        $this->assertEquals($shouldHave, $siteUrlsAfter);
+    }
+    
+    /**
+     * case empty array => nothing happens
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    public function testAddSiteUrlsNoUrlsToAdd1()
+    {
+        $idsite = $this->_addSite();
+        
+        $siteUrlsBefore = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        $toAdd = array();
+        
+        $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
+        $this->assertEquals(count($toAdd), $insertedUrls);
+        
+        $siteUrlsAfter = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        $shouldHave = $siteUrlsBefore;
+        sort($shouldHave);
+        
+        sort($siteUrlsAfter);
+        
+        $this->assertEquals($shouldHave, $siteUrlsAfter);
+    }
+    
+    /**
+     * case array only duplicate => nothing happens
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    public function testAddSiteUrlsNoUrlsToAdd2()
+    {
+        $idsite = $this->_addSite();
+        
+        $siteUrlsBefore = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        $toAdd = $siteUrlsBefore;
+        
+        $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
+        $this->assertEquals(0, $insertedUrls);
+        
+        $siteUrlsAfter = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        $shouldHave = $siteUrlsBefore;
+        sort($shouldHave);
+        
+        sort($siteUrlsAfter);
+        
+        $this->assertEquals($shouldHave, $siteUrlsAfter);
+    }
+    
+    /**
+     * wrong format urls => exception
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    public function testAddSiteUrlsWrongUrlsFormat3()
+    {
+        $idsite = $this->_addSite();
+        $toAdd = array("http:mpigeq");
+        $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
+    }
+    
+    /**
+     * wrong idsite => no exception because simply no access to this resource
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    public function testAddSiteUrlsWrongIdSite1()
+    {
+        $toAdd = array("http://pigeq.com/test");
+        $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls(-1, $toAdd);
+    }
+    
+    /**
+     * wrong idsite => exception
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    public function testAddSiteUrlsWrongIdSite2()
+    {
+        $toAdd = array("http://pigeq.com/test");
+        $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls(155, $toAdd);
+    }
+    
+    /**
+     * no Id -> empty array
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetAllSitesIdNoId()
+    {
+        $ids = Piwik_SitesManager_API::getInstance()->getAllSitesId();
+        $this->assertEquals(array(), $ids);
+    }
+    
+    /**
+     * several Id -> normal array
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetAllSitesIdSeveralId()
+    {
+        $name="tetq";
+        $idsites = array(
+                    Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")),
+                    Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")),
+                    Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")),
+                    Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")),
+                    Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")),
+            );
+        
+        $ids = Piwik_SitesManager_API::getInstance()->getAllSitesId();
+        $this->assertEquals($idsites, $ids);
+    }
+    
+    /**
+     * wrong id => exception
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    function testGetSiteFromIdWrongId1()
+    {
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId(0);
+    }
+    /**
+     * wrong id => exception
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    function testGetSiteFromIdWrongId2()
+    {
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId("x1");
+    }
+    /**
+     * wrong id : no access => exception
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    function testGetSiteFromIdWrongId3()
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site",array("http://piwik.net","http://piwik.com/test/"));
+        $this->assertEquals(1, $idsite);
+        
+        // set noaccess to site 1
+        FakeAccess::setIdSitesView (array(2));
+        FakeAccess::setIdSitesAdmin (array());
+        
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId(1);
+    }
+    /**
+     * normal case
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSiteFromIdNormalId()
+    {
+        $name = "website ''";
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/"));
+        $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+        
+        $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite);
+        $this->assertEquals($name, $siteInfo['name']);
+        $this->assertEquals("http://piwik.net", $siteInfo['main_url']);
+    }
+    
+    
+    /**
+     * there is no admin site available -> array()
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesWithAdminAccessNoResult()
+    {
+        FakeAccess::setIdSitesAdmin (array());
+        
+        $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAdminAccess();
+        $this->assertEquals(array(), $sites);
+    }
+    
+    /**
+     * normal case, admin and view and noaccess website => return only admin
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesWithAdminAccess()
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com/test/"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com/test/"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org"));
+        
+        $resultWanted = array(
+            0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net", "ecommerce" => 0, "excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => ''),
+            1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org", "ecommerce" => 0,"excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => ''),
+        );
+            
+        FakeAccess::setIdSitesAdmin (array(1,3));
+        
+        $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAdminAccess();
+        
+        // we dont test the ts_created
+        unset($sites[0]['ts_created']);
+        unset($sites[1]['ts_created']);
+        $this->assertEquals($resultWanted, $sites);
+    }
+    
+    /**
+     * there is no admin site available -> array()
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesWithViewAccessNoResult()
+    {
+        FakeAccess::setIdSitesView (array());
+        FakeAccess::setIdSitesAdmin (array());
+        
+        $sites = Piwik_SitesManager_API::getInstance()->getSitesWithViewAccess();
+        $this->assertEquals(array(), $sites);
+    }
+    
+    /**
+     * normal case, admin and view and noaccess website => return only admin
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesWithViewAccess()
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com/test/"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com/test/"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org"));
+        
+        $resultWanted = array(
+            0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net", "ecommerce" => 0,"excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => ''),
+            1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org", "ecommerce" => 0,"excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => ''),
+        );
+            
+        FakeAccess::setIdSitesView (array(1,3));
+        FakeAccess::setIdSitesAdmin (array());
+        
+        $sites = Piwik_SitesManager_API::getInstance()->getSitesWithViewAccess();
+        // we dont test the ts_created
+        unset($sites[0]['ts_created']);
+        unset($sites[1]['ts_created']);
+        $this->assertEquals($resultWanted, $sites);
+    }
+    
+    /**
+     * there is no admin site available -> array()
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesWithAtLeastViewAccessNoResult()
+    {
+        FakeAccess::setIdSitesView (array());
+        FakeAccess::setIdSitesAdmin (array());
+        
+        $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAtLeastViewAccess();
+        $this->assertEquals(array(), $sites);
+    }
+    
+    /**
+     * normal case, admin and view and noaccess website => return only admin
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesWithAtLeastViewAccess()
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com/test/"), $ecommerce=1);
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com/test/"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org"));
+        
+        $resultWanted = array(
+            0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net", "ecommerce" => 1,"excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => ''),
+            1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org", "ecommerce" => 0,"excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD', 'group' => ''),
+        );
+            
+        FakeAccess::setIdSitesView (array(1,3));
+        FakeAccess::setIdSitesAdmin (array());
+        
+        $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAtLeastViewAccess();
+        // we dont test the ts_created
+        unset($sites[0]['ts_created']);
+        unset($sites[1]['ts_created']);
+        $this->assertEquals($resultWanted, $sites);
+    }
+    
+    /**
+     * no urls for this site => array()
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSiteUrlsFromIdNoUrls()
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net"));
+        
+        $urls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        $this->assertEquals(array("http://piwik.net"), $urls);
+    }
+    
+    /**
+     * normal case
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSiteUrlsFromIdManyUrls()
+    {
+        $site = array("http://piwik.net",
+                        "http://piwik.org",    
+                        "http://piwik.org",    
+                        "http://piwik.com");
+        sort($site);
+        
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",$site);
+        
+        $siteWanted = array("http://piwik.net",
+                        "http://piwik.org",    
+                        "http://piwik.com");
+        sort($siteWanted);
+        $urls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        
+        
+        $this->assertEquals($siteWanted, $urls);
+    }
+    
+    /**
+     * wrongId => exception
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    function testGetSiteUrlsFromIdWrongId()
+    {
+        FakeAccess::setIdSitesView(array(3));
+        FakeAccess::setIdSitesAdmin(array());
+        Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId(1);
+    }
+    
+    /**
+     * one url => no change to alias urls
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testUpdateSiteOneUrl()
+    {
+        $urls = array("http://piwiknew.com",
+                        "http://piwiknew.net",
+                        "http://piwiknew.org",
+                        "http://piwiknew.fr");
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1", $urls);
+
+        $newMainUrl = "http://main.url";
+        
+        // Also test that the group was set to empty, and is searchable
+        $websites = Piwik_SitesManager_API::getInstance()->getSitesFromGroup('');
+        $this->assertEquals(1, count($websites));
+        
+        // the Update doesn't change the group field
+        Piwik_SitesManager_API::getInstance()->updateSite($idsite, "test toto@{}", $newMainUrl );
+        $websites = Piwik_SitesManager_API::getInstance()->getSitesFromGroup('');
+        $this->assertEquals(1, count($websites));
+
+        // Updating the group to something
+        $group = 'something';
+        Piwik_SitesManager_API::getInstance()->updateSite($idsite, "test toto@{}", $newMainUrl, $ecommerce = 0, $ips=null, $parametersExclude=null, $timezone=null, $currency=null, $group );
+        $websites = Piwik_SitesManager_API::getInstance()->getSitesFromGroup($group);
+        $this->assertEquals(1, count($websites));
+        $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($websites[0]['ts_created'])));
+
+        // Updating the group to nothing
+        $group = '';
+        Piwik_SitesManager_API::getInstance()->updateSite($idsite, "test toto@{}", $newMainUrl, $ecommerce = 0, $ips=null, $parametersExclude=null, $timezone=null, $currency=null, $group, $startDate = '2010-01-01' );
+        $websites = Piwik_SitesManager_API::getInstance()->getSitesFromGroup($group);
+        $this->assertEquals(1, count($websites));
+        $this->assertEquals('2010-01-01', date('Y-m-d', strtotime($websites[0]['ts_created'])));
+
+        $allUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        $this->assertEquals($newMainUrl, $allUrls[0]);
+        $aliasUrls = array_slice($allUrls, 1);
+        $this->assertEquals(array(), $aliasUrls);
+    }
+    
+    /**
+     * strange name and NO URL => name ok, main_url not updated
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testUpdateSiteStrangeNameNoUrl()
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1","http://main.url");
+        $newName ="test toto@{'786'}";
+        
+        Piwik_SitesManager_API::getInstance()->updateSite($idsite, $newName );
+        
+        $site = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite);
+        
+        $this->assertEquals($newName, $site['name']);
+        // url didn't change because parameter url NULL in updateSite
+        $this->assertEquals("http://main.url", $site['main_url']);
+    }
+    
+    /**
+     * several urls => both main and alias are updated
+     * also test the update of group field
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testUpdateSiteSeveralUrlsAndGroup()
+    {
+        $urls = array("http://piwiknew.com",
+                        "http://piwiknew.net",
+                        "http://piwiknew.org",
+                        "http://piwiknew.fr");
+        
+        $group = 'GROUP Before';
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",$urls, $ecommerce =1,$excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null, $group, $startDate = '2011-01-01');
+        
+        $websites = Piwik_SitesManager_API::getInstance()->getSitesFromGroup($group);
+        $this->assertEquals(1, count($websites));
+        
+        $newurls = array("http://piwiknew2.com",
+                        "http://piwiknew2.net",
+                        "http://piwiknew2.org",
+                        "http://piwiknew2.fr");
+
+        $groupAfter = '   GROUP After';
+        Piwik_SitesManager_API::getInstance()->updateSite($idsite, "test toto@{}",$newurls, $ecommerce = 0, $excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null, $groupAfter);
+
+        // no result for the group before update 
+        $websites = Piwik_SitesManager_API::getInstance()->getSitesFromGroup($group);
+        $this->assertEquals(0, count($websites));
+        
+        // Testing that the group was updated properly (and testing that the group value is trimmed before inserted/searched)
+        $websites = Piwik_SitesManager_API::getInstance()->getSitesFromGroup($groupAfter . ' ');
+        $this->assertEquals(1, count($websites));
+        $this->assertEquals('2011-01-01', date('Y-m-d', strtotime($websites[0]['ts_created'])));
+        
+        // Test fetch website groups
+        $expectedGroups = array(trim($groupAfter));
+        $fetched = Piwik_SitesManager_API::getInstance()->getSitesGroups();
+        $this->assertEquals($expectedGroups, $fetched);
+        
+        $allUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite);
+        sort($allUrls);
+        sort($newurls);
+        $this->assertEquals($newurls, $allUrls);
+    }
+
+    /**
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesGroups()
+    {
+        $groups = array( 'group1', ' group1 ', '', 'group2');
+        $expectedGroups = array('group1','','group2');
+        foreach($groups as $group)
+        {
+            Piwik_SitesManager_API::getInstance()->addSite("test toto@{}", 'http://example.org',$ecommerce=1,$excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null, $group);
+        }
+        
+        $this->assertEquals($expectedGroups, Piwik_SitesManager_API::getInstance()->getSitesGroups());
+    }
+
+    
+    public function getInvalidTimezoneData()
+    {
+        return array(
+            array('UTC+15'),
+            array('Paris'),
+        );
+    }
+    
+    /**
+     * 
+     * @dataProvider getInvalidTimezoneData
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    function testAddSitesInvalidTimezone($timezone)
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org'),$ecommerce=0, '', '', $timezone);
+    }
+    
+    /**
+     * 
+     * @group Plugins
+     * @group SitesManager
+     * @expectedException Exception
+     */
+    function testAddSitesInvalidCurrency()
+    {
+        $invalidCurrency = '€';
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org'),$ecommerce=0, '', 'UTC', $invalidCurrency);
+    }
+    
+    /**
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testSetDefaultTimezoneAndCurrencyAndExcludedQueryParametersAndExcludedIps()
+    {
+        // test that they return default values
+        $defaultTimezone = Piwik_SitesManager_API::getInstance()->getDefaultTimezone();
+        $this->assertEquals('UTC', $defaultTimezone);
+        $defaultCurrency = Piwik_SitesManager_API::getInstance()->getDefaultCurrency();
+        $this->assertEquals('USD', $defaultCurrency);
+        $excludedIps = Piwik_SitesManager_API::getInstance()->getExcludedIpsGlobal();
+        $this->assertEquals('', $excludedIps);
+        $excludedQueryParameters = Piwik_SitesManager_API::getInstance()->getExcludedQueryParametersGlobal();
+        $this->assertEquals('', $excludedQueryParameters);
+    
+        // test that when not specified, defaults are set as expected  
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org'));
+        $site = new Piwik_Site($idsite);
+        $this->assertEquals('UTC', $site->getTimezone());
+        $this->assertEquals('USD', $site->getCurrency());
+        $this->assertEquals('', $site->getExcludedQueryParameters());
+        $this->assertEquals('', $site->getExcludedIps());
+        $this->assertEquals(false, $site->isEcommerceEnabled());
+
+        // set the global timezone and get it
+        $newDefaultTimezone = 'UTC+5.5';
+        Piwik_SitesManager_API::getInstance()->setDefaultTimezone($newDefaultTimezone);
+        $defaultTimezone = Piwik_SitesManager_API::getInstance()->getDefaultTimezone();
+        $this->assertEquals($newDefaultTimezone, $defaultTimezone);
+
+        // set the default currency and get it
+        $newDefaultCurrency = 'EUR';
+        Piwik_SitesManager_API::getInstance()->setDefaultCurrency($newDefaultCurrency);
+        $defaultCurrency = Piwik_SitesManager_API::getInstance()->getDefaultCurrency();
+        $this->assertEquals($newDefaultCurrency, $defaultCurrency);
+        
+        // set the global IPs to exclude and get it
+        $newGlobalExcludedIps = '1.1.1.*,1.1.*.*,150.1.1.1';
+        Piwik_SitesManager_API::getInstance()->setGlobalExcludedIps($newGlobalExcludedIps);
+        $globalExcludedIps = Piwik_SitesManager_API::getInstance()->getExcludedIpsGlobal();
+        $this->assertEquals($newGlobalExcludedIps, $globalExcludedIps);
+        
+        // set the global URL query params to exclude and get it
+        $newGlobalExcludedQueryParameters = 'PHPSESSID,blabla, TesT';
+        // removed the space
+        $expectedGlobalExcludedQueryParameters = 'PHPSESSID,blabla,TesT';
+        Piwik_SitesManager_API::getInstance()->setGlobalExcludedQueryParameters($newGlobalExcludedQueryParameters);
+        $globalExcludedQueryParameters = Piwik_SitesManager_API::getInstance()->getExcludedQueryParametersGlobal();
+        $this->assertEquals($expectedGlobalExcludedQueryParameters, $globalExcludedQueryParameters);
+
+        // create a website and check that default currency and default timezone are set
+        // however, excluded IPs and excluded query Params are not returned
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org'),$ecommerce=1, '', '', $newDefaultTimezone);
+        $site = new Piwik_Site($idsite);
+        $this->assertEquals($newDefaultTimezone, $site->getTimezone());
+        $this->assertEquals(date('Y-m-d'), $site->getCreationDate()->toString());
+        $this->assertEquals($newDefaultCurrency, $site->getCurrency());
+        $this->assertEquals('', $site->getExcludedIps());
+        $this->assertEquals('', $site->getExcludedQueryParameters());
+        $this->assertTrue($site->isEcommerceEnabled());
+    }
+    
+    /**
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesIdFromSiteUrlSuperUser()
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com","http://piwik.net"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.com","http://piwik.org"));
+
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.org');
+        $this->assertTrue(count($idsites) == 1);
+        
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://www.piwik.org');
+        $this->assertTrue(count($idsites) == 1);
+
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.net');
+        $this->assertTrue(count($idsites) == 2);
+
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com');
+        $this->assertTrue(count($idsites) == 3);
+    }
+
+    /**
+     * 
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesIdFromSiteUrlUser()
+    {
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://www.piwik.net","http://piwik.com"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com","http://piwik.net"));
+        $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.com","http://piwik.org"));
+
+        $saveAccess = Zend_Registry::get('access');
+
+        Piwik_UsersManager_API::getInstance()->addUser("user1", "geqgegagae", "tegst@tesgt.com", "alias");
+        Piwik_UsersManager_API::getInstance()->setUserAccess("user1", "view", array(1));
+
+        Piwik_UsersManager_API::getInstance()->addUser("user2", "geqgegagae", "tegst2@tesgt.com", "alias");
+        Piwik_UsersManager_API::getInstance()->setUserAccess("user2", "view", array(1));
+        Piwik_UsersManager_API::getInstance()->setUserAccess("user2", "admin", array(3));
+
+        Piwik_UsersManager_API::getInstance()->addUser("user3", "geqgegagae", "tegst3@tesgt.com", "alias");
+        Piwik_UsersManager_API::getInstance()->setUserAccess("user3", "view", array(1,2));
+        Piwik_UsersManager_API::getInstance()->setUserAccess("user3", "admin", array(3));
+
+        $pseudoMockAccess = new FakeAccess;
+        FakeAccess::$superUser = false;
+        FakeAccess::$identity = 'user1';
+        FakeAccess::setIdSitesView (array(1));
+        FakeAccess::setIdSitesAdmin (array());
+        Zend_Registry::set('access', $pseudoMockAccess);
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com');
+        $this->assertEquals(1, count($idsites));
+        
+        // testing URL normalization
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://www.piwik.com');
+        $this->assertEquals(1, count($idsites));
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.net');
+        $this->assertEquals(1, count($idsites));
+
+        $pseudoMockAccess = new FakeAccess;
+        FakeAccess::$superUser = false;
+        FakeAccess::$identity = 'user2';
+        FakeAccess::setIdSitesView (array(1));
+        FakeAccess::setIdSitesAdmin (array(3));
+        Zend_Registry::set('access', $pseudoMockAccess);
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com');
+        $this->assertEquals(2, count($idsites));
+
+        $pseudoMockAccess = new FakeAccess;
+        FakeAccess::$superUser = false;
+        FakeAccess::$identity = 'user3';
+        FakeAccess::setIdSitesView (array(1,2));
+        FakeAccess::setIdSitesAdmin (array(3));
+        Zend_Registry::set('access', $pseudoMockAccess);
+        $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com');
+        $this->assertEquals(3, count($idsites));
+
+        Zend_Registry::set('access', $saveAccess);
+    }
+
+    /**
+     *
+     * @group Plugins
+     * @group SitesManager
+     */
+    function testGetSitesFromTimezones()
+    {
+        $idsite1 = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org"),null,null,null,'UTC');
+        $idsite2 = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org"),null,null,null,'Pacific/Auckland');
+        $idsite3 = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org"),null,null,null,'Pacific/Auckland');
+        $idsite4 = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org"),null,null,null,'UTC+10');
+        $result = Piwik_SitesManager_API::getInstance()->getSitesIdFromTimezones(array('UTC+10', 'Pacific/Auckland'));
+        $this->assertEquals(array($idsite2,$idsite3,$idsite4), $result);
+    }
+}
diff --git a/tests/PHPUnit/bootstrap.php b/tests/PHPUnit/bootstrap.php
index 0e9a792e10..82d1c7d2b3 100644
--- a/tests/PHPUnit/bootstrap.php
+++ b/tests/PHPUnit/bootstrap.php
@@ -28,7 +28,7 @@ require_once PIWIK_INCLUDE_PATH .'/libs/upgradephp/upgrade.php';
 require_once PIWIK_INCLUDE_PATH .'/core/testMinimumPhpVersion.php';
 require_once PIWIK_INCLUDE_PATH .'/core/Loader.php';
 require_once PIWIK_INCLUDE_PATH .'/core/FrontController.php';
-#require_once PIWIK_INCLUDE_PATH .'/tests/PHPUnit/DatabaseTestCase.php';
+require_once PIWIK_INCLUDE_PATH .'/tests/PHPUnit/DatabaseTestCase.php';
 #require_once PIWIK_INCLUDE_PATH .'/tests/PHPUnit/IntegrationTestCase.php';
 require_once PIWIK_INCLUDE_PATH .'/tests/PHPUnit/FakeAccess.php';
 
-- 
GitLab