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

#------------------------------------------------------------------------------

package Pinto::Action::Fake;

use Moose;

extends 'Pinto::Action';
with    'Pinto::Role::Committable';

sub execute { 
	my $self  = shift;

	# To bypass assert_has_changed() when committed
	$self->stack->head->update({has_changes => 1});

	return qw(Foo Bar Baz); 
}

no Moose;

#------------------------------------------------------------------------------

package main;

use strict;
use warnings;

use Test::More;

use Pinto::Globals;

use lib 't/lib';
use Pinto::Tester;

#------------------------------------------------------------------------------

local $Pinto::Globals::current_username = 'ME';

my $t = Pinto::Tester->new;
my $faked_title = 'Fake Foo, Bar, Baz';

#------------------------------------------------------------------------------

{
	note "Specified nothing";

	$t->run_ok(Fake => {});
	my $stack    = $t->pinto->repo->get_stack;
	my $revision = $stack->head;

	is ($revision->username,      'ME',         'Revision was committed by ME');
	is ($revision->message_title, $faked_title, 'Message has correct title');
	is ($revision->message_body,  '',           'Message body is empty');
	is ($revision->message,       $faked_title, 'Message is title only');
}

#------------------------------------------------------------------------------

{
	note "Specified use_default_message";

	$t->run_ok(Fake => {use_default_message => 1});
	my $stack    = $t->pinto->repo->get_stack;
	my $revision = $stack->head;

	is ($revision->username,      'ME',         'Revision was committed by ME');
	is ($revision->message_title, $faked_title, 'Message has correct title');
	is ($revision->message_body,  '',           'Message body is empty');
	is ($revision->message,       $faked_title, 'Message is title only');
}

#------------------------------------------------------------------------------

{
	note "Specified message is empty (or whitespace) string";

	$t->run_ok(Fake => {message => '  '});
	my $stack    = $t->pinto->repo->get_stack;
	my $revision = $stack->head;

	is ($revision->username,      'ME',         'Revision was committed by ME');
	is ($revision->message_title, $faked_title, 'Message has correct title');
	is ($revision->message_body,  '',           'Message body is empty');
	is ($revision->message,       $faked_title, 'Message is title only');
}

#------------------------------------------------------------------------------

{

	note "Specified custom (non-empty) message";

	$t->run_ok(Fake => {message => 'my message'});
	my $stack    = $t->pinto->repo->get_stack;
	my $revision = $stack->head;

	is ($revision->message, 'my message', 'Got custom commit message when specified');
	is ($revision->message_body, '', 'Message body is empty when specified message has title only');
	is ($revision->message_title, 'my message', 'Got message title');
}

#------------------------------------------------------------------------------

{
	note "Specified custom message containing title and body regions";

	$t->run_ok(Fake => {message => "  my title  \n\nmy body  "});
	my $stack    = $t->pinto->repo->get_stack;
	my $revision = $stack->head;

	is ($revision->message, "  my title  \n\nmy body  ", 'Got custom commit message when specified');
	is ($revision->message_body, 'my body', 'Got message body');
	is ($revision->message_title, 'my title', 'Got message title');
}

#------------------------------------------------------------------------------

done_testing;