Skip to content
Extraits de code Groupes Projets
UsersManagerTest.php 34,6 ko
Newer Older
  • Learn to ignore specific revisions
  • sgiehl's avatar
    sgiehl a validé
    <?php
    
    mattab's avatar
    mattab a validé
    use Piwik\Config;
    
    use Piwik\Plugins\SitesManager\API as APISitesManager;
    
    sgiehl's avatar
    sgiehl a validé
    /**
     * Piwik - Open source web analytics
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
     */
    class UsersManagerTest extends DatabaseTestCase
    {
        public function setUp()
        {
            parent::setUp();
    
    mattab's avatar
    mattab a validé
            \Piwik\Plugin\Manager::getInstance()->loadPlugin('UsersManager');
            \Piwik\Plugin\Manager::getInstance()->installLoadedPlugins();
    
    sgiehl's avatar
    sgiehl a validé
            // setup the access layer
            $pseudoMockAccess = new FakeAccess;
    
            FakeAccess::setIdSitesView(array(1, 2));
            FakeAccess::setIdSitesAdmin(array(3, 4));
    
    
    sgiehl's avatar
    sgiehl a validé
            //finally we set the user as a super user by default
            FakeAccess::$superUser = true;
    
            FakeAccess::$superUserLogin = 'superusertest';
    
            Access::setSingletonInstance($pseudoMockAccess);
    
    sgiehl's avatar
    sgiehl a validé
            // we make sure the tests don't depend on the config file content
    
            Config::getInstance()->superuser = array(
    
                'login'    => 'superusertest',
                'password' => 'passwordsuperusertest',
                'email'    => 'superuser@example.com'
    
    sgiehl's avatar
    sgiehl a validé
            );
        }
    
        private function _flatten($sitesAccess)
        {
    
    sgiehl's avatar
    sgiehl a validé
    
    
            foreach ($sitesAccess as $siteAccess) {
                $result[$siteAccess['site']] = $siteAccess['access'];
    
    sgiehl's avatar
    sgiehl a validé
            }
            return $result;
        }
    
    
        private function _checkUserHasNotChanged($user, $newPassword, $newEmail = null, $newAlias = null)
    
    sgiehl's avatar
    sgiehl a validé
        {
    
    sgiehl's avatar
    sgiehl a validé
                $newEmail = $user['email'];
            }
    
    sgiehl's avatar
    sgiehl a validé
                $newAlias = $user['alias'];
            }
    
            $userAfter = API::getInstance()->getUser($user["login"]);
    
    sgiehl's avatar
    sgiehl a validé
            unset($userAfter['date_registered']);
    
    sgiehl's avatar
    sgiehl a validé
            // we now compute what the token auth should be, it should always be a hash of the login and the current password
            // if the password has changed then the token_auth has changed!
    
            $user['token_auth'] = API::getInstance()->getTokenAuth($user["login"], md5($newPassword));
    
    
            $user['password'] = md5($newPassword);
            $user['email'] = $newEmail;
            $user['alias'] = $newAlias;
            $this->assertEquals($user, $userAfter);
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * @group Plugins
         */
        public function testAllSuperUserIncluded()
        {
    
            Config::getInstance()->superuser = array(
    
                'login'    => 'superusertest',
                'password' => 'passwordsuperusertest',
                'email'    => 'superuser@example.com'
    
    sgiehl's avatar
    sgiehl a validé
            );
    
    
            $user = array('login'    => 'user',
                          'password' => "geqgeagae",
                          'email'    => "test@test.com",
                          'alias'    => "alias");
    
            API::getInstance()->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
    
    sgiehl's avatar
    sgiehl a validé
            $exceptionNotRaised = false;
            try {
    
                API::getInstance()->addUser('superusertest', 'te', 'fake@fale.co', 'ega');
    
    sgiehl's avatar
    sgiehl a validé
                $exceptionNotRaised = true;
            } catch (Exception $expected) {
                $this->assertRegExp("(UsersManager_ExceptionSuperUser)", $expected->getMessage());
            }
            try {
    
                API::getInstance()->updateUser('superusertest', 'te', 'fake@fale.co', 'ega');
    
    sgiehl's avatar
    sgiehl a validé
                $exceptionNotRaised = true;
            } catch (Exception $expected) {
                $this->assertRegExp("(UsersManager_ExceptionSuperUser)", $expected->getMessage());
            }
            try {
    
                API::getInstance()->deleteUser('superusertest', 'te', 'fake@fale.co', 'ega');
    
    sgiehl's avatar
    sgiehl a validé
                $exceptionNotRaised = true;
            } catch (Exception $expected) {
                $this->assertRegExp("(UsersManager_ExceptionSuperUser)", $expected->getMessage());
            }
            try {
    
                API::getInstance()->deleteUser('superusertest', 'te', 'fake@fale.co', 'ega');
    
    sgiehl's avatar
    sgiehl a validé
                $exceptionNotRaised = true;
            } catch (Exception $expected) {
                $this->assertRegExp("(UsersManager_ExceptionSuperUser)", $expected->getMessage());
            }
    
    sgiehl's avatar
    sgiehl a validé
                $this->fail();
            }
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * bad password => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testUpdateUserBadpasswd()
        {
    
            $login = "login";
            $user = array('login'    => $login,
                          'password' => "geqgeagae",
                          'email'    => "test@test.com",
                          'alias'    => "alias");
    
    
            API::getInstance()->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
    
    sgiehl's avatar
    sgiehl a validé
            try {
    
                API::getInstance()->updateUser($login, "pas");
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionInvalidPassword)", $expected->getMessage());
    
    
                $this->_checkUserHasNotChanged($user, $user['password']);
    
    sgiehl's avatar
    sgiehl a validé
                return;
            }
            $this->fail("Exception not raised.");
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * Dataprovider
         */
        public function getAddUserInvalidLoginData()
        {
            return array(
                array(12, "password", "email@email.com", "alias"), // wrong login / integer => exception
                array("gegag'ggea'", "password", "email@email.com", "alias"), // wrong login / too short => exception
                array("gegag11gge&", "password", "email@email.com", "alias"), // wrong login / too long => exception
                array("geg'ag11gge@", "password", "email@email.com", "alias"), // wrong login / bad characters => exception
            );
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
    
    sgiehl's avatar
    sgiehl a validé
         * @dataProvider getAddUserInvalidLoginData
         * @group Plugins
         */
        public function testAddUserWrongLogin($userLogin, $password, $email, $alias)
        {
            try {
    
                API::getInstance()->addUser($userLogin, $password, $email, $alias);
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionInvalidLogin)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * existing login => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testAddUserExistingLogin()
        {
            try {
    
                API::getInstance()->addUser("test", "password", "email@email.com", "alias");
                API::getInstance()->addUser("test", "password2", "em2ail@email.com", "al2ias");
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionLoginExists)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
    
    sgiehl's avatar
    sgiehl a validé
        }
    
        /**
         * Dataprovider for wrong password tests
         */
    
        public function getWrongPasswordTestData()
    
    sgiehl's avatar
    sgiehl a validé
        {
            return array(
    
                array("geggeqgeqag", "pas", "email@email.com", "alias"), // too short -> exception
    
    sgiehl's avatar
    sgiehl a validé
                array("ghqgeggg", "gegageqqqqqqqgeqgqeg84897897897897g122", "email@email.com", "alias"), // too long -> exception
    
                array("geggeqgeqag", "", "email@email.com", "alias"), // empty -> exception
    
    sgiehl's avatar
    sgiehl a validé
            );
        }
    
        /**
         *
         * @dataProvider getWrongPasswordTestData
         * @group Plugins
         */
        public function testAddUserWrongPassword($userLogin, $password, $email, $alias)
        {
            try {
    
                API::getInstance()->addUser($userLogin, $password, $email, $alias);
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionInvalidPassword)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
        /**
         * Dataprovider for wrong email tests
         */
    
        public function getWrongEmailTestData()
    
    sgiehl's avatar
    sgiehl a validé
        {
            return array(
    
    Fabian Becker's avatar
    Fabian Becker a validé
                array("geggeqgeqag", "geqgeagae", "ema'il@email.com", "alias"),
    
    sgiehl's avatar
    sgiehl a validé
                array("geggeqgeqag", "geqgeagae", "@email.com", "alias"),
                array("geggeqgeqag", "geqgeagae", "email@.com", "alias"),
                array("geggeqgeqag", "geqgeagae", "email@4.", "alias"),
            );
        }
    
        /**
         *
         * @dataProvider getWrongEmailTestData
         * @group Plugins
         */
        public function testAddUserWrongEmail($userLogin, $password, $email, $alias)
        {
            try {
    
                API::getInstance()->addUser($userLogin, $password, $email, $alias);
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(mail)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * empty email => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testAddUserEmptyEmail()
        {
    
    sgiehl's avatar
    sgiehl a validé
            try {
    
                API::getInstance()->addUser("geggeqgeqag", "geqgeagae", "", "alias");
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(mail)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * empty alias => use login
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testAddUserEmptyAlias()
        {
    
            API::getInstance()->addUser($login, "geqgeagae", "mgeagi@geq.com", "");
            $user = API::getInstance()->getUser($login);
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals($login, $user['alias']);
            $this->assertEquals($login, $user['login']);
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * no alias => use login
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testAddUserNoAliasSpecified()
        {
    
            API::getInstance()->addUser($login, "geqgeagae", "mgeagi@geq.com");
            $user = API::getInstance()->getUser($login);
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals($login, $user['alias']);
            $this->assertEquals($login, $user['login']);
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal test case
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testAddUser()
        {
    
    sgiehl's avatar
    sgiehl a validé
            $password = "mypassword";
            $email = "mgeag4544i@geq.com";
            $alias = "her is my alias )(&|\" '£%*(&%+))";
    
    sgiehl's avatar
    sgiehl a validé
            $time = time();
    
            API::getInstance()->addUser($login, $password, $email, $alias);
            $user = API::getInstance()->getUser($login);
    
    sgiehl's avatar
    sgiehl a validé
            // check that the date registered is correct
    
            $this->assertTrue($time <= strtotime($user['date_registered']) && strtotime($user['date_registered']) <= time(),
                "the date_registered " . strtotime($user['date_registered']) . " is different from the time() " . time());
            $this->assertTrue($user['date_registered'] <= time());
    
    
    sgiehl's avatar
    sgiehl a validé
            // check that token is 32 chars
            $this->assertEquals(32, strlen($user['password']));
    
    sgiehl's avatar
    sgiehl a validé
            // that the password has been md5
    
            $this->assertEquals(md5($login . md5($password)), $user['token_auth']);
    
    
    sgiehl's avatar
    sgiehl a validé
            // check that all fields are the same
            $this->assertEquals($login, $user['login']);
            $this->assertEquals(md5($password), $user['password']);
            $this->assertEquals($email, $user['email']);
            $this->assertEquals($alias, $user['alias']);
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * user doesnt exist => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSeleteUserDoesntExist()
    
            API::getInstance()->addUser("geggeqgeqag", "geqgeagae", "test@test.com", "alias");
    
    sgiehl's avatar
    sgiehl a validé
            try {
    
                API::getInstance()->deleteUser("geggeqggnew");
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionDeleteDoesNotExist)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * empty name, doesnt exists =>exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testDeleteUserEmptyUser()
        {
            try {
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionDeleteDoesNotExist)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * null user,, doesnt exists => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testDeleteUserNullUser()
        {
            try {
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionDeleteDoesNotExist)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case, user deleted
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testDeleteUser()
        {
            //create the 3 websites
    
            $idsite = APISitesManager::getInstance()->addSite("site1", array("http://piwik.net", "http://piwik.com/test/"));
            $idsite = APISitesManager::getInstance()->addSite("site2", array("http://piwik.com/test/"));
            $idsite = APISitesManager::getInstance()->addSite("site3", array("http://piwik.org"));
    
    sgiehl's avatar
    sgiehl a validé
            //add user and set some rights
    
            API::getInstance()->addUser("geggeqgeqag", "geqgeagae", "test@test.com", "alias");
            API::getInstance()->setUserAccess("geggeqgeqag", "view", array(1, 2));
            API::getInstance()->setUserAccess("geggeqgeqag", "admin", array(1, 3));
    
    sgiehl's avatar
    sgiehl a validé
            // check rights are set
    
            $this->assertNotEquals(array(), API::getInstance()->getSitesAccessFromUser("geggeqgeqag"));
    
    sgiehl's avatar
    sgiehl a validé
            // delete the user
    
            API::getInstance()->deleteUser("geggeqgeqag");
    
    sgiehl's avatar
    sgiehl a validé
            // try to get it, it should raise an exception
            try {
    
                $user = API::getInstance()->getUser("geggeqgeqag");
    
    sgiehl's avatar
    sgiehl a validé
                $this->fail("Exception not raised.");
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionUserDoesNotExist)", $expected->getMessage());
            }
    
            // add the same user
    
            API::getInstance()->addUser("geggeqgeqag", "geqgeagae", "test@test.com", "alias");
    
    sgiehl's avatar
    sgiehl a validé
            //checks access have been deleted
            //to do so we recreate the same user login and check if the rights are still there
    
            $this->assertEquals(array(), API::getInstance()->getSitesAccessFromUser("geggeqgeqag"));
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * no user => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetUserNoUser()
        {
            // try to get it, it should raise an exception
            try {
    
                $user = API::getInstance()->getUser("geggeqgeqag");
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionUserDoesNotExist)", $expected->getMessage());
                return;
            }
    
    sgiehl's avatar
    sgiehl a validé
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function test_GetUser()
        {
    
    sgiehl's avatar
    sgiehl a validé
            $password = "mypassword";
            $email = "mgeag4544i@geq.com";
            $alias = "";
    
            API::getInstance()->addUser($login, $password, $email, $alias);
            $user = API::getInstance()->getUser($login);
    
    sgiehl's avatar
    sgiehl a validé
            // check that all fields are the same
            $this->assertEquals($login, $user['login']);
            $this->assertInternalType('string', $user['password']);
            $this->assertInternalType('string', $user['date_registered']);
            $this->assertEquals($email, $user['email']);
    
    sgiehl's avatar
    sgiehl a validé
            //alias shouldnt be empty even if no alias specified
            $this->assertGreaterThan(0, strlen($user['alias']));
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * no user => empty array
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetUsersNoUser()
        {
    
            $this->assertEquals(API::getInstance()->getUsers(), array());
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case
         * as well as selecting specific user names, comma separated
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetUsers()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
            API::getInstance()->addUser("geggeqge632ge56a4qag", "geqgegeagae", "tesggt@tesgt.com", "alias");
            API::getInstance()->addUser("geggeqgeqagqegg", "geqgeaggggae", "tesgggt@tesgt.com");
    
            $users = API::getInstance()->getUsers();
    
    sgiehl's avatar
    sgiehl a validé
            $users = $this->_removeNonTestableFieldsFromUsers($users);
    
            $user1 = array('login' => "gegg4564eqgeqag", 'password' => md5("geqgegagae"), 'alias' => "alias", 'email' => "tegst@tesgt.com");
            $user2 = array('login' => "geggeqge632ge56a4qag", 'password' => md5("geqgegeagae"), 'alias' => "alias", 'email' => "tesggt@tesgt.com");
            $user3 = array('login' => "geggeqgeqagqegg", 'password' => md5("geqgeaggggae"), 'alias' => 'geggeqgeqagqegg', 'email' => "tesgggt@tesgt.com");
    
    sgiehl's avatar
    sgiehl a validé
            $expectedUsers = array($user1, $user2, $user3);
            $this->assertEquals($expectedUsers, $users);
    
            $this->assertEquals(array($user1), $this->_removeNonTestableFieldsFromUsers(API::getInstance()->getUsers('gegg4564eqgeqag')));
            $this->assertEquals(array($user1, $user2), $this->_removeNonTestableFieldsFromUsers(API::getInstance()->getUsers('gegg4564eqgeqag,geggeqge632ge56a4qag')));
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        protected function _removeNonTestableFieldsFromUsers($users)
        {
    
    sgiehl's avatar
    sgiehl a validé
                unset($user['token_auth']);
                unset($user['date_registered']);
            }
            return $users;
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetUsersLogin()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
            API::getInstance()->addUser("geggeqge632ge56a4qag", "geqgegeagae", "tesggt@tesgt.com", "alias");
            API::getInstance()->addUser("geggeqgeqagqegg", "geqgeaggggae", "tesgggt@tesgt.com");
    
            $logins = API::getInstance()->getUsersLogin();
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals(array("gegg4564eqgeqag", "geggeqge632ge56a4qag", "geggeqgeqagqegg"), $logins);
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * no login => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessNoLogin()
        {
            // try to get it, it should raise an exception
            try {
    
                API::getInstance()->setUserAccess("nologin", "view", 1);
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionUserDoesNotExist)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * wrong access specified  => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessWrongAccess()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
    
    sgiehl's avatar
    sgiehl a validé
            // try to get it, it should raise an exception
            try {
    
                API::getInstance()->setUserAccess("gegg4564eqgeqag", "viewnotknown", 1);
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionAccessValues)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * idsites = all => apply access to all websites with admin access
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessIdsitesIsAll()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
    
    sgiehl's avatar
    sgiehl a validé
            FakeAccess::$superUser = false;
    
            API::getInstance()->setUserAccess("gegg4564eqgeqag", "view", "all");
    
    sgiehl's avatar
    sgiehl a validé
            FakeAccess::$superUser = true;
    
            $access = API::getInstance()->getSitesAccessFromUser("gegg4564eqgeqag");
    
    sgiehl's avatar
    sgiehl a validé
            $access = $this->_flatten($access);
    
    sgiehl's avatar
    sgiehl a validé
            FakeAccess::$superUser = false;
    
            $this->assertEquals(array_keys($access), FakeAccess::getSitesIdWithAdminAccess());
    
    
    sgiehl's avatar
    sgiehl a validé
            // we want to test the case for which we have actually set some rights
            // if this is not OK then change the setUp method and add some admin rights for some websites
            $this->assertGreaterThan(0, count(array_keys($access)));
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * idsites = all AND user is superuser=> apply access to all websites
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessIdsitesIsAllSuperuser()
        {
            FakeAccess::$superUser = true;
    
            $id1 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
            $id2 = APISitesManager::getInstance()->addSite("test2", array("http://piwik.net", "http://piwik.com/test/"));
            $id3 = APISitesManager::getInstance()->addSite("test3", array("http://piwik.net", "http://piwik.com/test/"));
            $id4 = APISitesManager::getInstance()->addSite("test4", array("http://piwik.net", "http://piwik.com/test/"));
            $id5 = APISitesManager::getInstance()->addSite("test5", array("http://piwik.net", "http://piwik.com/test/"));
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
            API::getInstance()->setUserAccess("gegg4564eqgeqag", "view", "all");
    
            $access = API::getInstance()->getSitesAccessFromUser("gegg4564eqgeqag");
    
    sgiehl's avatar
    sgiehl a validé
            $access = $this->_flatten($access);
    
            $this->assertEquals(array($id1, $id2, $id3, $id4, $id5), array_keys($access));
    
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * idsites is empty => no acccess set
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessIdsitesEmpty()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
    
    mattpiwik's avatar
    mattpiwik a validé
    
    
                API::getInstance()->setUserAccess("gegg4564eqgeqag", "view", array());
                $access = API::getInstance()->getSitesAccessFromUser("gegg4564eqgeqag");
    
            } catch (Exception $e) {
                return;
            }
            $this->fail('Expected exception not raised');
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case, access set for only one site
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessIdsitesOneSite()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
    
            $id1 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
    
            API::getInstance()->setUserAccess("gegg4564eqgeqag", "view", array(1));
    
            $access = API::getInstance()->getSitesAccessFromUser("gegg4564eqgeqag");
    
    sgiehl's avatar
    sgiehl a validé
            $access = $this->_flatten($access);
    
            $this->assertEquals(array(1), array_keys($access));
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case, access set for multiple sites
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessIdsitesMultipleSites()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
    
            $id1 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
            $id2 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
            $id3 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
    
            API::getInstance()->setUserAccess("gegg4564eqgeqag", "view", array($id1, $id3));
    
            $access = API::getInstance()->getSitesAccessFromUser("gegg4564eqgeqag");
    
    sgiehl's avatar
    sgiehl a validé
            $access = $this->_flatten($access);
    
            $this->assertEquals(array($id1, $id3), array_keys($access));
    
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case, string idSites comma separated access set for multiple sites
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessWithIdSitesIsStringCommaSeparated()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
    
            $id1 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
            $id2 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
            $id3 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
    
            API::getInstance()->setUserAccess("gegg4564eqgeqag", "view", "1,3");
    
            $access = API::getInstance()->getSitesAccessFromUser("gegg4564eqgeqag");
    
    sgiehl's avatar
    sgiehl a validé
            $access = $this->_flatten($access);
    
            $this->assertEquals(array($id1, $id3), array_keys($access));
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case,  set different acccess to different websites for one user
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessMultipleCallDistinctAccessSameUser()
        {
    
            API::getInstance()->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
    
            $id1 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
            $id2 = APISitesManager::getInstance()->addSite("test", array("http://piwik.net", "http://piwik.com/test/"));
    
            API::getInstance()->setUserAccess("gegg4564eqgeqag", "view", array($id1));
            API::getInstance()->setUserAccess("gegg4564eqgeqag", "admin", array($id2));
    
            $access = API::getInstance()->getSitesAccessFromUser("gegg4564eqgeqag");
    
    sgiehl's avatar
    sgiehl a validé
            $access = $this->_flatten($access);
    
            $this->assertEquals(array($id1 => 'view', $id2 => 'admin'), $access);
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case, set different access to different websites for multiple users
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessMultipleCallDistinctAccessMultipleUser()
        {
    
            API::getInstance()->addUser("user1", "geqgegagae", "tegst@tesgt.com", "alias");
            API::getInstance()->addUser("user2", "geqgegagae", "tegst2@tesgt.com", "alias");
    
            $id1 = APISitesManager::getInstance()->addSite("test1", array("http://piwik.net", "http://piwik.com/test/"));
            $id2 = APISitesManager::getInstance()->addSite("test2", array("http://piwik.net", "http://piwik.com/test/"));
            $id3 = APISitesManager::getInstance()->addSite("test2", array("http://piwik.net", "http://piwik.com/test/"));
    
            API::getInstance()->setUserAccess("user1", "view", array($id1, $id2));
            API::getInstance()->setUserAccess("user2", "admin", array($id1));
            API::getInstance()->setUserAccess("user2", "view", array($id3, $id2));
    
            $access1 = API::getInstance()->getSitesAccessFromUser("user1");
    
    sgiehl's avatar
    sgiehl a validé
            $access1 = $this->_flatten($access1);
    
            $access2 = API::getInstance()->getSitesAccessFromUser("user2");
    
    sgiehl's avatar
    sgiehl a validé
            $access2 = $this->_flatten($access2);
    
            $wanted1 = array($id1 => 'view', $id2 => 'view',);
            $wanted2 = array($id1 => 'admin', $id2 => 'view', $id3 => 'view');
    
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals($wanted1, $access1);
            $this->assertEquals($wanted2, $access2);
    
            $access1 = API::getInstance()->getUsersAccessFromSite($id1);
            $access2 = API::getInstance()->getUsersAccessFromSite($id2);
            $access3 = API::getInstance()->getUsersAccessFromSite($id3);
    
            $wanted1 = array('user1' => 'view', 'user2' => 'admin',);
            $wanted2 = array('user1' => 'view', 'user2' => 'view');
            $wanted3 = array('user2' => 'view');
    
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals($wanted1, $access1);
            $this->assertEquals($wanted2, $access2);
            $this->assertEquals($wanted3, $access3);
    
            $access1 = API::getInstance()->getUsersSitesFromAccess('view');
            $access2 = API::getInstance()->getUsersSitesFromAccess('admin');
    
            $wanted1 = array('user1' => array($id1, $id2), 'user2' => array($id2, $id3));
            $wanted2 = array('user2' => array($id1));
    
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals($wanted1, $access1);
            $this->assertEquals($wanted2, $access2);
    
    sgiehl's avatar
    sgiehl a validé
            // Test getUsersWithSiteAccess
    
            $users = API::getInstance()->getUsersWithSiteAccess($id1, $access = 'view');
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals(1, count($users));
            $this->assertEquals('user1', $users[0]['login']);
    
            $users = API::getInstance()->getUsersWithSiteAccess($id2, $access = 'view');
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals(2, count($users));
    
            $users = API::getInstance()->getUsersWithSiteAccess($id1, $access = 'admin');
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals(1, count($users));
            $this->assertEquals('user2', $users[0]['login']);
    
            $users = API::getInstance()->getUsersWithSiteAccess($id3, $access = 'admin');
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals(0, count($users));
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * we set access for one user for one site several times and check that it is updated
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testSetUserAccessMultipleCallOverwriteSingleUserOneSite()
        {
    
            API::getInstance()->addUser("user1", "geqgegagae", "tegst@tesgt.com", "alias");
    
            $id1 = APISitesManager::getInstance()->addSite("test1", array("http://piwik.net", "http://piwik.com/test/"));
            $id2 = APISitesManager::getInstance()->addSite("test2", array("http://piwik.net", "http://piwik.com/test/"));
    
            API::getInstance()->setUserAccess("user1", "view", array($id1, $id2));
            API::getInstance()->setUserAccess("user1", "admin", array($id1));
    
            $access1 = API::getInstance()->getSitesAccessFromUser("user1");
    
    sgiehl's avatar
    sgiehl a validé
            $access1 = $this->_flatten($access1);
    
            $wanted1 = array($id1 => 'admin', $id2 => 'view',);
    
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals($wanted1, $access1);
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * wrong user => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetSitesAccessFromUserWrongUser()
        {
            try {
    
                $access1 = API::getInstance()->getSitesAccessFromUser("user1");
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionUserDoesNotExist)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         *wrong idsite => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetUsersAccessFromSiteWrongSite()
        {
    
                $access1 = API::getInstance()->getUsersAccessFromSite(1);
    
            } catch (Exception $e) {
                return;
            }
            $this->fail('Expected exception not raised');
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * wrong access =>exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetUsersSitesFromAccessWrongSite()
        {
            try {
    
                $access1 = API::getInstance()->getUsersSitesFromAccess('unknown');
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionAccessValues)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * non existing login => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testUpdateUserWrongLogin()
        {
            try {
    
                API::getInstance()->updateUser("lolgin", "password");
    
            } catch (Exception $expected) {
    
    sgiehl's avatar
    sgiehl a validé
                $this->assertRegExp("(UsersManager_ExceptionUserDoesNotExist)", $expected->getMessage());
                return;
            }
            $this->fail("Exception not raised.");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * no email no alias => keep old ones
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testUpdateUserNoEmailNoAlias()
        {
    
            $login = "login";
            $user = array('login'    => $login,
                          'password' => "geqgeagae",
                          'email'    => "test@test.com",
                          'alias'    => "alias");
    
    
            API::getInstance()->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
    
            API::getInstance()->updateUser($login, "passowordOK");
    
    sgiehl's avatar
    sgiehl a validé
            $this->_checkUserHasNotChanged($user, "passowordOK");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         *no email => keep old ones
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testUpdateUserNoEmail()
        {
    
            $login = "login";
            $user = array('login'    => $login,
                          'password' => "geqgeagae",
                          'email'    => "test@test.com",
                          'alias'    => "alias");
    
    
            API::getInstance()->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
    
            API::getInstance()->updateUser($login, "passowordOK", null, "newalias");
    
    sgiehl's avatar
    sgiehl a validé
            $this->_checkUserHasNotChanged($user, "passowordOK", null, "newalias");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * no alias => keep old ones
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testUpdateUserNoAlias()
        {
    
            $login = "login";
            $user = array('login'    => $login,
                          'password' => "geqgeagae",
                          'email'    => "test@test.com",
                          'alias'    => "alias");
    
    
            API::getInstance()->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
    
            API::getInstance()->updateUser($login, "passowordOK", "email@geaga.com");
    
    sgiehl's avatar
    sgiehl a validé
            $this->_checkUserHasNotChanged($user, "passowordOK", "email@geaga.com");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * check to modify as the user
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testUpdateUserIAmTheUser()
        {
            FakeAccess::$identity = 'login';
            $this->testUpdateUserNoEmailNoAlias();
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * check to modify as being another user => exception
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testUpdateUserIAmNotTheUser()
        {
    
            try {
                FakeAccess::$identity = 'login2';
                FakeAccess::$superUser = false;
                $this->testUpdateUserNoEmailNoAlias();
            } catch (Exception $e) {
                return;
            }
            $this->fail('Expected exception not raised');
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * normal case, reused in other tests
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testUpdateUser()
        {
    
            $login = "login";
            $user = array('login'    => $login,
                          'password' => "geqgeagae",
                          'email'    => "test@test.com",
                          'alias'    => "alias");
    
    
            API::getInstance()->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
    
            API::getInstance()->updateUser($login, "passowordOK", "email@geaga.com", "NEW ALIAS");
    
    sgiehl's avatar
    sgiehl a validé
            $this->_checkUserHasNotChanged($user, "passowordOK", "email@geaga.com", "NEW ALIAS");
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * test getUserByEmail invalid mail
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetUserByEmailInvalidMail()
        {
    
                $userByMail = API::getInstance()->getUserByEmail('email@test.com');
    
            } catch (Exception $e) {
                return;
            }
            $this->fail('Expected exception not raised');
    
    sgiehl's avatar
    sgiehl a validé
        }
    
    sgiehl's avatar
    sgiehl a validé
        /**
         * test getUserByEmail
    
    sgiehl's avatar
    sgiehl a validé
         * @group Plugins
         */
        public function testGetUserByEmail()
        {
            $user = array('login'    => "login",
                          'password' => "geqgeagae",
                          'email'    => "test@test.com",
                          'alias'    => "alias");
    
            API::getInstance()->addUser($user['login'], $user['password'], $user['email'], $user['alias']);
    
            $userByMail = API::getInstance()->getUserByEmail($user['email']);
    
    sgiehl's avatar
    sgiehl a validé
            $this->assertEquals($user['login'], $userByMail['login']);
            $this->assertEquals($user['email'], $userByMail['email']);
            $this->assertEquals($user['alias'], $userByMail['alias']);
        }
    
        /**
         * @group Plugins
         */
        public function testGetUserPreferenceDefault()
        {
    
            APISitesManager::getInstance()->addSite("site1", array("http://piwik.net", "http://piwik.com/test/"));
    
            $defaultReportPref = API::PREFERENCE_DEFAULT_REPORT;
            $defaultReportDatePref = API::PREFERENCE_DEFAULT_REPORT_DATE;