diff --git a/lib/publishable/active_record.rb b/lib/publishable/active_record.rb index 26bede66..575691f4 100644 --- a/lib/publishable/active_record.rb +++ b/lib/publishable/active_record.rb @@ -36,7 +36,9 @@ def publishable(options = {}) rel = case version when NilClass - join_rel.where(publication: { uuid: number_or_uuid }).or(or_rel.published) + join_rel.where(publication: { uuid: number_or_uuid }).or( + or_rel.where.not(publication: { published_at: nil }) + ) when 'draft', 'd' or_rel.unpublished when 'latest' diff --git a/spec/lib/publishable_spec.rb b/spec/lib/publishable_spec.rb index cd962d30..ffff2a74 100644 --- a/spec/lib/publishable_spec.rb +++ b/spec/lib/publishable_spec.rb @@ -1,31 +1,56 @@ require 'rails_helper' RSpec.describe Publishable, type: :lib do - pending "add more examples to #{__FILE__}" + subject(:publishable) { FactoryBot.create :exercise } - subject(:publishable) { FactoryBot.create :exercise } + let(:author) { FactoryBot.create :user } + let(:copyright_holder) { FactoryBot.create :user } + let(:user) { FactoryBot.create :user } + let(:admin) { FactoryBot.create :user, :administrator } + let(:author_delegate) do + FactoryBot.create(:delegation, delegator: author, can_read: true).delegate + end + let(:copyright_delegate) do + FactoryBot.create(:delegation, delegator: copyright_holder, can_read: true).delegate + end - let(:author) { FactoryBot.create :user } - let(:coyright_holder) { FactoryBot.create :user } - let(:user) { FactoryBot.create :user } + before do + publishable.authors << Author.new(user: author) + publishable.copyright_holders << CopyrightHolder.new(user: copyright_holder) + end - before { publishable.authors << Author.new(user: author) - publishable.copyright_holders << CopyrightHolder.new(user: author) } + context 'with a new version available' do + before { publishable.publication.publish.save! } + let!(:new_version) { publishable.new_version.tap(&:save!) } - it 'can determine versions visible for a user' do - p1 = publishable - p1.publication.publish.save! - p2 = publishable.new_version - p2.save! - p2.publication.publish.save! - draft = publishable.new_version - draft.save! + it 'can return publishables by id' do + expect(publishable.class.with_id(publishable.number)).to eq [ publishable ] + expect(publishable.class.with_id(publishable.publication_group.uuid)).to eq [ publishable ] + expect(publishable.class.with_id(publishable.uuid)).to eq [ publishable ] + expect(publishable.class.with_id(publishable.uid)).to eq [ publishable ] + expect(publishable.class.with_id("#{publishable.number}@draft")).to eq [ new_version ] + expect(publishable.class.with_id("#{publishable.number}@d")).to eq [ new_version ] + expect(publishable.class.with_id("#{publishable.number}@latest")).to( + eq [ new_version, publishable ] + ) + end - expect(publishable.visible_versions(can_view_solutions: false)).to( - eq [p2.version, p1.version] - ) - expect(publishable.visible_versions(can_view_solutions: true)).to( - eq [draft.version, p2.version, p1.version] - ) + it 'can determine versions visible for a user' do + expect(publishable.class.visible_for(user: nil)).to eq [ publishable ] + expect(publishable.class.visible_for(user: user)).to eq [ publishable ] + expect(publishable.class.visible_for(user: admin)).to match_array [ publishable, new_version ] + expect(publishable.class.visible_for(user: author)).to( + match_array [ publishable, new_version ] + ) + expect(publishable.class.visible_for(user: copyright_holder)).to( + match_array [ publishable, new_version ] + ) + expect(publishable.class.visible_for(user: author_delegate)).to( + match_array [ publishable, new_version ] + ) + expect(publishable.class.visible_for(user: copyright_delegate)).to( + match_array [ publishable, new_version ] + ) + end end end diff --git a/spec/models/publication_spec.rb b/spec/models/publication_spec.rb index f759561f..2311f198 100644 --- a/spec/models/publication_spec.rb +++ b/spec/models/publication_spec.rb @@ -24,8 +24,8 @@ it 'can return publications by id' do new_version - #expect(described_class.with_id(publication.number)).to eq [ publication ] - #expect(described_class.with_id(publication.publication_group.uuid)).to eq [ publication ] + expect(described_class.with_id(publication.number)).to eq [ publication ] + expect(described_class.with_id(publication.publication_group.uuid)).to eq [ publication ] expect(described_class.with_id(publication.uuid)).to eq [ publication ] expect(described_class.with_id(publication.uid)).to eq [ publication ] expect(described_class.with_id("#{publication.number}@draft")).to eq [ new_version ] @@ -35,7 +35,7 @@ ) end - it 'knows which users can view it' do + it 'can determine versions visible for a user' do user = FactoryBot.create :user admin = FactoryBot.create :user, :administrator author = FactoryBot.create(:author, publication: publication).user