Git-Hooks

 view release on metacpan or  search on metacpan

t/02-check-jira.t  view on Meta::CPAN

use Git::Hooks::Test ':all';
use Test::More tests => 39;
use Path::Tiny;

my ($repo, $file, $clone, $T);

sub setup_repos_for {
    my ($reporef) = @_;

    ($repo, $file, $clone, $T) = new_repos();

    foreach my $git ($repo, $clone) {
        # Inject a fake JIRA::REST class definition in order to be able
        # to test this without a real Jira server.

        install_hooks($git, <<'EOF', qw/commit-msg update pre-receive/);
package JIRA::REST;

sub new {
    my ($class, $jiraurl, $jirauser, $jirapass) = @_;
    die "JIRA::REST(fake): cannot connect or login\n" if $jirapass eq 'invalid';
    return bless {}, $class;
}

my %issues = (
    'GIT-1' => {key => 'GIT-1',
                fields => {
                  resolution => 1,
                  assignee => { name => 'user'},
                  issuetype => { name => 'Task' },
                  status => { name => 'Closed' },
                  fixVersions => [],
               }},
    'GIT-2' => {key => 'GIT-2',
                fields => {
                  resolution => undef,
                  assignee => { name => 'user'},
                  issuetype => { name => 'Bug' },
                  status => { name => 'Open' },
                  fixVersions => [{name => '1.2.3'}],
               }},
    'GIT-3' => {key => 'GIT-3',
                fields => {
                  resolution => undef,
                  assignee => { name => 'user'},
                  issuetype => { name => 'Improvement' },
                  status => { name => 'Taken' },
                  fixVersions => [{name => '1.2.3'}, {name => '1.2'}],
               }},
    'GIT-4' => {key => 'GIT-4',
                fields => {
                  resolution => undef,
                  assignee => { name => 'user'},
                  issuetype => { name => 'Improvement' },
                  status => { name => 'Taken' },
                  fixVersions => [{name => 'master'}],
               }},
);

sub GET {
    my ($jira, $endpoint) = @_;
    my $key;
    if ($endpoint =~ m:/issue/(.*):) {
        $key = $1;
    } else {
        die "JIRA::Client(fake): no such endpoint ($endpoint)\n";
    }
    if (exists $issues{$key}) {
        return $issues{$key};
    } else {
        die "JIRA::Client(fake): no such issue ($key)\n";
    }
}

my %queries = (
    '(key IN (GIT-0)) AND (project=OTHER)' => [],
    '(key IN (GIT-0)) AND (project=GIT)'   => [$issues{'GIT-0'}],
    '(key IN (GIT-1)) AND (project=GIT)'   => [$issues{'GIT-1'}],
    '(key IN (GIT-2)) AND (project=GIT)'   => [$issues{'GIT-2'}],
    '(key IN (GIT-2))'                     => [$issues{'GIT-2'}],
    '(key IN (GIT-3))'                     => [$issues{'GIT-3'}],
    '(key IN (GIT-2,GIT-3))'               => [@issues{'GIT-2','GIT-3'}],
    '(key IN (GIT-4))'                     => [$issues{'GIT-4'}],
    '(key IN (GIT-2)) AND (status=Taken)'  => [],
    '(key IN (GIT-3)) AND (status=Taken)'  => [$issues{'GIT-3'}],
    '(key IN (GIT-3)) AND (issuetype=Bug)' => [],
    '(key IN (GIT-2)) AND (issuetype=Bug)' => [$issues{'GIT-2'}],
);

sub set_search_iterator {
    my ($jira, $query) = @_;
    my $jql = $query->{jql};
    if (exists $queries{$jql}) {
        $jira->{iterator} = [$queries{$jql}->@*];
    } else {
        die $jql;
    }
    return;
}

sub next_issue {
    my ($jira) = @_;
    if ($jira->{iterator}->@*) {
        return shift $jira->{iterator}->@*;
    } else {
        return;
    }
}

package main;
$INC{'JIRA/REST.pm'} = 'fake';
EOF
    }

    $$reporef->run(qw/config githooks.plugin CheckJira/);
    $$reporef->run(qw/config githooks.checkjira.jiraurl/, 'fake://url/');
    $$reporef->run(qw/config githooks.checkjira.jirauser user/);
    $$reporef->run(qw/config githooks.checkjira.jirapass valid/);

    return;
}

sub check_can_commit {
    my ($testname) = @_;
    $file->append($testname);
    $repo->run(add => $file);



( run in 2.069 seconds using v1.01-cache-2.11-cpan-a49fcb8fa48 )