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

use Prophet::Test tests => 24;
use App::SD::Test;
use App::SD::CLI;
$Prophet::Test::CLI_CLASS = 'App::SD::CLI';

$ENV{'PROPHET_REPO'} = $Prophet::Test::REPO_BASE . '/repo-' . $$;
diag "Replica is in $ENV{PROPHET_REPO}";

# additional tests for SD-specific usage methods

run_command( 'init', '--non-interactive' );

my @cmds = (
    {
        cmd     => [ qw(ticket create -h) ],
        error   => [
            'usage: sd-usage.t ticket create -- summary=foo status=open',
            '       sd-usage.t ticket create [--edit]',
        ],
        comment => 'show usage',
    },
    {
        cmd     => [ qw(ticket comments -h) ],
        error   => [ 'usage: sd-usage.t ticket comments <ticket-id>' ],
        comment => 'ticket comments usage',
    },
    {
        cmd     => [ qw(ticket show -h) ],
        error   => [
            'usage: sd-usage.t ticket show <record-id> [options]',
            '',
            'Options are:',
            "    -a|--all-props      Show props even if they aren't common",
            "    -s|--skip-history   Don't show ticket history",
            '    -h|--with-history   Show ticket history even if disabled in config',
            '    -b|--batch',
        ],
        comment => 'ticket show usage',
    },
    {
        cmd     => [ qw(ticket details -h) ],
        error   => [
            'usage: sd-usage.t ticket details <record-id> [options]',
            '',
            'Options are:',
            "    -a|--all-props      Show props even if they aren't common",
            '    -b|--batch',
        ],
        comment => 'ticket details usage',
    },
    {
        cmd     => [ qw(ticket search -h) ],
        error   => [
            'usage: sd-usage.t ticket search',
            '       sd-usage.t ticket search -- summary=~foo status!~new|open',
        ],
        comment => 'ticket search usage',
    },
    {
        cmd     => [ qw(ticket ls -h) ],
        error   => [
            'usage: sd-usage.t ticket ls',
            '       sd-usage.t ticket ls -- summary=~foo status!~new|open',
        ],
        comment => 'ticket ls usage',
    },
    {
        cmd     => [ qw(ticket update -h) ],
        error   => [
            'usage: sd-usage.t ticket update <record-id> --edit [--all-props]',
            '       sd-usage.t ticket update <record-id> -- status=open',
        ],
        comment => 'ticket update usage',
    },
    {
        cmd     => [ qw(help -h) ],
        error   => [ 'usage: sd-usage.t help [<topic>]' ],
        comment => 'help usage',
    },
    {
        cmd     => [ qw(browser -h) ],
        error   => [ 'usage: sd-usage.t browser [--port <number>]' ],
        comment => 'browser usage',
    },
    {
        cmd     => [ qw(init -h) ],
        error   => [ 'usage: sd-usage.t init [--non-interactive]',
            '',
            'Options:',
            "    -n | --non-interactive - Don't prompt to edit settings or specify email",
            '                             address for new database',
        ],
        comment => 'init usage',
    },
    {
        cmd     => [ qw(clone -h) ],
        error   => [ 'usage: sd-usage.t clone --from <url> [--non-interactive]',
            '',
            'Options:',
            "    -n | --non-interactive - Don't prompt to specify email address for new",
            '                             database',
        ],
        comment => 'clone usage',
    },
    {
        cmd     => [ qw(-h) ],
        error   => [
            'usage: sd-usage.t [cmd]',
            '       sd-usage.t --version | -V',
        ],
        comment => 'no-command usage',
    },
);

my $in_interactive_shell = 0;

for my $item ( @cmds ) {
    my $exp_error
        = defined $item->{error}
        ? (join "\n", @{$item->{error}})
        : '';
    my (undef, $got_error) = run_command( @{$item->{cmd}} );
    {
        local $/ = "";     # chomp paragraph mode
        chomp $got_error;
        chomp $exp_error;
    }
    is( $got_error, $exp_error, $item->{comment} . ' (non-shell)' );
}

$in_interactive_shell = 1;

for my $item ( @cmds ) {
    my $exp_error
        = defined $item->{error}
        ? (join "\n", @{$item->{error}}) . "\n"
        : '';
    # in an interactive shell, usage messages shouldn't be printing a command
    # name
    $exp_error =~ s/sd-usage.t //g;
    my (undef, $got_error) = run_command( @{$item->{cmd}} );
    {
        local $/ = "";     # chomp paragraph mode
        chomp $got_error;
        chomp $exp_error;
    }
    is( $got_error, $exp_error, $item->{comment} . ' (in shell)');
}

no warnings 'redefine';
sub Prophet::CLI::interactive_shell {
    return $in_interactive_shell;
}