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