use strict;
use warnings;
use Test::Exception tests => 9;
use FindBin;
use Dancer qw(config);
use Dancer::Plugin::Tapir;

throws_ok { setup_thrift_handler } qr/Missing configuration settings/, "Omit settings";

my %tapir_config = (
	thrift_idl    => $FindBin::Bin . '/thrift/example.thrift',
	handler_class => 'MyWebApp::Handler',
);
config->{plugins}{Tapir} = \%tapir_config;

{
	local $tapir_config{thrift_idl} = "/made/up/file";
	throws_ok { setup_thrift_handler } qr/Invalid thrift_idl file/, "Pass a non-existant thrift_idl file name";
}

{
	local $tapir_config{thrift_idl} = $FindBin::Bin . '/thrift/bad.thrift';
	throws_ok { setup_thrift_handler } qr/Parsing failed to consume all of the input/, "Pass a bad thrift_idl file";
}

{
	local $tapir_config{thrift_idl} = $FindBin::Bin . '/thrift/invalid.thrift';
	throws_ok { setup_thrift_handler } qr/the following errors were found.+has no comments/s, "Pass a thrift file which fails the validation check";
}

throws_ok { setup_thrift_handler } qr/Failed to load MyWebApp::Handler/, "Handler doesn't load";

$INC{'MyWebApp/Handler.pm'} = undef;

throws_ok { setup_thrift_handler } qr/must be a subclass of Tapir/, "Handler invalid subclass";

{
	package MyWebApp::Handler;

	use Moose;
	use Tapir::Server::Handler::Signatures;
	extends 'Tapir::Server::Handler::Class';
}

throws_ok { setup_thrift_handler } qr/didn't call service/, "Handler didn't call service()";

{
	package MyWebApp::Handler;

	set_service 'Accounts';

	method getAccount ($username) {
		print "getAccount called with $username\n";
		$call->set_result({
			id         => 42,
			error      => "this will fail",
			allocation => 1000,
		});
	}
}

throws_ok { setup_thrift_handler } qr/doesn't handle method createAccount/, "Missing methods";

{
	package MyWebApp::Handler;
	method createAccount { }
}

lives_ok { setup_thrift_handler } "Setup now completes without errors";
