discourse/spec/models/post_timing_spec.rb

136 lines
3.4 KiB
Ruby

require 'spec_helper'
describe PostTiming do
it { should belong_to :topic }
it { should belong_to :user }
it { should validate_presence_of :post_number }
it { should validate_presence_of :msecs }
describe 'process_timings' do
# integration test
it 'processes timings correctly' do
post = Fabricate(:post)
user2 = Fabricate(:coding_horror)
PostAction.act(user2, post, PostActionType.types[:like])
post.user.unread_notifications.should == 1
post.user.unread_notifications_by_type.should == { Notification.types[:liked] => 1 }
PostTiming.process_timings(post.user, post.topic_id, 1, 100, [[post.post_number, 100]])
post.user.reload
post.user.unread_notifications_by_type.should == {}
post.user.unread_notifications.should == 0
end
end
describe 'recording' do
before do
@post = Fabricate(:post)
@topic = @post.topic
@coding_horror = Fabricate(:coding_horror)
@timing_attrs = {msecs: 1234, topic_id: @post.topic_id, user_id: @coding_horror.id, post_number: @post.post_number}
end
it 'creates a post timing record' do
lambda {
PostTiming.record_timing(@timing_attrs)
}.should change(PostTiming, :count).by(1)
end
it 'adds a view to the post' do
lambda {
PostTiming.record_timing(@timing_attrs)
@post.reload
}.should change(@post, :reads).by(1)
end
describe 'multiple calls' do
before do
PostTiming.record_timing(@timing_attrs)
PostTiming.record_timing(@timing_attrs)
@timing = PostTiming.where(topic_id: @post.topic_id, user_id: @coding_horror.id, post_number: @post.post_number).first
end
it 'creates a timing record' do
@timing.should be_present
end
it 'sums the msecs together' do
@timing.msecs.should == 2468
end
end
describe 'avg times' do
describe 'posts' do
it 'has no avg_time by default' do
@post.avg_time.should be_blank
end
it "doesn't change when we calculate the avg time for the post because there's no timings" do
Post.calculate_avg_time
@post.reload
@post.avg_time.should be_blank
end
end
describe 'topics' do
it 'has no avg_time by default' do
@topic.avg_time.should be_blank
end
it "doesn't change when we calculate the avg time for the post because there's no timings" do
Topic.calculate_avg_time
@topic.reload
@topic.avg_time.should be_blank
end
end
describe "it doesn't create an avg time for the same user" do
it 'something' do
PostTiming.record_timing(@timing_attrs.merge(user_id: @post.user_id))
Post.calculate_avg_time
@post.reload
@post.avg_time.should be_blank
end
end
describe 'with a timing for another user' do
before do
PostTiming.record_timing(@timing_attrs)
Post.calculate_avg_time
@post.reload
end
it 'has a post avg_time from the timing' do
@post.avg_time.should be_present
end
describe 'forum topics' do
before do
Topic.calculate_avg_time
@topic.reload
end
it 'has an avg_time from the timing' do
@topic.avg_time.should be_present
end
end
end
end
end
end