The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;

BEGIN {
	plan skip_all => "This test requires DBIx::Class version 0.08009 or higher to be installed" unless eval { require DBIx::Class; die unless $DBIx::Class::VERSION >= 0.08009 };
	plan skip_all => "This test requires DBICx::TestDatabase to be installed" unless eval { require DBICx::TestDatabase };
	plan tests => 5;
}

use DBICx::TestDatabase;

my $schema = DBICx::TestDatabase->new('Foo::DB');

my $states = $schema->resultset("Workflow::State");

my $init = $states->create({ id => 1 });
my $blah = $states->create({ id => 2 });
my $gorch = $states->create({ id => 3 });

my $tns = $schema->resultset("Workflow::Transition");


my $blah_called = 0;

{
	package Foo::DB::Workflow::Transition::Blah;
	use Moose;

	extends qw(Foo::DB::Workflow::Transition);

	sub apply_body {
		$blah_called++;
		return {}, ();
	}
}

my $to_blah = $tns->create({
	state => $init,
	to_state => $blah,
	class => "Blah",
});

my $to_gorch = $tns->create({
	state => $init,
	to_state => $gorch,
	class => "Null",
});

my $instances = $schema->resultset("Workflow::Instance");

my $i = $instances->create({ state => $states->find({ id => 1 }) }); # $init

my $items = $schema->resultset("Item");

my $item = $items->create({ id => 1, workflow_instance => $i });

is( $blah_called, 0, "blah not called" );

$item->apply_transition($to_blah);

is( $blah_called, 1, "blah called" );

my $i2 = $item->workflow_instance;

is( $i2->state->id, $blah->id, "workflow instance ID is correct" );
is( $i2->prev->state->id, $init->id, "workflow history" );

is_deeply(
	[ sort map { $_->id } $instances->all ],
	[ sort map { $_->id } $i, $i2 ],
	"instances in DB",
);