hyrax 3.0.0.pre.beta1 → 3.0.0.pre.beta2

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 (170) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +157 -68
  3. data/.travis.yml +4 -1
  4. data/Gemfile +1 -0
  5. data/README.md +3 -3
  6. data/app/actors/hyrax/actors/collections_membership_actor.rb +5 -55
  7. data/app/actors/hyrax/actors/create_with_remote_files_ordered_members_actor.rb +6 -8
  8. data/app/actors/hyrax/actors/environment.rb +15 -0
  9. data/app/actors/hyrax/actors/interpret_visibility_actor.rb +22 -37
  10. data/app/assets/javascripts/hyrax/editor/controlled_vocabulary.es6 +1 -1
  11. data/app/assets/stylesheets/hyrax/_collections.scss +5 -3
  12. data/app/assets/stylesheets/hyrax/dashboard.scss +3 -3
  13. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +21 -2
  14. data/app/controllers/hyrax/homepage_controller.rb +1 -1
  15. data/app/forms/hyrax/forms/work_form.rb +1 -1
  16. data/app/helpers/hyrax/collections_helper.rb +13 -0
  17. data/app/helpers/hyrax/hyrax_helper_behavior.rb +3 -3
  18. data/app/indexers/hyrax/admin_set_indexer.rb +1 -1
  19. data/app/indexers/hyrax/basic_metadata_indexer.rb +1 -1
  20. data/app/indexers/hyrax/collection_indexer.rb +3 -3
  21. data/app/indexers/hyrax/deep_indexing_service.rb +12 -12
  22. data/app/indexers/hyrax/file_set_indexer.rb +1 -1
  23. data/app/indexers/hyrax/indexes_workflow.rb +4 -4
  24. data/app/indexers/hyrax/work_indexer.rb +1 -1
  25. data/app/models/concerns/hyrax/basic_metadata.rb +2 -0
  26. data/app/models/concerns/hyrax/collection_behavior.rb +3 -3
  27. data/app/models/concerns/hyrax/file_set/querying.rb +1 -1
  28. data/app/models/concerns/hyrax/human_readable_type.rb +2 -2
  29. data/app/models/concerns/hyrax/solr_document/characterization.rb +23 -23
  30. data/app/models/concerns/hyrax/solr_document/metadata.rb +3 -2
  31. data/app/models/concerns/hyrax/solr_document_behavior.rb +3 -3
  32. data/app/models/concerns/hyrax/user.rb +10 -2
  33. data/app/presenters/hyrax/work_show_presenter.rb +2 -2
  34. data/app/renderers/hyrax/renderers/faceted_attribute_renderer.rb +1 -1
  35. data/app/search_builders/hyrax/collection_search_builder.rb +1 -1
  36. data/app/search_builders/hyrax/deposit_search_builder.rb +1 -1
  37. data/app/search_builders/hyrax/embargo_search_builder.rb +1 -1
  38. data/app/search_builders/hyrax/lease_search_builder.rb +1 -1
  39. data/app/services/hyrax/default_middleware_stack.rb +0 -4
  40. data/app/services/hyrax/statistics/file_sets/by_format.rb +1 -1
  41. data/app/services/hyrax/statistics/works/by_resource_type.rb +1 -1
  42. data/app/services/hyrax/visibility_intention.rb +78 -0
  43. data/app/views/catalog/_index_list_default.html.erb +3 -3
  44. data/app/views/catalog/_thumbnail_list_collection.html.erb +3 -2
  45. data/app/views/hyrax/base/_attribute_rows.html.erb +1 -0
  46. data/app/views/hyrax/base/_form_files.html.erb +2 -2
  47. data/app/views/hyrax/base/_form_visibility_component.html.erb +1 -1
  48. data/app/views/hyrax/base/_show_actions.html.erb +6 -6
  49. data/app/views/hyrax/base/show.html.erb +2 -2
  50. data/app/views/hyrax/batch_edits/_check_all.html.erb +1 -1
  51. data/app/views/hyrax/batch_edits/_delete_selected.html.erb +1 -1
  52. data/app/views/hyrax/collections/_show_document_list_row.html.erb +1 -1
  53. data/app/views/hyrax/dashboard/collections/_show_document_list_row.html.erb +1 -1
  54. data/app/views/hyrax/dashboard/show_admin.html.erb +4 -4
  55. data/app/views/records/show_fields/_based_near.html.erb +1 -1
  56. data/app/views/records/show_fields/_creator.html.erb +1 -1
  57. data/app/views/records/show_fields/_keyword.html.erb +1 -1
  58. data/app/views/records/show_fields/_language.html.erb +1 -1
  59. data/app/views/records/show_fields/_publisher.html.erb +1 -1
  60. data/app/views/records/show_fields/_resource_type.html.erb +1 -1
  61. data/app/views/records/show_fields/_subject.html.erb +1 -1
  62. data/config/initializers/samvera-nesting_indexer_initializer.rb +3 -3
  63. data/config/locales/hyrax.de.yml +35 -22
  64. data/config/locales/hyrax.en.yml +22 -2
  65. data/config/locales/hyrax.es.yml +21 -1
  66. data/config/locales/hyrax.fr.yml +21 -1
  67. data/config/locales/hyrax.it.yml +21 -1
  68. data/config/locales/hyrax.pt-BR.yml +21 -1
  69. data/config/locales/hyrax.zh.yml +21 -1
  70. data/hyrax.gemspec +7 -9
  71. data/lib/generators/hyrax/templates/catalog_controller.rb +1 -1
  72. data/lib/generators/hyrax/templates/config/locales/hyrax.pt-BR.yml +10 -10
  73. data/lib/generators/hyrax/work/templates/locale.pt-BR.yml.erb +1 -1
  74. data/lib/hyrax/configuration.rb +18 -0
  75. data/lib/hyrax/engine.rb +8 -0
  76. data/lib/hyrax/transactions/container.rb +6 -0
  77. data/lib/hyrax/transactions/destroy_work.rb +21 -0
  78. data/lib/hyrax/transactions/steps/destroy_work.rb +24 -0
  79. data/lib/hyrax/version.rb +1 -1
  80. data/lib/wings.rb +45 -0
  81. data/lib/wings/active_fedora_converter.rb +56 -0
  82. data/lib/wings/model_transformer.rb +158 -0
  83. data/lib/wings/resource_factory.rb +8 -0
  84. data/lib/wings/valkyrie/metadata_adapter.rb +29 -0
  85. data/lib/wings/valkyrie/persister.rb +50 -0
  86. data/lib/wings/valkyrie/query_service.rb +43 -0
  87. data/lib/wings/valkyrie/resource_factory.rb +45 -0
  88. data/lib/wings/valkyrizable.rb +24 -0
  89. data/lib/wings/value_mapper.rb +59 -0
  90. data/spec/abilities/collection_ability_spec.rb +5 -5
  91. data/spec/abilities/permission_template_ability_spec.rb +1 -1
  92. data/spec/actors/hyrax/actors/collections_membership_actor_spec.rb +6 -175
  93. data/spec/actors/hyrax/actors/create_with_remote_files_ordered_members_actor_spec.rb +30 -22
  94. data/spec/actors/hyrax/actors/interpret_visibility_actor_spec.rb +2 -0
  95. data/spec/controllers/catalog_controller_spec.rb +1 -1
  96. data/spec/controllers/hyrax/admin/collection_types_controller_spec.rb +1 -1
  97. data/spec/controllers/hyrax/batch_edits_controller_spec.rb +9 -9
  98. data/spec/controllers/hyrax/collections_controller_spec.rb +5 -5
  99. data/spec/controllers/hyrax/dashboard/collection_members_controller_spec.rb +16 -13
  100. data/spec/controllers/hyrax/dashboard/collections_controller_spec.rb +9 -9
  101. data/spec/controllers/hyrax/dashboard/nest_collections_controller_spec.rb +1 -1
  102. data/spec/controllers/hyrax/generic_works_controller_spec.rb +10 -1
  103. data/spec/controllers/hyrax/homepage_controller_spec.rb +3 -3
  104. data/spec/controllers/hyrax/my/shares_controller_spec.rb +1 -1
  105. data/spec/features/actor_stack_spec.rb +48 -0
  106. data/spec/features/catalog_search_spec.rb +2 -2
  107. data/spec/features/collection_multi_membership_spec.rb +2 -2
  108. data/spec/features/collection_spec.rb +7 -7
  109. data/spec/features/collection_type_spec.rb +2 -2
  110. data/spec/features/dashboard/collection_spec.rb +18 -18
  111. data/spec/features/delete_work_spec.rb +1 -1
  112. data/spec/features/search_spec.rb +2 -2
  113. data/spec/features/work_show_spec.rb +5 -2
  114. data/spec/forms/hyrax/forms/batch_upload_form_spec.rb +1 -0
  115. data/spec/forms/hyrax/forms/collection_form_spec.rb +5 -5
  116. data/spec/forms/hyrax/forms/permission_template_form_spec.rb +1 -1
  117. data/spec/forms/hyrax/forms/work_form_spec.rb +2 -0
  118. data/spec/helpers/blacklight_helper_spec.rb +3 -1
  119. data/spec/helpers/hyrax/collections_helper_spec.rb +42 -0
  120. data/spec/helpers/hyrax/dashboard_helper_behavior_spec.rb +4 -4
  121. data/spec/helpers/hyrax_helper_spec.rb +8 -4
  122. data/spec/hyrax/transactions/destroy_work_spec.rb +35 -0
  123. data/spec/hyrax/transactions/steps/destroy_work_spec.rb +33 -0
  124. data/spec/indexers/hyrax/collection_indexer_spec.rb +1 -1
  125. data/spec/jobs/characterize_job_spec.rb +1 -1
  126. data/spec/lib/hyrax/resource_sync/change_list_writer_spec.rb +35 -21
  127. data/spec/lib/hyrax/resource_sync/resource_list_writer_spec.rb +1 -1
  128. data/spec/models/collection_spec.rb +18 -18
  129. data/spec/models/concerns/hyrax/collection_nesting_spec.rb +2 -2
  130. data/spec/models/file_set_spec.rb +2 -2
  131. data/spec/models/hyrax/collection_type_spec.rb +2 -2
  132. data/spec/models/user_spec.rb +26 -1
  133. data/spec/presenters/hyrax/collection_presenter_spec.rb +11 -11
  134. data/spec/presenters/hyrax/work_show_presenter_spec.rb +11 -0
  135. data/spec/search_builders/hyrax/collection_member_search_builder_spec.rb +1 -1
  136. data/spec/search_builders/hyrax/collection_search_builder_spec.rb +1 -1
  137. data/spec/search_builders/hyrax/dashboard/nested_collections_search_builder_spec.rb +1 -1
  138. data/spec/search_builders/hyrax/work_relation_spec.rb +1 -1
  139. data/spec/services/hyrax/adapters/nesting_index_adapter_spec.rb +2 -2
  140. data/spec/services/hyrax/collections/collection_member_service_spec.rb +2 -2
  141. data/spec/services/hyrax/collections/migration_service_spec.rb +27 -27
  142. data/spec/services/hyrax/collections/nested_collection_persistence_service_spec.rb +1 -1
  143. data/spec/services/hyrax/collections/nested_collection_query_service_spec.rb +38 -38
  144. data/spec/services/hyrax/curation_concern_spec.rb +1 -1
  145. data/spec/services/hyrax/default_middleware_stack_spec.rb +1 -2
  146. data/spec/services/hyrax/statistics/depositors/summary_spec.rb +1 -1
  147. data/spec/services/hyrax/statistics/works/by_resource_type_spec.rb +11 -4
  148. data/spec/services/hyrax/visibility_intention_spec.rb +144 -0
  149. data/spec/services/hyrax/workflow/changes_required_notification_spec.rb +1 -1
  150. data/spec/spec_helper.rb +10 -8
  151. data/spec/support/selectors.rb +10 -1
  152. data/spec/test_app_templates/Gemfile.extra +2 -0
  153. data/spec/test_app_templates/lib/generators/test_app_generator.rb +6 -0
  154. data/spec/views/catalog/_index_list_default.html.erb_spec.rb +3 -2
  155. data/spec/views/catalog/_thumbnail_list_collection.html.erb_spec.rb +38 -5
  156. data/spec/views/hyrax/base/_attributes.html.erb_spec.rb +1 -1
  157. data/spec/views/hyrax/base/_show_actions.html.erb_spec.rb +9 -9
  158. data/spec/views/hyrax/base/show.html.erb_spec.rb +3 -2
  159. data/spec/views/hyrax/collections/_show_document_list_row.html.erb_spec.rb +3 -2
  160. data/spec/views/hyrax/dashboard/collections/_show_document_list_row.html.erb_spec.rb +3 -2
  161. data/spec/wings/active_fedora_converter_spec.rb +31 -0
  162. data/spec/wings/model_transformer_spec.rb +288 -0
  163. data/spec/wings/valkyrie/metadata_adapter_spec.rb +10 -0
  164. data/spec/wings/valkyrie/persister_spec.rb +71 -0
  165. data/spec/wings/valkyrie/query_service_spec.rb +81 -0
  166. data/spec/wings/valkyrie/resource_factory_spec.rb +32 -0
  167. data/spec/wings/value_mapper_spec.rb +60 -0
  168. data/spec/wings_spec.rb +8 -0
  169. data/template.rb +3 -1
  170. metadata +86 -36
@@ -13,7 +13,7 @@ RSpec.describe Hyrax::Workflow::ChangesRequiredNotification do
13
13
  expect(approver).to receive(:send_message)
14
14
  .with(anything,
15
15
  "Test title (<a href=\"/concern/generic_works/#{work.id}\">#{work.id}</a>) " \
16
- "requires additional changes before approval.\n\n 'A pleasant read'",
16
+ "requires additional changes before approval.\n 'A pleasant read'",
17
17
  anything).exactly(3).times.and_call_original
18
18
 
19
19
  expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
@@ -40,6 +40,7 @@ require 'rspec/active_model/mocks'
40
40
  require 'capybara/rspec'
41
41
  require 'capybara/rails'
42
42
  require 'selenium-webdriver'
43
+ require 'chromedriver-helper'
43
44
  require 'equivalent-xml'
44
45
  require 'equivalent-xml/rspec_matchers'
45
46
  require 'database_cleaner'
@@ -169,13 +170,6 @@ RSpec.configure do |config|
169
170
  DatabaseCleaner.start
170
171
  end
171
172
 
172
- if example.metadata[:type] == :view
173
- # View tests should not hit any services. This ensures the tests are unit
174
- # testing only the views and run fast.
175
- WebMock.disable_net_connect!(allow_localhost: false)
176
- else
177
- WebMock.disable_net_connect!(allow_localhost: true)
178
- end
179
173
  # using :workflow is preferable to :clean_repo, use the former if possible
180
174
  # It's important that this comes after DatabaseCleaner.start
181
175
  ensure_deposit_available_for(user) if example.metadata[:workflow]
@@ -195,7 +189,15 @@ RSpec.configure do |config|
195
189
  end
196
190
 
197
191
  config.include(ControllerLevelHelpers, type: :view)
198
- config.before(:each, type: :view) { initialize_controller_helpers(view) }
192
+
193
+ config.before(:each, type: :view) do
194
+ initialize_controller_helpers(view)
195
+ WebMock.disable_net_connect!(allow_localhost: false)
196
+ end
197
+
198
+ config.after(:each, type: :view) do
199
+ WebMock.disable_net_connect!(allow_localhost: true)
200
+ end
199
201
 
200
202
  config.before(:all, type: :feature) do
201
203
  # Assets take a long time to compile. This causes two problems:
@@ -43,7 +43,16 @@ module Selectors
43
43
  def select_member_of_collection(collection)
44
44
  find('#s2id_member_of_collection_ids').click
45
45
  find('.select2-input').set(collection.title.first)
46
- sleep 10
46
+ # Crude way of waiting for the AJAX response
47
+ select2_results = []
48
+ time_elapsed = 0
49
+ while select2_results.empty? && time_elapsed < 30
50
+ begin_time = Time.now.to_f
51
+ doc = Nokogiri::XML.parse(page.body)
52
+ select2_results = doc.xpath('//html:li[contains(@class,"select2-result")]', html: 'http://www.w3.org/1999/xhtml')
53
+ end_time = Time.now.to_f
54
+ time_elapsed += end_time - begin_time
55
+ end
47
56
  expect(page).to have_css('.select2-result')
48
57
  within ".select2-result" do
49
58
  find("span", text: collection.title.first).click
@@ -4,3 +4,5 @@ group :development do
4
4
  gem 'better_errors'
5
5
  gem 'binding_of_caller'
6
6
  end
7
+
8
+ gem 'bootsnap', require: false
@@ -5,6 +5,12 @@ class TestAppGenerator < Rails::Generators::Base
5
5
  # so the following path gets us to /path/to/hyrax/spec/test_app_templates/
6
6
  source_root File.expand_path('../../../../spec/test_app_templates/', __FILE__)
7
7
 
8
+ def require_bootsnap
9
+ inject_into_file 'config/boot.rb', after: "require 'bundler/setup' # Set up gems listed in the Gemfile.\n" do
10
+ "require 'bootsnap/setup'\n"
11
+ end
12
+ end
13
+
8
14
  def install_engine
9
15
  generate 'hyrax:install', '-f'
10
16
  end
@@ -8,14 +8,15 @@ RSpec.describe 'catalog/_index_list_default', type: :view do
8
8
  'date_modified_dtsi' => 'a date',
9
9
  'rights_statement_tesim' => [''],
10
10
  'embargo_release_date_dtsi' => 'a date',
11
- 'lease_expiration_date_dtsi' => 'a date' }
11
+ 'lease_expiration_date_dtsi' => 'a date',
12
+ 'has_model_ssim' => 'GenericWork' }
12
13
  end
13
14
  let(:document) { SolrDocument.new(attributes) }
14
15
  let(:presenter) { double }
15
16
 
16
17
  before do
17
18
  allow(view).to receive(:index_presenter).and_return(presenter)
18
- allow(presenter).to receive(:field_value) { |field| "Test #{field}" }
19
+ allow(presenter).to receive(:field_value) { |field| "Test #{field.field}" }
19
20
  render 'catalog/index_list_default', document: document
20
21
  end
21
22
 
@@ -1,10 +1,43 @@
1
1
  RSpec.describe 'catalog/_thumbnail_list_collection.html.erb', type: :view do
2
- before do
3
- stub_template 'catalog/_thumbnail_list_collection.html.erb' => '<div class="col-sm-3"><span class="fa fa-cubes collection-icon-search"></span></div>'
4
- render
2
+ context "When the collection thumbnail is attached" do
3
+ let(:attributes) do
4
+ { id: "xxx",
5
+ "has_model_ssim": ["Collection"],
6
+ "title_tesim": ["Collection Title"],
7
+ "description_tesim": ["Collection Description"],
8
+ "system_modified_dtsi": 'date',
9
+ "thumbnail_path_ss": '/xxx/yyy?file=thumbnail' }
10
+ end
11
+ let(:doc) { SolrDocument.new(attributes) }
12
+ let(:current_ability) { Ability.new(build(:user)) }
13
+
14
+ before do
15
+ render 'catalog/thumbnail_list_collection', document: doc
16
+ end
17
+
18
+ it 'displays the collection thumbnail in the search results' do
19
+ expect(rendered).to include '/xxx/yyy?file=thumbnail'
20
+ end
5
21
  end
6
22
 
7
- it 'displays the collection icon in the search results' do
8
- expect(rendered).to match '<div class="col-sm-3"><span class="fa fa-cubes collection-icon-search"></span></div>'
23
+ context "When the collection thumbnail is not attached" do
24
+ let(:attributes) do
25
+ { id: "xxx",
26
+ "has_model_ssim": ["Collection"],
27
+ "title_tesim": ["Collection Title"],
28
+ "description_tesim": ["Collection Description"],
29
+ "system_modified_dtsi": 'date',
30
+ "thumbnail_path_ss" => Hyrax::CollectionIndexer.thumbnail_path_service.default_image }
31
+ end
32
+ let(:doc) { SolrDocument.new(attributes) }
33
+ let(:current_ability) { Ability.new(build(:user)) }
34
+
35
+ before do
36
+ render 'catalog/thumbnail_list_collection', document: doc
37
+ end
38
+
39
+ it 'displays the collection icon in the search results' do
40
+ expect(rendered).to include '/assets/collection-'
41
+ end
9
42
  end
10
43
  end
@@ -7,7 +7,7 @@ RSpec.describe 'hyrax/base/_attributes.html.erb' do
7
7
  let(:solr_document) { SolrDocument.new(attributes) }
8
8
  let(:attributes) do
9
9
  {
10
- Solrizer.solr_name('has_model', :symbol) => ["GenericWork"],
10
+ ActiveFedora.index_field_mapper.solr_name('has_model', :symbol) => ["GenericWork"],
11
11
  subject_tesim: subject,
12
12
  contributor_tesim: contributor,
13
13
  creator_tesim: creator,
@@ -15,7 +15,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
15
15
  before do
16
16
  allow(presenter).to receive(:show_deposit_for?).with(anything).and_return(false)
17
17
  allow(presenter).to receive(:editor?).and_return(false)
18
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
18
+ render 'hyrax/base/show_actions', presenter: presenter
19
19
  end
20
20
  it "doesn't show edit / delete / Add to collection links" do
21
21
  expect(rendered).not_to have_link 'Edit'
@@ -32,7 +32,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
32
32
  context "when the work does not contain children" do
33
33
  before do
34
34
  allow(presenter).to receive(:member_presenters).and_return([])
35
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
35
+ render 'hyrax/base/show_actions', presenter: presenter
36
36
  end
37
37
  it "does not show file manager link" do
38
38
  expect(rendered).not_to have_link 'File Manager'
@@ -46,7 +46,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
46
46
  context "when the work contains 1 child" do
47
47
  before do
48
48
  allow(presenter).to receive(:member_presenters).and_return([member])
49
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
49
+ render 'hyrax/base/show_actions', presenter: presenter
50
50
  end
51
51
  it "does not show file manager link" do
52
52
  expect(rendered).not_to have_link 'File Manager'
@@ -60,7 +60,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
60
60
 
61
61
  before do
62
62
  allow(presenter).to receive(:member_presenters).and_return([member, file_member])
63
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
63
+ render 'hyrax/base/show_actions', presenter: presenter
64
64
  end
65
65
  it "shows file manager link" do
66
66
  expect(rendered).to have_link 'File Manager'
@@ -70,7 +70,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
70
70
  context "when there are valid_child_concerns" do
71
71
  before do
72
72
  allow(presenter).to receive(:member_presenters).and_return([])
73
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
73
+ render 'hyrax/base/show_actions', presenter: presenter
74
74
  end
75
75
  it "creates a link to add child work" do
76
76
  expect(rendered).to have_link 'Attach Generic Work', href: "/concern/parent/#{presenter.id}/generic_works/new"
@@ -87,7 +87,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
87
87
  context "and user is editor" do
88
88
  before do
89
89
  allow(presenter).to receive(:editor?).and_return(true)
90
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
90
+ render 'hyrax/base/show_actions', presenter: presenter
91
91
  end
92
92
 
93
93
  it "shows editor related buttons" do
@@ -101,7 +101,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
101
101
  context "and user is viewer" do
102
102
  before do
103
103
  allow(presenter).to receive(:editor?).and_return(false)
104
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
104
+ render 'hyrax/base/show_actions', presenter: presenter
105
105
  end
106
106
  it "shows only Add to collection link" do
107
107
  expect(rendered).not_to have_link 'File Manager'
@@ -121,7 +121,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
121
121
  context "and user is editor" do
122
122
  before do
123
123
  allow(presenter).to receive(:editor?).and_return(true)
124
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
124
+ render 'hyrax/base/show_actions', presenter: presenter
125
125
  end
126
126
 
127
127
  it "shows editor related buttons" do
@@ -135,7 +135,7 @@ RSpec.describe 'hyrax/base/_show_actions.html.erb', type: :view do
135
135
  context "and user is viewer" do
136
136
  before do
137
137
  allow(presenter).to receive(:editor?).and_return(false)
138
- render 'hyrax/base/show_actions.html.erb', presenter: presenter
138
+ render 'hyrax/base/show_actions', presenter: presenter
139
139
  end
140
140
 
141
141
  it "shows only Add to collection link" do
@@ -9,6 +9,7 @@ RSpec.describe 'hyrax/base/show.html.erb', type: :view do
9
9
  description_tesim: ['Lorem ipsum lorem ipsum.'],
10
10
  keyword_tesim: ['bacon', 'sausage', 'eggs'],
11
11
  rights_statement_tesim: ['http://example.org/rs/1'],
12
+ rights_notes_tesim: ['Notes on the rights'],
12
13
  date_created_tesim: ['1984-01-02'])
13
14
  end
14
15
 
@@ -62,7 +63,7 @@ RSpec.describe 'hyrax/base/show.html.erb', type: :view do
62
63
  stub_template 'hyrax/base/_workflow_actions_widget.html.erb' => ''
63
64
  stub_template '_masthead.html.erb' => ''
64
65
  assign(:presenter, presenter)
65
- render template: 'hyrax/base/show.html.erb', layout: 'layouts/hyrax/1_column'
66
+ render template: 'hyrax/base/show', layout: 'layouts/hyrax/1_column'
66
67
  end
67
68
 
68
69
  it 'shows workflow badge' do
@@ -72,7 +73,7 @@ RSpec.describe 'hyrax/base/show.html.erb', type: :view do
72
73
  describe 'IIIF viewer integration' do
73
74
  before do
74
75
  allow(presenter).to receive(:iiif_viewer?).and_return(viewer_enabled)
75
- render template: 'hyrax/base/show.html.erb'
76
+ render template: 'hyrax/base/show'
76
77
  end
77
78
 
78
79
  context 'when presenter says it is enabled' do
@@ -15,15 +15,16 @@ RSpec.describe 'hyrax/collections/_show_document_list_row.html.erb', type: :view
15
15
  context 'when not logged in' do
16
16
  before do
17
17
  view.blacklight_config = Blacklight::Configuration.new
18
+ assign(:presenter, collection)
18
19
  allow(view).to receive(:current_user).and_return(nil)
19
20
  allow(work).to receive(:title_or_label).and_return("One Hundred Years of Solitude")
20
21
  allow(work).to receive(:edit_people).and_return([])
21
- allow(view).to receive(:render_collection_links).and_return("collections: #{collection.title}")
22
+ allow(view).to receive(:render_other_collection_links).and_return([])
22
23
  end
23
24
 
24
25
  it "renders collections links" do
25
26
  render('hyrax/collections/show_document_list_row.html.erb', document: work)
26
- expect(rendered).to have_content 'My awesome collection'
27
+ expect(rendered).not_to have_content 'My awesome collection'
27
28
  end
28
29
 
29
30
  it "renders works" do
@@ -15,15 +15,16 @@ RSpec.describe 'hyrax/dashboard/collections/_show_document_list_row.html.erb', t
15
15
  context 'when not logged in' do
16
16
  before do
17
17
  view.blacklight_config = Blacklight::Configuration.new
18
+ assign(:presenter, collection)
18
19
  allow(view).to receive(:current_user).and_return(nil)
19
20
  allow(work).to receive(:title_or_label).and_return("One Hundred Years of Solitude")
20
21
  allow(work).to receive(:edit_people).and_return([])
21
- allow(view).to receive(:render_collection_links).and_return("collections: #{collection.title}")
22
+ allow(view).to receive(:render_other_collection_links).and_return([])
22
23
  end
23
24
 
24
25
  it "renders collections links" do
25
26
  render('show_document_list_row', document: work)
26
- expect(rendered).to have_content 'My awesome collection'
27
+ expect(rendered).not_to have_content 'My awesome collection'
27
28
  end
28
29
 
29
30
  it "renders works" do
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'wings'
4
+ require 'wings/active_fedora_converter'
5
+
6
+ RSpec.describe Wings::ActiveFedoraConverter do
7
+ subject(:converter) { described_class.new(resource: resource) }
8
+ let(:adapter) { Valkyrie::Persistence::Memory::MetadataAdapter.new }
9
+ let(:attributes) { { id: id } }
10
+ let(:id) { 'moomin_id' }
11
+ let(:resource) { work.valkyrie_resource }
12
+ let(:work) { GenericWork.new(attributes) }
13
+
14
+ describe '#convert' do
15
+ it 'returns the ActiveFedora model' do
16
+ expect(converter.convert).to eq work
17
+ end
18
+
19
+ context 'with attributes' do
20
+ let(:attributes) do
21
+ FactoryBot.attributes_for(:generic_work)
22
+ end
23
+
24
+ it 'repopulates the attributes' do
25
+ expect(converter.convert).to have_attributes(attributes)
26
+ end
27
+
28
+ it 'populates reflections'
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,288 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'wings/model_transformer'
4
+
5
+ RSpec.describe Wings::ModelTransformer do
6
+ subject(:factory) { described_class.new(pcdm_object: pcdm_object) }
7
+ let(:pcdm_object) { work }
8
+ let(:adapter) { Valkyrie::MetadataAdapter.find(:memory) }
9
+ let(:id) { 'moomin123' }
10
+ let(:persister) { adapter.persister }
11
+ let(:work) { GenericWork.new(id: id, **attributes) }
12
+
13
+ let(:uris) do
14
+ [RDF::URI('http://example.com/fake1'),
15
+ RDF::URI('http://example.com/fake2')]
16
+ end
17
+
18
+ let(:attributes) do
19
+ {
20
+ title: ['fake title'],
21
+ date_created: [Time.now.utc],
22
+ depositor: 'user1',
23
+ description: ['a description'],
24
+ import_url: uris.first,
25
+ publisher: [false],
26
+ related_url: uris,
27
+ source: [1.125, :moomin]
28
+ }
29
+ end
30
+
31
+ before(:context) do
32
+ Valkyrie::MetadataAdapter.register(
33
+ Valkyrie::Persistence::Memory::MetadataAdapter.new,
34
+ :memory
35
+ )
36
+
37
+ Valkyrie::StorageAdapter.register(
38
+ Valkyrie::Storage::Memory.new,
39
+ :memory
40
+ )
41
+ end
42
+
43
+ # TODO: extract to Valkyrie?
44
+ define :have_a_valkyrie_alternate_id_of do |expected_id_str|
45
+ match do |valkyrie_resource|
46
+ valkyrie_resource.alternate_ids.map(&:id).include?(expected_id_str)
47
+ end
48
+ end
49
+
50
+ describe '.convert_class_name_to_valkyrie_resource_class' do
51
+ context 'when given a ActiveFedora class name (eg. a constant that responds to #properties)' do
52
+ it 'creates a Valkyrie::Resource class' do
53
+ subject = described_class.convert_class_name_to_valkyrie_resource_class('GenericWork')
54
+ expect(subject.new).to be_a Valkyrie::Resource
55
+ end
56
+ end
57
+ end
58
+
59
+ describe '.to_valkyrie_resource_class' do
60
+ context 'when given a ActiveFedora class (eg. a constant that responds to #properties)' do
61
+ context 'for the returned object (e.g. a class)' do
62
+ subject { described_class.to_valkyrie_resource_class(klass: GenericWork) }
63
+ it 'will be Valkyrie::Resource build' do
64
+ expect(subject.new).to be_a Valkyrie::Resource
65
+ end
66
+ it 'has a to_s instance that delegates to the given klass' do
67
+ expect(subject.to_s).to eq(GenericWork.to_s)
68
+ end
69
+ it 'has a internal_resource instance that is the given klass' do
70
+ expect(subject.internal_resource).to eq(GenericWork)
71
+ end
72
+ end
73
+ end
74
+ context 'when given a non-ActiveFedora class' do
75
+ it 'raises an exception' do
76
+ expect { described_class.to_valkyrie_resource_class(klass: String) }.to raise_error
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '.for' do
82
+ it 'returns a Valkyrie::Resource' do
83
+ expect(described_class.for(work)).to be_a Valkyrie::Resource
84
+ end
85
+ end
86
+
87
+ describe '#build' do
88
+ it 'returns a Valkyrie::Resource' do
89
+ expect(factory.build).to be_a Valkyrie::Resource
90
+ end
91
+
92
+ it 'has the id of the pcdm_object' do
93
+ expect(factory.build).to have_a_valkyrie_alternate_id_of work.id
94
+ end
95
+
96
+ it 'has attributes matching the pcdm_object' do
97
+ expect(factory.build)
98
+ .to have_attributes title: work.title,
99
+ date_created: work.date_created,
100
+ depositor: work.depositor,
101
+ description: work.description
102
+ end
103
+
104
+ it 'round trips attributes' do # rubocop:disable RSpec/ExampleLength
105
+ persister.save(resource: factory.build)
106
+
107
+ expect(adapter.query_service.find_by_alternate_identifier(alternate_identifier: work.id))
108
+ .to have_attributes title: work.title,
109
+ date_created: work.date_created,
110
+ depositor: work.depositor,
111
+ description: work.description,
112
+ import_url: work.import_url,
113
+ publisher: work.publisher,
114
+ related_url: work.related_url,
115
+ source: work.source
116
+ end
117
+ end
118
+
119
+ context 'with relationship properties' do
120
+ let(:pcdm_object) { book }
121
+ let(:id) { 'moomin123' }
122
+ let(:book) { book_class.new(id: id, **attributes) }
123
+ let(:page1) { page_class.new(id: 'pg1') }
124
+ let(:page2) { page_class.new(id: 'pg2') }
125
+
126
+ let(:book_class) do
127
+ Book = Class.new(ActiveFedora::Base) do
128
+ has_many :pages
129
+ property :title, predicate: ::RDF::Vocab::DC.title
130
+ property :contributor, predicate: ::RDF::Vocab::DC.contributor
131
+ property :description, predicate: ::RDF::Vocab::DC.description
132
+ end
133
+ end
134
+
135
+ let(:page_class) do
136
+ Page = Class.new(ActiveFedora::Base) do
137
+ belongs_to :book_with_pages, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.isPartOf
138
+ end
139
+ end
140
+
141
+ after do
142
+ Object.send(:remove_const, :Page)
143
+ Object.send(:remove_const, :Book)
144
+ end
145
+
146
+ let(:attributes) do
147
+ {
148
+ title: ['fake title', 'fake title 2'],
149
+ contributor: ['user1'],
150
+ description: ['a description'],
151
+ pages: [page1, page2]
152
+ }
153
+ end
154
+
155
+ describe '.for' do
156
+ it 'returns a Valkyrie::Resource' do
157
+ expect(described_class.for(book)).to be_a Valkyrie::Resource
158
+ end
159
+ end
160
+
161
+ describe '#build' do
162
+ it 'returns a Valkyrie::Resource' do
163
+ expect(subject.build).to be_a Valkyrie::Resource
164
+ end
165
+
166
+ it 'has the id of the active_fedora_object' do
167
+ expect(subject.build).to have_a_valkyrie_alternate_id_of book.id
168
+ end
169
+
170
+ it 'has attributes matching the active_fedora_object' do
171
+ expect(subject.build)
172
+ .to have_attributes title: book.title,
173
+ contributor: book.contributor,
174
+ description: book.description
175
+ expect_ids_to_match(subject.build.page_ids, ['pg1', 'pg2'])
176
+ end
177
+ end
178
+ end
179
+
180
+ context 'for PCDM & Hydra-Works models', :clean_repo do
181
+ let(:collection1) { build(:public_collection_lw, id: 'col1', title: ['Collection 1']) }
182
+ let(:collection2) { build(:public_collection_lw, id: 'col2', title: ['Collection 2']) }
183
+ let(:collection3) { build(:public_collection_lw, id: 'col3', title: ['Collection 3']) }
184
+ let(:work1) { build(:work, id: 'wk1', title: ['Work 1']) }
185
+ let(:work2) { build(:work, id: 'wk2', title: ['Work 2']) }
186
+ let(:work3) { build(:work, id: 'wk3', title: ['Work 3']) }
187
+ let(:fileset1) { build(:file_set, id: 'fs1', title: ['Fileset 1']) }
188
+ let(:fileset2) { build(:file_set, id: 'fs2', title: ['Fileset 2']) }
189
+
190
+ describe '#build' do
191
+ context 'for parent collection' do
192
+ before do
193
+ collection1.members = [work1, work2, collection2, collection3]
194
+ collection1.save!
195
+ end
196
+
197
+ let(:pcdm_object) { collection1 }
198
+
199
+ it 'returns a Valkyrie::Resource' do
200
+ expect(subject.build).to be_a Valkyrie::Resource
201
+ end
202
+
203
+ it 'has the id of the active_fedora_object' do
204
+ expect(subject.build).to have_a_valkyrie_alternate_id_of collection1.id
205
+ end
206
+
207
+ it 'has attributes for the PCDM model' do
208
+ expect(subject.build)
209
+ .to have_attributes title: collection1.title
210
+ expect_ids_to_match(subject.build.member_ids, [work1.id, work2.id, collection2.id, collection3.id])
211
+ end
212
+ end
213
+
214
+ context 'for child collection' do
215
+ let(:pcdm_object) { collection3 }
216
+
217
+ before do
218
+ collection3.member_of_collections = [collection1, collection2]
219
+ collection3.save!
220
+ end
221
+
222
+ it 'returns a Valkyrie::Resource' do
223
+ expect(subject.build).to be_a Valkyrie::Resource
224
+ end
225
+
226
+ it 'has the id of the active_fedora_object' do ###
227
+ expect(subject.build).to have_a_valkyrie_alternate_id_of collection3.id
228
+ end
229
+
230
+ it 'has attributes matching the active_fedora_object' do
231
+ expect(subject.build)
232
+ .to have_attributes title: collection3.title
233
+ expect_ids_to_match(subject.build.member_of_collection_ids, ['col1', 'col2'])
234
+ end
235
+ end
236
+
237
+ context 'for work in collection' do
238
+ let(:pcdm_object) { work1 }
239
+
240
+ before do
241
+ work1.member_of_collections = [collection1, collection2]
242
+ work1.save!
243
+ end
244
+
245
+ it 'returns a Valkyrie::Resource' do
246
+ expect(subject.build).to be_a Valkyrie::Resource
247
+ end
248
+
249
+ it 'has the id of the active_fedora_object' do ###
250
+ expect(subject.build).to have_a_valkyrie_alternate_id_of work1.id
251
+ end
252
+
253
+ it 'has attributes matching the active_fedora_object' do
254
+ expect(subject.build)
255
+ .to have_attributes title: work1.title
256
+ expect_ids_to_match(subject.build.member_of_collection_ids, ['col1', 'col2'])
257
+ end
258
+ end
259
+
260
+ context 'work with works and filesets' do
261
+ let(:pcdm_object) { work1 }
262
+
263
+ before do
264
+ work1.members = [work2, work3, fileset1, fileset2]
265
+ work1.save!
266
+ end
267
+
268
+ it 'returns a Valkyrie::Resource' do
269
+ expect(subject.build).to be_a Valkyrie::Resource
270
+ end
271
+
272
+ it 'has the id of the active_fedora_object' do ###
273
+ expect(subject.build).to have_a_valkyrie_alternate_id_of work1.id
274
+ end
275
+
276
+ it 'has attributes matching the active_fedora_object' do
277
+ expect(subject.build)
278
+ .to have_attributes title: work1.title
279
+ expect_ids_to_match(subject.build.member_ids, [work2.id, work3.id, fileset1.id, fileset2.id])
280
+ end
281
+ end
282
+ end
283
+ end
284
+
285
+ def expect_ids_to_match(valkyrie_ids, expected_ids)
286
+ expect(valkyrie_ids.map(&:id)).to match_array expected_ids
287
+ end
288
+ end