1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
#!/usr/bin/env perl
# Test SOAP mustUnderstand
use warnings;
use strict;
use lib 'lib','t';
use TestTools;
use Data::Dumper;
$Data::Dumper::Indent = 1;
use XML::Compile::SOAP11::Client;
use XML::Compile::Tester;
use Test::More tests => 18;
use XML::LibXML;
#use Log::Report mode => 'DEBUG';
my $schema = <<__HELPERS;
<schema targetNamespace="$TestNS"
xmlns="$SchemaNS">
<element name="good" type="int"/>
</schema>
__HELPERS
#
# Create and interpret a message
#
my $soap = XML::Compile::SOAP11::Client->new;
$soap->schemas->importDefinitions($schema);
my @msg_struct =
( header => [ count => "{$TestNS}good" ]
, mustUnderstand => 'count'
);
my $sender = $soap->compileMessage(SENDER => @msg_struct);
is(ref $sender, 'CODE', 'compiled a sender');
my $receiver = $soap->compileMessage(RECEIVER => @msg_struct);
is(ref $receiver, 'CODE', 'compiled a receiver');
#
# First, the data is present
#
my $msg1_soap = <<__MSG1;
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<x0:good xmlns:x0="$TestNS" SOAP-ENV:mustUnderstand="1">
3
</x0:good>
</SOAP-ENV:Header>
<SOAP-ENV:Body/>
</SOAP-ENV:Envelope>
__MSG1
# sender
my $xml1a = $sender->(count => 3);
isa_ok($xml1a, 'XML::LibXML::Node', 'produced XML');
compare_xml($xml1a, $msg1_soap);
my $xml1b = $sender->( {count => 3} );
isa_ok($xml1b, 'XML::LibXML::Node', 'produced XML');
compare_xml($xml1b, $msg1_soap);
# receiver
my $hash1 = $receiver->($msg1_soap);
is(ref $hash1, 'HASH', 'produced HASH');
is_deeply($hash1, {count => 3}, "server parsed input");
###
### Now, the receiver does not understand the count header
###
my $receiver2 = $soap->compileMessage('RECEIVER');
is(ref $receiver2, 'CODE', 'compiled unknowing receiver');
my $hash2 = $receiver2->($msg1_soap);
ok(defined $hash2, 'received2 works');
is(ref $hash2, 'HASH', 'produced HASH');
ok(defined $hash2->{Fault}, 'fault');
ok(defined $hash2->{Fault}{faultcode}, 'faultcode');
ok(defined $hash2->{Fault}{faultstring}, 'faultstring');
#
# any sender must accept faults
#
my $msg2_soap = <<__FAULT;
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:MustUnderstand</faultcode>
<faultstring>
SOAP mustUnderstand {http://test-types}good
</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
__FAULT
# remove fault decoding extras
delete $hash2->{header};
delete $hash2->{delete $hash2->{Fault}{_NAME}};
my $xml2 = $sender->($hash2);
isa_ok($xml2, 'XML::LibXML::Node', 'produced XML fault');
compare_xml($xml2, $msg2_soap, 'correct structure');
#
# and any receiver can decode them
#
# See XML::Compile README.todo: initial prefix problem: we need to
# stringify and reparse the XML structure.
my $hash3 = $receiver->($xml2->toString);
ok(defined $hash3, 'received decodes fault');
is(ref $hash3, 'HASH');
|