The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package SOAP::WSDL::Server::PlackTest;
use parent qw(Test::Class);

use strict;
use warnings;

use Carp;
use Test::More;
use Test::Exception;
use HTTP::Request::Common qw(GET POST PUT DELETE);
use HTTP::Status qw(:constants);
use Plack::Test;
# You may add this to trace SOAP calls
#use SOAP::Lite +trace => [qw(all)];

use SOAP::WSDL::Server::Plack;

use Example::Server::HelloWorld::HelloWorldSoap;
use Example::Interfaces::HelloWorld::HelloWorldSoap;

# As SOAP::WSDL client use LWP, we have to use a real HTTP server
# instead of the L<Plack::Test> MockHTTP default method.
$Plack::Test::Impl = 'Server';

sub server_test : Test(6) {
	my ($self) = @_;

	my $app = SOAP::WSDL::Server::Plack->new({
		dispatch_to => 'Example::HelloWorldImpl',
		soap_service => 'Example::Server::HelloWorld::HelloWorldSoap',
	})->psgi_app();

	test_psgi $app, sub {
		my $cb = shift;
		my $request = GET '/';
		my $res = $cb->($request);
		is($res->code, HTTP_LENGTH_REQUIRED);

		# steal uri from request
		my $uri = $request->uri->clone();
		$uri->path('/');
		note 'Temporary web server url: ' . $uri;

		my $if = Example::Interfaces::HelloWorld::HelloWorldSoap->new({
			proxy => $uri->as_string(),
		});

		my $response;
		lives_ok(sub {
			$response = $if->sayHello({
				name => 'Wall',
				givenName => 'Larry',
			});
		}, 'Calling interface works');

		ok($response, 'Got successful result');
		unless ($response) {
			diag "$response";
		}
		is($response->get_sayHelloResult(), 'Hello Larry Wall');
	};
}

1;