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