xref: /dokuwiki/lib/plugins/authpdo/_test/mysql.test.php (revision df01249e8b85052013de1deba4557864723e13a5)
1<?php
2
3/**
4 * MySQL tests for the authpdo plugin
5 *
6 * @group plugin_authpdo
7 * @group plugins
8 */
9class mysql_plugin_authpdo_test extends DokuWikiTest {
10
11    protected $host = '';
12    protected $database = 'authpdo_testing';
13    protected $user = '';
14    protected $pass = '';
15
16    public function setUp() {
17        parent::setUp();
18        $configuration = DOKU_UNITTEST . 'mysql.conf.php';
19        if(!file_exists($configuration)) {
20            return;
21        }
22        /** @var $conf array */
23        include $configuration;
24        $this->host = $conf['host'];
25        $this->user = $conf['user'];
26        $this->pass = $conf['pass'];
27    }
28
29    /**
30     * Check if database credentials exist
31     */
32    public function test_requirements() {
33        if(!$this->host || !$this->user) {
34            $this->markTestSkipped("Skipped mysql tests. Missing configuration");
35        }
36    }
37
38    /**
39     * create the database for testing
40     */
41    protected function createDatabase() {
42        $pdo = new PDO(
43            "mysql:dbname=;host={$this->host}", $this->user, $this->pass,
44            array(
45                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // we want exceptions, not error codes
46            )
47        );
48        $pdo->exec("DROP DATABASE IF EXISTS {$this->database}");
49        $pdo->exec("CREATE DATABASE {$this->database}");
50        $pdo = null;
51    }
52
53    /**
54     * remove the database
55     */
56    protected function dropDatabase() {
57        $pdo = new PDO(
58            "mysql:dbname={$this->database};host={$this->host}", $this->user, $this->pass,
59            array(
60                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // we want exceptions, not error codes
61            )
62        );
63        $pdo->exec("DROP DATABASE IF EXISTS {$this->database}");
64        $pdo = null;
65    }
66
67    /**
68     * imports a database dump
69     *
70     * @param $file
71     */
72    protected function importDatabase($file) {
73        // connect to database and import dump
74        $pdo = null;
75        $pdo = new PDO(
76            "mysql:dbname={$this->database};host={$this->host}", $this->user, $this->pass,
77            array(
78                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // we want exceptions, not error codes
79            )
80        );
81        $sql = file_get_contents($file);
82        $pdo->exec($sql);
83        $pdo = null;
84    }
85
86    /**
87     * Run general tests on all users
88     *
89     * @param auth_plugin_authpdo $auth
90     * @param array $users
91     */
92    protected function runGeneralTests(auth_plugin_authpdo $auth, $users) {
93        global $conf;
94        $info = 'DSN: ' . $auth->getConf('dsn');
95        $this->assertTrue($auth->success, $info);
96
97        if($auth->canDo('getUsers')) {
98            $list = $auth->retrieveUsers();
99            $this->assertGreaterThanOrEqual(count($users), count($list), $info);
100        }
101
102        if($auth->canDo('getGroups')) {
103            $list = $auth->retrieveGroups();
104            $this->assertGreaterThanOrEqual(1, $list, $info);
105        }
106
107        if($auth->canDo('getUserCount')) {
108            $count = $auth->getUserCount();
109            $this->assertGreaterThanOrEqual(count($users), $count);
110        }
111
112        if($auth->canDo('addUser')) {
113            $newuser = array(
114                'user' => 'newuserfoobar',
115                'name' => 'First LastFoobar',
116                'pass' => 'password',
117                'mail' => 'newuserfoobar@example.com',
118                'grps' => array('acompletelynewgroup')
119            );
120            $ok = $auth->createUser(
121                $newuser['user'],
122                $newuser['pass'],
123                $newuser['name'],
124                $newuser['mail'],
125                $newuser['grps']
126            );
127            $this->assertTrue($ok, $info);
128            $check = $auth->getUserData($newuser['user']);
129            $this->assertEquals($newuser['user'], $check['user'], $info);
130            $this->assertEquals($newuser['mail'], $check['mail'], $info);
131            $groups = array_merge($newuser['grps'], array($conf['defaultgroup']));
132            $this->assertEquals($groups, $check['grps'], $info);
133        }
134    }
135
136    /**
137     * run all the tests with the given user, depending on the capabilities
138     *
139     * @param auth_plugin_authpdo $auth
140     * @param $user
141     */
142    protected function runUserTests(auth_plugin_authpdo $auth, $user) {
143        global $conf;
144        $info = 'DSN: ' . $auth->getConf('dsn') . ' User:' . $user['user'];
145
146        // minimal setup
147        $this->assertTrue($auth->checkPass($user['user'], $user['pass']), $info);
148        $check = $auth->getUserData($user['user']);
149        $this->assertEquals($user['user'], $check['user'], $info);
150        $this->assertEquals($user['name'], $check['name'], $info);
151        $this->assertEquals($user['mail'], $check['mail'], $info);
152        $groups = array_merge($user['grps'], array($conf['defaultgroup']));
153        $this->assertEquals($groups, $check['grps'], $info);
154
155        // getUsers
156        if($auth->canDo('getUsers')) {
157            $list = $auth->retrieveUsers(0, -1, array('user' => $user['user']));
158            $this->assertGreaterThanOrEqual(1, count($list));
159            $list = $auth->retrieveUsers(0, -1, array('name' => $user['name']));
160            $this->assertGreaterThanOrEqual(1, count($list));
161            $list = $auth->retrieveUsers(0, -1, array('mail' => $user['mail']));
162            $this->assertGreaterThanOrEqual(1, count($list));
163        }
164
165        // getUserCount
166        if($auth->canDo('getUserCount')) {
167            $count = $auth->getUserCount(array('user' => $user['user']));
168            $this->assertGreaterThanOrEqual(1, $count);
169            $count = $auth->getUserCount(array('name' => $user['name']));
170            $this->assertGreaterThanOrEqual(1, $count);
171            $count = $auth->getUserCount(array('mail' => $user['mail']));
172            $this->assertGreaterThanOrEqual(1, $count);
173        }
174
175        // modGroups
176        if($auth->canDo('modGroups')) {
177            $newgroup = 'foobar';
178            $ok = $auth->modifyUser($user['user'], array('grps' => array($newgroup)));
179            $this->assertTrue($ok, $info);
180            $check = $auth->getUserData($user['user']);
181            $this->assertTrue(in_array($newgroup, $check['grps']), $info);
182        }
183
184        // modPass
185        if($auth->canDo('modPass')) {
186            $newpass = 'foobar';
187            $ok = $auth->modifyUser($user['user'], array('pass' => $newpass));
188            $this->assertTrue($ok, $info);
189            $this->assertTrue($auth->checkPass($user['user'], $newpass), $info);
190        }
191
192        // modMail
193        if($auth->canDo('modMail')) {
194            $newmail = 'foobar@example.com';
195            $ok = $auth->modifyUser($user['user'], array('mail' => $newmail));
196            $this->assertTrue($ok, $info);
197            $check = $auth->getUserData($user['user']);
198            $this->assertEquals($newmail, $check['mail'], $info);
199        }
200
201        // modName
202        if($auth->canDo('modName')) {
203            $newname = 'FirstName Foobar';
204            $ok = $auth->modifyUser($user['user'], array('name' => $newname));
205            $this->assertTrue($ok, $info);
206            $check = $auth->getUserData($user['user']);
207            $this->assertEquals($newname, $check['name'], $info);
208        }
209
210        // modLogin
211        if($auth->canDo('modLogin')) {
212            $newuser = 'foobar' . $user['user'];
213            $ok = $auth->modifyUser($user['user'], array('user' => $newuser));
214            $this->assertTrue($ok, $info);
215            $check = $auth->getUserData($newuser);
216            $this->assertEquals($newuser, $check['user'], $info);
217            // rename back
218            $ok = $auth->modifyUser($newuser, array('user' => $user['user']));
219            $this->assertTrue($ok, $info);
220        }
221
222        // delUser
223        if($auth->canDo('delUser')) {
224            $num = $auth->deleteUsers(array($user['user']));
225            $this->assertEquals(1, $num, $info);
226            $this->assertFalse($auth->getUserData($user['user']), $info);
227        }
228    }
229
230    /**
231     * This triggers all the tests based on the dumps and configurations
232     *
233     * @depends test_requirements
234     */
235    public function test_mysql() {
236        global $conf;
237
238        $files = glob(__DIR__ . '/mysql/*.php');
239        foreach($files as $file) {
240            $dump = preg_replace('/\.php$/', '.sql', $file);
241            $this->database = 'authpdo_testing_' . basename($file, '.php');
242
243            $this->createDatabase();
244            $this->importDatabase($dump);
245
246            // Setup the configuration and initialize a new auth object
247            /** @var $data array */
248            include $file;
249
250            $conf['plugin']['authpdo'] = array();
251            $conf['plugin']['authpdo'] = $data['conf'];
252            $conf['plugin']['authpdo']['dsn'] = "mysql:dbname={$this->database};host={$this->host}";
253            $conf['plugin']['authpdo']['user'] = $this->user;
254            $conf['plugin']['authpdo']['pass'] = $this->pass;
255            $conf['plugin']['authpdo']['debug'] = 1;
256            if($data['passcrypt']) $conf['passcrypt'] = $data['passcrypt'];
257            $auth = new auth_plugin_authpdo();
258
259            $this->runGeneralTests($auth, $data['users']);
260            foreach($data['users'] as $user) {
261                $this->runUserTests($auth, $user);
262            }
263
264            $this->dropDatabase();
265        }
266    }
267
268}
269