The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package TestYAML;

use strict;
use warnings;

use base 'TestBase';

use Astronaut;

use File::Path;
use YAML qw( DumpFile LoadFile );
use File::Spec::Functions 'catfile';

use Test::More;
use Test::Exception;

sub test_data
{
	return
	{
		type        => 'Astronaut',
		class       => 'Class::StorageFactory::YAML',
		storage     => 'data',
		add_files   =>
		[
			boris => { name => 'Boris', rank => 'Captain', age => 33 },
		],
	}
}

sub create_test_data :Test( startup )
{
	my $self      = shift;
	my $test_data = $self->test_data();
	my $path      = $test_data->{storage};
	my %add_files = @{ $test_data->{add_files} };

	mkpath( $path );

	while (my ($name, $data) = each %add_files)
	{
		my $file = catfile( $path, $name . '.yml' );
		DumpFile( $file, $data );
	}
}

sub remove_test_data :Test( shutdown )
{
	my $self      = shift;
	my $test_data = $self->test_data();
	my $path      = $test_data->{storage};
	rmtree( $path );
}

sub fetch :Test( 5 )
{
	my $self     = shift;
	my $factory  = $self->{factory};
	throws_ok { $factory->fetch() } qr/No id specified for fetch()/,
		'fetch() should throw exception unless it has an id';
	throws_ok { $factory->fetch( 'empty' ) } qr/No file found for id 'empty'/,
		'... or if id does not exist';

	my $astronaut;
	lives_ok  { $astronaut = $factory->fetch( 'boris' ) }
		'... but should live if it does exist';
	isa_ok( $astronaut, 'Astronaut', '... blessing results so that it' );

	is_deeply( $astronaut->data(),
		{ name => 'Boris', rank => 'Captain', age => 33 },
		'... blessing all data' );
}

sub store :Test( 3 )
{
	my $self       = shift;
	my $factory    = $self->{factory};
	my $test_data  = $self->test_data();
	my $path       = $test_data->{storage};

	throws_ok { $factory->store() } qr/No id specified for store()/,
		'store() should throw exception unless it has an id';

	my $attributes = { name => 'Natasha', rank => 'Commander', age => 31 };
	my $natasha    = Astronaut->new( $attributes );
	my $stored_file = catfile( $path, 'natasha' . '.yml' );

	$factory->store( natasha => $natasha );
	ok( -e $stored_file, '... saving file with the id, if passed' );
	my $stored_atts = LoadFile( $stored_file );
	is_deeply( $stored_atts, $attributes, '... with all of its data' );
}

1;