1<?php
2
3namespace dokuwiki\plugin\acknowledge\test;
4
5use DokuWikiTest;
6
7/**
8 * Helper tests for the acknowledge plugin
9 *
10 * @group plugin_acknowledge
11 * @group plugins
12 */
13class HelperTest extends DokuWikiTest
14{
15    /** @var array */
16    protected $pluginsEnabled = ['acknowledge', 'sqlite'];
17    /** @var \helper_plugin_acknowledge $helper */
18    protected $helper;
19    /** @var \helper_plugin_sqlite */
20    protected $db;
21
22    public static function setUpBeforeClass(): void
23    {
24        parent::setUpBeforeClass();
25        /** @var \auth_plugin_authplain $auth */
26        global $auth;
27        $auth->createUser('max', 'none', 'max', 'max@example.com', ['super']);
28        $auth->createUser('regular', 'none', 'regular', 'regular@example.com', ['user']);
29    }
30
31    public function setUp(): void
32    {
33        parent::setUp();
34        $this->helper = plugin_load('helper', 'acknowledge');
35
36        $this->db = $this->helper->getDB();
37
38        $pages = "REPLACE INTO pages(page,lastmod)
39            VALUES ('dokuwiki:acktest1', 1560805365),
40            ('dokuwiki:acktest2', 1560805365),
41            ('dokuwiki:acktest3', 1560805365),
42            ('dokuwiki:acktest4', 1560805365)";
43        $this->db->query($pages);
44
45        $assignments = "REPLACE INTO assignments(page,pageassignees)
46            VALUES ('dokuwiki:acktest1', 'regular, @super'),
47            ('dokuwiki:acktest2', '@super'),
48            ('dokuwiki:acktest3', '@user'),
49            ('dokuwiki:acktest4', 'max')";
50        $this->db->query($assignments);
51
52        // outdated, current, outdated but replaced, current replacing outdated, outdated, outdated
53        $acks = "REPLACE INTO acks(page,user,ack)
54            VALUES
55            ('dokuwiki:acktest3', 'regular', 1550801270),
56            ('dokuwiki:acktest3', 'regular', 1560805555),
57            ('dokuwiki:acktest1', 'max', 1550805770),
58            ('dokuwiki:acktest1', 'max', 1560805770),
59            ('dokuwiki:acktest3', 'max', 1560805000),
60            ('dokuwiki:acktest4', 'max', 1560805000)
61            ";
62        $this->db->query($acks);
63    }
64
65    /**
66     * test latest acknowledgements
67     */
68    public function test_getLatestAcknowledgements()
69    {
70        $actual = $this->helper->getAcknowledgements();
71        $expected = [
72            [
73                'page' => 'dokuwiki:acktest1',
74                'user' => 'max',
75                'ack' => '1560805770',
76                'lastmod' => '1560805365',
77            ],
78            [
79                'page' => 'dokuwiki:acktest3',
80                'user' => 'regular',
81                'ack' => '1560805555',
82                'lastmod' => '1560805365',
83            ],
84            [
85                'page' => 'dokuwiki:acktest3',
86                'user' => 'max',
87                'ack' => '1560805000',
88                'lastmod' => '1560805365',
89            ],
90            [
91                'page' => 'dokuwiki:acktest4',
92                'user' => 'max',
93                'ack' => '1560805000',
94                'lastmod' => '1560805365',
95            ],
96        ];
97        $this->assertEquals($expected, $actual);
98    }
99
100    /**
101     * test latest acknowledgements limited to 1
102     */
103    public function test_getLimitedAcknowledgements()
104    {
105        $actual = $this->helper->getAcknowledgements(1);
106        $expected = [
107            [
108                'page' => 'dokuwiki:acktest1',
109                'user' => 'max',
110                'ack' => '1560805770',
111                'lastmod' => '1560805365',
112            ],
113        ];
114        $this->assertEquals($expected, $actual);
115    }
116
117    /**
118     * Test assignments for the given user
119     */
120    public function test_getUserAssignments()
121    {
122        $actual = $this->helper->getUserAssignments('regular', ['user']);
123        $expected = [
124            [
125                'page' => 'dokuwiki:acktest1',
126                'pageassignees' => 'regular, @super',
127                'autoassignees' => '',
128                'lastmod' => '1560805365',
129                'user' => null,
130                'ack' => null,
131            ],
132        ];
133        $this->assertEquals($expected, $actual);
134
135        $actual = $this->helper->getUserAssignments('max', ['user', 'super']);
136        $expected = [
137            [
138                'page' => 'dokuwiki:acktest2',
139                'pageassignees' => '@super',
140                'autoassignees' => '',
141                'lastmod' => '1560805365',
142                'user' => null,
143                'ack' => null,
144            ],
145            [
146                'page' => 'dokuwiki:acktest3',
147                'pageassignees' => '@user',
148                'autoassignees' => '',
149                'lastmod' => '1560805365',
150                'user' => null,
151                'ack' => null,
152            ],
153            [
154                'page' => 'dokuwiki:acktest4',
155                'pageassignees' => 'max',
156                'autoassignees' => '',
157                'lastmod' => '1560805365',
158                'user' => null,
159                'ack' => null,
160            ],
161        ];
162        $this->assertEquals($expected, $actual);
163    }
164
165    /**
166     * Test all acknowledgements for a user (done or still due)
167     *
168     * @return void
169     */
170    public function test_getUserAcknowledgementsAll()
171    {
172        $actual = $this->helper->getUserAcknowledgements('max', ['user', 'super']);
173        $expected = [
174            // current / up to date
175            [
176                'page' => 'dokuwiki:acktest1',
177                'pageassignees' => 'regular, @super',
178                'autoassignees' => '',
179                'lastmod' => '1560805365',
180                'user' => 'max',
181                'ack' => '1560805770',
182            ],
183            // due / missing
184            [
185                'page' => 'dokuwiki:acktest2',
186                'pageassignees' => '@super',
187                'autoassignees' => '',
188                'lastmod' => '1560805365',
189                'user' => null,
190                'ack' => null,
191            ],
192            // outdated
193            [
194                'page' => 'dokuwiki:acktest3',
195                'pageassignees' => '@user',
196                'autoassignees' => '',
197                'lastmod' => '1560805365',
198                'user' => 'max',
199                'ack' => '1560805000',
200            ],
201            // outdated
202            [
203                'page' => 'dokuwiki:acktest4',
204                'pageassignees' => 'max',
205                'autoassignees' => '',
206                'lastmod' => '1560805365',
207                'user' => 'max',
208                'ack' => '1560805000',
209            ],
210        ];
211        $this->assertEquals($expected, $actual);
212    }
213
214    /**
215     * Test pages that user still has to acknowledge
216     *
217     * @return void
218     */
219    public function test_getUserAcknowledgementsDue()
220    {
221        $actual = $this->helper->getUserAcknowledgements('max', ['user', 'super'], 'due');
222        $expected = [
223            [
224                'page' => 'dokuwiki:acktest2',
225                'pageassignees' => '@super',
226                'autoassignees' => '',
227                'lastmod' => '1560805365',
228                'user' => null,
229                'ack' => null,
230            ],
231            [
232                'page' => 'dokuwiki:acktest3',
233                'pageassignees' => '@user',
234                'autoassignees' => '',
235                'lastmod' => '1560805365',
236                'user' => 'max',
237                'ack' => '1560805000',
238            ],
239            [
240                'page' => 'dokuwiki:acktest4',
241                'pageassignees' => 'max',
242                'autoassignees' => '',
243                'lastmod' => '1560805365',
244                'user' => 'max',
245                'ack' => '1560805000',
246            ],
247        ];
248        $this->assertEquals($expected, $actual);
249    }
250
251    /**
252     * Test current / up-to-date acknowledgements
253     *
254     * @return void
255     */
256    public function test_getUserAcknowledgementsCurrent()
257    {
258        $actual = $this->helper->getUserAcknowledgements('max', ['user', 'super'], 'current');
259        $expected = [
260            [
261                'page' => 'dokuwiki:acktest1',
262                'pageassignees' => 'regular, @super',
263                'autoassignees' => '',
264                'lastmod' => '1560805365',
265                'user' => 'max',
266                'ack' => '1560805770',
267            ],
268        ];
269        $this->assertEquals($expected, $actual);
270    }
271
272    /**
273     * Test outdated acknowledgements (ack exists, but for older page revision)
274     *
275     * @return void
276     */
277    public function test_getUserAcknowledgementsOutdated()
278    {
279        $actual = $this->helper->getUserAcknowledgements('max', ['user', 'super'], 'outdated');
280        $expected = [
281            [
282                'page' => 'dokuwiki:acktest3',
283                'pageassignees' => '@user',
284                'autoassignees' => '',
285                'lastmod' => '1560805365',
286                'user' => 'max',
287                'ack' => '1560805000',
288            ],
289            [
290                'page' => 'dokuwiki:acktest4',
291                'pageassignees' => 'max',
292                'autoassignees' => '',
293                'lastmod' => '1560805365',
294                'user' => 'max',
295                'ack' => '1560805000',
296            ],
297        ];
298        $this->assertEquals($expected, $actual);
299    }
300
301    /**
302     * Check what users are assigned to a page that has a user and a group in the database
303     */
304    public function test_getPageAssignees()
305    {
306        $actual = $this->helper->getPageAssignees('dokuwiki:acktest1');
307        $expected = ['regular', 'max'];
308        $this->assertEquals($expected, $actual);
309    }
310
311    /**
312     * Check what acknowledgments are there for a page
313     */
314    public function test_getPageAcknowledgements()
315    {
316        $actual = $this->helper->getPageAcknowledgements('dokuwiki:acktest1');
317        $expected = [
318            [
319                'page' => 'dokuwiki:acktest1',
320                'lastmod' => '1560805365',
321                'user' => 'max',
322                'ack' => '1560805770',
323            ],
324            [
325                'page' => 'dokuwiki:acktest1',
326                'lastmod' => '1560805365',
327                'user' => 'regular',
328                'ack' => null,
329            ],
330
331        ];
332        $this->assertEquals($expected, $actual);
333
334        $actual = $this->helper->getPageAcknowledgements('dokuwiki:acktest1', 'max');
335        $expected = [
336            [
337                'page' => 'dokuwiki:acktest1',
338                'lastmod' => '1560805365',
339                'user' => 'max',
340                'ack' => '1560805770',
341            ],
342        ];
343        $this->assertEquals($expected, $actual);
344
345        $actual = $this->helper->getPageAcknowledgements('dokuwiki:acktest2', '', 'due');
346        $expected = [
347            [
348                'page' => 'dokuwiki:acktest2',
349                'lastmod' => '1560805365',
350                'user' => 'max',
351                'ack' => null,
352            ],
353        ];
354        $this->assertEquals($expected, $actual);
355
356        $actual = $this->helper->getPageAcknowledgements('dokuwiki:acktest3', '', 'current');
357        $expected = [
358            [
359                'page' => 'dokuwiki:acktest3',
360                'lastmod' => '1560805365',
361                'user' => 'regular',
362                'ack' => '1560805555',
363            ],
364        ];
365        $this->assertEquals($expected, $actual);
366
367    $actual = $this->helper->getPageAcknowledgements('dokuwiki:acktest4', '', 'current');
368        $expected = [];
369        $this->assertEquals($expected, $actual);
370    }
371}
372