X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=t%2Fmech.t;h=990de7659332b1909e87bbc8b7614c6ea4a2d608;hb=a2431c9440cf1b82e07a6c3e4822403c4feff88a;hp=6a30b18dccb8ae799ceafe42035f79040bb2b1df;hpb=28b3c465ed805dd2bcf03ff80c981be91b99f75f;p=gruntmaster-page.git diff --git a/t/mech.t b/t/mech.t index 6a30b18..990de76 100644 --- a/t/mech.t +++ b/t/mech.t @@ -2,17 +2,77 @@ use strict; use warnings; -use Test::More; -BEGIN { - plan skip_all => '$ENV{AUTHOR_TESTING} is false, skipping tests' unless $ENV{AUTHOR_TESTING}; - plan tests => 5; -} +use Test::MockTime ':all'; +use Test::More tests => 14; use Test::WWW::Mechanize::PSGI; +use Gruntmaster::Data; +use JSON::MaybeXS qw/decode_json/; +use Log::Log4perl qw/:easy/; + +set_fixed_time 25; + my $mech = Test::WWW::Mechanize::PSGI->new(app => do 'app.psgi'); -$mech->get_ok('/'); -$mech->title_is('Gruntmaster 6000'); +my $result; +my $content; + +Log::Log4perl->easy_init($OFF); + +sub get { + my ($url, $expect_fail) = @_; + my $param = $url =~ /[?]/ ? '&format=json' : '?format=json'; + $expect_fail ? $mech->get("$url$param") : $mech->get_ok("$url$param"); + $result = $mech->response->code; + $content = $result == 200 ? decode_json $mech->content(decoded_by_headers => 1) : ''; +} + +our $db = Gruntmaster::Data->connect('dbi:SQLite:dbname=:memory:'); +$db->deploy; + +$db->users->create({id => 'MGV', admin => 1}); +$db->contests->create({id => 'fc', start => 10, stop => 20, name => 'Finished contest', owner => 'MGV'}); +$db->contests->create({id => 'rc', start => 20, stop => 30, name => 'Running contest', owner => 'MGV'}); +$db->contests->create({id => 'pc', start => 30, stop => 40, name => 'Pending contest', owner => 'MGV'}); + +my @pbjunk = ( + name => 'Problem', + generator => 'Undef', + runner => 'File', + judge => 'Absolute', + level => 'beginner', + value => 100, + owner => 'MGV', + statement => '...', + testcnt => 1, + timeout => 1 +); + +$db->problems->create({id => 'fca', private => 0, @pbjunk}); +$db->problems->create({id => 'rca', private => 0, @pbjunk}); +$db->problems->create({id => 'pca', private => 0, @pbjunk}); +$db->problems->create({id => 'arc', private => 0, @pbjunk}); +$db->problems->create({id => 'prv', private => 1, @pbjunk}); +$db->contest_problems->create({problem => "${_}a", contest => $_}) for qw/fc rc pc/; + +sub problem_list () { [sort map {$_->{id}} @{$content->{beginner}}] } +get '/pb/'; +is_deeply problem_list, [qw/arc fca/], '/pb/ has correct problems'; +get '/pb/?contest=pc', 1; +is $result, 401, '/pb/?contest=pc returns 401'; +get '/pb/?contest=rc'; +is_deeply problem_list, [qw/rca/], '/pb/?contest=rc has correct problems'; +get '/pb/?contest=fc'; +is_deeply problem_list, [qw/fca/], '/pb/?contest=fc has correct problems'; + +get '/us/'; +my ($mgv) = @{$content->{us}}; +is $mgv->{id}, 'MGV', 'first (and only) user is MGV'; +is $mgv->{admin}, 1, 'MGV is an admin'; -$mech->get_ok('/pb/'); -$mech->title_is('Problems'); -$mech->content_contains('Spell'); +get '/ct/'; +my $pc = $content->{pending}->[0]; +my $rc = $content->{running}->[0]; +my $fc = $content->{finished}->[0]; +is $pc->{id}, 'pc', 'pc is pending'; +is $rc->{id}, 'rc', 'rc is running'; +is $fc->{id}, 'fc', 'fc is running';