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