1<?php
2/**
3 * Test the LoginTasks class.
4 *
5 * @category Horde
6 * @package  LoginTasks
7 * @author   Gunnar Wrobel <wrobel@pardus.de>
8 * @license  http://www.horde.org/licenses/lgpl21 LGPL 2.1
9 * @link     http://pear.horde.org/index.php?package=LoginTasks
10 */
11
12/**
13 * Test the LoginTasks class.
14 *
15 * Copyright 2009-2016 Horde LLC (http://www.horde.org/)
16 *
17 * See the enclosed file COPYING for license information (LGPL). If you
18 * did not receive this file, see http://www.horde.org/licenses/lgpl21.
19 *
20 * @category Horde
21 * @package  LoginTasks
22 * @author   Gunnar Wrobel <wrobel@pardus.de>
23 * @license  http://www.horde.org/licenses/lgpl21 LGPL 2.1
24 * @link     http://pear.horde.org/index.php?package=LoginTasks
25 */
26
27class Horde_LoginTasks_LoginTasksTest extends PHPUnit_Framework_TestCase
28{
29    public function testTheTasksAreRun()
30    {
31        Horde_LoginTasks_Stub_Task::$executed = array();
32        $tasks = $this->_getLoginTasks(array('Horde_LoginTasks_Stub_Task'));
33        $tasks->runTasks();
34        $this->assertEquals(
35            'Horde_LoginTasks_Stub_Task',
36            Horde_LoginTasks_Stub_Task::$executed[0]
37        );
38    }
39
40    public function testNoTasksAreRanIfTheTasklistIsEmpty()
41    {
42        Horde_LoginTasks_Stub_Task::$executed = array();
43        $tasks = $this->_getLoginTasks();
44        $tasks->runTasks();
45        $this->assertEquals(
46            array(),
47            Horde_LoginTasks_Stub_Task::$executed
48        );
49    }
50
51    public function testNoTasksAreRanIfTheTasklistIsCompleted()
52    {
53        Horde_LoginTasks_Stub_Task::$executed = array();
54        $tasks = $this->_getLoginTasks(array('Horde_LoginTasks_Stub_Task'));
55        $tasks->runTasks();
56        Horde_LoginTasks_Stub_Task::$executed = array();
57        $tasks->runTasks();
58        $this->assertEquals(
59            array(),
60            Horde_LoginTasks_Stub_Task::$executed
61        );
62    }
63
64    public function testTasksWithHighPriorityAreExecutedBeforeTasksWithLowPriority()
65    {
66        Horde_LoginTasks_Stub_Task::$executed = array();
67        $tasks = $this->_getLoginTasks(
68            array(
69                'Horde_LoginTasks_Stub_Task',
70                'Horde_LoginTasks_Stub_High',
71            )
72        );
73        $tasks->runTasks();
74        $this->assertEquals(
75            array(
76                'Horde_LoginTasks_Stub_High',
77                'Horde_LoginTasks_Stub_Task'
78            ),
79            Horde_LoginTasks_Stub_Task::$executed
80        );
81    }
82
83    public function testTasksThatRepeatYearlyAreExecutedAtTheBeginningOfEachYear()
84    {
85        Horde_LoginTasks_Stub_Task::$executed = array();
86        $date = new Horde_Date(time());
87        $tasks = $this->_getLoginTasks(
88            array('Horde_LoginTasks_Stub_Year'),
89            $date
90        );
91        $this->assertEquals(
92            array(),
93            Horde_LoginTasks_Stub_Task::$executed
94        );
95
96        $date->year--;
97
98        Horde_LoginTasks_Stub_Task::$executed = array();
99        $tasks = $this->_getLoginTasks(
100            array('Horde_LoginTasks_Stub_Year'),
101            $date
102        );
103        $tasks->runTasks();
104        $this->assertEquals(
105            'Horde_LoginTasks_Stub_Year',
106            Horde_LoginTasks_Stub_Task::$executed[0]
107        );
108    }
109
110    public function testTasksThatRepeatMonthlyAreExecutedAtTheBeginningOfEachMonth()
111    {
112        Horde_LoginTasks_Stub_Task::$executed = array();
113        $date = new Horde_Date(time());
114        $tasks = $this->_getLoginTasks(
115            array('Horde_LoginTasks_Stub_Month'),
116            $date
117        );
118        $tasks->runTasks();
119        $this->assertEquals(
120            array(),
121            Horde_LoginTasks_Stub_Task::$executed
122        );
123
124        $date->month--;
125
126        Horde_LoginTasks_Stub_Task::$executed = array();
127        $tasks = $this->_getLoginTasks(
128            array('Horde_LoginTasks_Stub_Month'),
129            $date
130        );
131        $tasks->runTasks();
132        $this->assertEquals(
133            'Horde_LoginTasks_Stub_Month',
134            Horde_LoginTasks_Stub_Task::$executed[0]
135        );
136    }
137
138    public function testTasksThatRepeatWeeklyAreExecutedAtTheBeginningOfEachWeek()
139    {
140        Horde_LoginTasks_Stub_Task::$executed = array();
141        $date = new Horde_Date(time());
142        $tasks = $this->_getLoginTasks(
143            array('Horde_LoginTasks_Stub_Week'),
144            $date
145        );
146        $tasks->runTasks();
147        $this->assertEquals(
148            array(),
149            Horde_LoginTasks_Stub_Task::$executed
150        );
151
152        $date->mday -= 7;
153
154        Horde_LoginTasks_Stub_Task::$executed = array();
155        $tasks = $this->_getLoginTasks(
156            array('Horde_LoginTasks_Stub_Week'),
157            $date
158        );
159        $tasks->runTasks();
160        $this->assertEquals(
161            'Horde_LoginTasks_Stub_Week',
162            Horde_LoginTasks_Stub_Task::$executed[0]
163        );
164    }
165
166    public function testTasksThatRepeatDailyAreExecutedAtTheBeginningOfEachDay()
167    {
168        Horde_LoginTasks_Stub_Task::$executed = array();
169        $date = new Horde_Date(time());
170        $tasks = $this->_getLoginTasks(
171            array('Horde_LoginTasks_Stub_Day'),
172            $date
173        );
174        $tasks->runTasks();
175        $this->assertEquals(
176            array(),
177            Horde_LoginTasks_Stub_Task::$executed
178        );
179
180        $date->mday--;
181
182        Horde_LoginTasks_Stub_Task::$executed = array();
183        $tasks = $this->_getLoginTasks(
184            array('Horde_LoginTasks_Stub_Day'),
185            $date
186        );
187        $tasks->runTasks();
188        $this->assertEquals(
189            'Horde_LoginTasks_Stub_Day',
190            Horde_LoginTasks_Stub_Task::$executed[0]
191        );
192    }
193
194    public function testTasksThatRepeatEachLoginAreExecutedOnEachLogin()
195    {
196        Horde_LoginTasks_Stub_Task::$executed = array();
197        $date = new Horde_Date(time());
198        $tasks = $this->_getLoginTasks(
199            array('Horde_LoginTasks_Stub_Task'),
200            $date
201        );
202        $tasks->runTasks();
203        $this->assertEquals(
204            array('Horde_LoginTasks_Stub_Task'),
205            Horde_LoginTasks_Stub_Task::$executed
206        );
207    }
208
209    public function testTasksThatAreExecutedOnFirstLoginAreExecutedOnlyThen()
210    {
211        Horde_LoginTasks_Stub_First::$executed = array();
212        $tasks = $this->_getLoginTasks(
213            array('Horde_LoginTasks_Stub_First')
214        );
215        $tasks->runTasks();
216        $this->assertEquals(
217            array('Horde_LoginTasks_Stub_First'),
218            Horde_LoginTasks_Stub_Task::$executed
219        );
220
221        Horde_LoginTasks_Stub_Task::$executed = array();
222        $date = new Horde_Date(time());
223        $tasks = $this->_getLoginTasks(
224            array('Horde_LoginTasks_Stub_First'),
225            $date
226        );
227        $tasks->runTasks();
228        $this->assertEquals(
229            array(),
230            Horde_LoginTasks_Stub_Task::$executed
231        );
232    }
233
234    public function testTasksThatRunOnceAreNotExecutedMoreThanOnce()
235    {
236        Horde_LoginTasks_Stub_Once::$executed = array();
237        $tasks = $this->_getLoginTasks(
238            array('Horde_LoginTasks_Stub_Once')
239        );
240        $tasks->runTasks();
241        $this->assertEquals(
242            array('Horde_LoginTasks_Stub_Once'),
243            Horde_LoginTasks_Stub_Task::$executed
244        );
245
246        Horde_LoginTasks_Stub_Task::$executed = array();
247        $tasks = $this->_getLoginTasks(
248            array('Horde_LoginTasks_Stub_Once'),
249            true
250        );
251        $tasks->runTasks();
252        $this->assertEquals(
253            array(),
254            Horde_LoginTasks_Stub_Task::$executed
255        );
256    }
257
258    public function testAllTasksGetRunIfNoTasksRequiresDisplay()
259    {
260        Horde_LoginTasks_Stub_Task::$executed = array();
261        $tasks = $this->_getLoginTasks(
262            array(
263                'Horde_LoginTasks_Stub_Task',
264                'Horde_LoginTasks_Stub_High',
265            )
266        );
267        $tasks->runTasks();
268        $this->assertEquals(
269            array(
270                'Horde_LoginTasks_Stub_High',
271                'Horde_LoginTasks_Stub_Task'
272            ),
273            Horde_LoginTasks_Stub_Task::$executed
274        );
275    }
276
277    public function testTheLastTimeOfCompletingTheLoginTasksWillBeStoredOnceAllTasksWereExcecuted()
278    {
279        Horde_LoginTasks_Stub_Task::$executed = array();
280        $tasks = $this->_getLoginTasks(
281            array(
282                'Horde_LoginTasks_Stub_Task',
283                'Horde_LoginTasks_Stub_High',
284            )
285        );
286        $tasks->runTasks();
287        $this->assertTrue(Horde_LoginTasks_Stub_Backend::$lastRun['test'] > time() - 10);
288    }
289
290    public function testAllTasksToBeRunBeforeTheFirstTaskRequiringDisplayGetExecutedInABatch()
291    {
292        Horde_LoginTasks_Stub_Task::$executed = array();
293        $tasks = $this->_getLoginTasks(
294            array(
295                'Horde_LoginTasks_Stub_Task',
296                'Horde_LoginTasks_Stub_High',
297                'Horde_LoginTasks_Stub_Notice',
298            )
299        );
300        $tasks->runTasks();
301        $this->assertEquals(
302            array(
303                'Horde_LoginTasks_Stub_High',
304                'Horde_LoginTasks_Stub_Task'
305            ),
306            Horde_LoginTasks_Stub_Task::$executed
307        );
308    }
309
310    public function testTheFirstTaskRequiringDisplayRedirectsToTheLoginTasksUrl()
311    {
312        Horde_LoginTasks_Stub_Task::$executed = array();
313        $tasks = $this->_getLoginTasks(
314            array(
315                'Horde_LoginTasks_Stub_Task',
316                'Horde_LoginTasks_Stub_High',
317                'Horde_LoginTasks_Stub_Notice',
318            )
319        );
320        $this->assertContains(
321            'URL',
322            (string) $tasks->runTasks()
323        );
324    }
325
326    public function testADisplayTaskWillBeExecutedOnceDisplayed()
327    {
328        Horde_LoginTasks_Stub_Task::$executed = array();
329        $tasks = $this->_getLoginTasks(
330            array(
331                'Horde_LoginTasks_Stub_Task',
332                'Horde_LoginTasks_Stub_High',
333                'Horde_LoginTasks_Stub_Notice',
334            )
335        );
336        $tasks->runTasks();
337        $tasklist = $tasks->displayTasks();
338        $this->assertEquals(
339            'Horde_LoginTasks_Stub_Notice',
340            get_class($tasklist[0])
341        );
342    }
343
344    public function testSeveralSubsequentTasksWithTheSameDisplayOptionGetDisplayedTogether()
345    {
346        Horde_LoginTasks_Stub_Task::$executed = array();
347        $tasks = $this->_getLoginTasks(
348            array(
349                'Horde_LoginTasks_Stub_Task',
350                'Horde_LoginTasks_Stub_High',
351                'Horde_LoginTasks_Stub_Notice',
352                'Horde_LoginTasks_Stub_NoticeTwo',
353            )
354        );
355        $tasks->runTasks();
356        $tasklist = $tasks->displayTasks();
357        $classes = array();
358        foreach ($tasklist as $task) {
359            $classes[] = get_class($task);
360        }
361        asort($classes);
362        $this->assertEquals(
363            array(
364                'Horde_LoginTasks_Stub_Notice',
365                'Horde_LoginTasks_Stub_NoticeTwo'
366            ),
367            $classes
368        );
369    }
370
371    public function testSeveralSubsequentTasksWithTheSameDisplayOptionGetExecutedTogether()
372    {
373        Horde_LoginTasks_Stub_Task::$executed = array();
374        $tasks = $this->_getLoginTasks(
375            array(
376                'Horde_LoginTasks_Stub_Task',
377                'Horde_LoginTasks_Stub_High',
378                'Horde_LoginTasks_Stub_Notice',
379                'Horde_LoginTasks_Stub_NoticeTwo',
380            )
381        );
382        $tasks->runTasks();
383        Horde_LoginTasks_Stub_Task::$executed = array();
384        $tasks->displayTasks();
385        $tasks->runTasks(array(
386            'user_confirmed' => true
387        ));
388        $this->assertEquals(
389            array(
390                'Horde_LoginTasks_Stub_Notice',
391                'Horde_LoginTasks_Stub_NoticeTwo',
392            ),
393            Horde_LoginTasks_Stub_Task::$executed
394        );
395    }
396
397    public function testAfterConfirmationOfADisplayedTaskTheUserIsRedirectedToTheUrlStoredBeforeDisplaying()
398    {
399        $tasks = $this->_getLoginTasks(
400            array(
401                'Horde_LoginTasks_Stub_Confirm',
402                'Horde_LoginTasks_Stub_Notice',
403            )
404        );
405        $tasks->runTasks(array(
406            'url' => 'redirect'
407        ));
408        $tasks->displayTasks();
409        $this->assertContains(
410            'URL',
411            (string) $tasks->runTasks(array('user_confirmed' => true))
412        );
413        $this->assertNull(
414            $tasks->runTasks()
415        );
416        $tasks->displayTasks();
417        $this->assertEquals(
418            'redirect',
419            $tasks->runTasks(array('user_confirmed' => true))
420        );
421    }
422
423    public function testConfirmSeriesDisplay()
424    {
425        Horde_LoginTasks_Stub_Task::$executed = array();
426        $tasks = $this->_getLoginTasks(
427            array(
428                'Horde_LoginTasks_Stub_ConfirmNo',
429                'Horde_LoginTasks_Stub_Confirm',
430                'Horde_LoginTasks_Stub_Task',
431                'Horde_LoginTasks_Stub_Notice',
432                'Horde_LoginTasks_Stub_ConfirmTwo',
433                'Horde_LoginTasks_Stub_TaskTwo',
434                'Horde_LoginTasks_Stub_ConfirmThree',
435                'Horde_LoginTasks_Stub_NoticeTwo',
436            )
437        );
438        $this->assertContains(
439            'URL',
440            (string) $tasks->runTasks(array('url' => 'redirect'))
441        );
442        $this->assertEquals(
443            array(
444            ),
445            Horde_LoginTasks_Stub_Task::$executed
446        );
447        $tasklist = $tasks->displayTasks();
448        $classes = array();
449        foreach ($tasklist as $task) {
450            $classes[] = get_class($task);
451        }
452        asort($classes);
453        $this->assertEquals(
454            array(
455                'Horde_LoginTasks_Stub_ConfirmNo',
456                'Horde_LoginTasks_Stub_Confirm'
457            ),
458            $classes
459        );
460        $this->assertContains(
461            'URL',
462            (string) $tasks->runTasks(array(
463                'confirmed' => array(
464                    0,
465                    1
466                ),
467                'user_confirmed' => true
468            ))
469        );
470        $this->assertEquals(
471            array(
472                'Horde_LoginTasks_Stub_ConfirmNo',
473                'Horde_LoginTasks_Stub_Confirm',
474                'Horde_LoginTasks_Stub_Task',
475            ),
476            Horde_LoginTasks_Stub_Task::$executed
477        );
478        $this->assertNull(
479            $tasks->runTasks()
480        );
481        $this->assertEquals(
482            array(
483                'Horde_LoginTasks_Stub_ConfirmNo',
484                'Horde_LoginTasks_Stub_Confirm',
485                'Horde_LoginTasks_Stub_Task',
486            ),
487            Horde_LoginTasks_Stub_Task::$executed
488        );
489        $tasklist = $tasks->displayTasks();
490        $classes = array();
491        foreach ($tasklist as $task) {
492            $classes[] = get_class($task);
493        }
494        asort($classes);
495        $this->assertEquals(
496            array(
497                'Horde_LoginTasks_Stub_Notice'
498            ),
499            $classes
500        );
501        $this->assertContains(
502            'URL',
503            (string) $tasks->runTasks(array('user_confirmed' => true))
504        );
505        $this->assertEquals(
506            array(
507                'Horde_LoginTasks_Stub_ConfirmNo',
508                'Horde_LoginTasks_Stub_Confirm',
509                'Horde_LoginTasks_Stub_Task',
510                'Horde_LoginTasks_Stub_Notice'
511            ),
512            Horde_LoginTasks_Stub_Task::$executed
513        );
514        $tasklist = $tasks->displayTasks();
515        $classes = array();
516        foreach ($tasklist as $task) {
517            $classes[] = get_class($task);
518        }
519        asort($classes);
520        $this->assertEquals(
521            array(
522                'Horde_LoginTasks_Stub_ConfirmTwo',
523            ),
524            $classes
525        );
526        $this->assertContains(
527            'URL',
528            (string) $tasks->runTasks(array(
529                'confirmed' => array(
530                    0
531                ),
532                'user_confirmed' => true
533            ))
534        );
535        $this->assertEquals(
536            array(
537                'Horde_LoginTasks_Stub_ConfirmNo',
538                'Horde_LoginTasks_Stub_Confirm',
539                'Horde_LoginTasks_Stub_Task',
540                'Horde_LoginTasks_Stub_Notice',
541                'Horde_LoginTasks_Stub_ConfirmTwo',
542                'Horde_LoginTasks_Stub_TaskTwo',
543            ),
544            Horde_LoginTasks_Stub_Task::$executed
545        );
546        $tasklist = $tasks->displayTasks();
547        $classes = array();
548        foreach ($tasklist as $task) {
549            $classes[] = get_class($task);
550        }
551        asort($classes);
552        $this->assertEquals(
553            array(
554                'Horde_LoginTasks_Stub_ConfirmThree',
555            ),
556            $classes
557        );
558        $this->assertContains(
559            'URL',
560            (string) $tasks->runTasks(array(
561                'confirmed' => array(
562                    0
563                ),
564                'user_confirmed' => true
565            ))
566        );
567        $this->assertEquals(
568            array(
569                'Horde_LoginTasks_Stub_ConfirmNo',
570                'Horde_LoginTasks_Stub_Confirm',
571                'Horde_LoginTasks_Stub_Task',
572                'Horde_LoginTasks_Stub_Notice',
573                'Horde_LoginTasks_Stub_ConfirmTwo',
574                'Horde_LoginTasks_Stub_TaskTwo',
575                'Horde_LoginTasks_Stub_ConfirmThree',
576            ),
577            Horde_LoginTasks_Stub_Task::$executed
578        );
579        $tasklist = $tasks->displayTasks();
580        $classes = array();
581        foreach ($tasklist as $task) {
582            $classes[] = get_class($task);
583        }
584        asort($classes);
585        $this->assertEquals(
586            array(
587                'Horde_LoginTasks_Stub_NoticeTwo',
588            ),
589            $classes
590        );
591        $this->assertContains(
592            'redirect',
593            (string) $tasks->runTasks(array('user_confirmed' => true))
594        );
595        $this->assertEquals(
596            array(
597                'Horde_LoginTasks_Stub_ConfirmNo',
598                'Horde_LoginTasks_Stub_Confirm',
599                'Horde_LoginTasks_Stub_Task',
600                'Horde_LoginTasks_Stub_Notice',
601                'Horde_LoginTasks_Stub_ConfirmTwo',
602                'Horde_LoginTasks_Stub_TaskTwo',
603                'Horde_LoginTasks_Stub_ConfirmThree',
604                'Horde_LoginTasks_Stub_NoticeTwo',
605            ),
606            Horde_LoginTasks_Stub_Task::$executed
607        );
608    }
609
610    private function _getLoginTasks(array $tasks = array(), $last_run = false)
611    {
612        if ($last_run && !is_bool($last_run)) {
613            $last_run = array('test' => $last_run->timestamp());
614        }
615
616        $tasklist = array();
617        foreach ($tasks as $val) {
618            $tasklist[$val] = 'test';
619        }
620
621        return new Horde_LoginTasks(
622            new Horde_LoginTasks_Stub_Backend($tasklist, $last_run)
623        );
624    }
625}
626