curation_concerns 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +0 -4
  4. data/app/actors/curation_concerns/actors/file_actor.rb +19 -3
  5. data/app/assets/javascripts/curation_concerns/curation_concerns.js +1 -0
  6. data/app/assets/javascripts/curation_concerns/file_manager/sorting.es6 +44 -5
  7. data/app/assets/javascripts/curation_concerns/file_manager.es6 +9 -2
  8. data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +57 -18
  9. data/app/controllers/concerns/curation_concerns/permissions_controller_behavior.rb +23 -0
  10. data/app/controllers/concerns/curation_concerns/selects_collections.rb +2 -0
  11. data/app/controllers/curation_concerns/permissions_controller.rb +1 -16
  12. data/app/forms/curation_concerns/forms/work_form.rb +0 -7
  13. data/app/helpers/batch_select_helper.rb +0 -15
  14. data/app/helpers/curation_concerns/collections_helper.rb +40 -6
  15. data/app/helpers/curation_concerns/main_app_helpers.rb +0 -2
  16. data/app/jobs/characterize_job.rb +5 -3
  17. data/app/jobs/create_derivatives_job.rb +3 -2
  18. data/app/jobs/ingest_file_job.rb +16 -16
  19. data/app/models/concerns/curation_concerns/admin_set_behavior.rb +5 -0
  20. data/app/models/concerns/curation_concerns/basic_metadata.rb +8 -0
  21. data/app/models/concerns/curation_concerns/collection_behavior.rb +2 -3
  22. data/app/models/concerns/curation_concerns/serializers.rb +2 -2
  23. data/app/models/concerns/curation_concerns/solr_document_behavior.rb +3 -2
  24. data/app/models/concerns/curation_concerns/work_behavior.rb +1 -1
  25. data/app/presenters/curation_concerns/work_show_presenter.rb +2 -1
  26. data/app/renderers/curation_concerns/renderers/external_link_attribute_renderer.rb +13 -0
  27. data/app/renderers/{renderers.rb → curation_concerns/renderers.rb} +0 -0
  28. data/app/search_builders/curation_concerns/admin_set_search_builder.rb +3 -3
  29. data/app/search_builders/curation_concerns/collection_search_builder.rb +6 -4
  30. data/app/search_builders/curation_concerns/file_set_search_builder.rb +3 -3
  31. data/app/search_builders/curation_concerns/filter_by_type.rb +17 -5
  32. data/app/search_builders/curation_concerns/member_search_builder.rb +7 -3
  33. data/app/search_builders/curation_concerns/single_result.rb +1 -1
  34. data/app/services/curation_concerns/admin_set_service.rb +6 -8
  35. data/app/services/curation_concerns/indexes_thumbnails.rb +0 -1
  36. data/app/services/curation_concerns/license_service.rb +8 -0
  37. data/app/services/curation_concerns/working_directory.rb +4 -2
  38. data/app/views/collections/_search_form.html.erb +2 -2
  39. data/app/views/curation_concerns/base/_file_manager_actions.html.erb +1 -0
  40. data/app/views/curation_concerns/base/_file_manager_member_resource_options.html.erb +4 -0
  41. data/app/views/curation_concerns/base/_file_manager_resource_form.html.erb +1 -0
  42. data/app/views/curation_concerns/base/_form_rights.html.erb +3 -2
  43. data/config/locales/curation_concerns.en.yml +4 -0
  44. data/curation_concerns.gemspec +3 -3
  45. data/lib/curation_concerns/version.rb +1 -1
  46. data/lib/generators/curation_concerns/models_generator.rb +8 -0
  47. data/lib/generators/curation_concerns/templates/spec/models/collection_spec.rb +7 -0
  48. data/lib/generators/curation_concerns/templates/spec/models/file_set_spec.rb +7 -0
  49. data/spec/actors/curation_concerns/file_actor_spec.rb +17 -3
  50. data/spec/actors/curation_concerns/file_set_actor_spec.rb +34 -8
  51. data/spec/controllers/curation_concerns/collections_controller_spec.rb +3 -4
  52. data/spec/controllers/selects_collections_controller_spec.rb +7 -2
  53. data/spec/factories/generic_works.rb +3 -1
  54. data/spec/features/collection_spec.rb +2 -0
  55. data/spec/helpers/curation_concerns/collections_helper_spec.rb +87 -3
  56. data/spec/indexers/file_set_indexer_spec.rb +3 -0
  57. data/spec/indexers/work_indexer_spec.rb +2 -1
  58. data/spec/javascripts/file_manager_member_spec.coffee +2 -1
  59. data/spec/javascripts/file_manager_sorting_spec.coffee +23 -0
  60. data/spec/javascripts/fixtures/sortable.html +182 -0
  61. data/spec/javascripts/save_manager_spec.coffee +2 -1
  62. data/spec/jobs/characterize_job_spec.rb +18 -1
  63. data/spec/jobs/ingest_file_job_spec.rb +18 -13
  64. data/spec/models/admin_set_spec.rb +5 -3
  65. data/spec/models/file_set_spec.rb +2 -4
  66. data/spec/models/solr_document_spec.rb +17 -3
  67. data/spec/presenters/curation_concerns/collection_presenter_spec.rb +5 -0
  68. data/spec/renderers/curation_concerns/renderers/external_link_attribute_renderer_spec.rb +22 -0
  69. data/spec/search_builders/curation_concerns/admin_set_search_builder_spec.rb +8 -5
  70. data/spec/search_builders/curation_concerns/file_set_search_builder_spec.rb +2 -2
  71. data/spec/services/curation_concerns/admin_set_service_spec.rb +53 -22
  72. data/spec/spec_helper.rb +1 -2
  73. data/spec/test_app_templates/Gemfile.extra +4 -0
  74. data/spec/views/curation_concerns/base/_attributes.html.erb_spec.rb +10 -4
  75. data/spec/views/curation_concerns/base/file_manager.html.erb_spec.rb +8 -0
  76. data/spec/views/curation_concerns/base/show.json.jbuilder_spec.rb +1 -1
  77. data/spec/views/curation_concerns/file_sets/show.json.jbuilder_spec.rb +1 -1
  78. metadata +19 -22
  79. data/app/helpers/collections_helper.rb +0 -4
  80. data/app/helpers/curation_concerns/collections_helper_behavior.rb +0 -41
  81. data/app/helpers/curation_concerns/permissions_helper.rb +0 -19
  82. data/app/helpers/curation_concerns/rights_helper.rb +0 -9
  83. data/app/models/collection.rb +0 -6
  84. data/spec/helpers/collections_helper_spec.rb +0 -88
@@ -37,7 +37,7 @@ module CurationConcerns::WorkBehavior
37
37
 
38
38
  def to_s
39
39
  if title.present?
40
- Array.wrap(title).join(' | ')
40
+ title.join(' | ')
41
41
  else
42
42
  'No Title'
43
43
  end
@@ -38,7 +38,8 @@ module CurationConcerns
38
38
  # Metadata Methods
39
39
  delegate :title, :date_created, :date_modified, :date_uploaded, :description,
40
40
  :creator, :contributor, :subject, :publisher, :language, :embargo_release_date,
41
- :lease_expiration_date, :rights, :source, :thumbnail_id, to: :solr_document
41
+ :lease_expiration_date, :rights, :source, :thumbnail_id, :representative_id,
42
+ to: :solr_document
42
43
 
43
44
  # @return [Array<FileSetPresenter>] presenters for the orderd_members that are FileSets
44
45
  def file_set_presenters
@@ -0,0 +1,13 @@
1
+ module CurationConcerns
2
+ module Renderers
3
+ class ExternalLinkAttributeRenderer < AttributeRenderer
4
+ private
5
+
6
+ def li_value(value)
7
+ auto_link(value) do |link|
8
+ "<span class='glyphicon glyphicon-new-window'></span>&nbsp;#{link}"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -5,9 +5,9 @@ module CurationConcerns
5
5
  super(context)
6
6
  end
7
7
 
8
- # This overrides the filter_models in FilterByType
9
- def filter_models(solr_parameters)
10
- solr_parameters[:fq] << ActiveFedora::SolrQueryBuilder.construct_query_for_rel(has_model: ::AdminSet.to_class_uri)
8
+ # This overrides the models in FilterByType
9
+ def models
10
+ [::AdminSet]
11
11
  end
12
12
 
13
13
  # Overrides Hydra::AccessControlsEnforcement
@@ -1,16 +1,18 @@
1
1
  module CurationConcerns
2
2
  class CollectionSearchBuilder < ::SearchBuilder
3
+ include FilterByType
3
4
  # Defines which search_params_logic should be used when searching for Collections
4
5
  self.default_processor_chain = [:default_solr_parameters, :add_query_to_solr,
5
- :add_access_controls_to_solr_params, :add_collection_filter, :some_rows, :sort_by_title]
6
+ :add_access_controls_to_solr_params, :filter_models,
7
+ :some_rows, :sort_by_title]
6
8
 
7
9
  def some_rows(solr_parameters)
8
10
  solr_parameters[:rows] = '100'
9
11
  end
10
12
 
11
- def add_collection_filter(solr_parameters)
12
- solr_parameters[:fq] ||= []
13
- solr_parameters[:fq] << ActiveFedora::SolrQueryBuilder.construct_query_for_rel(has_model: ::Collection.to_class_uri)
13
+ # This overrides FilterByType and ensures we only match on collections.
14
+ def only_collections?
15
+ true
14
16
  end
15
17
 
16
18
  # Sort results by title if no query was supplied.
@@ -2,9 +2,9 @@ module CurationConcerns
2
2
  class FileSetSearchBuilder < ::SearchBuilder
3
3
  include CurationConcerns::SingleResult
4
4
 
5
- # This overrides the filter_models in FilterByType
6
- def filter_models(solr_parameters)
7
- solr_parameters[:fq] << ActiveFedora::SolrQueryBuilder.construct_query_for_rel(has_model: ::FileSet.to_class_uri)
5
+ # This overrides the models in FilterByType
6
+ def models
7
+ [::FileSet]
8
8
  end
9
9
  end
10
10
  end
@@ -9,7 +9,7 @@ module CurationConcerns
9
9
  # Add queries that excludes everything except for works and collections
10
10
  def filter_models(solr_parameters)
11
11
  solr_parameters[:fq] ||= []
12
- solr_parameters[:fq] << '{!terms f=has_model_ssim}' + (work_clauses + collection_clauses).join(',')
12
+ solr_parameters[:fq] << "{!terms f=has_model_ssim}#{models_to_solr_clause}"
13
13
  end
14
14
 
15
15
  protected
@@ -22,8 +22,19 @@ module CurationConcerns
22
22
  generic_type_field.include?('Work')
23
23
  end
24
24
 
25
+ # Override this method if you want to filter for a different set of models.
26
+ # @return [Array<Class>] a list of classes to include
27
+ def models
28
+ work_classes + collection_classes
29
+ end
30
+
25
31
  private
26
32
 
33
+ def models_to_solr_clause
34
+ # to_class_uri is deprecated in AF 11
35
+ [ActiveFedora::Base.respond_to?(:to_rdf_representation) ? models.map(&:to_rdf_representation) : models.map(&:to_class_uri)].join(',')
36
+ end
37
+
27
38
  def generic_type_field
28
39
  Array.wrap(blacklight_params.fetch(:f, {}).fetch(:generic_type_sim, []))
29
40
  end
@@ -35,14 +46,15 @@ module CurationConcerns
35
46
  CurationConcerns.config.curation_concerns
36
47
  end
37
48
 
38
- def work_clauses
49
+ def work_classes
39
50
  return [] if only_collections?
40
- work_types.map(&:to_class_uri)
51
+ work_types
41
52
  end
42
53
 
43
- def collection_clauses
54
+ def collection_classes
44
55
  return [] if only_works?
45
- [::Collection.to_class_uri]
56
+ # to_class_uri is deprecated in AF 11
57
+ [::Collection]
46
58
  end
47
59
  end
48
60
  end
@@ -6,12 +6,16 @@ module CurationConcerns
6
6
  # Defines which search_params_logic should be used when searching for Collection members
7
7
  self.default_processor_chain += [:include_collection_ids]
8
8
 
9
- delegate :collection, to: :scope
10
-
11
9
  # include filters into the query to only include the collection memebers
12
10
  def include_collection_ids(solr_parameters)
13
11
  solr_parameters[:fq] ||= []
14
- solr_parameters[:fq] << "{!join from=#{from_field} to=id}id:#{collection.id}"
12
+ solr_parameters[:fq] << "{!join from=#{from_field} to=id}id:#{collection_id}"
15
13
  end
14
+
15
+ protected
16
+
17
+ def collection_id
18
+ blacklight_params.fetch('id')
19
+ end
16
20
  end
17
21
  end
@@ -7,7 +7,7 @@ module CurationConcerns
7
7
  end
8
8
 
9
9
  def find_one(solr_parameters)
10
- solr_parameters[:fq] << "_query_:\"{!field f=id}#{blacklight_params.fetch(:id)}\""
10
+ solr_parameters[:fq] << "{!raw f=id}#{blacklight_params.fetch(:id)}"
11
11
  end
12
12
  end
13
13
  end
@@ -14,13 +14,11 @@ module CurationConcerns
14
14
  end
15
15
  end
16
16
 
17
- private
18
-
19
- # @param [Symbol] access :read or :edit
20
- def search_results(access)
21
- builder = AdminSetSearchBuilder.new(context, access)
22
- response = context.repository.search(builder)
23
- response.documents
24
- end
17
+ # @param [Symbol] access :read or :edit
18
+ def search_results(access)
19
+ builder = AdminSetSearchBuilder.new(context, access)
20
+ response = context.repository.search(builder)
21
+ response.documents
22
+ end
25
23
  end
26
24
  end
@@ -20,7 +20,6 @@ module CurationConcerns
20
20
  # @params [Hash] solr_document the solr document to add the field to
21
21
  def index_thumbnails(solr_document)
22
22
  solr_document[thumbnail_field] = thumbnail_path
23
- solr_document[Solrizer.solr_name('thumbnail_id', :symbol)] = object.thumbnail_id
24
23
  end
25
24
 
26
25
  # Returns the value for the thumbnail path to put into the solr document
@@ -4,5 +4,13 @@ module CurationConcerns
4
4
  def initialize
5
5
  super('licenses')
6
6
  end
7
+
8
+ def include_current_value(value, _index, render_options, html_options)
9
+ unless value.blank? || active?(value)
10
+ html_options[:class] << ' force-select'
11
+ render_options += [[label(value), value]]
12
+ end
13
+ [render_options, html_options]
14
+ end
7
15
  end
8
16
  end
@@ -1,10 +1,12 @@
1
1
  module CurationConcerns
2
- module WorkingDirectory
2
+ class WorkingDirectory
3
3
  class << self
4
4
  # @param [String] repository_file_id identifier for Hydra::PCDM::File
5
5
  # @param [String] id the identifier of the FileSet
6
+ # @param [String, NilClass] filepath path to existing cached copy of the file
6
7
  # @return [String] path of the working file
7
- def find_or_retrieve(repository_file_id, id)
8
+ def find_or_retrieve(repository_file_id, id, filepath = nil)
9
+ return filepath if filepath && File.exist?(filepath)
8
10
  repository_file = Hydra::PCDM::File.find(repository_file_id)
9
11
  working_path = full_filename(id, repository_file.original_name)
10
12
  if File.exist?(working_path)
@@ -1,7 +1,7 @@
1
1
  <%= form_for presenter, method: :get, class: "well form-search" do |f| %>
2
- <label class="sr-only">Search Collection <%= presenter.title %></label>
2
+ <label class="sr-only"><%= t('curation_concerns.collections.search_form.label', title: presenter.to_s) %></label>
3
3
  <div class="input-group">
4
- <%= text_field_tag :cq, params[:cq], class: "collection-query form-control", placeholder: "Search Collection", size: '30', type: "search", id: "collection_search" %>
4
+ <%= text_field_tag :cq, params[:cq], class: "collection-query form-control", placeholder: t('curation_concerns.collections.search_form.placeholder'), size: '30', type: "search", id: "collection_search" %>
5
5
  <div class="input-group-btn">
6
6
  <button type="submit" class="btn btn-primary" id="collection_submit"><i class="glyphicon glyphicon-search"></i> Go</button>
7
7
  </div>
@@ -1,4 +1,5 @@
1
1
  <div class="actions form-horizontal panel panel-default">
2
2
  <%= button_tag "Save", class: "btn btn-primary disabled", data: { action: "save-actions" }%>
3
+ <%= button_tag "Sort alphabetically", class: "btn btn-primary", data: { action: "alpha-sort-action" }%>
3
4
  </div>
4
5
  <%= render "file_manager_resource_form" %>
@@ -3,4 +3,8 @@
3
3
  <%= radio_button_tag "thumbnail_id", node.id, @presenter.thumbnail_id == node.id, id: "thumbnail_id_#{node.id}", class: "radio_buttons" %>
4
4
  <%= label_tag "thumbnail_id_#{node.id}", "Thumbnail" %>
5
5
  </span>
6
+ <span class="radio">
7
+ <%= radio_button_tag "representative_id", node.id, @presenter.representative_id == node.id, id: "representative_id_#{node.id}", class: "radio_buttons" %>
8
+ <%= label_tag "representative_id_#{node.id}", "Representative Media" %>
9
+ </span>
6
10
  </div>
@@ -1,5 +1,6 @@
1
1
  <div class="resource-form-container">
2
2
  <%= simple_form_for [main_app, @presenter], remote: true, html: { id: 'resource-form', 'data-type': 'json' } do |f| %>
3
3
  <%= f.input :thumbnail_id, as: :hidden, input_html: { data: {member_link: 'thumbnail_id'}} %>
4
+ <%= f.input :representative_id, as: :hidden, input_html: { data: {member_link: 'representative_id'}} %>
4
5
  <% end %>
5
6
  </div>
@@ -9,10 +9,11 @@
9
9
  <a href="http://creativecommons.org/licenses/" target="_blank">Here's some help</a> if you don't know which license to choose.
10
10
  </p>
11
11
 
12
+ <% license_service = CurationConcerns::LicenseService.new %>
12
13
  <%= f.input :rights, as: :multi_value_select,
13
- collection: CurationConcerns::LicenseService.new.select_active_options,
14
+ collection: license_service.select_active_options,
14
15
  include_blank: true,
15
- item_helper: method(:include_current_value),
16
+ item_helper: license_service.method(:include_current_value),
16
17
  input_html: { class: 'form-control' } %>
17
18
  </fieldset>
18
19
  </div>
@@ -6,6 +6,10 @@ en:
6
6
  index:
7
7
  type_tabs:
8
8
  all: All
9
+ collections:
10
+ search_form:
11
+ placeholder: "Search Collection"
12
+ label: "Search Collection %{title}"
9
13
  division:
10
14
  name: "Your Division at Institution"
11
15
  homepage_url: "#"
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency 'sprockets-es6'
31
31
  spec.add_dependency 'kaminari_route_prefix', '~> 0.0.1'
32
32
  spec.add_dependency 'active_attr'
33
- spec.add_dependency 'hydra-works', '>= 0.12.0'
33
+ spec.add_dependency 'hydra-works', '>= 0.14.0'
34
34
  spec.add_dependency 'active_fedora-noid', '~> 2.0.0.beta1'
35
35
  spec.add_dependency 'qa', '~> 0.5'
36
36
  spec.add_dependency 'redlock', '~> 0.1.2'
@@ -41,12 +41,12 @@ Gem::Specification.new do |spec|
41
41
  spec.add_dependency 'browse-everything', '~> 0.10'
42
42
  spec.add_dependency 'clipboard-rails', '~> 1.5'
43
43
 
44
- spec.add_development_dependency 'solr_wrapper', '~> 0.13', '>= 0.13.1'
44
+ spec.add_development_dependency 'solr_wrapper', '~> 0.16'
45
45
  spec.add_development_dependency 'fcrepo_wrapper', '~> 0.1'
46
46
  spec.add_development_dependency 'devise', '>= 3.0', '< 5'
47
47
  spec.add_development_dependency "bundler", "~> 1.6"
48
48
  spec.add_development_dependency "rake"
49
- spec.add_development_dependency "engine_cart", "~> 0.9"
49
+ spec.add_development_dependency "engine_cart", "~> 1.0"
50
50
  spec.add_development_dependency "sqlite3"
51
51
  spec.add_development_dependency "rspec-its"
52
52
  spec.add_development_dependency "rspec-rails"
@@ -1,3 +1,3 @@
1
1
  module CurationConcerns
2
- VERSION = '1.5.0'.freeze
2
+ VERSION = '1.6.0'.freeze
3
3
  end
@@ -38,14 +38,22 @@ This generator makes the following changes to your application:
38
38
 
39
39
  def create_collection
40
40
  copy_file 'app/models/collection.rb', 'app/models/collection.rb'
41
+ copy_file 'spec/models/collection_spec.rb', 'spec/models/collection_spec.rb' if rspec_installed?
41
42
  end
42
43
 
43
44
  def create_file_set
44
45
  copy_file 'app/models/file_set.rb', 'app/models/file_set.rb'
46
+ copy_file 'spec/models/file_set_spec.rb', 'spec/models/file_set_spec.rb' if rspec_installed?
45
47
  end
46
48
 
47
49
  # Adds clamav initializtion
48
50
  def clamav
49
51
  generate 'curation_concerns:clamav'
50
52
  end
53
+
54
+ private
55
+
56
+ def rspec_installed?
57
+ defined?(RSpec) && defined?(RSpec::Rails)
58
+ end
51
59
  end
@@ -0,0 +1,7 @@
1
+ require 'rails_helper'
2
+
3
+ describe Collection do
4
+ it "has tests" do
5
+ skip "Add your tests here"
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'rails_helper'
2
+
3
+ describe FileSet do
4
+ it "has tests" do
5
+ skip "Add your tests here"
6
+ end
7
+ end
@@ -9,11 +9,25 @@ describe CurationConcerns::Actors::FileActor do
9
9
  let(:relation) { create(:file_set) }
10
10
  let(:actor) { described_class.new(file_set, 'remastered', user) }
11
11
  let(:uploaded_file) { fixture_file_upload('/world.png', 'image/png') }
12
+ let(:ingest_options) { { mime_type: 'image/png', relation: 'remastered', filename: 'world.png' } }
13
+ let(:working_file) { CurationConcerns::WorkingDirectory.copy_file_to_working_directory(uploaded_file, file_set.id) }
12
14
 
13
15
  describe '#ingest_file' do
14
- it 'calls ingest file job' do
15
- expect(IngestFileJob).to receive(:perform_later).with(file_set, /world\.png$/, 'image/png', user, 'remastered')
16
- actor.ingest_file(uploaded_file)
16
+ context "when the file is available locally" do
17
+ it 'calls ingest file job' do
18
+ expect(IngestFileJob).to receive(:perform_later).with(file_set, uploaded_file.path, user, ingest_options)
19
+ expect(CurationConcerns::WorkingDirectory).not_to receive(:copy_file_to_working_directory)
20
+ actor.ingest_file(uploaded_file)
21
+ end
22
+ end
23
+ context "when the file is not available locally" do
24
+ before do
25
+ allow(actor).to receive(:working_file).with(uploaded_file).and_return(working_file)
26
+ end
27
+ it 'calls ingest file job' do
28
+ expect(IngestFileJob).to receive(:perform_later).with(file_set, /world\.png$/, user, ingest_options)
29
+ actor.ingest_file(uploaded_file)
30
+ end
17
31
  end
18
32
  end
19
33
 
@@ -4,11 +4,12 @@ require 'redlock'
4
4
  describe CurationConcerns::Actors::FileSetActor do
5
5
  include ActionDispatch::TestProcess
6
6
 
7
- let(:user) { create(:user) }
8
- let(:uploaded_file) { fixture_file_upload('/world.png', 'image/png') }
9
- let(:local_file) { File.open(File.join(fixture_path, 'world.png')) }
10
- let(:file_set) { create(:file_set, content: local_file) }
11
- let(:actor) { described_class.new(file_set, user) }
7
+ let(:user) { create(:user) }
8
+ let(:uploaded_file) { fixture_file_upload('/world.png', 'image/png') }
9
+ let(:local_file) { File.open(File.join(fixture_path, 'world.png')) }
10
+ let(:file_set) { create(:file_set, content: local_file) }
11
+ let(:actor) { described_class.new(file_set, user) }
12
+ let(:ingest_options) { { mime_type: 'image/png', relation: 'original_file', filename: 'world.png' } }
12
13
 
13
14
  describe 'creating metadata and content' do
14
15
  let(:upload_set_id) { nil }
@@ -21,7 +22,7 @@ describe CurationConcerns::Actors::FileSetActor do
21
22
  end
22
23
 
23
24
  before do
24
- expect(IngestFileJob).to receive(:perform_later).with(file_set, /world\.png$/, 'image/png', user, 'original_file')
25
+ expect(IngestFileJob).to receive(:perform_later).with(file_set, /world\.png/, user, ingest_options)
25
26
  allow(actor).to receive(:acquire_lock_for).and_yield
26
27
  actor.create_metadata(work)
27
28
  actor.create_content(uploaded_file)
@@ -66,13 +67,14 @@ describe CurationConcerns::Actors::FileSetActor do
66
67
 
67
68
  describe '#create_content' do
68
69
  it 'calls ingest file job' do
69
- expect(IngestFileJob).to receive(:perform_later).with(file_set, /world\.png$/, 'image/png', user, 'original_file')
70
+ expect(IngestFileJob).to receive(:perform_later).with(file_set, /world\.png/, user, ingest_options)
70
71
  actor.create_content(uploaded_file)
71
72
  end
72
73
 
73
74
  context 'when an alternative relationship is specified' do
75
+ let(:ingest_options) { { mime_type: 'image/png', relation: 'remastered', filename: 'world.png' } }
74
76
  it 'calls ingest file job' do
75
- expect(IngestFileJob).to receive(:perform_later).with(file_set, /world\.png$/, 'image/png', user, 'remastered')
77
+ expect(IngestFileJob).to receive(:perform_later).with(file_set, /world\.png/, user, ingest_options)
76
78
  actor.create_content(uploaded_file, 'remastered')
77
79
  end
78
80
  end
@@ -285,4 +287,28 @@ describe CurationConcerns::Actors::FileSetActor do
285
287
  end
286
288
  end
287
289
  end
290
+
291
+ describe '#revert_content' do
292
+ let(:file_set) { create(:file_set, user: user) }
293
+ let(:file1) { "small_file.txt" }
294
+ let(:file2) { "curation_concerns_generic_stub.txt" }
295
+ let(:version1) { "version1" }
296
+
297
+ before do
298
+ original_adapter = ActiveJob::Base.queue_adapter
299
+ ActiveJob::Base.queue_adapter = :inline
300
+ allow(CharacterizeJob).to receive(:perform_later)
301
+ actor.create_content(fixture_file_upload(file1))
302
+ actor.create_content(fixture_file_upload(file2))
303
+ ActiveJob::Base.queue_adapter = original_adapter
304
+ actor.file_set.reload
305
+ end
306
+
307
+ let(:restored_content) { file_set.reload.original_file }
308
+
309
+ it "restores the first versions's content and metadata" do
310
+ actor.revert_content(version1)
311
+ expect(restored_content.original_name).to eq file1
312
+ end
313
+ end
288
314
  end
@@ -76,10 +76,9 @@ describe CollectionsController do
76
76
  end
77
77
 
78
78
  describe '#index' do
79
- before { sign_in user }
80
- let!(:collection1) { create(:collection, title: ['Beta'], user: user) }
81
- let!(:collection2) { create(:collection, title: ['Alpha'], user: user) }
82
- let!(:generic_work) { create(:generic_work, user: user) }
79
+ let!(:collection1) { create(:collection, :public, title: ['Beta']) }
80
+ let!(:collection2) { create(:collection, :public, title: ['Alpha']) }
81
+ let!(:generic_work) { create(:generic_work, :public) }
83
82
 
84
83
  it 'shows a list of collections sorted alphabetically' do
85
84
  get :index
@@ -3,13 +3,18 @@ require "spec_helper"
3
3
  class SelectsCollectionsController < ApplicationController
4
4
  include Blacklight::Catalog
5
5
  include Hydra::Controller::ControllerBehavior
6
- include CurationConcerns::SelectsCollections
6
+ Deprecation.silence CurationConcerns::SelectsCollections do
7
+ include CurationConcerns::SelectsCollections
8
+ end
7
9
  end
8
10
 
9
11
  describe SelectsCollectionsController, type: :controller do
10
12
  describe "#find_collections" do
11
13
  it "uses the search builder" do
12
- expect(subject.collections_search_builder_class.default_processor_chain).to eq [:default_solr_parameters, :add_query_to_solr, :add_access_controls_to_solr_params, :add_collection_filter, :some_rows, :sort_by_title]
14
+ expect(subject.collections_search_builder_class.default_processor_chain).to eq [
15
+ :default_solr_parameters, :add_query_to_solr,
16
+ :add_access_controls_to_solr_params, :filter_models,
17
+ :some_rows, :sort_by_title]
13
18
  expect(CurationConcerns::CollectionSearchBuilder).to receive(:new).with(subject).and_call_original
14
19
  subject.find_collections
15
20
  end
@@ -13,7 +13,9 @@ FactoryGirl.define do
13
13
  work.apply_depositor_metadata(evaluator.user.user_key)
14
14
  end
15
15
 
16
- factory :public_generic_work do
16
+ factory :public_generic_work, traits: [:public]
17
+
18
+ trait :public do
17
19
  visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
18
20
  end
19
21
 
@@ -86,6 +86,7 @@ feature 'collection' do
86
86
  within('#document_' + collection.id) do
87
87
  click_link('collection title')
88
88
  end
89
+ expect(page).to have_selector '.sr-only', text: 'Search Collection Test collection title', visible: false
89
90
  expect(page).to have_content 'Test collection title'
90
91
  expect(page).to have_content 'collection description'
91
92
  # Should have search results / contents listing
@@ -165,6 +166,7 @@ feature 'collection' do
165
166
  within("#document_#{collection.id}") do
166
167
  click_link('Edit Collection')
167
168
  end
169
+
168
170
  expect(page).to have_field 'collection_title', with: 'Test collection title'
169
171
  expect(page).to have_field 'collection_description', with: 'collection description'
170
172
  expect(page).to have_content(gw1.title.first)
@@ -40,9 +40,8 @@ describe CurationConcerns::CollectionsHelper do
40
40
 
41
41
  before do
42
42
  allow(helper).to receive(:current_user).and_return(user)
43
- allow(ActiveFedora::SolrService).to receive(:query)
44
- .with("_query_:\"{!field f=has_model_ssim}Collection\"",
45
- fl: 'title_tesim id', rows: 1000)
43
+ allow(Collection).to receive(:search_with_conditions)
44
+ .with({}, fl: 'title_tesim id', rows: 1000)
46
45
  .and_return([doc1, doc2, doc3])
47
46
  end
48
47
 
@@ -59,4 +58,89 @@ describe CurationConcerns::CollectionsHelper do
59
58
  end
60
59
  end
61
60
  end
61
+
62
+ describe "has_collection_search_parameters?" do
63
+ subject { helper }
64
+
65
+ context "when cq is set" do
66
+ before { allow(helper).to receive(:params).and_return(cq: 'foo') }
67
+ it { is_expected.to have_collection_search_parameters }
68
+ end
69
+
70
+ context "when cq is not set" do
71
+ before { allow(helper).to receive(:params).and_return(cq: '') }
72
+ it { is_expected.not_to have_collection_search_parameters }
73
+ end
74
+ end
75
+
76
+ describe "button_for_remove_from_collection" do
77
+ let(:item) { double(id: 'changeme:123') }
78
+ let(:collection) { FactoryGirl.create(:collection) }
79
+
80
+ it "generates a form that can remove the item" do
81
+ str = button_for_remove_from_collection collection, item
82
+ doc = Nokogiri::HTML(str)
83
+ form = doc.xpath('//form').first
84
+ expect(form.attr('action')).to eq collection_path(collection)
85
+ expect(form.css('input#collection_members[type="hidden"][value="remove"]')).not_to be_empty
86
+ expect(form.css('input[type="hidden"][name="batch_document_ids[]"][value="changeme:123"]')).not_to be_empty
87
+ end
88
+
89
+ describe "for a collection of another name" do
90
+ before(:all) do
91
+ class OtherCollection < ActiveFedora::Base
92
+ include CurationConcerns::Collection
93
+ include Hydra::Works::WorkBehavior
94
+ end
95
+ end
96
+
97
+ let!(:collection) { OtherCollection.create! }
98
+
99
+ after(:all) do
100
+ Object.send(:remove_const, :OtherCollection)
101
+ end
102
+
103
+ it "generates a form that can remove the item" do
104
+ str = button_for_remove_from_collection collection, item
105
+ doc = Nokogiri::HTML(str)
106
+ form = doc.xpath('//form').first
107
+ expect(form.attr('action')).to eq collection_path(collection)
108
+ expect(form.css('input#collection_members[type="hidden"][value="remove"]')).not_to be_empty
109
+ expect(form.css('input[type="hidden"][name="batch_document_ids[]"][value="changeme:123"]')).not_to be_empty
110
+ end
111
+ end
112
+ end
113
+
114
+ describe "button_for_remove_selected_from_collection" do
115
+ let(:collection) { FactoryGirl.create(:collection) }
116
+
117
+ it "creates a button to the collections delete path" do
118
+ str = button_for_remove_selected_from_collection collection
119
+ doc = Nokogiri::HTML(str)
120
+ form = doc.xpath('//form').first
121
+ expect(form.attr('action')).to eq collection_path(collection)
122
+ i = form.xpath('.//input')[2]
123
+ expect(i.attr('value')).to eq("remove")
124
+ expect(i.attr('name')).to eq("collection[members]")
125
+ end
126
+
127
+ it "creates a button with my text" do
128
+ str = button_for_remove_selected_from_collection collection, "Remove My Button"
129
+ doc = Nokogiri::HTML(str)
130
+ form = doc.css('form').first
131
+ expect(form.attr('action')).to eq collection_path(collection)
132
+ expect(form.css('input[type="submit"]').attr('value').value).to eq "Remove My Button"
133
+ end
134
+ end
135
+
136
+ describe "hidden_collection_members" do
137
+ before { helper.params[:batch_document_ids] = ['foo:12', 'foo:23'] }
138
+ it "makes hidden fields" do
139
+ doc = Nokogiri::HTML(hidden_collection_members)
140
+ inputs = doc.xpath('//input[@type="hidden"][@name="batch_document_ids[]"]')
141
+ expect(inputs.length).to eq(2)
142
+ expect(inputs[0].attr('value')).to eq('foo:12')
143
+ expect(inputs[1].attr('value')).to eq('foo:23')
144
+ end
145
+ end
62
146
  end