spec/readable_spec.rb in unread-0.5.0 vs spec/readable_spec.rb in unread-0.6.0

- old
+ new

@@ -19,10 +19,12 @@ it "should return unread records" do @email1.mark_as_read! :for => @reader expect(Email.unread_by(@reader)).to eq [@email2] expect(Email.unread_by(@reader).count).to eq 1 + + expect(Email.unread_by(@other_reader)).to eq [@email1, @email2] end it "should not allow invalid parameter" do [ 42, nil, 'foo', :foo, {} ].each do |not_a_reader| expect { @@ -36,12 +38,123 @@ expect { Email.unread_by(unsaved_reader) }.to raise_error(ArgumentError) end + + describe "should work without any read_marks" do + before do + ReadMark.delete_all + end + + it "should return all objects" do + expect(Email.unread_by(@reader)).to eq [@email1, @email2] + expect(Email.unread_by(@other_reader)).to eq [@email1, @email2] + end + + it "should return unread records" do + @email1.mark_as_read! :for => @reader + + expect(Email.unread_by(@reader)).to eq [@email2] + expect(Email.unread_by(@reader).count).to eq 1 + end + + it "should not allow invalid parameter" do + [ 42, nil, 'foo', :foo, {} ].each do |not_a_reader| + expect { + Email.unread_by(not_a_reader) + }.to raise_error(ArgumentError) + end + end + + it "should not allow unsaved reader" do + unsaved_reader = Reader.new + + expect { + Email.unread_by(unsaved_reader) + }.to raise_error(ArgumentError) + end + end end + describe :read_by do + it "should return an empty array" do + expect(Email.read_by(@reader)).to be_empty + expect(Email.read_by(@other_reader)).to be_empty + end + + it "should return read records" do + @email1.mark_as_read! :for => @reader + + expect(Email.read_by(@reader)).to eq [@email1] + expect(Email.read_by(@reader).count).to eq 1 + end + + it "should return all records when all read" do + Email.mark_as_read! :all, :for => @reader + + expect(Email.read_by(@reader)).to eq [@email1, @email2] + end + + it "should not allow invalid parameter" do + [ 42, nil, 'foo', :foo, {} ].each do |not_a_reader| + expect { + Email.read_by(not_a_reader) + }.to raise_error(ArgumentError) + end + end + + it "should not allow unsaved reader" do + unsaved_reader = Reader.new + + expect { + Email.read_by(unsaved_reader) + }.to raise_error(ArgumentError) + end + + describe "should work without any read_marks" do + before do + ReadMark.delete_all + end + + it "should return an empty array" do + expect(Email.read_by(@reader)).to be_empty + expect(Email.read_by(@other_reader)).to be_empty + end + + it "should return read records" do + @email1.mark_as_read! :for => @reader + + expect(Email.read_by(@reader)).to eq [@email1] + expect(Email.read_by(@reader).count).to eq 1 + end + + it "should return all records when all read" do + Email.mark_as_read! :all, :for => @reader + + expect(Email.read_by(@reader)).to eq [@email1, @email2] + end + + it "should not allow invalid parameter" do + [ 42, nil, 'foo', :foo, {} ].each do |not_a_reader| + expect { + Email.read_by(not_a_reader) + }.to raise_error(ArgumentError) + end + end + + it "should not allow unsaved reader" do + unsaved_reader = Reader.new + + expect { + Email.read_by(unsaved_reader) + }.to raise_error(ArgumentError) + end + end + end + + describe :with_read_marks_for do it "should return readables" do expect(Email.with_read_marks_for(@reader).to_a).to eq([@email1, @email2]) end @@ -95,10 +208,26 @@ expect(emails[0].unread?(@reader)).to be_falsey expect(emails[1].unread?(@reader)).to be_truthy }.to perform_queries(1) end + + it "should work without any read_marks" do + ReadMark.delete_all + + emails = Email.with_read_marks_for(@reader).to_a + expect(emails[0].unread?(@reader)).to be_truthy + expect(emails[1].unread?(@reader)).to be_truthy + end + + it "should work with eager-loaded read marks for the correct reader" do + @email1.mark_as_read! :for => @reader + + emails = Email.with_read_marks_for(@reader).to_a + expect(emails[0].unread?(@reader)).to be_falsey + expect(emails[0].unread?(@other_reader)).to be_truthy + end end describe '#mark_as_read!' do it "should mark a single object as read" do @email1.mark_as_read! :for => @reader @@ -156,10 +285,17 @@ @email1.mark_as_read! :for => @reader expect(@reader.read_marks.single).to eq [] end + it "should reset memoized global read mark" do + rm_global = @reader.read_mark_global(Email) + + Email.mark_as_read! :all, :for => @reader + expect(@reader.read_mark_global(Email)).not_to eq(rm_global) + end + it "should not allow invalid arguments" do expect { Email.mark_as_read! :foo, :for => @reader }.to raise_error(ArgumentError) @@ -203,10 +339,15 @@ expect(@reader.read_marks.single.count).to eq 0 end it "should not delete read marks from other readables" do - other_read_mark = @reader.read_marks.create! :readable_type => 'Foo', :readable_id => 42, :timestamp => 5.years.ago + other_read_mark = @reader.read_marks.create! do |rm| + rm.readable_type = 'Foo' + rm.readable_id = 42 + rm.timestamp = 5.years.ago + end + Email.cleanup_read_marks! expect(ReadMark.exists?(other_read_mark.id)).to be_truthy end end