317 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			317 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * mysql tests for the authpdo plugin
 | |
|  *
 | |
|  * @group plugin_authpdo
 | |
|  * @group plugins
 | |
|  */
 | |
| class mysql_plugin_authpdo_test extends DokuWikiTest {
 | |
| 
 | |
|     protected $driver = 'mysql';
 | |
|     protected $host = '';
 | |
|     protected $database = 'authpdo_testing';
 | |
|     protected $user = '';
 | |
|     protected $pass = '';
 | |
|     protected $port = '';
 | |
| 
 | |
|     public function setUp() : void {
 | |
|         parent::setUp();
 | |
|         $configuration = DOKU_UNITTEST . "{$this->driver}.conf.php";
 | |
|         if(!file_exists($configuration)) {
 | |
|             return;
 | |
|         }
 | |
|         /** @var $conf array */
 | |
|         include $configuration;
 | |
|         $this->host = $conf['host'];
 | |
|         $this->user = $conf['user'];
 | |
|         $this->pass = $conf['pass'];
 | |
|         $this->port = $conf['port'];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * try to remove the last set up database
 | |
|      *
 | |
|      * it might still be there if something went wrong
 | |
|      */
 | |
|     public function tearDown() : void {
 | |
|         parent::tearDown();
 | |
|         $this->dropDatabase();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Check if database credentials and extensions exist
 | |
|      */
 | |
|     public function test_requirements() {
 | |
|         if(!$this->host || !$this->user) {
 | |
|             $this->markTestSkipped("Skipped {$this->driver} tests. Missing configuration");
 | |
|         }
 | |
|         if(!class_exists('PDO')) {
 | |
|             $this->markTestSkipped("Skipped {$this->driver} tests. Missing PDO extension");
 | |
|         }
 | |
|         if(!in_array($this->driver, pdo_drivers())) {
 | |
|             $this->markTestSkipped("Skipped {$this->driver} tests. Missing pdo_{$this->driver} extension");
 | |
|         }
 | |
|         $this->assertTrue(true); // avoid being marked as risky for having no assertion
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * create the database for testing
 | |
|      */
 | |
|     protected function createDatabase() {
 | |
|         $pdo = new PDO(
 | |
|             "{$this->driver}:host={$this->host};port={$this->port}", $this->user, $this->pass,
 | |
|             array(
 | |
|                 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // we want exceptions, not error codes
 | |
|             )
 | |
|         );
 | |
|         $pdo->exec("DROP DATABASE IF EXISTS {$this->database}");
 | |
|         $pdo->exec("CREATE DATABASE {$this->database}");
 | |
|         $pdo = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * remove the database
 | |
|      */
 | |
|     protected function dropDatabase() {
 | |
|         $pdo = new PDO(
 | |
|             "{$this->driver}:host={$this->host};port={$this->port}", $this->user, $this->pass,
 | |
|             array(
 | |
|                 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // we want exceptions, not error codes
 | |
|             )
 | |
|         );
 | |
|         try {
 | |
|             $pdo->exec("DROP DATABASE IF EXISTS {$this->database}");
 | |
|         } catch (PDOException $e) {
 | |
|             // ignore - sometimes this fails even though the database was deleted
 | |
|         }
 | |
|         $pdo = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * imports a database dump
 | |
|      *
 | |
|      * @param $file
 | |
|      */
 | |
|     protected function importDatabase($file) {
 | |
|         // connect to database and import dump
 | |
|         $pdo = null;
 | |
|         $pdo = new PDO(
 | |
|             "{$this->driver}:dbname={$this->database};host={$this->host};port={$this->port}", $this->user, $this->pass,
 | |
|             array(
 | |
|                 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // we want exceptions, not error codes
 | |
|             )
 | |
|         );
 | |
|         $sql = file_get_contents($file);
 | |
|         $pdo->exec($sql);
 | |
|         $pdo = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Run general tests on all users
 | |
|      *
 | |
|      * @param auth_plugin_authpdo $auth
 | |
|      * @param array $users
 | |
|      */
 | |
|     protected function runGeneralTests(auth_plugin_authpdo $auth, $users) {
 | |
|         global $conf;
 | |
|         $info = 'DSN: ' . $auth->getConf('dsn');
 | |
|         $this->assertTrue($auth->success, $info);
 | |
| 
 | |
|         if($auth->canDo('getUsers')) {
 | |
|             $list = $auth->retrieveUsers();
 | |
|             $this->assertGreaterThanOrEqual(count($users), count($list), $info);
 | |
|         }
 | |
| 
 | |
|         if($auth->canDo('getGroups')) {
 | |
|             $list = $auth->retrieveGroups();
 | |
|             $this->assertGreaterThanOrEqual(1, $list, $info);
 | |
|         }
 | |
| 
 | |
|         if($auth->canDo('getUserCount')) {
 | |
|             $count = $auth->getUserCount();
 | |
|             $this->assertGreaterThanOrEqual(count($users), $count);
 | |
|         }
 | |
| 
 | |
|         if($auth->canDo('addUser')) {
 | |
|             $newuser = array(
 | |
|                 'user' => 'newuserfoobar',
 | |
|                 'name' => 'First LastFoobar',
 | |
|                 'pass' => 'password',
 | |
|                 'mail' => 'newuserfoobar@example.com',
 | |
|                 'grps' => array('acompletelynewgroup')
 | |
|             );
 | |
|             $ok = $auth->createUser(
 | |
|                 $newuser['user'],
 | |
|                 $newuser['pass'],
 | |
|                 $newuser['name'],
 | |
|                 $newuser['mail'],
 | |
|                 $newuser['grps']
 | |
|             );
 | |
|             $this->assertTrue($ok, $info);
 | |
|             $check = $auth->getUserData($newuser['user']);
 | |
|             $this->assertEquals($newuser['user'], $check['user'], $info);
 | |
|             $this->assertEquals($newuser['mail'], $check['mail'], $info);
 | |
|             $groups = array_merge($newuser['grps'], array($conf['defaultgroup']));
 | |
|             $this->assertEquals($groups, $check['grps'], $info);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * run all the tests with the given user, depending on the capabilities
 | |
|      *
 | |
|      * @param auth_plugin_authpdo $auth
 | |
|      * @param $user
 | |
|      */
 | |
|     protected function runUserTests(auth_plugin_authpdo $auth, $user) {
 | |
|         global $conf;
 | |
|         $info = 'DSN: ' . $auth->getConf('dsn') . ' User:' . $user['user'];
 | |
| 
 | |
|         // minimal setup
 | |
|         $this->assertTrue($auth->checkPass($user['user'], $user['pass']), $info);
 | |
|         $check = $auth->getUserData($user['user']);
 | |
|         $this->assertEquals($user['user'], $check['user'], $info);
 | |
|         $this->assertEquals($user['name'], $check['name'], $info);
 | |
|         $this->assertEquals($user['mail'], $check['mail'], $info);
 | |
|         $groups = array_merge($user['grps'], array($conf['defaultgroup']));
 | |
|         $this->assertEquals($groups, $check['grps'], $info);
 | |
| 
 | |
|         // getUsers
 | |
|         if($auth->canDo('getUsers')) {
 | |
|             $list = $auth->retrieveUsers(0, -1, array('user' => $user['user']));
 | |
|             $this->assertGreaterThanOrEqual(1, count($list));
 | |
|             $list = $auth->retrieveUsers(0, -1, array('name' => $user['name']));
 | |
|             $this->assertGreaterThanOrEqual(1, count($list));
 | |
|             $list = $auth->retrieveUsers(0, -1, array('mail' => $user['mail']));
 | |
|             $this->assertGreaterThanOrEqual(1, count($list));
 | |
|         }
 | |
| 
 | |
|         // getUserCount
 | |
|         if($auth->canDo('getUserCount')) {
 | |
|             $count = $auth->getUserCount(array('user' => $user['user']));
 | |
|             $this->assertGreaterThanOrEqual(1, $count);
 | |
|             $count = $auth->getUserCount(array('name' => $user['name']));
 | |
|             $this->assertGreaterThanOrEqual(1, $count);
 | |
|             $count = $auth->getUserCount(array('mail' => $user['mail']));
 | |
|             $this->assertGreaterThanOrEqual(1, $count);
 | |
|         }
 | |
| 
 | |
|         // modGroups
 | |
|         if($auth->canDo('modGroups')) {
 | |
|             $newgroup = 'foobar';
 | |
|             $ok = $auth->modifyUser($user['user'], array('grps' => array($newgroup)));
 | |
|             $this->assertTrue($ok, $info);
 | |
|             $check = $auth->getUserData($user['user']);
 | |
|             $this->assertTrue(in_array($newgroup, $check['grps']), $info);
 | |
|         }
 | |
| 
 | |
|         // modPass
 | |
|         if($auth->canDo('modPass')) {
 | |
|             $newpass = 'foobar';
 | |
|             $ok = $auth->modifyUser($user['user'], array('pass' => $newpass));
 | |
|             $this->assertTrue($ok, $info);
 | |
|             $this->assertTrue($auth->checkPass($user['user'], $newpass), $info);
 | |
|         }
 | |
| 
 | |
|         // modMail
 | |
|         if($auth->canDo('modMail')) {
 | |
|             $newmail = 'foobar@example.com';
 | |
|             $ok = $auth->modifyUser($user['user'], array('mail' => $newmail));
 | |
|             $this->assertTrue($ok, $info);
 | |
|             $check = $auth->getUserData($user['user']);
 | |
|             $this->assertEquals($newmail, $check['mail'], $info);
 | |
|         }
 | |
| 
 | |
|         // modName
 | |
|         if($auth->canDo('modName')) {
 | |
|             $newname = 'FirstName Foobar';
 | |
|             $ok = $auth->modifyUser($user['user'], array('name' => $newname));
 | |
|             $this->assertTrue($ok, $info);
 | |
|             $check = $auth->getUserData($user['user']);
 | |
|             $this->assertEquals($newname, $check['name'], $info);
 | |
|         }
 | |
| 
 | |
|         // modLogin
 | |
|         if($auth->canDo('modLogin')) {
 | |
|             $newuser = 'foobar' . $user['user'];
 | |
|             $ok = $auth->modifyUser($user['user'], array('user' => $newuser));
 | |
|             $this->assertTrue($ok, $info);
 | |
|             $check = $auth->getUserData($newuser);
 | |
|             $this->assertEquals($newuser, $check['user'], $info);
 | |
|             // rename back
 | |
|             $ok = $auth->modifyUser($newuser, array('user' => $user['user']));
 | |
|             $this->assertTrue($ok, $info);
 | |
|         }
 | |
| 
 | |
|         // delUser
 | |
|         if($auth->canDo('delUser')) {
 | |
|             $num = $auth->deleteUsers(array($user['user']));
 | |
|             $this->assertEquals(1, $num, $info);
 | |
|             $this->assertFalse($auth->getUserData($user['user']), $info);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * prepares the individual configurations for testing
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public function data_provider() {
 | |
|         $testdata = array();
 | |
| 
 | |
|         $files = glob(__DIR__ . "/{$this->driver}/*.php");
 | |
|         foreach($files as $file) {
 | |
|             $dump = preg_replace('/\.php$/', '.sql', $file);
 | |
|             $dbname = 'authpdo_testing_' . basename($file, '.php');
 | |
| 
 | |
|             /** @var $data array */
 | |
|             include $file;
 | |
| 
 | |
|             $testdata[] = array($dbname, $dump, $data);
 | |
|         }
 | |
| 
 | |
|         return $testdata;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This triggers all the tests based on the dumps and configurations
 | |
|      *
 | |
|      * @dataProvider data_provider
 | |
|      * @depends      test_requirements
 | |
|      * @param string $dbname Name of the database to use
 | |
|      * @param string $dump The path to the dump file to import
 | |
|      * @param array|string $data config and test user setup. When a string is passed, test is skipped with that msg
 | |
|      */
 | |
|     public function test_database($dbname, $dump, $data){
 | |
|         global $conf;
 | |
| 
 | |
|         if(!is_array($data)) {
 | |
|             $this->markTestSkipped($data);
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $this->database = $dbname;
 | |
| 
 | |
|         $this->createDatabase();
 | |
|         $this->importDatabase($dump);
 | |
| 
 | |
|         // Setup the configuration and initialize a new auth object
 | |
|         $conf['plugin']['authpdo'] = array();
 | |
|         $conf['plugin']['authpdo'] = $data['conf'];
 | |
|         $conf['plugin']['authpdo']['dsn'] = "{$this->driver}:dbname={$this->database};host={$this->host};port={$this->port}";
 | |
|         $conf['plugin']['authpdo']['user'] = $this->user;
 | |
|         $conf['plugin']['authpdo']['pass'] = $this->pass;
 | |
|         $conf['plugin']['authpdo']['debug'] = 1;
 | |
|         if($data['passcrypt']) $conf['passcrypt'] = $data['passcrypt'];
 | |
|         $auth = new auth_plugin_authpdo();
 | |
| 
 | |
|         $this->runGeneralTests($auth, $data['users']);
 | |
|         foreach($data['users'] as $user) {
 | |
|             $this->runUserTests($auth, $user);
 | |
|         }
 | |
| 
 | |
|         $this->dropDatabase();
 | |
|     }
 | |
| 
 | |
| }
 |