Show More
Commit Description:
Merge pull request #15 from nattee/master...
Commit Description:
Merge pull request #15 from nattee/master finalizing merge of nattee's master
References:
File last commit:
Show/Diff file:
Action:
spec/controllers/main_controller_spec.rb | 193 lines | 5.5 KiB | text/x-ruby | RubyLexer |
require 'delorean'
require File.dirname(__FILE__) + '/../spec_helper'
require File.dirname(__FILE__) + '/../config_spec_helper'
describe MainController, "when a user comes to list page" do
it "should redirect user to login page when unlogged-in user try to access main/list" do
get 'list'
response.should redirect_to(:action => 'login')
end
end
describe MainController, "when a logged in user comes to list page, with multicontests off" do
integrate_views
include ConfigSpecHelperMethods
fixtures :users
fixtures :problems
fixtures :contests
before(:each) do
disable_multicontest
end
it "should list available problems" do
john = users(:john)
get "list", {}, {:user_id => john.id}
response.should render_template 'main/list'
response.should have_text(/add/)
response.should have_text(/easy_problem/)
response.should have_text(/hard_problem/)
end
end
describe MainController, "when a logged in user comes to list page, with multicontests on" do
integrate_views
include ConfigSpecHelperMethods
fixtures :users
fixtures :problems
fixtures :contests
before(:each) do
enable_multicontest
end
it "should list only available public problems to users with no contest assigned" do
john = users(:john)
get "list", {}, {:user_id => john.id}
response.should render_template('main/list')
response.should have_text(/add/)
response.should_not have_text(/easy_problem/)
response.should_not have_text(/hard_problem/)
end
it "should list available problems on a specific contest" do
james = users(:james)
get "list", {}, {:user_id => james.id}
response.should render_template('main/list')
response.should have_text(/add/)
response.should have_text(/easy_problem/)
response.should_not have_text(/hard_problem/)
end
it "should shows available problems by contests" do
james = users(:james)
get "list", {}, {:user_id => james.id}
response.should render_template('main/list')
response.should have_text(Regexp.new('Contest A.*easy_problem', Regexp::MULTILINE))
end
it "should shows available problems by contests; problems belonging to more the one contest should appear many times" do
jack = users(:jack)
get "list", {}, {:user_id => jack.id}
response.should render_template('main/list')
response.should have_text(Regexp.new('Contest A.*easy_problem.*Contest B.*easy_problem', Regexp::MULTILINE))
response.should have_text(Regexp.new('Contest B.*hard_problem', Regexp::MULTILINE))
end
end
describe MainController, "when a user loads sources and compiler messages" do
before(:each) do
@problem = mock(Problem, :name => 'test', :output_only => false)
@language = mock(Language, :name => 'cpp', :ext => 'cpp')
@submission = mock(Submission,
:id => 1,
:user_id => 1,
:problem => @problem,
:language => @language,
:source => 'sample source',
:compiler_message => 'none')
@user = mock(User, :id => 1, :login => 'john')
@user.should_receive(:update_start_time).at_most(:once)
@another_user = mock(User, :id => 2, :login => 'mary')
@another_user.should_receive(:update_start_time).at_most(:once)
User.should_receive(:find).
with(1).any_number_of_times.
and_return(@user)
User.should_receive(:find).
with(2).any_number_of_times.
and_return(@another_user)
Submission.should_receive(:find).
any_number_of_times.with(@submission.id.to_s).
and_return(@submission)
end
it "should let user sees her own source" do
@submission.should_receive(:download_filename).and_return("foo.c")
get 'source', {:id => @submission.id}, {:user_id => 1}
response.should be_success
end
it "should let user sees her own compiler message" do
get 'compiler_msg', {:id => @submission.id}, {:user_id => 1}
response.should be_success
end
it "should not let user sees other user's source" do
get 'source', {:id => @submission.id}, {:user_id => 2}
flash[:notice].should =~ /[Ee]rror/
response.should redirect_to(:action => 'list')
end
it "should not let user sees other user's compiler message" do
get 'compiler_msg', {:id => @submission.id}, {:user_id => 2}
flash[:notice].should =~ /[Ee]rror/
response.should redirect_to(:action => 'list')
end
end
describe MainController, "during individual contest mode" do
integrate_views
include ConfigSpecHelperMethods
fixtures :users
fixtures :problems
fixtures :contests
before(:each) do
set_contest_time_limit('3:00') # 3 hours
set_indv_contest_mode
end
it "should allow newly login user to see problem list" do
john = users(:john)
get "list", {}, {:user_id => john.id}
response.should render_template 'main/list'
response.should have_text(/add/)
response.should have_text(/easy_problem/)
response.should have_text(/hard_problem/)
end
it "should not show 'contest over' sign before the contest ends" do
john = users(:john)
get "list", {}, {:user_id => john.id}
Delorean.time_travel_to(179.minutes.since) do
get "list", {}, {:user_id => john.id}
response.should_not have_text(/OVER/)
end
end
it "should show 'contest over' sign after the contest ends" do
john = users(:john)
get "list", {}, {:user_id => john.id}
Delorean.time_travel_to(181.minutes.since) do
get "list", {}, {:user_id => john.id}
response.should have_text(/OVER/)
end
end
end