1# -- 2# Copyright (C) 2001-2020 OTRS AG, https://otrs.com/ 3# -- 4# This software comes with ABSOLUTELY NO WARRANTY. For details, see 5# the enclosed file COPYING for license information (GPL). If you 6# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt. 7# -- 8 9## no critic (Modules::RequireExplicitPackage) 10use strict; 11use warnings; 12use utf8; 13 14use vars (qw($Self)); 15 16use Kernel::System::VariableCheck qw(:all); 17 18# get needed objects 19my $CacheObject = $Kernel::OM->Get('Kernel::System::Cache'); 20my $ActivityObject = $Kernel::OM->Get('Kernel::System::ProcessManagement::DB::Activity'); 21my $ActivityDialogObject = $Kernel::OM->Get('Kernel::System::ProcessManagement::DB::ActivityDialog'); 22 23# get helper object 24$Kernel::OM->ObjectParamAdd( 25 'Kernel::System::UnitTest::Helper' => { 26 RestoreDatabase => 1, 27 }, 28); 29my $Helper = $Kernel::OM->Get('Kernel::System::UnitTest::Helper'); 30 31# set fixed time 32$Helper->FixedTimeSet(); 33 34# define needed variables 35my $RandomID = $Helper->GetRandomID(); 36my $UserID = 1; 37my $ActivityDialogEntityID1 = 'AD1-' . $RandomID; 38my $ActivityDialogEntityID2 = 'AD2-' . $RandomID; 39my $ActivityDialogEntityID3 = 'AD3-' . $RandomID; 40my $ActivityDialogName1 = 'ActivityDialog1'; 41my $ActivityDialogName2 = 'ActivityDialog2'; 42my $ActivityDialogName3 = 'ActivityDialog3'; 43 44my $EntityID = $Kernel::OM->Get('Kernel::System::ProcessManagement::DB::Entity')->EntityIDGenerate( 45 EntityType => 'Activity', 46 UserID => 1, 47); 48 49my %ActivityDialogLookup = ( 50 $ActivityDialogEntityID1 => $ActivityDialogName1, 51 $ActivityDialogEntityID2 => $ActivityDialogName2, 52 $ActivityDialogEntityID3 => $ActivityDialogName3, 53); 54 55my $AcitivityDialogID1 = $ActivityDialogObject->ActivityDialogAdd( 56 EntityID => $ActivityDialogEntityID1, 57 Name => $ActivityDialogName1, 58 Config => { 59 DescriptionShort => 'a Description', 60 Fields => {}, 61 FieldOrder => [], 62 }, 63 UserID => $UserID, 64); 65 66# sanity test 67$Self->IsNot( 68 $AcitivityDialogID1, 69 undef, 70 "ActivityDialogAdd Test1: EntityID '$ActivityDialogEntityID1', Name '$ActivityDialogName1' | Should not be undef", 71); 72my $AcitivityDialogID2 = $ActivityDialogObject->ActivityDialogAdd( 73 EntityID => $ActivityDialogEntityID2, 74 Name => $ActivityDialogName2, 75 Config => { 76 DescriptionShort => 'a Description', 77 Fields => {}, 78 FieldOrder => [], 79 }, 80 UserID => $UserID, 81); 82 83# sanity test 84$Self->IsNot( 85 $AcitivityDialogID2, 86 undef, 87 "ActivityDialogAdd Test2: EntityID '$ActivityDialogEntityID2', Name '$ActivityDialogName2' | Should not be undef", 88); 89my $AcitivityDialogID3 = $ActivityDialogObject->ActivityDialogAdd( 90 EntityID => $ActivityDialogEntityID3, 91 Name => $ActivityDialogName3, 92 Config => { 93 DescriptionShort => 'a Description', 94 Fields => {}, 95 FieldOrder => [], 96 }, 97 UserID => $UserID, 98); 99 100# sanity test 101$Self->IsNot( 102 $AcitivityDialogID3, 103 undef, 104 "ActivityDialogAdd Test3: EntityID '$ActivityDialogEntityID3', Name '$ActivityDialogName3' | Should not be undef", 105); 106 107my @AddedActivityDialogs = ( $AcitivityDialogID1, $AcitivityDialogID2, $AcitivityDialogID3 ); 108my $ActivityDialogList = $ActivityDialogObject->ActivityDialogList( 109 UseEntities => 1, 110 UserID => $UserID, 111); 112 113# get original activity list 114my $OriginalActivityList = $ActivityObject->ActivityList( UserID => $UserID ) || {}; 115 116# 117# Tests for ActivityAdd 118# 119my @Tests = ( 120 { 121 Name => 'ActivityAdd Test 1: No Params', 122 Config => {}, 123 Success => 0, 124 }, 125 { 126 Name => 'ActivityAdd Test 2: No EntityID', 127 Config => { 128 EntityID => undef, 129 Name => 'Activity-$RandomID', 130 Config => {}, 131 UserID => $UserID, 132 }, 133 Success => 0, 134 }, 135 { 136 Name => 'ActivityAdd Test 3: No Name', 137 Config => { 138 EntityID => $RandomID, 139 Name => undef, 140 Config => {}, 141 UserID => $UserID, 142 }, 143 Success => 0, 144 145 }, 146 { 147 Name => 'ActivityAdd Test 4: No UserID', 148 Config => { 149 EntityID => $RandomID, 150 Name => "Activity-$RandomID", 151 Config => {}, 152 UserID => undef, 153 }, 154 Success => 0, 155 }, 156 { 157 Name => 'ActivityAdd Test 5: Wrong Config format', 158 Config => { 159 EntityID => $RandomID, 160 Name => "Activity-$RandomID", 161 Config => 'Config', 162 UserID => $UserID, 163 }, 164 Success => 0, 165 }, 166 { 167 Name => 'ActivityAdd Test 6: Correct ASCII', 168 Config => { 169 EntityID => $RandomID, 170 Name => "Activity-$RandomID", 171 Config => { 172 ActivityDialog => { 173 1 => $ActivityDialogEntityID1, 174 }, 175 }, 176 UserID => $UserID, 177 }, 178 Success => 1, 179 }, 180 { 181 Name => 'ActivityAdd Test 7: Duplicated EntityID', 182 Config => { 183 EntityID => $RandomID, 184 Name => "Activity-$RandomID", 185 Config => { 186 ActivityDialog => { 187 1 => $ActivityDialogEntityID1, 188 }, 189 }, 190 UserID => $UserID, 191 }, 192 Success => 0, 193 }, 194 { 195 Name => 'ActivityAdd Test 8: Correct UTF8', 196 Config => { 197 EntityID => "$RandomID-1", 198 Name => "Activity-$RandomID-!§$%&/()=?Ã*ÃÃL:L@,.-", 199 Config => { 200 Description => 'a Description !§$%&/()=?Ã*ÃÃL:L@,.-', 201 ActivityDialog => { 202 1 => $ActivityDialogEntityID1, 203 2 => $ActivityDialogEntityID2, 204 }, 205 }, 206 UserID => $UserID, 207 }, 208 Success => 1, 209 }, 210 { 211 Name => 'ActivityAdd Test 9: Correct UTF8 2', 212 Config => { 213 EntityID => "$RandomID-2", 214 Name => "Activity-$RandomID--äöüßÄÖÜ€исáéíúóúÁÉÍÓÚñÑ", 215 Config => { 216 Description => 'a Description -äöüßÄÖÜ€исáéíúóúÁÉÍÓÚñÑ', 217 ActivityDialog => { 218 1 => $ActivityDialogEntityID1, 219 2 => $ActivityDialogEntityID2, 220 3 => $ActivityDialogEntityID3, 221 }, 222 }, 223 UserID => $UserID, 224 }, 225 Success => 1, 226 }, 227 { 228 Name => 'ActivityAdd Test 10: EntityID Full Length', 229 Config => { 230 EntityID => $EntityID, 231 Name => $EntityID, 232 Config => { 233 Description => 'a Description -äöüßÄÖÜ€исáéíúóúÁÉÍÓÚñÑ', 234 ActivityDialog => { 235 1 => $ActivityDialogEntityID1, 236 2 => $ActivityDialogEntityID2, 237 3 => $ActivityDialogEntityID3, 238 }, 239 }, 240 UserID => $UserID, 241 }, 242 Success => 1, 243 }, 244); 245 246my %AddedActivities; 247for my $Test (@Tests) { 248 my $ActivityID = $ActivityObject->ActivityAdd( %{ $Test->{Config} } ); 249 250 if ( $Test->{Success} ) { 251 $Self->IsNot( 252 $ActivityID, 253 0, 254 "$Test->{Name} | ActivityID should not be 0", 255 ); 256 $AddedActivities{$ActivityID} = $Test->{Config}; 257 } 258 else { 259 $Self->Is( 260 $ActivityID, 261 undef, 262 "$Test->{Name} | ActivityID should be undef", 263 ); 264 } 265} 266 267# 268# ActivitySearch() tests 269# 270 271@Tests = ( 272 { 273 Name => "ActivitySearch Test1 - Correct ASCII", 274 ActivityName => $RandomID, 275 Result => [ 276 $RandomID, 277 "$RandomID-1", 278 "$RandomID-2", 279 ], 280 Count => 3, 281 }, 282 { 283 Name => "ActivitySearch Test1 - Correct ASCII with asterisk", 284 ActivityName => '*' . $RandomID . '*', 285 Result => [ 286 $RandomID, 287 "$RandomID-1", 288 "$RandomID-2", 289 ], 290 Count => 3, 291 }, 292 { 293 Name => "ActivitySearch Test2 - Correct UTF8 1", 294 ActivityName => "Activity-$RandomID-!§$%&/()=?Ã*ÃÃL:L@,.-", 295 , 296 Result => ["$RandomID-1"], 297 Count => 1, 298 }, 299 { 300 Name => "ActivitySearch Test3 - - Correct UTF8 1", 301 ActivityName => "Activity-$RandomID--äöüßÄÖÜ€исáéíúóúÁÉÍÓÚñÑ", 302 Result => ["$RandomID-2"], 303 Count => 1, 304 }, 305 { 306 Name => "ActivitySearch Test4 - EntityID Full Length", 307 ActivityName => $EntityID, 308 Result => [$EntityID], 309 Count => 1, 310 }, 311); 312 313for my $Test (@Tests) { 314 315 my $ActivityList = $ActivityObject->ActivitySearch( ActivityName => $Test->{ActivityName} ); 316 317 $Self->Is( 318 scalar keys @{$ActivityList}, 319 $Test->{Count}, 320 "$Test->{Name} | Number of activities is as expected: $Test->{Count}.", 321 ); 322 323 $Self->IsDeeply( 324 $ActivityList, 325 $Test->{Result}, 326 "$Test->{Name} | Result of activity search is as expected.", 327 ); 328} 329 330# 331# ActivityGet() 332# 333my @AddedActivityList = map {$_} sort keys %AddedActivities; 334@Tests = ( 335 { 336 Name => 'ActivityGet Test 1: No params', 337 Config => {}, 338 Success => 0, 339 }, 340 { 341 Name => 'ActivityGet Test 2: No ID and EntityID', 342 Config => { 343 ID => undef, 344 EntityID => undef, 345 ActivityDialogNames => 0, 346 UserID => $UserID, 347 }, 348 Success => 0, 349 }, 350 { 351 Name => 'ActivityGet Test 3: No UserID', 352 Config => { 353 ID => 1, 354 EntityID => undef, 355 ActivityDialogNames => 0, 356 UserID => undef, 357 }, 358 Success => 0, 359 }, 360 { 361 Name => 'ActivityGet Test 4: Wrong ID', 362 Config => { 363 ID => '9999999', 364 EntityID => undef, 365 ActivityDialogNames => 0, 366 UserID => $UserID, 367 }, 368 Success => 0, 369 }, 370 { 371 Name => 'ActivityGet Test 5: Wrong EntityID', 372 Config => { 373 ID => undef, 374 EntityID => '9999999', 375 ActivityDialogNames => 0, 376 UserID => $UserID, 377 }, 378 Success => 0, 379 }, 380 { 381 Name => 'ActivityGet Test 6: Correct ASCII, W/ID, WO/ActivityDialogNames ', 382 Config => { 383 ID => $AddedActivityList[0], 384 EntityID => undef, 385 ActivityDialogNames => 0, 386 UserID => $UserID, 387 }, 388 Success => 1, 389 }, 390 { 391 Name => 'ActivityGet Test 7: Correct ASCII, W/ID, W/ActivityNames ', 392 Config => { 393 ID => $AddedActivityList[0], 394 EntityID => undef, 395 ActivityDialogNames => 1, 396 UserID => $UserID, 397 }, 398 Success => 1, 399 }, 400 { 401 Name => 'ActivityGet Test 8: Correct UTF8, W/ID, WO/ActivityDialogNames ', 402 Config => { 403 ID => $AddedActivityList[1], 404 EntityID => undef, 405 ActivityDialogNames => 0, 406 UserID => $UserID, 407 }, 408 Success => 1, 409 }, 410 { 411 Name => 'ActivityGet Test 9: Correct UTF8, W/ID, W/ActivityDialogNames ', 412 Config => { 413 ID => $AddedActivityList[1], 414 EntityID => undef, 415 ActivityDialogNames => 1, 416 UserID => $UserID, 417 }, 418 Success => 1, 419 }, 420 { 421 Name => 'ActivityGet Test 11: Correct UTF82, W/ID, WO/ActivityDialogNames ', 422 Config => { 423 ID => $AddedActivityList[2], 424 EntityID => undef, 425 ActivityDialogNames => 0, 426 UserID => $UserID, 427 }, 428 Success => 1, 429 }, 430 { 431 Name => 'ActivityGet Test 12: Correct UTF82, W/ID, W/ActivityDialogNames ', 432 Config => { 433 ID => $AddedActivityList[2], 434 EntityID => undef, 435 ActivityDialogNames => 1, 436 UserID => $UserID, 437 }, 438 Success => 1, 439 }, 440 { 441 Name => 'ActivityGet Test 13: Correct ASCII, W/EntityID, WO/ActivityDialogNames ', 442 Config => { 443 ID => undef, 444 EntityID => $AddedActivities{ $AddedActivityList[0] }->{EntityID}, 445 ActivityDialogNames => 0, 446 UserID => $UserID, 447 }, 448 Success => 1, 449 }, 450 { 451 Name => 'ActivityGet Test 14: Correct ASCII, W/EntityID, W/ActivityDialogNames ', 452 Config => { 453 ID => undef, 454 EntityID => $AddedActivities{ $AddedActivityList[0] }->{EntityID}, 455 ActivityDialogNames => 1, 456 UserID => $UserID, 457 }, 458 Success => 1, 459 }, 460 { 461 Name => 'ActivityGet Test 15: Correct UTF8, W/EntityID, WO/ActivityDialogNames ', 462 Config => { 463 ID => undef, 464 EntityID => $AddedActivities{ $AddedActivityList[1] }->{EntityID}, 465 ActivityDialogNames => 0, 466 UserID => $UserID, 467 }, 468 Success => 1, 469 }, 470 { 471 Name => 'ActivityGet Test 16: Correct UTF8, W/EntityID, W/ActivityDialogNames ', 472 Config => { 473 ID => undef, 474 EntityID => $AddedActivities{ $AddedActivityList[1] }->{EntityID}, 475 ActivityDialogNames => 1, 476 UserID => $UserID, 477 }, 478 Success => 1, 479 }, 480 { 481 Name => 'ActivityGet Test 17: Correct UTF82, W/EntityID, WO/ActivityDialogNames ', 482 Config => { 483 ID => undef, 484 EntityID => $AddedActivities{ $AddedActivityList[2] }->{EntityID}, 485 ActivityDialogNames => 0, 486 UserID => $UserID, 487 }, 488 Success => 1, 489 }, 490 { 491 Name => 'ActivityGet Test 18: Correct UTF82, W/EntityID, W/ActivityDialogNames ', 492 Config => { 493 ID => undef, 494 EntityID => $AddedActivities{ $AddedActivityList[2] }->{EntityID}, 495 ActivityDialogNames => 1, 496 UserID => $UserID, 497 }, 498 Success => 1, 499 }, 500); 501 502for my $Test (@Tests) { 503 my $Activity = $ActivityObject->ActivityGet( %{ $Test->{Config} } ); 504 505 if ( $Test->{Success} ) { 506 507 $Self->Is( 508 ref $Activity, 509 'HASH', 510 "$Test->{Name} | Activity structure is HASH", 511 ); 512 $Self->True( 513 IsHashRefWithData($Activity), 514 "$Test->{Name} | Activity structure is non empty HASH", 515 ); 516 if ( $Test->{Config}->{ActivityDialogNames} ) { 517 $Self->Is( 518 ref $Activity->{ActivityDialogs}, 519 'HASH', 520 "$Test->{Name} | Activity ActivityDialogs structure is HASH", 521 ); 522 523 my $ActivityDialog = $AddedActivities{ $Activity->{ID} }->{Config}->{ActivityDialog}; 524 my %ExpectedActivityDialogs 525 = map { $ActivityDialog->{$_} => $ActivityDialogLookup{ $ActivityDialog->{$_} } } 526 sort keys %{$ActivityDialog}; 527 528 $Self->IsDeeply( 529 $Activity->{ActivityDialogs}, 530 \%ExpectedActivityDialogs, 531 "$Test->{Name} | Activity ActivityDialogs" 532 ); 533 } 534 else { 535 $Self->Is( 536 ref $Activity->{ActivityDialogs}, 537 'ARRAY', 538 "$Test->{Name} | Activity Activities structure is ARRAY", 539 ); 540 541 my @ExpectedActivityDialogs = map { $AddedActivities{ $Activity->{ID} }->{Config}->{ActivityDialog}->{$_} } 542 sort { $a <=> $b } 543 keys %{ $AddedActivities{ $Activity->{ID} }->{Config}->{ActivityDialog} }; 544 $Self->IsDeeply( 545 $Activity->{ActivityDialogs}, 546 \@ExpectedActivityDialogs, 547 "$Test->{Name} | Activity ActivityDialogs" 548 ); 549 } 550 551 my $ActivityDialogNames = 0; 552 if ( 553 defined $Test->{Config}->{ActivityDialogNames} 554 && $Test->{Config}->{ActivityDialogNames} == 1 555 ) 556 { 557 $ActivityDialogNames = 1; 558 } 559 560 # check cache 561 my $CacheKey; 562 if ( $Test->{Config}->{ID} ) { 563 $CacheKey = 'ActivityGet::ID::' . $Test->{Config}->{ID} . '::ActivityDialogNames::' 564 . $ActivityDialogNames; 565 } 566 else { 567 $CacheKey = 'ActivityGet::EntityID::' 568 . $Test->{Config}->{EntityID} 569 . '::ActivityDialogNames::' 570 . $ActivityDialogNames; 571 } 572 573 my $Cache = $CacheObject->Get( 574 Type => 'ProcessManagement_Activity', 575 Key => $CacheKey, 576 ); 577 578 $Self->IsDeeply( 579 $Cache, 580 $Activity, 581 "$Test->{Name} | Activity cache" 582 ); 583 584 # remove not need parameters 585 my %ExpectedActivity = %{ $AddedActivities{ $Activity->{ID} } }; 586 delete $ExpectedActivity{UserID}; 587 588 # create a variable copy otherwise the cache will be altered 589 my %ActivityCopy = %{$Activity}; 590 for my $Attribute (qw(ID ActivityDialogs CreateTime ChangeTime)) { 591 $Self->IsNot( 592 $ActivityCopy{$Attribute}, 593 undef, 594 "$Test->{Name} | ActivityCopy{$Attribute} should not be undef", 595 ); 596 delete $ActivityCopy{$Attribute}; 597 } 598 599 $Self->IsDeeply( 600 \%ActivityCopy, 601 \%ExpectedActivity, 602 "$Test->{Name} | Activity" 603 ); 604 } 605 else { 606 $Self->False( 607 ref $Activity eq 'HASH', 608 "$Test->{Name} | Activity structure is not HASH", 609 ); 610 $Self->Is( 611 $Activity, 612 undef, 613 "$Test->{Name} | Activity should be undefined", 614 ); 615 } 616} 617 618# 619# ActivityUpdate() tests 620# 621@Tests = ( 622 { 623 Name => 'ActivityUpdate Test 1: No params', 624 Config => {}, 625 Success => 0, 626 }, 627 { 628 Name => 'ActivityUpdate Test 2: No ID', 629 Config => { 630 ID => undef, 631 EntityID => $RandomID . '-U', 632 Name => "Activity-$RandomID", 633 Config => { 634 Description => 'a Description', 635 }, 636 UserID => $UserID, 637 }, 638 Success => 0, 639 }, 640 { 641 Name => 'ActivityUpdate Test 3: No EntityID', 642 Config => { 643 ID => 1, 644 EntityID => undef, 645 Name => "Activity-$RandomID", 646 Config => { 647 Description => 'a Description', 648 }, 649 UserID => $UserID, 650 }, 651 Success => 0, 652 }, 653 { 654 Name => 'ActivityUpdate Test 4: No Name', 655 Config => { 656 ID => 1, 657 EntityID => $RandomID . '-U', 658 Name => undef, 659 Config => { 660 Description => 'a Description', 661 }, 662 UserID => $UserID, 663 }, 664 Success => 0, 665 }, 666 { 667 Name => 'ActivityUpdate Test 5: No Config', 668 Config => { 669 ID => 1, 670 EntityID => $RandomID . '-U', 671 Name => "Activity-$RandomID", 672 Config => undef, 673 UserID => $UserID, 674 }, 675 Success => 0, 676 }, 677 { 678 Name => 'ActivityUpdate Test 6: No UserID', 679 Config => { 680 ID => 1, 681 EntityID => $RandomID . '-U', 682 Name => "Activity-$RandomID", 683 Config => { 684 Description => 'a Description', 685 }, 686 UserID => undef, 687 }, 688 Success => 0, 689 }, 690 { 691 Name => 'ActivityUpdate Test 7: Correct ASCII', 692 Config => { 693 ID => $AddedActivityList[0], 694 EntityID => $RandomID . '-U', 695 Name => "Activity-$RandomID -U", 696 Config => { 697 Description => 'a Description-U', 698 }, 699 UserID => $UserID, 700 }, 701 Success => 1, 702 UpdateDB => 1, 703 }, 704 { 705 Name => 'ActivityUpdate Test 8: Correct UTF8', 706 Config => { 707 ID => $AddedActivityList[1], 708 EntityID => $RandomID . '-1-U', 709 Name => "Activity-$RandomID -!§$%&/()=?Ã*ÃÃL:L@,.--U", 710 Config => { 711 Description => 'a Description !§$%&/()=?Ã*ÃÃL:L@,.--U', 712 }, 713 UserID => $UserID, 714 }, 715 Success => 1, 716 UpdateDB => 1 717 }, 718 { 719 Name => 'ActivityUpdate Test 9: Correct UTF8 2', 720 Config => { 721 ID => $AddedActivityList[1], 722 EntityID => $RandomID . '-2-U', 723 Name => "Activity-$RandomID -äöüßÄÖÜ€исáéíúóúÁÉÍÓÚñÑ-U", 724 Config => { 725 Description => 'a Description -äöüßÄÖÜ€исáéíúóúÁÉÍÓÚñÑ-U', 726 }, 727 UserID => $UserID, 728 }, 729 Success => 1, 730 UpdateDB => 1 731 }, 732 { 733 Name => 'ActivityUpdate Test 10: Correct ASCII No DBUpdate', 734 Config => { 735 ID => $AddedActivityList[0], 736 EntityID => $RandomID . '-U', 737 Name => "Activity-$RandomID -U", 738 Config => { 739 Description => 'a Description-U', 740 }, 741 UserID => $UserID, 742 }, 743 Success => 1, 744 UpdateDB => 0, 745 }, 746); 747 748for my $Test (@Tests) { 749 750 # get the old activity (if any) 751 my $OldActivity = $ActivityObject->ActivityGet( 752 ID => $Test->{Config}->{ID} || 0, 753 UserID => $Test->{Config}->{UserID}, 754 ); 755 756 if ( $Test->{Success} ) { 757 758 # try to update the Activity 759 print "Force a gap between create and update activity, Waiting 2s\n"; 760 761 # wait 2 seconds 762 $Helper->FixedTimeAddSeconds(2); 763 764 my $Success = $ActivityObject->ActivityUpdate( %{ $Test->{Config} } ); 765 766 $Self->IsNot( 767 $Success, 768 0, 769 "$Test->{Name} | Result should be 1" 770 ); 771 772 # check cache 773 my $CacheKey = 'ActivityGet::ID::' . $Test->{Config}->{ID} . '::ActivityDialogNames::0'; 774 775 my $Cache = $CacheObject->Get( 776 Type => 'ProcessManagement_Activity', 777 Key => $CacheKey, 778 ); 779 780 if ( $Test->{UpdateDB} ) { 781 $Self->Is( 782 $Cache, 783 undef, 784 "$Test->{Name} | Cache should be deleted after update, should be undef", 785 ); 786 } 787 else { 788 $Self->IsNot( 789 $Cache, 790 undef, 791 "$Test->{Name} | Cache should not be deleted after update, since no update needed", 792 ); 793 } 794 795 # get the new process 796 my $NewActivity = $ActivityObject->ActivityGet( 797 ID => $Test->{Config}->{ID}, 798 UserID => $Test->{Config}->{UserID}, 799 ); 800 801 # check cache 802 $Cache = $CacheObject->Get( 803 Type => 'ProcessManagement_Activity', 804 Key => $CacheKey, 805 ); 806 807 $Self->IsDeeply( 808 $Cache, 809 $NewActivity, 810 "$Test->{Name} | Cache is equal to updated activity", 811 ); 812 813 if ( $Test->{UpdateDB} ) { 814 $Self->IsNotDeeply( 815 $NewActivity, 816 $OldActivity, 817 "$Test->{Name} | Updated activity is different than original", 818 ); 819 820 # check create and change times 821 $Self->Is( 822 $NewActivity->{CreateTime}, 823 $OldActivity->{CreateTime}, 824 "$Test->{Name} | Updated activity create time should not change", 825 ); 826 $Self->IsNot( 827 $NewActivity->{ChangeTime}, 828 $OldActivity->{ChangeTime}, 829 "$Test->{Name} | Updated activity change time should be different", 830 ); 831 832 # remove not need parameters 833 my %ExpectedActivity = %{ $Test->{Config} }; 834 delete $ExpectedActivity{UserID}; 835 836 # create a variable copy otherwise the cache will be altered 837 my %NewActivityCopy = %{$NewActivity}; 838 for my $Attribute (qw( ActivityDialogs CreateTime ChangeTime )) { 839 delete $NewActivityCopy{$Attribute}; 840 } 841 842 $Self->IsDeeply( 843 \%NewActivityCopy, 844 \%ExpectedActivity, 845 "$Test->{Name} | Activity" 846 ); 847 } 848 else { 849 $Self->IsDeeply( 850 $NewActivity, 851 $OldActivity, 852 "$Test->{Name} | Updated activity is equal than original", 853 ); 854 } 855 } 856 else { 857 my $Success = $ActivityObject->ActivityUpdate( %{ $Test->{Config} } ); 858 859 $Self->False( 860 $Success, 861 "$Test->{Name} | Result should fail", 862 ); 863 } 864} 865 866# 867# ActivityList() tests 868# 869 870# no params 871my $TestActivityList = $ActivityObject->ActivityList(); 872 873$Self->Is( 874 $TestActivityList, 875 undef, 876 "ActivityList Test 1: No Params | Should be undef", 877); 878 879# normal Activity list 880$TestActivityList = $ActivityObject->ActivityList( UserID => $UserID ); 881 882$Self->Is( 883 ref $TestActivityList, 884 'HASH', 885 "ActivityList Test 2: | Should be a HASH", 886); 887 888$Self->True( 889 IsHashRefWithData($TestActivityList), 890 "ActivityList Test 2: | Should be not empty HASH", 891); 892 893$Self->IsNotDeeply( 894 $TestActivityList, 895 $OriginalActivityList, 896 "ActivityList Test 2: | Should be different than the original", 897); 898 899# create a variable copy otherwise the cache will be altered 900my %TestActivityListCopy = %{$TestActivityList}; 901 902# delete original activities 903for my $ActivityID ( sort keys %{$OriginalActivityList} ) { 904 delete $TestActivityListCopy{$ActivityID}; 905} 906 907$Self->Is( 908 scalar keys %TestActivityListCopy, 909 scalar @AddedActivityList, 910 "ActivityList Test 2: | Number of activities match added activities", 911); 912 913my $Counter = 0; 914for my $ActivityID ( sort { $a cmp $b } keys %TestActivityListCopy ) { 915 $Self->Is( 916 $ActivityID, 917 $AddedActivityList[$Counter], 918 "ActivityList Test 2: | ActivityID match AddedActivityID", 919 ); 920 $Counter++; 921} 922 923# 924# ActivityDelete() (test for fail, test for success are done by removing activities at the end) 925# 926@Tests = ( 927 { 928 Name => 'ActivityDelete Test 1: No params', 929 Config => {}, 930 Success => 0, 931 }, 932 { 933 Name => 'ActivityDelete Test 2: No Activity ID', 934 Config => { 935 ID => undef, 936 UserID => $RandomID, 937 }, 938 Success => 0, 939 }, 940 { 941 Name => 'ActivityDelete Test 3: No UserID', 942 Config => { 943 ID => $RandomID, 944 UserID => undef, 945 }, 946 Success => 0, 947 }, 948 { 949 Name => 'ActivityDelete Test 4: Wrong Activity ID', 950 Config => { 951 ID => '9999999', 952 UserID => $UserID, 953 }, 954 Success => 0, 955 }, 956); 957 958for my $Test (@Tests) { 959 my $Success = $ActivityObject->ActivityDelete( %{ $Test->{Config} } ); 960 961 if ( $Test->{Success} ) { 962 $Self->True( 963 $Success, 964 "$Test->{Name} | Activity deleted with true", 965 ); 966 } 967 else { 968 $Self->False( 969 $Success, 970 "$Test->{Name} | Activity delete with false", 971 ); 972 } 973} 974 975# 976# ActivityListGet() tests 977# 978 979my $FullList = $ActivityObject->ActivityListGet( 980 UserID => undef, 981); 982 983$Self->IsNot( 984 ref $FullList, 985 'ARRAY', 986 "ActivityListGet Test 1: No UserID | List Should not be an array", 987); 988 989# get the List of activities with all details 990$FullList = $ActivityObject->ActivityListGet( 991 UserID => $UserID, 992); 993 994# get simple list of activities 995my $List = $ActivityObject->ActivityList( 996 UserID => $UserID, 997); 998 999# create the list of activities with details manually 1000my $ExpectedActivityList; 1001for my $ActivityID ( sort { int $a <=> int $b } keys %{$List} ) { 1002 1003 my $ActivityData = $ActivityObject->ActivityGet( 1004 ID => $ActivityID, 1005 UserID => $UserID, 1006 ); 1007 push @{$ExpectedActivityList}, $ActivityData; 1008} 1009 1010$Self->Is( 1011 ref $FullList, 1012 'ARRAY', 1013 "ActivityListGet Test 2: Correct List | Should be an array", 1014); 1015 1016$Self->True( 1017 IsArrayRefWithData($FullList), 1018 "ActivityListGet Test 2: Correct List | The list is not empty", 1019); 1020 1021$Self->IsDeeply( 1022 $FullList, 1023 $ExpectedActivityList, 1024 "ActivityListGet Test 2: Correct List | Activity List", 1025); 1026 1027# check cache 1028my $CacheKey = 'ActivityListGet'; 1029 1030my $Cache = $CacheObject->Get( 1031 Type => 'ProcessManagement_Activity', 1032 Key => $CacheKey, 1033); 1034 1035$Self->IsDeeply( 1036 $Cache, 1037 $FullList, 1038 "ActivityListGet Test 2: Correct List | Cache", 1039); 1040 1041# cleanup is done by RestoreDatabase 1042 10431; 1044