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

use strict;
use warnings;

use lib 't/lib/';
use Git::Flux;

use File::Temp 'tempdir';
use Test::More skip_all => 'feature not implemented yet'; # 6
use Test::Fatal;
use TestFunctions;
use Test::TinyMocker;

{
    # can't init without name

    my ( $flux, $repo ) = default_env();

    is(
        exception { $flux->run( feature => 'start' ) },
        "Missing argument <name>\n",
        'Cannot init without name',
    );
}

{
    # if branch name exists, we die

    my ( $flux, $repo ) = default_env();
    my $branch = 'test_feature';

    # create feature branch
    $repo->run( branch => $branch );

    is(
        exception { $flux->run( feature => 'start', $branch ) },
        qq{Branch '$branch' already exists. Pick another name.\n},
        'Cannot create feature branch with pre-existing name',
    );
}

{
    # fetch flag
    1;
}

{
    # assert origin's same-name branch isn't behind it

    my ( $flux, $repo ) = default_env();
    my $branch = 'test_feature';

    # create origin feature branch, at least fooling the app to think so
    $repo->run( branch => "origin/$branch" );

    # this shouldn't be a problem since it isn't really origin,
    # just looks like
    ok(
        ! exception { $flux->run( feature => 'start', $branch ) },
        'No problem on differing branches',
    );
}

{
    # assert origin's same-name branch isn't behind it
    # when in fact it is
    # this requires to actually create a remote branch
    1;
}

{
    # exception thrown when cannot create branch

    {
        package Ztest;
        sub close {1}
        sub exit  {255}
    }

    my ( $flux, $repo ) = default_env();
    my $branch = 'test_feature';

    # cripple branch creation so it doesn't work
    mock 'Git::Repository'
        => method 'command'
        => should {
            return bless {}, 'Ztest';
        };

    is(
        exception { $flux->run( feature => 'start', $branch ) },
        qq{Could not create feature branch '$branch'\n},
        'Recognizing git branch failure',
    );

    unmock 'Git::Repository' => method 'command';
}

{
    # everything working

    my ( $flux, $repo ) = default_env();
    my $branch = 'test_feature';

    ok(
        ! exception { $flux->run( feature => 'start', $branch ) },
        'feature start command lives',
    );

    ok(
        $flux->git_branch_exists($branch),
        'branch was created successfully',
    );
}