Skip to content

Instantly share code, notes, and snippets.

@arion
Created March 30, 2012 08:03
Show Gist options
  • Save arion/2249200 to your computer and use it in GitHub Desktop.
Save arion/2249200 to your computer and use it in GitHub Desktop.
second spec for seconds_left
it "should calculate with real tarif" do
time = Time.local(2011, 5, 6, 13, 00, 0)
Timecop.freeze(time)
real_tarif_settings = YAML.load(File.read(File.join(RACK_ROOT, 'spec', 'support', 'unit_tarif.yml')))
real_calc_module = CalculationModule.create!(:slug => 'real_tariff', :settings => real_tarif_settings)
real_tarif = Tarif.create!(:name => 'real_tariff', :starts_at => 1.year.ago)
CalculationRule.make!(:calculation_module => real_calc_module, :service => Service.find(ServerConfig.service_autorun_id), :tarif => real_tarif)
computer = Computer.make!(:computer_class => ComputerClass.find('b12d1111-50c0-11e1-95f6-0023df7d4b7e'))
CalculationRulesCache.instance.reload!
real_tarif_group = TarifGroup.make!
real_tarif_group.tarifs << real_tarif
login = Login.make!(:login => '1111111', :password => '1234', :password_confirmation => '1234', :tarif_group => real_tarif_group)
Account.find(ServerConfig.src_account_id).transfer 2, :to => login.account, :author_id => ServerConfig.ft_author_id
login.reload.balance.should == 2
client = TestClient.new('1111111', '1234')
# AUHT
auth = client.auth(computer.number)
Session.find(auth.sessionId).authenticated?.should == true
# START
start = client.start(real_tarif.id)
Session.find(auth.sessionId).running?.should == true
session = Session.find(start.sessionId)
session.application_sessions.count.should == 1
UnprocessedActivity.count.should == 0
login.reload.balance.should == 2
session.reload.seconds_left.should == 2.hour - 1.second # один юнит равен одному часу
# первый час секунды плавно тают
(1.hour / 30.seconds).to_i.times do |i|
session.reload.create_activities(30)
UnprocessedActivity.count.should == 1
UnprocessedActivity.first.processed!
Timecop.travel(time += 30.seconds)
session.reload.seconds_left.should == (2.hour - 1.second) - ((i + 1) * 30.second)
end
# теперь у нас остался 1 юнит
login.reload.balance.should == 1
# и один час в запасе
session.reload.seconds_left.should == (1.hour - 1.second)
# стоит нам создать активность и оплатить этот час
session.reload.create_activities(30)
UnprocessedActivity.count.should == 1
UnprocessedActivity.first.processed!
login.reload.balance.should == 0
Timecop.travel(time += 30.seconds)
# как seconds_left нам будет всегда показывать еденицу
10.times do |i|
session.reload.create_activities(30)
UnprocessedActivity.count.should == 1
UnprocessedActivity.first.processed!
Timecop.travel(time += 30.seconds)
session.reload.seconds_left.should == 1
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment