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