From ad33628220ca6cadad46ebb69e88a8005a5b0394 Mon Sep 17 00:00:00 2001
From: diosmosis <benaka@piwik.pro>
Date: Mon, 29 Sep 2014 20:23:56 -0700
Subject: [PATCH] Fixing UI tests and adding tests for Access::doAsSuperUser.

---
 plugins/Installation/Controller.php           |  6 ++-
 plugins/Login/PasswordResetter.php            |  4 +-
 tests/PHPUnit/Integration/Core/AccessTest.php | 54 +++++++++++++++++++
 3 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/plugins/Installation/Controller.php b/plugins/Installation/Controller.php
index 7d66116082..a26a29d182 100644
--- a/plugins/Installation/Controller.php
+++ b/plugins/Installation/Controller.php
@@ -306,9 +306,11 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
     {
         $this->checkPiwikIsNotInstalled();
 
-        $this->initObjectsToCallAPI();
+        $siteIdsCount = Access::doAsSuperUser(function () {
+            return count(APISitesManager::getInstance()->getAllSitesId());
+        });
 
-        if (count(APISitesManager::getInstance()->getAllSitesId()) > 0) {
+        if ($siteIdsCount > 0) {
             // if there is a already a website, skip this step and trackingCode step
             $this->redirectToNextStep('trackingCode');
         }
diff --git a/plugins/Login/PasswordResetter.php b/plugins/Login/PasswordResetter.php
index 3f3c384183..d2631abdf9 100644
--- a/plugins/Login/PasswordResetter.php
+++ b/plugins/Login/PasswordResetter.php
@@ -210,7 +210,7 @@ class PasswordResetter
 
         // reset password of user
         $usersManager = $this->usersManagerApi;
-        UsersManagerAPI::doAsSuperUser(function () use ($usersManager, $user, $resetPassword) {
+        Access::doAsSuperUser(function () use ($usersManager, $user, $resetPassword) {
             $usersManager->updateUser(
                 $user['login'], $resetPassword, $email = false, $alias = false, $isPasswordHashed = true);
         });
@@ -360,7 +360,7 @@ class PasswordResetter
     protected function getUserInformation($loginOrMail)
     {
         $usersManager = $this->usersManagerApi;
-        return UsersManagerAPI::doAsSuperUser(function () use ($loginOrMail, $usersManager) {
+        return Access::doAsSuperUser(function () use ($loginOrMail, $usersManager) {
             $user = null;
             if ($usersManager->userExists($loginOrMail)) {
                 $user = $usersManager->getUser($loginOrMail);
diff --git a/tests/PHPUnit/Integration/Core/AccessTest.php b/tests/PHPUnit/Integration/Core/AccessTest.php
index 87dc7cf4d5..5e95ed3326 100644
--- a/tests/PHPUnit/Integration/Core/AccessTest.php
+++ b/tests/PHPUnit/Integration/Core/AccessTest.php
@@ -309,4 +309,58 @@ class Core_AccessTest extends DatabaseTestCase
         $this->assertTrue($access->reloadAccess($mock));
         $this->assertFalse($access->hasSuperUserAccess());
     }
+
+    public function test_doAsSuperUser_ChangesSuperUserAccessCorrectly()
+    {
+        Access::getInstance()->setSuperUserAccess(false);
+
+        $this->assertFalse(Access::getInstance()->hasSuperUserAccess());
+
+        Access::doAsSuperUser(function () {
+            Core_AccessTest::assertTrue(Access::getInstance()->hasSuperUserAccess());
+        });
+
+        $this->assertFalse(Access::getInstance()->hasSuperUserAccess());
+    }
+
+    public function test_doAsSuperUser_RemovesSuperUserAccess_IfExceptionThrown()
+    {
+        Access::getInstance()->setSuperUserAccess(false);
+
+        $this->assertFalse(Access::getInstance()->hasSuperUserAccess());
+
+        try {
+            Access::doAsSuperUser(function () {
+                throw new Exception();
+            });
+
+            $this->fail("Exception was not propagated by doAsSuperUser.");
+        } catch (Exception $ex)
+        {
+            // pass
+        }
+
+        $this->assertFalse(Access::getInstance()->hasSuperUserAccess());
+    }
+
+    public function test_doAsSuperUser_ReturnsCallbackResult()
+    {
+        $result = Access::doAsSuperUser(function () {
+            return 24;
+        });
+        $this->assertEquals(24, $result);
+    }
+
+    public function test_reloadAccess_DoesNotRemoveSuperUserAccess_IfUsedInDoAsSuperUser()
+    {
+        Access::getInstance()->setSuperUserAccess(false);
+
+        Access::doAsSuperUser(function () {
+            $access = Access::getInstance();
+
+            Core_AccessTest::assertTrue($access->hasSuperUserAccess());
+            $access->reloadAccess();
+            Core_AccessTest::assertTrue($access->hasSuperUserAccess());
+        });
+    }
 }
\ No newline at end of file
-- 
GitLab