Skip to content

Instantly share code, notes, and snippets.

@maciejsmolinski
Created July 27, 2011 16:03
Show Gist options
  • Save maciejsmolinski/1109694 to your computer and use it in GitHub Desktop.
Save maciejsmolinski/1109694 to your computer and use it in GitHub Desktop.
Battle specs
require 'spec_helper'
describe Battle do
context "new" do
let!(:battle) { Battle.new }
let!(:events) { [:can_open?, :can_close_no_opponent?, :can_start?, :can_close_no_video?, :can_close_no_videos?, :can_close_no_votes?, :can_close_ex_equo?, :can_close_more_votes?, :can_close?] }
it "should have default :pending status" do
battle.current_state.name.should == :pending
end
it "should have proper states flow" do
battle.send(events[0]).should be_true
battle.send(events[1]).should be_true
battle.send(events[2]).should be_false
battle.send(events[3]).should be_false
battle.send(events[4]).should be_false
battle.send(events[5]).should be_false
battle.send(events[6]).should be_false
battle.send(events[7]).should be_false
battle.send(events[8]).should be_false
battle.open!
battle.send(events[0]).should be_false
battle.send(events[1]).should be_false
battle.send(events[2]).should be_true
battle.send(events[3]).should be_true
battle.send(events[4]).should be_true
battle.send(events[5]).should be_false
battle.send(events[6]).should be_false
battle.send(events[7]).should be_false
battle.send(events[8]).should be_false
battle.start!
battle.send(events[0]).should be_false
battle.send(events[1]).should be_false
battle.send(events[2]).should be_false
battle.send(events[3]).should be_false
battle.send(events[4]).should be_false
battle.send(events[5]).should be_true
battle.send(events[6]).should be_true
battle.send(events[7]).should be_true
battle.send(events[8]).should be_true
end
end
context "validations" do
let!(:battle) { Battle.new }
it "should validate the presence of :rule_id, :type_id and :lasts_for" do
battle.valid?.should be_false
[:rule_id, :type_id, :lasts_for].each do |attr|
battle.should have_at_least(1).error_on(attr)
end
end
it "should validate numericality of :lasts_for; Value must be between 1 and 4" do
battle.should have(2).errors_on(:lasts_for)
battle.lasts_for = "text"
battle.should have(1).error_on(:lasts_for)
battle.lasts_for = 0
battle.should have(1).error_on(:lasts_for)
battle.lasts_for = 5
battle.should have(1).error_on(:lasts_for)
battle.lasts_for = 1.123313
battle.lasts_for.should eql 1
battle.should have(0).errors_on(:lasts_for)
[1,2,3,4].each do |valid_value|
battle.lasts_for = valid_value
battle.should have(0).errors_on(:lasts_for)
end
end
end
context "scopes" do
let!(:common) { {:type_id => 1, :rule_id => 1, :lasts_for => 3, :finish_date => 2.days.ago} }
let!(:states) { ["awaiting_votes", "closed_no_votes", "closed_ex_equo", "closed_more_votes", "closed", "closed_no_video", "closed_no_videos"] }
pending "#awaiting_videos"
pending "#awaiting_votes"
it "#finished should return only battles finished by: no votes / ex equo / more votes / WIN or KO or TKO" do
Battle.create(common.merge :state => states[0])
Battle.create(common.merge :state => states[1])
Battle.create(common.merge :state => states[2])
Battle.create(common.merge :state => states[3])
Battle.create(common.merge :state => states[4])
Battle.create(common.merge :state => states[5])
Battle.create(common.merge :state => states[6])
Battle.finished.should have(4).elements
end
pending "#pending"
pending "#closed_dq should return only battles finished by not providing videos (DQ)"
pending "#closed_no_opponent"
it "#created_before_2_weeks" do
@battle1 = Battle.create(common.merge :created_at => 13.days.ago)
@battle2 = Battle.create(common.merge :created_at => 14.days.ago)
@battle3 = Battle.create(common.merge :created_at => 15.days.ago)
Battle.created_before_2_weeks.should have(1).element
Battle.created_before_2_weeks.should == [@battle3]
end
pending "#awaiting_videos_dq"
pending "#awaiting_votes_to_close"
end
context "custom methods" do
let!(:today) { Time.now.utc.to_date }
let!(:common) { {:type_id => 1, :rule_id => 1, :lasts_for => 3} }
let!(:battle) { Battle.new }
describe "#formatted_finish_date" do
it "should return 'not specified' if is nil" do
battle.formatted_finish_date.should == "not specified"
end
it "should return 'today' if battle is starting/finishing today" do
battle.finish_date = today
battle.formatted_finish_date.should == "today"
end
it "should return dd.mm.yyyy formatted date if battle is not starting/finishing today" do
battle.finish_date = today.tomorrow
battle.formatted_finish_date.should =~ /\d{2}.\d{2}.\d{4}/
end
end
it "#hidden_rival? should return true if battle type is hidden rival (type_id == 2)" do
battle.type_id = 1
battle.hidden_rival?.should be_false
battle.type_id = 2
battle.hidden_rival?.should be_true
end
it "#finished? should return bool (if battle is finished by: no votes / ex equo / more votes / WIN or KO or TKO)l" do
battle.state = "awaiting_votes"
battle.finished?.should be_false
battle.state = "closed_no_votes"
battle.finished?.should be_true
battle.state = "closed_ex_equo"
battle.finished?.should be_true
battle.state = "closed_more_votes"
battle.finished?.should be_true
battle.state = "closed"
battle.finished?.should be_true
battle.state = "closed_no_video"
battle.finished?.should be_false
battle.state = "closed_no_videos"
battle.finished?.should be_false
end
it "#closed? should return bool (if battle is finished by not providing videos (DQ))" do
battle.state = "awaiting_votes"
battle.closed?.should be_false
battle.state = "closed_no_votes"
battle.closed?.should be_false
battle.state = "closed_ex_equo"
battle.closed?.should be_false
battle.state = "closed_more_votes"
battle.closed?.should be_false
battle.state = "closed"
battle.closed?.should be_false
battle.state = "closed_no_video"
battle.closed?.should be_true
battle.state = "closed_no_videos"
battle.closed?.should be_true
end
let!(:user1) { mock_model(User, :id => 1) }
let!(:user2) { mock_model(User, :id => 2) }
let!(:user3) { mock_model(User, :id => 3) }
it "#participant? should return true if user participate in battle" do
battle.stub!(:user_ids).and_return([1, 2])
battle.participant?(user1).should be_true
battle.participant?(user2).should be_true
battle.participant?(user3).should be_false
end
it "#points should retrieve points cost for create/join" do
battle.rule_id = 2
battle.type_id = 1
points = mock_model(Points, :rule_id => battle.rule_id, :type_id => battle.type_id, :win => 40)
Points.stub!(:find_by_rule_id_and_type_id).with( battle.rule_id, battle.type.id ).and_return(points)
battle.points.should eql 40
end
it "#compute_votes should return votes in format: [votes_to_player1, votes_to_player2]" do
vote1 = mock_model(Vote, :vote_to => 1)
vote2 = mock_model(Vote, :vote_to => 2)
vote3 = mock_model(Vote, :vote_to => 1)
battle.stub!(:users).and_return([user1, user2])
battle.stub!(:votes).and_return([vote1, vote2, vote3])
battle.compute_votes.should eql([2, 1])
battle.stub!(:votes).and_return([])
battle.compute_votes.should eql([0, 0])
battle.stub!(:votes).and_return([vote1])
battle.compute_votes.should eql([1, 0])
battle.stub!(:votes).and_return([vote2])
battle.compute_votes.should eql([0, 1])
end
pending "self#compute_states"
pending "#update_users_states"
end
end
# == Schema Information
#
# Table name: battles
#
# id :integer(4) not null, primary key
# type_id :integer(4)
# created_at :datetime
# updated_at :datetime
# start_date :date
# finish_date :date
# rule_id :integer(4)
# lasts_for :integer(4)
# state :string(255)
#
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment