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 Socket;
17use MIME::Base64;
18
19use Kernel::GenericInterface::Debugger;
20use Kernel::GenericInterface::Operation::Ticket::TicketCreate;
21use Kernel::GenericInterface::Operation::Session::SessionCreate;
22
23use Kernel::System::VariableCheck qw(IsArrayRefWithData IsHashRefWithData IsStringWithData);
24
25# get needed objects
26my $ConfigObject    = $Kernel::OM->Get('Kernel::Config');
27my $SysConfigObject = $Kernel::OM->Get('Kernel::System::SysConfig');
28
29# Skip SSL certificate verification.
30$Kernel::OM->ObjectParamAdd(
31    'Kernel::System::UnitTest::Helper' => {
32        SkipSSLVerify => 1,
33    },
34);
35my $Helper = $Kernel::OM->Get('Kernel::System::UnitTest::Helper');
36
37my $RandomID = $Helper->GetRandomID();
38
39$Helper->ConfigSettingChange(
40    Valid => 1,
41    Key   => 'Ticket::Type',
42    Value => 1,
43);
44
45$Helper->ConfigSettingChange(
46    Valid => 1,
47    Key   => 'Ticket::Frontend::AccountTime',
48    Value => 1,
49);
50
51$Helper->ConfigSettingChange(
52    Valid => 1,
53    Key   => 'Ticket::Frontend::NeedAccountedTime',
54    Value => 1,
55);
56
57# disable DNS lookups
58$Helper->ConfigSettingChange(
59    Valid => 1,
60    Key   => 'CheckMXRecord',
61    Value => 0,
62);
63
64$Helper->ConfigSettingChange(
65    Valid => 1,
66    Key   => 'CheckEmailAddresses',
67    Value => 1,
68);
69
70# disable SessionCheckRemoteIP setting
71$Helper->ConfigSettingChange(
72    Valid => 1,
73    Key   => 'SessionCheckRemoteIP',
74    Value => 0,
75);
76
77# enable customer groups support
78$Helper->ConfigSettingChange(
79    Valid => 1,
80    Key   => 'CustomerGroupSupport',
81    Value => 1,
82);
83
84# check if SSL Certificate verification is disabled
85$Self->Is(
86    $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME},
87    0,
88    'Disabled SSL certificates verification in environment'
89);
90
91my $TestOwnerLogin        = $Helper->TestUserCreate();
92my $TestResponsibleLogin  = $Helper->TestUserCreate();
93my $TestCustomerUserLogin = $Helper->TestCustomerUserCreate();
94my $TestUserLogin         = $Helper->TestUserCreate(
95    Groups => [ 'admin', 'users', ],
96);
97my $UserObject = $Kernel::OM->Get('Kernel::System::User');
98
99my $OwnerID = $UserObject->UserLookup(
100    UserLogin => $TestOwnerLogin,
101);
102my $ResponsibleID = $UserObject->UserLookup(
103    UserLogin => $TestResponsibleLogin,
104);
105my $UserID = $UserObject->UserLookup(
106    UserLogin => $TestUserLogin,
107);
108
109my $InvalidID = $Kernel::OM->Get('Kernel::System::Valid')->ValidLookup( Valid => 'invalid' );
110
111# sanity test
112$Self->IsNot(
113    $InvalidID,
114    undef,
115    "ValidLookup() for 'invalid' should not be undef"
116);
117
118# get group object
119my $GroupObject = $Kernel::OM->Get('Kernel::System::Group');
120
121# create a new group
122my $GroupID = $GroupObject->GroupAdd(
123    Name    => 'TestSpecial' . $RandomID,
124    Comment => 'comment describing the group',    # optional
125    ValidID => 1,
126    UserID  => 1,
127);
128
129my %GroupData = $GroupObject->GroupGet( ID => $GroupID );
130
131# sanity check
132$Self->True(
133    IsHashRefWithData( \%GroupData ),
134    "GroupGet() - for testing group",
135);
136
137# create queue object
138my $QueueObject = $Kernel::OM->Get('Kernel::System::Queue');
139
140my @Queues;
141
142my @QueueProperties = (
143    {
144        Name    => 'queue1' . $RandomID,
145        GroupID => 1,
146    },
147    {
148        Name    => 'queue2' . $RandomID,
149        GroupID => $GroupID,
150    }
151);
152
153# create queues
154for my $QueueProperty (@QueueProperties) {
155    my $QueueID = $QueueObject->QueueAdd(
156        %{$QueueProperty},
157        ValidID         => 1,
158        SystemAddressID => 1,
159        SalutationID    => 1,
160        SignatureID     => 1,
161        Comment         => 'Some comment',
162        UserID          => 1,
163    );
164
165    # sanity check
166    $Self->True(
167        $QueueID,
168        "QueueAdd() - create testing queue",
169    );
170    my %QueueData = $QueueObject->QueueGet( ID => $QueueID );
171
172    push @Queues, \%QueueData;
173}
174
175# get type object
176my $TypeObject = $Kernel::OM->Get('Kernel::System::Type');
177
178# create new type
179my $TypeID = $TypeObject->TypeAdd(
180    Name    => 'TestType' . $RandomID,
181    ValidID => 1,
182    UserID  => 1,
183);
184
185# sanity check
186$Self->True(
187    $TypeID,
188    "TypeAdd() - create testing type",
189);
190
191my %TypeData = $TypeObject->TypeGet(
192    ID => $TypeID,
193);
194
195# sanity check
196$Self->True(
197    IsHashRefWithData( \%TypeData ),
198    "TypeGet() - for testing type",
199);
200
201# create service object
202my $ServiceObject = $Kernel::OM->Get('Kernel::System::Service');
203
204# create new service
205my $ServiceID = $ServiceObject->ServiceAdd(
206    Name    => 'TestService' . $RandomID,
207    ValidID => 1,
208    UserID  => 1,
209);
210
211# sanity check
212$Self->True(
213    $ServiceID,
214    "ServiceAdd() - create testing service",
215);
216
217my %ServiceData = $ServiceObject->ServiceGet(
218    ServiceID => $ServiceID,
219    UserID    => 1,
220);
221
222# sanity check
223$Self->True(
224    IsHashRefWithData( \%ServiceData ),
225    "ServiceGet() - for testing service",
226);
227
228# set service for the customer
229$ServiceObject->CustomerUserServiceMemberAdd(
230    CustomerUserLogin => $TestCustomerUserLogin,
231    ServiceID         => $ServiceID,
232    Active            => 1,
233    UserID            => 1,
234);
235
236# create SLA object
237my $SLAObject = $Kernel::OM->Get('Kernel::System::SLA');
238
239# create new SLA
240my $SLAID = $SLAObject->SLAAdd(
241    Name       => 'TestSLA' . $RandomID,
242    ServiceIDs => [$ServiceID],
243    ValidID    => 1,
244    UserID     => 1,
245);
246
247# sanity check
248$Self->True(
249    $SLAID,
250    "SLAAdd() - create testing SLA",
251);
252
253my %SLAData = $SLAObject->SLAGet(
254    SLAID  => $SLAID,
255    UserID => 1,
256);
257
258# sanity check
259$Self->True(
260    IsHashRefWithData( \%SLAData ),
261    "SLAGet() - for testing SLA",
262);
263
264# create state object
265my $StateObject = $Kernel::OM->Get('Kernel::System::State');
266
267# create new state
268my $StateID = $StateObject->StateAdd(
269    Name    => 'TestState' . $RandomID,
270    TypeID  => 2,
271    ValidID => 1,
272    UserID  => 1,
273);
274
275# sanity check
276$Self->True(
277    $StateID,
278    "StateAdd() - create testing state",
279);
280
281my %StateData = $StateObject->StateGet(
282    ID => $StateID,
283);
284
285# sanity check
286$Self->True(
287    IsHashRefWithData( \%StateData ),
288    "StateGet() - for testing state",
289);
290
291# create priority object
292my $PriorityObject = $Kernel::OM->Get('Kernel::System::Priority');
293
294# create new priority
295my $PriorityID = $PriorityObject->PriorityAdd(
296    Name    => 'TestPriority' . $RandomID,
297    ValidID => 1,
298    UserID  => 1,
299);
300
301# sanity check
302$Self->True(
303    $PriorityID,
304    "PriorityAdd() - create testing priority",
305);
306
307my %PriorityData = $PriorityObject->PriorityGet(
308    PriorityID => $PriorityID,
309    UserID     => 1,
310);
311
312# sanity check
313$Self->True(
314    IsHashRefWithData( \%PriorityData ),
315    "PriorityGet() - for testing priority",
316);
317
318# create dynamic field object
319my $DynamicFieldObject = $Kernel::OM->Get('Kernel::System::DynamicField');
320
321# create new dynamic field
322my $DynamicFieldID = $DynamicFieldObject->DynamicFieldAdd(
323    Name       => 'TestDynamicFieldGI' . $Helper->GetRandomNumber(),
324    Label      => 'GI Test Field',
325    FieldOrder => 9991,
326    FieldType  => 'DateTime',
327    ObjectType => 'Ticket',
328    Config     => {
329        DefaultValue  => 0,
330        YearsInFuture => 0,
331        YearsInPast   => 0,
332        YearsPeriod   => 0,
333    },
334    ValidID => 1,
335    UserID  => 1,
336);
337
338my $DynamicFieldID2 = $DynamicFieldObject->DynamicFieldAdd(
339    Name       => 'TestDynamicFieldGI2' . $Helper->GetRandomNumber(),
340    Label      => 'GI Test Field2',
341    FieldOrder => 9992,
342    FieldType  => 'Text',
343    ObjectType => 'Article',
344    Config     => {
345        DefaultValue => '',
346    },
347    ValidID => 1,
348    UserID  => 1,
349);
350
351# sanity check
352$Self->True(
353    $DynamicFieldID,
354    "DynamicFieldAdd() - create testing dynamic field",
355);
356
357my $DynamicFieldData = $DynamicFieldObject->DynamicFieldGet(
358    ID => $DynamicFieldID,
359);
360
361$Self->True(
362    $DynamicFieldID2,
363    "DynamicFieldAdd() - create testing dynamic field",
364);
365
366my $DynamicFieldData2 = $DynamicFieldObject->DynamicFieldGet(
367    ID => $DynamicFieldID2,
368);
369
370# sanity check
371$Self->True(
372    IsHashRefWithData($DynamicFieldData),
373    "DynamicFieldGet() - for testing dynamic field",
374);
375
376# create web service object
377my $WebserviceObject = $Kernel::OM->Get('Kernel::System::GenericInterface::Webservice');
378$Self->Is(
379    ref $WebserviceObject,
380    'Kernel::System::GenericInterface::Webservice',
381    "Create web service object",
382);
383
384# set web service name
385my $WebserviceName = '-Test-' . $RandomID;
386
387my $WebserviceID = $WebserviceObject->WebserviceAdd(
388    Name   => $WebserviceName,
389    Config => {
390        Debugger => {
391            DebugThreshold => 'debug',
392        },
393        Provider => {
394            Transport => {
395                Type => '',
396            },
397        },
398    },
399    ValidID => 1,
400    UserID  => 1,
401);
402$Self->True(
403    $WebserviceID,
404    "Added web service",
405);
406
407# get remote host with some precautions for certain unit test systems
408my $Host = $Helper->GetTestHTTPHostname();
409
410# prepare web service config
411my $RemoteSystem =
412    $ConfigObject->Get('HttpType')
413    . '://'
414    . $Host
415    . '/'
416    . $ConfigObject->Get('ScriptAlias')
417    . '/nph-genericinterface.pl/WebserviceID/'
418    . $WebserviceID;
419
420my $WebserviceConfig = {
421
422    #    Name => '',
423    Description =>
424        'Test for Ticket Connector using SOAP transport backend.',
425    Debugger => {
426        DebugThreshold => 'debug',
427        TestMode       => 1,
428    },
429    Provider => {
430        Transport => {
431            Type   => 'HTTP::SOAP',
432            Config => {
433                MaxLength => 10000000,
434                NameSpace => 'http://otrs.org/SoapTestInterface/',
435                Endpoint  => $RemoteSystem,
436            },
437        },
438        Operation => {
439            TicketCreate => {
440                Type              => 'Ticket::TicketCreate',
441                IncludeTicketData => 1,
442            },
443            SessionCreate => {
444                Type => 'Session::SessionCreate',
445            },
446        },
447    },
448    Requester => {
449        Transport => {
450            Type   => 'HTTP::SOAP',
451            Config => {
452                NameSpace => 'http://otrs.org/SoapTestInterface/',
453                Encoding  => 'UTF-8',
454                Endpoint  => $RemoteSystem,
455                Timeout   => 120,
456            },
457        },
458        Invoker => {
459            TicketCreate => {
460                Type => 'Test::TestSimple',
461            },
462            SessionCreate => {
463                Type => 'Test::TestSimple',
464            },
465        },
466    },
467};
468
469# update web service with real config
470my $WebserviceUpdate = $WebserviceObject->WebserviceUpdate(
471    ID      => $WebserviceID,
472    Name    => $WebserviceName,
473    Config  => $WebserviceConfig,
474    ValidID => 1,
475    UserID  => 1,
476);
477$Self->True(
478    $WebserviceUpdate,
479    "Updated web service $WebserviceID - $WebserviceName",
480);
481
482# Get SessionID
483# create requester object
484my $RequesterSessionObject = $Kernel::OM->Get('Kernel::GenericInterface::Requester');
485$Self->Is(
486    ref $RequesterSessionObject,
487    'Kernel::GenericInterface::Requester',
488    "SessionID - Create requester object",
489);
490
491# create a new user for current test
492my $UserLogin = $Helper->TestUserCreate(
493    Groups => [ 'admin', 'users' ],
494);
495my $Password = $UserLogin;
496
497# create a new user without permissions for current test
498my $UserLogin2 = $Helper->TestUserCreate();
499my $Password2  = $UserLogin2;
500
501# create a customer where a ticket will use and will have permissions
502my $CustomerUserLogin = $Helper->TestCustomerUserCreate();
503my $CustomerPassword  = $CustomerUserLogin;
504
505# create a customer that will not have permissions
506my $CustomerUserLogin2 = $Helper->TestCustomerUserCreate();
507my $CustomerPassword2  = $CustomerUserLogin2;
508
509# start requester with our web service
510my $RequesterSessionResult = $RequesterSessionObject->Run(
511    WebserviceID => $WebserviceID,
512    Invoker      => 'SessionCreate',
513    Data         => {
514        UserLogin => $UserLogin,
515        Password  => $Password,
516    },
517);
518
519my $NewSessionID = $RequesterSessionResult->{Data}->{SessionID};
520my @Tests        = (
521    {
522        Name           => 'Ticket with IDs',
523        SuccessRequest => 1,
524        SuccessCreate  => 1,
525        RequestData    => {
526            Ticket => {
527                Title         => 'Ticket Title',
528                CustomerUser  => $TestCustomerUserLogin,
529                QueueID       => $Queues[0]->{QueueID},
530                TypeID        => $TypeID,
531                ServiceID     => $ServiceID,
532                SLAID         => $SLAID,
533                StateID       => $StateID,
534                PriorityID    => $PriorityID,
535                OwnerID       => $OwnerID,
536                ResponsibleID => $ResponsibleID,
537                PendingTime   => {
538                    Year   => 2012,
539                    Month  => 12,
540                    Day    => 16,
541                    Hour   => 20,
542                    Minute => 48,
543                },
544            },
545            Article => {
546                Subject                         => 'Article subject',
547                Body                            => 'Article body',
548                AutoResponseType                => 'auto reply',
549                SenderTypeID                    => 1,
550                IsVisibleForCustomer            => 1,
551                CommunicationChannel            => 'Email',
552                From                            => 'enjoy@otrs.com',
553                ContentType                     => 'text/plain; charset=UTF8',
554                HistoryType                     => 'NewTicket',
555                HistoryComment                  => '% % ',
556                TimeUnit                        => 25,
557                ForceNotificationToUserID       => [$UserID],
558                ExcludeNotificationToUserID     => [$UserID],
559                ExcludeMuteNotificationToUserID => [$UserID],
560            },
561            DynamicField => [
562                {
563                    Name  => $DynamicFieldData->{Name},
564                    Value => '2012-01-17 12:40:00',
565                },
566                {
567                    Name  => $DynamicFieldData2->{Name},
568                    Value => 'DynamicFieldTypeArticle',
569                },
570            ],
571            Attachment => [
572                {
573                    Content     => 'VGhpcyBpcyBhIHRlc3QgdGV4dC4=',
574                    ContentType => 'text/plain; charset=UTF8',
575                    Filename    => 'Test.txt',
576                    Disposition => 'attachment',
577                },
578            ],
579        },
580        Operation => 'TicketCreate',
581    },
582);
583
584# debugger object
585my $DebuggerObject = Kernel::GenericInterface::Debugger->new(
586    DebuggerConfig => {
587        DebugThreshold => 'debug',
588        TestMode       => 1,
589    },
590    WebserviceID      => $WebserviceID,
591    CommunicationType => 'Provider',
592);
593$Self->Is(
594    ref $DebuggerObject,
595    'Kernel::GenericInterface::Debugger',
596    'DebuggerObject instantiate correctly',
597);
598
599for my $Test (@Tests) {
600
601    # create local object
602    my $LocalObject = "Kernel::GenericInterface::Operation::Ticket::$Test->{Operation}"->new(
603        DebuggerObject => $DebuggerObject,
604        WebserviceID   => $WebserviceID,
605        Operation      => $Test->{Operation},
606    );
607
608    $Self->Is(
609        ref $LocalObject,
610        "Kernel::GenericInterface::Operation::Ticket::$Test->{Operation}",
611        "$Test->{Name} - Create local object",
612    );
613
614    my %Auth = (
615        UserLogin => $UserLogin,
616        Password  => $Password,
617    );
618    if ( IsHashRefWithData( $Test->{Auth} ) ) {
619        %Auth = %{ $Test->{Auth} };
620    }
621
622    # start requester with our web service
623    my $LocalResult = $LocalObject->Run(
624        WebserviceID => $WebserviceID,
625        Invoker      => $Test->{Operation},
626        Data         => {
627            %Auth,
628            %{ $Test->{RequestData} },
629        },
630    );
631
632    # check result
633    $Self->Is(
634        ref $LocalResult,
635        'HASH',
636        "$Test->{Name} - Local result structure is valid",
637    );
638
639    # create requester object
640    my $RequesterObject = $Kernel::OM->Get('Kernel::GenericInterface::Requester');
641    $Self->Is(
642        ref $RequesterObject,
643        'Kernel::GenericInterface::Requester',
644        "$Test->{Name} - Create requester object",
645    );
646
647    # start requester with our web service
648    my $RequesterResult = $RequesterObject->Run(
649        WebserviceID => $WebserviceID,
650        Invoker      => $Test->{Operation},
651        Data         => {
652            %Auth,
653            %{ $Test->{RequestData} },
654        },
655    );
656
657    # check result
658    $Self->Is(
659        ref $RequesterResult,
660        'HASH',
661        "$Test->{Name} - Requester result structure is valid",
662    );
663
664    $Self->Is(
665        $RequesterResult->{Success},
666        $Test->{SuccessRequest},
667        "$Test->{Name} - Requester successful result",
668    );
669
670    # tests supposed to succeed
671    if ( $Test->{SuccessCreate} ) {
672
673        # local results
674        $Self->True(
675            $LocalResult->{Data}->{TicketID},
676            "$Test->{Name} - Local result TicketID with True.",
677        );
678        $Self->True(
679            $LocalResult->{Data}->{TicketNumber},
680            "$Test->{Name} - Local result TicketNumber with True.",
681        );
682        $Self->True(
683            $LocalResult->{Data}->{ArticleID},
684            "$Test->{Name} - Local result ArticleID with True.",
685        );
686        $Self->Is(
687            $LocalResult->{Data}->{Error},
688            undef,
689            "$Test->{Name} - Local result Error is undefined.",
690        );
691
692        # requester results
693        $Self->True(
694            $RequesterResult->{Data}->{TicketID},
695            "$Test->{Name} - Requester result TicketID with True.",
696        );
697        $Self->True(
698            $RequesterResult->{Data}->{TicketNumber},
699            "$Test->{Name} - Requester result TicketNumber with True.",
700        );
701        $Self->True(
702            $RequesterResult->{Data}->{ArticleID},
703            "$Test->{Name} - Requester result ArticleID with True.",
704        );
705        $Self->Is(
706            $RequesterResult->{Data}->{Error},
707            undef,
708            "$Test->{Name} - Requester result Error is undefined.",
709        );
710
711        # create ticket object
712        my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
713
714        # check several ticket and article data
715        $Self->Is(
716            $LocalResult->{Data}->{Ticket}->{Title},
717            $Test->{RequestData}->{Ticket}->{Title},
718            "$Test->{Name} - Ticket title Ok.",
719        );
720
721        $Self->Is(
722            $LocalResult->{Data}->{Ticket}->{QueueID},
723            $Test->{RequestData}->{Ticket}->{QueueID},
724            "$Test->{Name} - Ticket QueueID Ok.",
725        );
726
727        $Self->Is(
728            $LocalResult->{Data}->{Ticket}->{Article}->{Body},
729            $Test->{RequestData}->{Article}->{Body},
730            "$Test->{Name} - Article body Ok.",
731        );
732
733        $Self->Is(
734            $LocalResult->{Data}->{Ticket}->{Article}->{From},
735            $Test->{RequestData}->{Article}->{From},
736            "$Test->{Name} - Article from Ok.",
737        );
738
739        # check dynamic fields
740        my %CompareDynamicFieldTest;
741        for my $Field ( @{ $Test->{RequestData}->{DynamicField} } ) {
742            if ( $Field->{Name} eq $DynamicFieldData->{Name} ) {
743                $CompareDynamicFieldTest{Ticket} = $Field;
744            }
745            elsif ( $Field->{Name} eq $DynamicFieldData2->{Name} ) {
746                $CompareDynamicFieldTest{Article} = $Field;
747            }
748
749        }
750
751        my %CompareDynamicFieldLocal;
752        LOCALRESULTTICKET:
753        for my $Field ( @{ $LocalResult->{Data}->{Ticket}->{DynamicField} } ) {
754            next LOCALRESULTTICKET if $Field->{Name} ne $DynamicFieldData->{Name};
755            $CompareDynamicFieldLocal{Ticket} = $Field;
756        }
757
758        LOCALRESULTARTICLE:
759        for my $Field ( @{ $LocalResult->{Data}->{Ticket}->{Article}->{DynamicField} } ) {
760            next LOCALRESULTARTICLE if $Field->{Name} ne $DynamicFieldData2->{Name};
761            $CompareDynamicFieldLocal{Article} = $Field;
762        }
763
764        $Self->IsDeeply(
765            \%CompareDynamicFieldLocal,
766            \%CompareDynamicFieldTest,
767            "$Test->{Name} - local Ticket->DynamicField match test definition.",
768        );
769
770        $Self->Is(
771            $LocalResult->{Data}->{Ticket}->{Article}->{Attachment}->[0]->{Filename},
772            $Test->{RequestData}->{Attachment}->[0]->{Filename},
773            "$Test->{Name} - Attachment filename Ok.",
774        );
775
776        $Self->Is(
777            $RequesterResult->{Data}->{Ticket}->{Title},
778            $Test->{RequestData}->{Ticket}->{Title},
779            "$Test->{Name} - Ticket title Ok.",
780        );
781
782        $Self->Is(
783            $RequesterResult->{Data}->{Ticket}->{QueueID},
784            $Test->{RequestData}->{Ticket}->{QueueID},
785            "$Test->{Name} - Ticket QueueID Ok.",
786        );
787
788        $Self->Is(
789            $RequesterResult->{Data}->{Ticket}->{Article}->{Body},
790            $Test->{RequestData}->{Article}->{Body},
791            "$Test->{Name} - Article body Ok.",
792        );
793
794        $Self->Is(
795            $RequesterResult->{Data}->{Ticket}->{Article}->{From},
796            $Test->{RequestData}->{Article}->{From},
797            "$Test->{Name} - Article from Ok.",
798        );
799
800        # check dynamic fields
801        my %CompareDynamicFieldReq;
802        LOCALRESULTTICKET:
803        for my $Field ( @{ $RequesterResult->{Data}->{Ticket}->{DynamicField} } ) {
804            next LOCALRESULTTICKET if $Field->{Name} ne $DynamicFieldData->{Name};
805            $CompareDynamicFieldReq{Ticket} = $Field;
806        }
807
808        # Check for type of key containing article dynamic field data, since it might be a hash on systems without
809        #   multiple fields defined. In this case normalize it to an array of hashes for easier comparison later.
810        if ( ref $RequesterResult->{Data}->{Ticket}->{Article}->{DynamicField} eq 'HASH' ) {
811            $RequesterResult->{Data}->{Ticket}->{Article}->{DynamicField}
812                = [ $RequesterResult->{Data}->{Ticket}->{Article}->{DynamicField} ];
813        }
814
815        LOCALRESULTARTICLE:
816        for my $Field ( @{ $RequesterResult->{Data}->{Ticket}->{Article}->{DynamicField} } ) {
817            next LOCALRESULTARTICLE if $Field->{Name} ne $DynamicFieldData2->{Name};
818            $CompareDynamicFieldReq{Article} = $Field;
819        }
820
821        $Self->IsDeeply(
822            \%CompareDynamicFieldReq,
823            \%CompareDynamicFieldTest,
824            "$Test->{Name} - req Ticket->DynamicField match test definition.",
825        );
826
827        # check attachment
828        $Self->Is(
829            $RequesterResult->{Data}->{Ticket}->{Article}->{Attachment}->{Filename},
830            $Test->{RequestData}->{Attachment}->[0]->{Filename},
831            "$Test->{Name} - Attachment filename Ok.",
832        );
833
834        # delete the tickets
835        for my $TicketID (
836            $LocalResult->{Data}->{TicketID},
837            $RequesterResult->{Data}->{TicketID}
838            )
839        {
840
841            # Allow some time for all history entries to be written to the ticket before deleting it,
842            #   otherwise TicketDelete could fail.
843            sleep 1;
844
845            my $TicketDelete = $TicketObject->TicketDelete(
846                TicketID => $TicketID,
847                UserID   => 1,
848            );
849
850            # sanity check
851            $Self->True(
852                $TicketDelete,
853                "TicketDelete() successful for Ticket ID $TicketID",
854            );
855        }
856    }
857}
858
859# delete web service
860my $WebserviceDelete = $WebserviceObject->WebserviceDelete(
861    ID     => $WebserviceID,
862    UserID => 1,
863);
864$Self->True(
865    $WebserviceDelete,
866    "Deleted web service $WebserviceID",
867);
868
869# get DB object
870my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
871
872my $Success;
873
874# delete queues
875for my $QueueData (@Queues) {
876    $Success = $DBObject->Do(
877        SQL => "DELETE FROM queue WHERE id = $QueueData->{QueueID}",
878    );
879    $Self->True(
880        $Success,
881        "Queue with ID $QueueData->{QueueID} is deleted!",
882    );
883}
884
885# delete group
886$Success = $DBObject->Do(
887    SQL => "DELETE FROM groups WHERE id = $GroupID",
888);
889$Self->True(
890    $Success,
891    "Group with ID $GroupID is deleted!",
892);
893
894# delete type
895$Success = $DBObject->Do(
896    SQL => "DELETE FROM ticket_type WHERE id = $TypeID",
897);
898$Self->True(
899    $Success,
900    "Type with ID $TypeID is deleted!",
901);
902
903# delete service_customer_user and service
904$Success = $DBObject->Do(
905    SQL => "DELETE FROM service_customer_user WHERE service_id = $ServiceID",
906);
907$Self->True(
908    $Success,
909    "Service user referenced to service ID $ServiceID is deleted!",
910);
911
912$Success = $DBObject->Do(
913    SQL => "DELETE FROM service_sla WHERE service_id = $ServiceID OR sla_id = $SLAID",
914);
915$Self->True(
916    $Success,
917    "Service SLA referenced to service ID $ServiceID is deleted!",
918);
919
920$Success = $DBObject->Do(
921    SQL => "DELETE FROM service WHERE id = $ServiceID",
922);
923$Self->True(
924    $Success,
925    "Service with ID $ServiceID is deleted!",
926);
927
928# delete SLA
929$Success = $DBObject->Do(
930    SQL => "DELETE FROM sla WHERE id = $SLAID",
931);
932$Self->True(
933    $Success,
934    "SLA with ID $SLAID is deleted!",
935);
936
937# delete state
938$Success = $DBObject->Do(
939    SQL => "DELETE FROM ticket_state WHERE id = $StateID",
940);
941$Self->True(
942    $Success,
943    "State with ID $StateID is deleted!",
944);
945
946# delete priority
947$Success = $DBObject->Do(
948    SQL => "DELETE FROM ticket_priority WHERE id = $PriorityID",
949);
950$Self->True(
951    $Success,
952    "Priority with ID $PriorityID is deleted!",
953);
954
955# Delete test dynamic fields.
956$Success = $DBObject->Do(
957    SQL  => 'DELETE FROM dynamic_field WHERE id = ? OR id = ?',
958    Bind => [ \$DynamicFieldID, \$DynamicFieldID2 ],
959);
960$Self->True(
961    $Success,
962    "Dynamic fields with ID $DynamicFieldID and $DynamicFieldID2 are deleted!",
963);
964
965# cleanup cache
966$Kernel::OM->Get('Kernel::System::Cache')->CleanUp();
967
9681;
969