diff --git a/app/change_set_persisters/plum_change_set_persister.rb b/app/change_set_persisters/plum_change_set_persister.rb index 54ab923e85..3d8c1d035b 100644 --- a/app/change_set_persisters/plum_change_set_persister.rb +++ b/app/change_set_persisters/plum_change_set_persister.rb @@ -44,7 +44,9 @@ def before_save(change_set:) def after_save(change_set:, updated_resource:); end - def before_delete(change_set:); end + def before_delete(change_set:) + clean_up_collection_associations(change_set: change_set) if change_set.resource.is_a?(Collection) + end def apply_remote_metadata(change_set:) return unless change_set.respond_to?(:source_metadata_identifier) @@ -57,6 +59,14 @@ def apply_remote_metadata(change_set:) end end + def clean_up_collection_associations(change_set:) + resources = query_service.find_inverse_references_by(resource: change_set.resource, property: :member_of_collection_ids) + resources.each do |resource| + resource.member_of_collection_ids -= [change_set.id] + persister.save(resource: resource) + end + end + def create_files(change_set:) appender = FileAppender.new(storage_adapter: storage_adapter, persister: persister, files: files(change_set: change_set)) appender.append_to(change_set.resource) diff --git a/app/change_sets/collection_change_set.rb b/app/change_sets/collection_change_set.rb new file mode 100644 index 0000000000..c641c0f97f --- /dev/null +++ b/app/change_sets/collection_change_set.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +class CollectionChangeSet < Valkyrie::ChangeSet + delegate :human_readable_type, to: :model + property :title, multiple: false, required: true + property :slug, multiple: false, required: true + property :description, multiple: false, required: false + property :visibility, multiple: false, required: false + validates :title, :slug, presence: true + + def primary_terms + [:title, :slug, :description] + end +end diff --git a/app/change_sets/scanned_resource_change_set.rb b/app/change_sets/scanned_resource_change_set.rb index 65421ace2c..fdd91337e0 100644 --- a/app/change_sets/scanned_resource_change_set.rb +++ b/app/change_sets/scanned_resource_change_set.rb @@ -16,6 +16,7 @@ class ScannedResourceChangeSet < Valkyrie::ChangeSet property :member_ids, multiple: true, required: false, type: Types::Strict::Array.member(Valkyrie::Types::ID) property :thumbnail_id, multiple: false, required: false, type: Valkyrie::Types::ID property :start_canvas, multiple: false, type: Valkyrie::Types::ID + property :member_of_collection_ids, multiple: true, required: false, type: Types::Strict::Array.member(Valkyrie::Types::ID) # Virtual Attributes property :refresh_remote_metadata, virtual: true, multiple: false @@ -38,7 +39,8 @@ def primary_terms :holding_location, :pdf_type, :portion_note, - :nav_date + :nav_date, + :member_of_collection_ids ] end diff --git a/app/controllers/catalog_controller.rb b/app/controllers/catalog_controller.rb index 3b99e1b461..3f4cb8b560 100644 --- a/app/controllers/catalog_controller.rb +++ b/app/controllers/catalog_controller.rb @@ -20,7 +20,8 @@ def self.search_config config.index.title_field = 'title_ssim' config.index.display_type_field = "internal_resource_ssim" - config.add_facet_field 'title_ssim', label: 'Title' + config.add_facet_field 'member_of_collection_titles_ssim', label: 'Collections' + config.add_facet_field 'internal_resource_ssim', label: 'Type of Work' config.add_facet_fields_to_solr_request! config.add_search_field 'all_fields', label: 'All Fields' diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb new file mode 100644 index 0000000000..6603d17924 --- /dev/null +++ b/app/controllers/collections_controller.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +class CollectionsController < ApplicationController + include Valhalla::ResourceController + self.change_set_class = DynamicChangeSet + self.resource_class = Collection + self.change_set_persister = PlumChangeSetPersister.new( + metadata_adapter: Valkyrie::MetadataAdapter.find(:indexing_persister), + storage_adapter: Valkyrie.config.storage_adapter + ) +end diff --git a/app/controllers/scanned_resources_controller.rb b/app/controllers/scanned_resources_controller.rb index 75d7540e41..206a7ca9f7 100644 --- a/app/controllers/scanned_resources_controller.rb +++ b/app/controllers/scanned_resources_controller.rb @@ -7,6 +7,11 @@ class ScannedResourcesController < ApplicationController metadata_adapter: Valkyrie::MetadataAdapter.find(:indexing_persister), storage_adapter: Valkyrie.config.storage_adapter ) + before_action :load_collections, only: [:new, :edit] + + def load_collections + @collections = query_service.find_all_of_model(model: Collection).map(&:decorate) + end def browse_everything_files change_set_persister.buffer_into_index do |buffered_changeset_persister| diff --git a/app/decorators/collection_decorator.rb b/app/decorators/collection_decorator.rb new file mode 100644 index 0000000000..0fa1cc5294 --- /dev/null +++ b/app/decorators/collection_decorator.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +class CollectionDecorator < Valkyrie::ResourceDecorator + def title + Array(super).first + end + + def manageable_files? + false + end +end diff --git a/app/decorators/scanned_resource_decorator.rb b/app/decorators/scanned_resource_decorator.rb index 8ccb18bf9c..a8364fbe3d 100644 --- a/app/decorators/scanned_resource_decorator.rb +++ b/app/decorators/scanned_resource_decorator.rb @@ -1,4 +1,22 @@ # frozen_string_literal: true class ScannedResourceDecorator < Valkyrie::ResourceDecorator - self.display_attributes = [:author, :internal_resource, :created_at, :updated_at] + self.display_attributes = [:author, :internal_resource, :created_at, :updated_at, :member_of_collections] + delegate :query_service, to: :metadata_adapter + + def member_of_collections + @member_of_collections ||= + begin + member_of_collection_ids.map do |id| + query_service.find_by(id: id).decorate + end.map(&:title) + end + end + + def member_of_collection_ids + super || [] + end + + def metadata_adapter + Valkyrie.config.metadata_adapter + end end diff --git a/app/decorators/valkyrie/resource_decorator.rb b/app/decorators/valkyrie/resource_decorator.rb index 8db8fb8efd..d63925515f 100644 --- a/app/decorators/valkyrie/resource_decorator.rb +++ b/app/decorators/valkyrie/resource_decorator.rb @@ -15,7 +15,7 @@ def updated_at end def header - title.to_sentence + Array(title).to_sentence end def manageable_files? diff --git a/app/indexers/collection_indexer.rb b/app/indexers/collection_indexer.rb new file mode 100644 index 0000000000..68c021138c --- /dev/null +++ b/app/indexers/collection_indexer.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +class CollectionIndexer + delegate :query_service, to: :metadata_adapter + attr_reader :resource + def initialize(resource:) + @resource = resource + end + + def to_solr + return {} unless resource.respond_to?(:member_of_collection_ids) + { + "member_of_collection_titles_ssim" => collections.map(&:title).to_a + } + end + + def collections + return [] if resource.member_of_collection_ids.blank? + @collections ||= + begin + query_service.find_references_by(resource: resource, property: :member_of_collection_ids).map(&:decorate) + end + end + + def metadata_adapter + Valkyrie.config.metadata_adapter + end +end diff --git a/app/indexers/composite_indexer.rb b/app/indexers/composite_indexer.rb new file mode 100644 index 0000000000..fe9cbc11b8 --- /dev/null +++ b/app/indexers/composite_indexer.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +class CompositeIndexer + attr_reader :indexers + def initialize(*indexers) + @indexers = indexers + end + + def new(resource:) + Instance.new(indexers, resource: resource) + end + + class Instance + attr_reader :indexers, :resource + def initialize(indexers, resource:) + @resource = resource + @indexers = indexers.map { |i| i.new(resource: resource) } + end + + def to_solr + indexers.map(&:to_solr).inject({}, &:merge) + end + end +end diff --git a/app/models/collection.rb b/app/models/collection.rb new file mode 100644 index 0000000000..7f22c89e55 --- /dev/null +++ b/app/models/collection.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +class Collection < Valhalla::Resource + include Valkyrie::Resource::AccessControls + attribute :id, Valkyrie::Types::ID.optional + attribute :title, Valkyrie::Types::Set + attribute :slug, Valkyrie::Types::Set + attribute :description, Valkyrie::Types::Set + attribute :visibility, Valkyrie::Types::Set +end diff --git a/app/models/scanned_resource.rb b/app/models/scanned_resource.rb index 67689e675a..9c82621466 100644 --- a/app/models/scanned_resource.rb +++ b/app/models/scanned_resource.rb @@ -7,6 +7,7 @@ class ScannedResource < Valhalla::Resource attribute :member_ids, Valkyrie::Types::Array attribute :viewing_hint attribute :viewing_direction + attribute :member_of_collection_ids def to_s "#{human_readable_type}: #{title.to_sentence}" diff --git a/app/models/search_builder.rb b/app/models/search_builder.rb index 5fc8781c59..c25d46c1ef 100644 --- a/app/models/search_builder.rb +++ b/app/models/search_builder.rb @@ -12,7 +12,7 @@ def filter_models(solr_parameters) end def models_to_solr_clause - [ScannedResource].join(",") + [ScannedResource, Collection].join(",") end def add_access_controls_to_solr_params(*args) diff --git a/app/views/catalog/_home_text.html.erb b/app/views/catalog/_home_text.html.erb index 8ae38173fe..b2092c5f55 100644 --- a/app/views/catalog/_home_text.html.erb +++ b/app/views/catalog/_home_text.html.erb @@ -14,4 +14,4 @@ types: [] } %> <%= render partial: 'catalog/work_types', locals: { label: 'Collections', - types: [] } %> + types: [Collection] } %> diff --git a/app/views/records/edit_fields/_member_of_collection_ids.html.erb b/app/views/records/edit_fields/_member_of_collection_ids.html.erb new file mode 100644 index 0000000000..f25469fe61 --- /dev/null +++ b/app/views/records/edit_fields/_member_of_collection_ids.html.erb @@ -0,0 +1 @@ +<%= f.input :member_of_collection_ids, collection: @collections, label_method: :title, value_method: :id, input_html: { multiple: f.object.multiple?(key) }, include_blank: true %> diff --git a/app/views/shared/_add_content.html.erb b/app/views/shared/_add_content.html.erb index b8978f2346..8b6dbb3f38 100644 --- a/app/views/shared/_add_content.html.erb +++ b/app/views/shared/_add_content.html.erb @@ -10,47 +10,10 @@ <%= render 'shared/add_works' %> <% end %> - - -<% end %> -<% if false %> -<% include_works_link ||= can_ever_create_works? %> -<% include_collections_link ||= can?(:create, ::Collection) %> -<% include_roles_link ||= can?(:create, ::Role) %> -<% if include_works_link || include_collections_link || include_roles_link %> -
- <%= link_to '#', id: "add-content", class: "btn btn-primary dropdown-toggle", data: { toggle: "dropdown"} do %> - Add - <% end %> -
<% end %> -<% end %> diff --git a/app/views/shared/_my_actions.html.erb b/app/views/shared/_my_actions.html.erb index 965817d260..1837d283dc 100644 --- a/app/views/shared/_my_actions.html.erb +++ b/app/views/shared/_my_actions.html.erb @@ -4,29 +4,7 @@ diff --git a/app/views/shared/_site_actions.html.erb b/app/views/shared/_site_actions.html.erb index 2a5dfef483..99ebf964ce 100644 --- a/app/views/shared/_site_actions.html.erb +++ b/app/views/shared/_site_actions.html.erb @@ -2,6 +2,5 @@ <%= render 'shared/add_content' %> <%= render 'shared/my_actions' %> <% else %> - <%# <%= link_to 'Log In', main_app.user_cas_omniauth_authorize_path, class: 'btn btn-primary login', role: 'menuitem' %> <%= link_to 'Log In', main_app.new_user_session_path, class: 'btn btn-primary login', role: 'menuitem' %> <% end %> diff --git a/config/initializers/valkyrie.rb b/config/initializers/valkyrie.rb index f6fd40435a..ff91733ede 100644 --- a/config/initializers/valkyrie.rb +++ b/config/initializers/valkyrie.rb @@ -23,7 +23,10 @@ Valkyrie::MetadataAdapter.register( Valkyrie::Persistence::Solr::MetadataAdapter.new( connection: Blacklight.default_index.connection, - resource_indexer: Valkyrie::Indexers::AccessControlsIndexer + resource_indexer: CompositeIndexer.new( + Valkyrie::Indexers::AccessControlsIndexer, + CollectionIndexer + ) ), :index_solr ) diff --git a/config/locales/en.yml b/config/locales/en.yml index bad17d6270..d519499d22 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -55,6 +55,8 @@ en: label: "Date Uploaded" updated_at: label: "Date Modified" + member_of_collections: + label: "Collections" search: form: q: diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index ad78abfdd2..5b6fde2986 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -38,6 +38,7 @@ en: pdf_type: "PDF Type" portion_note: "Portion Note" nav_date: "Navigation Date" + member_of_collection_ids: "Collections" required: html: 'required' helpers: diff --git a/config/routes.rb b/config/routes.rb index 88ba371314..e07e6d31da 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -66,6 +66,8 @@ end end + resources :collections + get '/catalog/parent/:parent_id/:id', to: 'catalog#show', as: :parent_solr_document mount BrowseEverything::Engine => '/browse' diff --git a/spec/change_set_persisters/plum_change_set_persister_spec.rb b/spec/change_set_persisters/plum_change_set_persister_spec.rb index d55a2f7709..08006f1504 100644 --- a/spec/change_set_persisters/plum_change_set_persister_spec.rb +++ b/spec/change_set_persisters/plum_change_set_persister_spec.rb @@ -118,4 +118,19 @@ expect(original_file).to respond_to(:read) end end + + describe "collection interactions" do + context "when a collection is deleted" do + it "cleans up associations from all its members" do + collection = FactoryGirl.create_for_repository(:collection) + resource = FactoryGirl.create_for_repository(:scanned_resource, member_of_collection_ids: collection.id) + change_set = CollectionChangeSet.new(collection) + + change_set_persister.delete(change_set: change_set) + reloaded = query_service.find_by(id: resource.id) + + expect(reloaded.member_of_collection_ids).to eq [] + end + end + end end diff --git a/spec/change_sets/collection_change_set_spec.rb b/spec/change_sets/collection_change_set_spec.rb new file mode 100644 index 0000000000..37666b1906 --- /dev/null +++ b/spec/change_sets/collection_change_set_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true +require 'rails_helper' + +RSpec.describe CollectionChangeSet do + subject(:change_set) { described_class.new(collection) } + let(:collection) { FactoryGirl.build(:collection) } + before do + change_set.prepopulate! + end + describe "#title" do + it "is single-valued and required" do + expect(change_set.multiple?(:title)).to eq false + expect(change_set.required?(:title)).to eq true + expect(change_set.validate(title: "")).to eq false + end + end + + describe "#slug" do + it "is single-valued and required" do + expect(change_set.multiple?(:slug)).to eq false + expect(change_set.required?(:slug)).to eq true + expect(change_set.validate(slug: "")).to eq false + end + end + + describe "#description" do + it "is single-valued and not required" do + expect(change_set.multiple?(:description)).to eq false + expect(change_set.required?(:description)).to eq false + end + end + + describe "#visibility" do + it "is single-valued and not required" do + expect(change_set.multiple?(:description)).to eq false + expect(change_set.required?(:description)).to eq false + end + end + + describe "#primary_terms" do + it "returns the primary terms" do + expect(change_set.primary_terms).to eq [:title, :slug, :description] + end + end +end diff --git a/spec/controllers/catalog_controller_spec.rb b/spec/controllers/catalog_controller_spec.rb index cf797d5fcf..1fd612089b 100644 --- a/spec/controllers/catalog_controller_spec.rb +++ b/spec/controllers/catalog_controller_spec.rb @@ -40,6 +40,32 @@ end end + describe "Collection behavior" do + before do + sign_in FactoryGirl.create(:admin) + end + + it "displays indexed collections" do + persister.save(resource: FactoryGirl.build(:collection)) + + get :index, params: { q: "" } + + expect(assigns(:document_list).length).to eq 1 + end + context "when a resource has a collection" do + render_views + it "facets on it" do + collection = persister.save(resource: FactoryGirl.build(:collection)) + persister.save(resource: FactoryGirl.build(:scanned_resource, member_of_collection_ids: [collection.id])) + + get :index, params: { q: "" } + + expect(response.body).to have_selector ".facet-field-heading", text: "Collections" + expect(response.body).to have_selector ".facet_select", text: collection.title.first + end + end + end + describe "nested catalog paths" do it "loads the parent document when given an ID" do child = persister.save(resource: FactoryGirl.build(:file_set)) @@ -76,6 +102,16 @@ expect(response.body).to have_link "Delete This File Set", href: file_set_path(resource) expect(response.body).not_to have_link "File Manager" end + + it "renders for a Collection" do + resource = persister.save(resource: FactoryGirl.build(:collection)) + + get :show, params: { id: "id-#{resource.id}" } + + expect(response.body).to have_link "Edit This Collection", href: edit_collection_path(resource) + expect(response.body).to have_link "Delete This Collection", href: collection_path(resource) + expect(response.body).not_to have_link "File Manager" + end end end diff --git a/spec/controllers/collections_controller_spec.rb b/spec/controllers/collections_controller_spec.rb new file mode 100644 index 0000000000..db4c4610b4 --- /dev/null +++ b/spec/controllers/collections_controller_spec.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true +require 'rails_helper' + +RSpec.describe CollectionsController do + let(:user) { nil } + let(:adapter) { Valkyrie::MetadataAdapter.find(:indexing_persister) } + let(:persister) { adapter.persister } + let(:query_service) { adapter.query_service } + before do + sign_in user if user + end + context "when an admin" do + let(:user) { FactoryGirl.create(:admin) } + describe "POST /collections" do + it "creates a collection" do + post :create, params: { collection: { title: 'test', slug: 'slug', visibility: 'open', description: '' } } + + expect(response).to be_redirect + + collection = query_service.find_all_of_model(model: Collection).first + expect(collection.title).to eq ['test'] + expect(collection.slug).to eq ['slug'] + expect(collection.visibility).to eq ['open'] + expect(collection.description).to eq [] + end + end + describe "GET /collections/new" do + render_views + it "renders a new record" do + get :new + + expect(response).to render_template("valhalla/base/_form") + end + end + + describe "GET /collections/edit" do + render_views + it "renders an existing record" do + collection = persister.save(resource: FactoryGirl.build(:collection)) + + get :edit, params: { id: collection.id.to_s } + + expect(response.body).to have_field "Title", with: collection.title.first + end + end + + describe "PATCH /collections/:id" do + it "updates an existing record" do + collection = persister.save(resource: FactoryGirl.build(:collection)) + + patch :update, params: { id: collection.id.to_s, collection: { title: 'New' } } + reloaded = query_service.find_by(id: collection.id) + + expect(reloaded.title).to eq ['New'] + end + end + end +end diff --git a/spec/factories/collection.rb b/spec/factories/collection.rb new file mode 100644 index 0000000000..d0f6921b1d --- /dev/null +++ b/spec/factories/collection.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +FactoryGirl.define do + factory :collection do + title 'Title' + slug 'test' + visibility 'open' + read_groups 'public' + to_create do |instance| + Valkyrie.config.metadata_adapter.persister.save(resource: instance) + end + end +end diff --git a/spec/features/root_spec.rb b/spec/features/root_spec.rb index 77b7778f90..a79a201e79 100644 --- a/spec/features/root_spec.rb +++ b/spec/features/root_spec.rb @@ -9,5 +9,6 @@ it "displays creation links for administrators" do expect(page).to have_link "New Scanned Resource" + expect(page).to have_link "Add a Collection", href: "/collections/new" end end diff --git a/spec/indexers/collection_indexer_spec.rb b/spec/indexers/collection_indexer_spec.rb new file mode 100644 index 0000000000..f11061c65c --- /dev/null +++ b/spec/indexers/collection_indexer_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +require 'rails_helper' + +RSpec.describe CollectionIndexer do + describe ".to_solr" do + it "indexes collection titles into member_of_collection_titles" do + collection = FactoryGirl.create_for_repository(:collection) + resource = FactoryGirl.create_for_repository(:scanned_resource, member_of_collection_ids: collection.id) + output = described_class.new(resource: resource).to_solr + + expect(output["member_of_collection_titles_ssim"]).to eq [collection.title.first] + end + end +end diff --git a/spec/models/collection_spec.rb b/spec/models/collection_spec.rb new file mode 100644 index 0000000000..2d41263fb2 --- /dev/null +++ b/spec/models/collection_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +require 'rails_helper' + +RSpec.describe Collection do + subject(:collection) { FactoryGirl.build(:collection) } + it "has a title" do + collection.title = "Test" + expect(collection.title).to eq ["Test"] + end + it "has a slug" do + collection.slug = "test" + expect(collection.slug).to eq ["test"] + end + it "has a description" do + collection.description = "test" + expect(collection.description).to eq ["test"] + end + it "has visibility" do + collection.visibility = "open" + expect(collection.visibility).to eq ["open"] + end +end diff --git a/spec/requests/scanned_resources_spec.rb b/spec/requests/scanned_resources_spec.rb index 4d970bc61e..ecd291e983 100644 --- a/spec/requests/scanned_resources_spec.rb +++ b/spec/requests/scanned_resources_spec.rb @@ -17,6 +17,8 @@ end end it "has a form for creating scanned resources" do + collection = FactoryGirl.create_for_repository(:collection) + get "/concern/scanned_resources/new" expect(response.body).to have_field "Title" expect(response.body).to have_field "Source Metadata ID" @@ -28,6 +30,7 @@ expect(response.body).to have_field "PDF Type" expect(response.body).to have_field "Portion Note" expect(response.body).to have_field "Navigation Date" + expect(response.body).to have_select "Collections", name: "scanned_resource[member_of_collection_ids][]", options: ["", collection.title.first] expect(response.body).to have_checked_field "Private" expect(response.body).to have_button "Save" end @@ -62,6 +65,26 @@ id = response.location.gsub("http://www.example.com/catalog/", "").gsub("%2F", "/").gsub(/^id-/, "") expect(find_resource(id).title).to contain_exactly "Title 1", "Title 2" end + context "when joining a collection" do + let(:valid_params) do + { + title: ['Title 1', 'Title 2'], + rights_statement: 'Test Statement', + visibility: 'restricted', + member_of_collection_ids: [collection.id.to_s] + } + end + let(:collection) { FactoryGirl.create_for_repository(:collection) } + it "works" do + post "/concern/scanned_resources", params: { scanned_resource: valid_params } + + expect(response).to be_redirect + expect(response.location).to start_with "http://www.example.com/catalog/" + id = response.location.gsub("http://www.example.com/catalog/", "").gsub("%2F", "/").gsub(/^id-/, "") + expect(find_resource(id).member_of_collection_ids).to contain_exactly collection.id + end + end + it "can create and join a collection" context "when something bad goes wrong" do it "doesn't persist anything at all when it's solr erroring" do allow(Valkyrie::MetadataAdapter.find(:index_solr)).to receive(:persister).and_return( diff --git a/spec/views/catalog/show.html.erb_spec.rb b/spec/views/catalog/show.html.erb_spec.rb index f1ad5fb69b..53dff2b794 100644 --- a/spec/views/catalog/show.html.erb_spec.rb +++ b/spec/views/catalog/show.html.erb_spec.rb @@ -3,8 +3,9 @@ RSpec.describe "catalog/show.html.erb" do context "when given a ScannedResource solr document" do - let(:scanned_resource) { FactoryGirl.create_for_repository(:scanned_resource, author: "Shakespeare") } + let(:scanned_resource) { FactoryGirl.create_for_repository(:scanned_resource, author: "Shakespeare", member_of_collection_ids: [collection.id]) } let(:document) { Valkyrie::MetadataAdapter.find(:index_solr).resource_factory.from_resource(scanned_resource) } + let(:collection) { FactoryGirl.create_for_repository(:collection) } let(:solr_document) { SolrDocument.new(document) } before do Timecop.freeze(Time.zone.local(1990)) @@ -34,6 +35,10 @@ # Date Modified expect(rendered).to have_selector "th", text: "Date Modified" expect(rendered).to have_selector ".updated_at", text: "01/01/90 12:00:00 AM UTC" + + # Collection + expect(rendered).to have_selector "th", text: "Collections" + expect(rendered).to have_selector ".member_of_collections", text: collection.title.first end end end