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