hyrax 2.1.0.rc1 → 2.1.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CONTRIBUTING.md +6 -6
  3. data/README.md +18 -8
  4. data/app/assets/javascripts/hyrax/app.js.erb +1 -1
  5. data/app/assets/javascripts/hyrax/collections.js +16 -13
  6. data/app/assets/javascripts/hyrax/monkey_patch_turbolinks.js.coffee +12 -0
  7. data/app/assets/stylesheets/hyrax/dashboard.scss +4 -0
  8. data/app/controllers/hyrax/dashboard/collections_controller.rb +4 -7
  9. data/app/controllers/hyrax/my_controller.rb +1 -0
  10. data/app/helpers/hyrax/collections_helper.rb +9 -0
  11. data/app/models/sipity/workflow.rb +6 -7
  12. data/app/presenters/hyrax/work_show_presenter.rb +4 -1
  13. data/app/services/hyrax/adapters/nesting_index_adapter.rb +1 -0
  14. data/app/services/hyrax/collection_types/create_service.rb +2 -2
  15. data/app/services/hyrax/file_set_fixity_check_service.rb +1 -1
  16. data/app/views/hyrax/dashboard/collections/_form.html.erb +1 -1
  17. data/app/views/hyrax/dashboard/collections/_form_for_select_collection.html.erb +11 -6
  18. data/app/views/hyrax/dashboard/collections/_modal_parent_collection_remove_deny.html.erb +14 -0
  19. data/app/views/hyrax/dashboard/collections/_show_add_items_actions.html.erb +1 -1
  20. data/app/views/hyrax/dashboard/collections/_show_parent_collection_row.html.erb +11 -1
  21. data/app/views/hyrax/dashboard/collections/show.html.erb +1 -0
  22. data/app/views/hyrax/my/collections/_modal_collection_types_to_create.html.erb +1 -1
  23. data/app/views/hyrax/my/collections/index.html.erb +8 -2
  24. data/app/views/hyrax/my/works/_tabs.html.erb +1 -2
  25. data/app/views/hyrax/my/works/index.html.erb +11 -0
  26. data/config/locales/hyrax.de.yml +19 -8
  27. data/config/locales/hyrax.en.yml +14 -3
  28. data/config/locales/hyrax.es.yml +13 -2
  29. data/config/locales/hyrax.fr.yml +13 -2
  30. data/config/locales/hyrax.it.yml +13 -2
  31. data/config/locales/hyrax.pt-BR.yml +13 -2
  32. data/config/locales/hyrax.zh.yml +13 -2
  33. data/hyrax.gemspec +1 -1
  34. data/lib/generators/hyrax/templates/db/migrate/20170810190549_update_collection_type_column_options.rb.erb +9 -1
  35. data/lib/hyrax/version.rb +1 -1
  36. data/spec/controllers/hyrax/dashboard/collections_controller_spec.rb +2 -3
  37. data/spec/features/collection_multi_membership_spec.rb +32 -33
  38. data/spec/features/dashboard/all_works.rb +2 -1
  39. data/spec/features/dashboard/collection_spec.rb +35 -13
  40. data/spec/features/work_show_spec.rb +6 -6
  41. data/spec/helpers/hyrax/collections_helper_spec.rb +16 -0
  42. data/spec/models/sipity/workflow_spec.rb +9 -0
  43. data/spec/presenters/hyrax/work_show_presenter_spec.rb +2 -2
  44. data/spec/services/hyrax/adapters/nesting_index_adapter_spec.rb +7 -3
  45. data/spec/services/hyrax/collection_types/create_service_spec.rb +2 -2
  46. data/spec/services/hyrax/collections_service_spec.rb +1 -1
  47. data/spec/services/hyrax/file_set_fixity_check_service_spec.rb +13 -0
  48. data/spec/spec_helper.rb +1 -0
  49. data/spec/support/optional_example.rb +16 -0
  50. data/spec/support/selectors.rb +15 -1
  51. data/spec/views/hyrax/dashboard/collections/_form_for_select_collection.html.erb_spec.rb +13 -21
  52. data/spec/views/hyrax/dashboard/collections/_show_add_items_actions.html.erb_spec.rb +5 -3
  53. data/spec/views/hyrax/dashboard/collections/_show_parent_collection_row.html.erb_spec.rb +35 -15
  54. data/spec/views/hyrax/my/collections/index.html.erb_spec.rb +34 -0
  55. data/spec/views/hyrax/my/works/index.html.erb_spec.rb +3 -0
  56. data/template.rb +1 -1
  57. metadata +15 -4
@@ -1,4 +1,4 @@
1
- RSpec.describe "As an admin user I should be able to see all works" do
1
+ RSpec.describe "As an admin user I should be able to see all works", :clean_repo do
2
2
  let!(:work1) { create(:work, title: ['Testing #1'], admin_set: adminset, member_of_collections: [collection]) }
3
3
  let!(:work2) { create(:work, title: ['Testing #2'], admin_set: adminset, member_of_collections: [collection]) }
4
4
  let(:collection) { build(:collection_lw, with_solr_document: true) }
@@ -18,5 +18,6 @@ RSpec.describe "As an admin user I should be able to see all works" do
18
18
  expect(page).to have_link(collection.title.first, class: 'facet_select')
19
19
  expect(page).to have_button('Admin Set')
20
20
  expect(page).to have_link(adminset.title.first, class: 'facet_select')
21
+ expect(page).to have_content("2 works in the repository")
21
22
  end
22
23
  end
@@ -36,7 +36,7 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
36
36
  visit '/dashboard/my/collections'
37
37
  end
38
38
 
39
- it "has page title, does not have tabs, and lists only user's collections" do
39
+ it "has page title, does not have tabs, lists only user's collections, and displays number of collections in the respository" do
40
40
  expect(page).to have_content 'Collections'
41
41
  expect(page).not_to have_link 'All Collections'
42
42
  within('section.tabs-row') do
@@ -47,6 +47,7 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
47
47
  expect(page).to have_link(admin_set_b.title.first)
48
48
  expect(page).not_to have_link(collection3.title.first)
49
49
  expect(page).not_to have_link(admin_set_a.title.first)
50
+ expect(page).to have_content("3 collections you own in the repository")
50
51
  end
51
52
 
52
53
  it "has collection type and visibility filters" do
@@ -256,6 +257,11 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
256
257
  expect(page).to have_content title
257
258
  expect(page).to have_content description
258
259
  end
260
+
261
+ it "has properly formed collection type buttons" do
262
+ expect(page).not_to have_selector("input[data-path$='collections/new&collection_type_id=1']")
263
+ expect(page).to have_selector("input[data-path$='collections/new?locale=en&collection_type_id=1']")
264
+ end
259
265
  end
260
266
 
261
267
  context 'when user can create collections of one type' do
@@ -357,7 +363,9 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
357
363
 
358
364
  context 'and collection is empty' do
359
365
  it 'and user confirms delete, deletes the collection', :js do
360
- expect(page).to have_content(empty_collection.title.first)
366
+ within("table#collections-list-table") do
367
+ expect(page).to have_content(empty_collection.title.first)
368
+ end
361
369
  check_tr_data_attributes(empty_collection.id, 'collection')
362
370
  # check that modal data attributes haven't been added yet
363
371
  expect(page).not_to have_selector("div[data-id='#{empty_collection.id}']")
@@ -370,11 +378,15 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
370
378
  within("div#collection-empty-to-delete-modal") do
371
379
  click_button('Delete')
372
380
  end
373
- expect(page).not_to have_content(empty_collection.title.first)
381
+ within("table#collections-list-table") do
382
+ expect(page).not_to have_content(empty_collection.title.first)
383
+ end
374
384
  end
375
385
 
376
386
  it 'and user cancels, does NOT delete the collection', :js do
377
- expect(page).to have_content(empty_collection.title.first)
387
+ within("table#collections-list-table") do
388
+ expect(page).to have_content(collection.title.first)
389
+ end
378
390
  check_tr_data_attributes(empty_collection.id, 'collection')
379
391
  # check that modal data attributes haven't been added yet
380
392
  expect(page).not_to have_selector("div[data-id='#{empty_collection.id}']")
@@ -388,13 +400,17 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
388
400
  within("div#collection-empty-to-delete-modal") do
389
401
  click_button('Cancel')
390
402
  end
391
- expect(page).to have_content(empty_collection.title.first)
403
+ within("table#collections-list-table") do
404
+ expect(page).to have_content(collection.title.first)
405
+ end
392
406
  end
393
407
  end
394
408
 
395
409
  context 'and collection is not empty' do
396
410
  it 'and user confirms delete, deletes the collection', :js do
397
- expect(page).to have_content(collection.title.first)
411
+ within("table#collections-list-table") do
412
+ expect(page).to have_content(collection.title.first)
413
+ end
398
414
  check_tr_data_attributes(collection.id, 'collection')
399
415
  within("#document_#{collection.id}") do
400
416
  first('button.dropdown-toggle').click
@@ -405,11 +421,15 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
405
421
  within("div#collection-to-delete-modal") do
406
422
  find('button.modal-delete-button').click
407
423
  end
408
- expect(page).not_to have_content(collection.title.first)
424
+ within("table#collections-list-table") do
425
+ expect(page).not_to have_content(collection.title.first)
426
+ end
409
427
  end
410
428
 
411
429
  it 'and user cancels, does NOT delete the collection', :js do
412
- expect(page).to have_content(collection.title.first)
430
+ within("table#collections-list-table") do
431
+ expect(page).to have_content(collection.title.first)
432
+ end
413
433
  within("#document_#{collection.id}") do
414
434
  first('button.dropdown-toggle').click
415
435
  first('.itemtrash').click
@@ -419,7 +439,9 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
419
439
  within("div#collection-to-delete-modal") do
420
440
  click_button('Cancel')
421
441
  end
422
- expect(page).to have_content(collection.title.first)
442
+ within("table#collections-list-table") do
443
+ expect(page).to have_content(collection.title.first)
444
+ end
423
445
  end
424
446
  end
425
447
  end
@@ -611,15 +633,15 @@ RSpec.describe 'collection', type: :feature, clean_repo: true do
611
633
  click_link 'Add existing works'
612
634
  first('input#check_all').click
613
635
  click_button "Add to collection"
614
- expect(page).to have_css("input#id_#{collection1.id}[checked='checked']")
615
- expect(page).not_to have_css("input#id_#{collection2.id}[checked='checked']")
636
+ expect(page).to have_selector "#member_of_collection_ids[value=\"#{collection1.id}\"]", visible: false
637
+ expect(page).to have_selector "#member_of_collection_label[value=\"#{collection1.title.first}\"]"
616
638
 
617
639
  visit "/dashboard/collections/#{collection2.id}"
618
640
  click_link 'Add existing works'
619
641
  first('input#check_all').click
620
642
  click_button "Add to collection"
621
- expect(page).not_to have_css("input#id_#{collection1.id}[checked='checked']")
622
- expect(page).to have_css("input#id_#{collection2.id}[checked='checked']")
643
+ expect(page).to have_selector "#member_of_collection_ids[value=\"#{collection2.id}\"]", visible: false
644
+ expect(page).to have_selector "#member_of_collection_label[value=\"#{collection2.title.first}\"]"
623
645
 
624
646
  click_button "Save changes"
625
647
  expect(page).to have_content(work1.title.first)
@@ -1,4 +1,6 @@
1
1
  RSpec.describe "display a work as its owner" do
2
+ include Selectors::Dashboard
3
+
2
4
  let(:work_path) { "/concern/generic_works/#{work.id}" }
3
5
 
4
6
  before do
@@ -44,13 +46,11 @@ RSpec.describe "display a work as its owner" do
44
46
  expect(find('div.viewer:first')['data-uri']).to eq "/concern/generic_works/#{work.id}/manifest"
45
47
  end
46
48
 
47
- it "add work to a collection", js: true do
49
+ it "add work to a collection", clean_repo: true, js: true do
50
+ optional 'ability to get capybara to find css select2-result (see Issue #3038)' if ENV['TRAVIS']
48
51
  click_button "Add to collection" # opens the modal
49
- # since there is only one collection, it's not necessary to choose a radio button
50
- within('div#collection-list-container') do
51
- choose collection.title.first # selects the collection
52
- click_button 'Save changes'
53
- end
52
+ select_member_of_collection(collection)
53
+ click_button 'Save changes'
54
54
 
55
55
  # forwards to collection show page
56
56
  expect(page).to have_content collection.title.first
@@ -98,4 +98,20 @@ RSpec.describe Hyrax::CollectionsHelper do
98
98
  end
99
99
  end
100
100
  end
101
+
102
+ describe '#append_collection_type_url' do
103
+ let(:url) { "http://example.com" }
104
+ context "when a provided url has no querystring" do
105
+ it 'returns the url with added collection_type_id' do
106
+ expect(append_collection_type_url(url, '1')).to eq "#{url}?collection_type_id=1"
107
+ end
108
+ end
109
+
110
+ context "when a provided url has an existing querystring" do
111
+ let(:url) { "http://example.com?bob=ross" }
112
+ it 'return the url with added collection_type_id' do
113
+ expect(append_collection_type_url(url, '1')).to eq "#{url}&collection_type_id=1"
114
+ end
115
+ end
116
+ end
101
117
  end
@@ -22,6 +22,15 @@ module Sipity
22
22
  let!(:other_permission_template) { create(:permission_template) }
23
23
  let!(:active_workflow) { create(:workflow, active: true, permission_template_id: permission_template.id) }
24
24
 
25
+ context 'selecting already active workflow' do
26
+ it 'makes no change' do
27
+ inactive_workflow = create(:workflow, permission_template_id: permission_template.id)
28
+ described_class.activate!(permission_template: permission_template, workflow_id: active_workflow.id)
29
+ expect(active_workflow.reload).to be_active
30
+ expect(inactive_workflow.reload).not_to be_active
31
+ end
32
+ end
33
+
25
34
  it 'raises an exception if you do not pass a workflow_id nor workflow_name' do
26
35
  expect do
27
36
  described_class.activate!(permission_template: other_permission_template)
@@ -47,7 +47,7 @@ RSpec.describe Hyrax::WorkShowPresenter do
47
47
  let(:id_present) { false }
48
48
  let(:representative_presenter) { double('representative', present?: false) }
49
49
  let(:image_boolean) { false }
50
- let(:iiif_enabled) { false }
50
+ let(:iiif_enabled) { true }
51
51
  let(:file_set_presenter) { Hyrax::FileSetPresenter.new(solr_document, ability) }
52
52
  let(:file_set_presenters) { [file_set_presenter] }
53
53
  let(:read_permission) { true }
@@ -77,7 +77,7 @@ RSpec.describe Hyrax::WorkShowPresenter do
77
77
  context 'with non-image representative_presenter' do
78
78
  let(:id_present) { true }
79
79
  let(:representative_presenter) { double('representative', present?: true) }
80
- let(:image_boolean) { true }
80
+ let(:image_boolean) { false }
81
81
 
82
82
  it { is_expected.to be false }
83
83
  end
@@ -38,12 +38,16 @@ RSpec.describe Hyrax::Adapters::NestingIndexAdapter do
38
38
  describe '.find_index_document_by' do
39
39
  subject { described_class.find_index_document_by(id: id) }
40
40
 
41
- context 'with a not found id ' do
41
+ context 'with id not in solr, it builds from Fedora' do
42
42
  let(:id) { 'so-very-missing-no-document-here' }
43
+ let(:document) { double("Document", id: id, fetch: nil) }
44
+ let(:object) { double("Object_to_reindex", id: id, to_solr: document) }
43
45
 
44
- it 'raises RuntimeError' do
45
- expect { subject }.to raise_error(RuntimeError)
46
+ before do
47
+ allow(ActiveFedora::Base).to receive(:find).with(id).and_return(object)
46
48
  end
49
+
50
+ it { is_expected.to be_a(Samvera::NestingIndexer::Documents::IndexDocument) }
47
51
  end
48
52
 
49
53
  context 'with a found id' do
@@ -43,7 +43,7 @@ RSpec.describe Hyrax::CollectionTypes::CreateService do
43
43
  expect(ct.machine_id).to eq(Hyrax::CollectionType::ADMIN_SET_MACHINE_ID)
44
44
  expect(ct.title).to eq(Hyrax::CollectionType::ADMIN_SET_DEFAULT_TITLE)
45
45
  expect(ct.description).to eq('An aggregation of works that is intended to help with administrative control. Admin Sets provide a way of defining behaviors and policies around a set of works.')
46
- expect(ct.badge_color).to eq('#663333')
46
+ expect(ct.badge_color).to eq('#405060')
47
47
  expect(ct).not_to be_nestable
48
48
  expect(ct).not_to be_brandable
49
49
  expect(ct).not_to be_discoverable
@@ -63,7 +63,7 @@ RSpec.describe Hyrax::CollectionTypes::CreateService do
63
63
  expect(ct.machine_id).to eq(Hyrax::CollectionType::USER_COLLECTION_MACHINE_ID)
64
64
  expect(ct.title).to eq(Hyrax::CollectionType::USER_COLLECTION_DEFAULT_TITLE)
65
65
  expect(ct.description).to eq('A User Collection can be created by any user to organize their works.')
66
- expect(ct.badge_color).to eq('#663333')
66
+ expect(ct.badge_color).to eq('#705070')
67
67
  expect(ct).to be_nestable
68
68
  expect(ct).to be_brandable
69
69
  expect(ct).to be_discoverable
@@ -38,7 +38,7 @@ RSpec.describe Hyrax::CollectionsService do
38
38
  context "with read access" do
39
39
  let(:access) { :read }
40
40
 
41
- it "returns three collections" do
41
+ it "returns four collections" do
42
42
  expect(subject.map(&:id)).to match_array [collection1.id, collection2.id, collection3.id, collection4.id]
43
43
  end
44
44
  end
@@ -49,6 +49,19 @@ RSpec.describe Hyrax::FileSetFixityCheckService do
49
49
  specify 'returns a single result' do
50
50
  expect(subject.length).to eq(1)
51
51
  end
52
+ describe 'non-versioned file with latest version only' do
53
+ let(:service_by_object) { described_class.new(f, async_jobs: false, latest_version_only: true) }
54
+
55
+ before do
56
+ allow(f.original_file).to receive(:has_versions?).and_return(false)
57
+ end
58
+
59
+ subject { service_by_object.send(:fixity_check_file, f.original_file) }
60
+
61
+ specify 'returns a single result' do
62
+ expect(subject.length).to eq(1)
63
+ end
64
+ end
52
65
  end
53
66
 
54
67
  describe '#fixity_check_file_version' do
data/spec/spec_helper.rb CHANGED
@@ -226,6 +226,7 @@ RSpec.configure do |config|
226
226
  config.include Capybara::RSpecMatchers, type: :input
227
227
  config.include InputSupport, type: :input
228
228
  config.include FactoryBot::Syntax::Methods
229
+ config.include OptionalExample
229
230
 
230
231
  config.infer_spec_type_from_file_location!
231
232
 
@@ -0,0 +1,16 @@
1
+ module OptionalExample
2
+ RSpec.configure do |config|
3
+ config.after do |example|
4
+ if example.metadata[:optional] && (RSpec::Core::Pending::PendingExampleFixedError === example.display_exception) # rubocop:disable Style/CaseEquality
5
+ ex = example.display_exception
6
+ example.display_exception = nil
7
+ example.execution_result.pending_exception = ex
8
+ end
9
+ end
10
+ end
11
+
12
+ def optional(message)
13
+ RSpec.current_example.metadata[:optional] = true
14
+ pending(message)
15
+ end
16
+ end
@@ -21,7 +21,8 @@ module Selectors
21
21
  end
22
22
  end
23
23
 
24
- # For use with javascript collection selector that allows for searching for an existing collection.
24
+ # For use with javascript collection selector that allows for searching for an existing collection from works relationship tab.
25
+ # Adds the collection and validates that the collection is listed in the Collection Relationship table once added.
25
26
  # @param [Collection] collection to select
26
27
  def select_collection(collection)
27
28
  first('a.select2-choice').click
@@ -35,6 +36,19 @@ module Selectors
35
36
  end
36
37
  end
37
38
  end
39
+
40
+ # For use with javascript collection selector that allows for searching for an existing collection from add to collection modal.
41
+ # Does not save the selection. The calling test is expected to click Save and validate the collection membership was added to the work.
42
+ # @param [Collection] collection to select
43
+ def select_member_of_collection(collection)
44
+ find('#s2id_member_of_collection_ids').click
45
+ find('.select2-input').set(collection.title.first)
46
+ sleep 10
47
+ expect(page).to have_css('.select2-result')
48
+ within ".select2-result" do
49
+ find("span", text: collection.title.first).click
50
+ end
51
+ end
38
52
  end
39
53
 
40
54
  module NewTransfers
@@ -17,7 +17,7 @@ RSpec.describe 'hyrax/dashboard/collections/_form_for_select_collection.html.erb
17
17
  end
18
18
  end
19
19
 
20
- let(:doc) { Nokogiri::HTML(rendered) }
20
+ let(:page) { Capybara::Node::Simple.new(rendered) }
21
21
 
22
22
  before do
23
23
  # Stub route because view specs don't handle engine routes
@@ -27,29 +27,21 @@ RSpec.describe 'hyrax/dashboard/collections/_form_for_select_collection.html.erb
27
27
  allow(view).to receive(:user_collections).and_return(solr_collections)
28
28
  end
29
29
 
30
- it "sorts the collections" do
30
+ it "uses autocomplete" do
31
31
  render
32
- collection_ids = doc.xpath("//input[@class='collection-selector']/@id").map(&:to_s)
33
- expect(collection_ids).to eql(["id_1237", "id_1234", "id_1235", "id_1236"])
34
- expect(rendered).to have_selector("label", text: 'Title 1')
35
- expect(rendered).not_to have_selector("label", text: "[\"Title 1\"]")
32
+ expect(page).to have_selector('input[data-autocomplete-url="/authorities/search/collections?access=deposit"]')
36
33
  end
37
34
 
38
- it "selects the right collection when instructed to do so" do
39
- assign(:add_works_to_collection, collections[2][:id])
40
- render
41
- expect(rendered).not_to have_selector "#id_#{collections[0][:id]}[checked='checked']"
42
- expect(rendered).not_to have_selector "#id_#{collections[1][:id]}[checked='checked']"
43
- expect(rendered).not_to have_selector "#id_#{collections[3][:id]}[checked='checked']"
44
- expect(rendered).to have_selector "#id_#{collections[2][:id]}[checked='checked']"
45
- end
35
+ context 'when a collection is specified' do
36
+ let(:collection_id) { collections[2][:id] }
37
+ let(:collection_label) { collections[2]["title_tesim"] }
46
38
 
47
- it "selects the first collection when nothing else specified" do
48
- # first when sorted by create date, so not index 0
49
- render
50
- expect(rendered).not_to have_selector "#id_#{collections[0][:id]}[checked='checked']"
51
- expect(rendered).not_to have_selector "#id_#{collections[1][:id]}[checked='checked']"
52
- expect(rendered).not_to have_selector "#id_#{collections[2][:id]}[checked='checked']"
53
- expect(rendered).to have_selector "#id_#{collections[3][:id]}[checked='checked']"
39
+ it "selects the right collection when instructed to do so" do
40
+ assign(:add_works_to_collection, collection_id)
41
+ assign(:add_works_to_collection_label, collection_label)
42
+ render
43
+ expect(page).to have_selector "#member_of_collection_ids[value=\"#{collection_id}\"]", visible: false
44
+ expect(page).to have_selector "#member_of_collection_label", text: collection_label
45
+ end
54
46
  end
55
47
  end
@@ -1,5 +1,5 @@
1
1
  RSpec.describe 'hyrax/dashboard/collections/_show_add_items_actions.html.erb', type: :view do
2
- let(:presenter) { double('Hyrax::CollectionPresenter', solr_document: solr_document, id: '123') }
2
+ let(:presenter) { double('Hyrax::CollectionPresenter', solr_document: solr_document, id: '123', title: 'Collection 1') }
3
3
  let(:solr_document) { double('Solr Document') }
4
4
  let(:can_deposit) { true }
5
5
 
@@ -14,7 +14,8 @@ RSpec.describe 'hyrax/dashboard/collections/_show_add_items_actions.html.erb', t
14
14
 
15
15
  it 'renders add_existing_works_to_collection link' do
16
16
  render
17
- expect(rendered).to have_css(".btn[href='#{hyrax.my_works_path(add_works_to_collection: presenter.id)}']")
17
+ expect(rendered).to have_css(".btn[href='#{hyrax.my_works_path(add_works_to_collection: presenter.id,
18
+ add_works_to_collection_label: presenter.title)}']")
18
19
  end
19
20
  it 'renders add_new_work_to_collection link' do
20
21
  render
@@ -26,7 +27,8 @@ RSpec.describe 'hyrax/dashboard/collections/_show_add_items_actions.html.erb', t
26
27
 
27
28
  it 'does not render add_works_to_collection link' do
28
29
  render
29
- expect(rendered).not_to have_css(".actions-controls-collections .btn[href='#{hyrax.my_works_path(add_works_to_collection: presenter.id)}']")
30
+ expect(rendered).not_to have_css(".actions-controls-collections .btn[href='#{hyrax.my_works_path(add_works_to_collection: presenter.id,
31
+ add_works_to_collection_label: presenter.title)}']")
30
32
  end
31
33
  end
32
34
 
@@ -9,33 +9,53 @@ RSpec.describe 'hyrax/dashboard/collections/_show_parent_collection_row.html.erb
9
9
  let(:document) { SolrDocument.new(parent_collection_doc) }
10
10
  let(:subject) { render('show_parent_collection_row.html.erb', id: child_collection.id, document: document) }
11
11
 
12
- context 'when user can edit the parent collection' do
12
+ context 'when user cannot edit the child collection' do
13
13
  before do
14
+ allow(view).to receive(:can?).with(:edit, child_collection.id).and_return(false)
14
15
  allow(view).to receive(:can?).with(:edit, document.id).and_return(true)
15
16
  end
16
17
 
17
- it 'shows link to collection title and active remove button' do
18
+ it 'does shows link to collection title but not the remove button' do
18
19
  subject
19
20
  expect(rendered).to have_link(document.title.first)
20
- expect(rendered).to have_button("Remove")
21
- end
22
-
23
- it "renders the proper data attributes on list element" do
24
- expect(subject).to have_selector(:css, 'li[data-post-url="/dashboard/collections/123/remove_parent/999"]')
25
- expect(subject).to have_selector(:css, 'li[data-id="123"]')
26
- expect(subject).to have_selector(:css, 'li[data-parent-id="999"]')
21
+ expect(rendered).not_to have_button("Remove")
22
+ expect(rendered).not_to have_link("Remove")
27
23
  end
28
24
  end
29
25
 
30
- context 'disable button if no edit permission' do
26
+ context 'when user can edit the child collection' do
31
27
  before do
32
- allow(view).to receive(:can?).with(:edit, document.id).and_return(false)
28
+ allow(view).to receive(:can?).with(:edit, child_collection.id).and_return(true)
33
29
  end
34
30
 
35
- it 'shows link to collection title and disabled remove button' do
36
- subject
37
- expect(rendered).to have_link(document.title.first)
38
- expect(rendered).to have_button("Remove", disabled: true)
31
+ context 'and user can edit the parent collection' do
32
+ before do
33
+ allow(view).to receive(:can?).with(:edit, document.id).and_return(true)
34
+ end
35
+
36
+ it 'shows link to collection title and active remove button' do
37
+ subject
38
+ expect(rendered).to have_link(document.title.first)
39
+ expect(rendered).to have_button("Remove")
40
+ end
41
+
42
+ it "renders the proper data attributes on list element" do
43
+ expect(subject).to have_selector(:css, 'li[data-post-url="/dashboard/collections/123/remove_parent/999"]')
44
+ expect(subject).to have_selector(:css, 'li[data-id="123"]')
45
+ expect(subject).to have_selector(:css, 'li[data-parent-id="999"]')
46
+ end
47
+ end
48
+
49
+ context 'and user cannot edit the parent collection' do
50
+ before do
51
+ allow(view).to receive(:can?).with(:edit, document.id).and_return(false)
52
+ end
53
+
54
+ it 'shows link to collection title and active remove link' do
55
+ subject
56
+ expect(rendered).to have_link(document.title.first)
57
+ expect(rendered).to have_link("Remove")
58
+ end
39
59
  end
40
60
  end
41
61
  end