sufia 7.0.0 → 7.1.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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -7
  3. data/app/assets/javascripts/sufia.js +3 -4
  4. data/app/assets/javascripts/sufia/app.js +8 -0
  5. data/app/assets/javascripts/sufia/relationships.js +2 -0
  6. data/app/assets/javascripts/sufia/relationships/table.es6 +206 -0
  7. data/app/assets/javascripts/sufia/relationships/table_row.es6 +79 -0
  8. data/app/assets/javascripts/sufia/save_work/save_work_control.es6 +3 -0
  9. data/app/assets/javascripts/sufia/save_work/uploaded_files.es6 +5 -0
  10. data/app/forms/sufia/forms/batch_edit_form.rb +2 -2
  11. data/app/forms/sufia/forms/work_form.rb +13 -1
  12. data/app/presenters/sufia/work_show_presenter.rb +11 -0
  13. data/app/views/curation_concerns/base/_form_child_work_relationships.html.erb +65 -0
  14. data/app/views/curation_concerns/base/_form_progress.html.erb +3 -1
  15. data/app/views/curation_concerns/base/_form_relationships.html.erb +11 -2
  16. data/app/views/curation_concerns/base/_metadata.html.erb +2 -2
  17. data/app/views/curation_concerns/base/_relationships.html.erb +7 -22
  18. data/app/views/curation_concerns/base/_relationships_member_rows.html.erb +24 -0
  19. data/app/views/curation_concerns/base/_relationships_parent_row.html.erb +16 -0
  20. data/app/views/curation_concerns/base/_relationships_parent_row_empty.html.erb +6 -0
  21. data/app/views/curation_concerns/base/_relationships_parent_rows.html.erb +23 -0
  22. data/app/views/curation_concerns/file_sets/_actions.html.erb +1 -1
  23. data/app/views/curation_concerns/file_sets/_show_actions.html.erb +8 -9
  24. data/app/views/curation_concerns/file_sets/_single_use_link_rows.html.erb +19 -0
  25. data/app/views/curation_concerns/file_sets/_single_use_links.html.erb +10 -0
  26. data/app/views/curation_concerns/file_sets/show.html.erb +1 -0
  27. data/app/views/records/edit_fields/_in_works_ids.html.erb +59 -0
  28. data/config/locales/sufia.en.yml +22 -3
  29. data/lib/generators/sufia/templates/config/sufia.rb +5 -0
  30. data/lib/sufia/configuration.rb +6 -0
  31. data/lib/sufia/engine.rb +0 -2
  32. data/lib/sufia/version.rb +1 -1
  33. data/spec/features/search_spec.rb +7 -2
  34. data/spec/forms/sufia/forms/work_form_spec.rb +20 -0
  35. data/spec/javascripts/helpers/test_fixtures.js.coffee +9 -0
  36. data/spec/javascripts/helpers/test_responses.js +10 -5
  37. data/spec/javascripts/relationships_table_spec.js.coffee +83 -0
  38. data/spec/javascripts/save_work_spec.js +4 -2
  39. data/spec/javascripts/support/jasmine.yml +1 -1
  40. data/spec/javascripts/uploaded_files_spec.js +23 -0
  41. data/spec/views/batch_edits/edit.html.erb_spec.rb +1 -1
  42. data/spec/views/catalog/index.html.erb_spec.rb +0 -4
  43. data/spec/views/curation_concerns/base/_form_child_work_relationships.html.erb_spec.rb +113 -0
  44. data/spec/views/curation_concerns/base/_relationships.html.erb_spec.rb +89 -3
  45. data/spec/views/curation_concerns/file_sets/_single_use_links.html.erb_spec.rb +32 -0
  46. data/spec/views/curation_concerns/file_sets/show.html.erb_spec.rb +4 -0
  47. data/spec/views/records/edit_fields/_in_works_ids.html.erb_spec.rb +113 -0
  48. data/sufia.gemspec +1 -2
  49. metadata +35 -21
  50. data/app/assets/javascripts/sufia/single_use_link.js +0 -30
  51. data/spec/javascripts/single_use_link_spec.js.coffee +0 -21
@@ -75,6 +75,11 @@ Sufia.config do |config|
75
75
  # The default is true.
76
76
  # config.active_deposit_agreement_acceptance = true
77
77
 
78
+ # Should work creation require file upload, or can a work be created first
79
+ # and a file added at a later time?
80
+ # The default is true.
81
+ # config.work_requires_files = true
82
+
78
83
  # Should a button with "Share my work" show on the front page to all users (even those not logged in)?
79
84
  # config.always_display_share_button = true
80
85
 
@@ -63,6 +63,12 @@ module Sufia
63
63
  @active_deposit_agreement_acceptance
64
64
  end
65
65
 
66
+ attr_writer :work_requires_files
67
+ def work_requires_files
68
+ return true if @work_requires_files.nil?
69
+ @work_requires_files
70
+ end
71
+
66
72
  attr_writer :batch_user_key
67
73
  def batch_user_key
68
74
  @batch_user_key ||= 'batchuser@example.com'
@@ -7,7 +7,6 @@ module Sufia
7
7
  require 'jquery-ui-rails'
8
8
  require 'flot-rails'
9
9
  require 'almond-rails'
10
- require 'zeroclipboard-rails'
11
10
 
12
11
  config.autoload_paths += %W(
13
12
  #{config.root}/app/controllers/concerns
@@ -58,7 +57,6 @@ module Sufia
58
57
  app.config.assets.paths << config.root.join('app', 'assets', 'images', 'site_images')
59
58
 
60
59
  app.config.assets.precompile << /fontawesome-webfont\.(?:svg|ttf|woff)$/
61
- app.config.assets.precompile += %w( ZeroClipboard.swf )
62
60
  app.config.assets.precompile += %w(*.png *.jpg *.ico *.gif *.svg)
63
61
 
64
62
  Sprockets::ES6.configuration = { 'modules' => 'amd', 'moduleIds' => true }
@@ -1,3 +1,3 @@
1
1
  module Sufia
2
- VERSION = '7.0.0'.freeze
2
+ VERSION = '7.1.0'.freeze
3
3
  end
@@ -1,8 +1,11 @@
1
1
  describe 'searching' do
2
2
  let(:user) { create :user }
3
- let(:subject_value) { 'fffzzz' }
3
+ let(:subject_value) { 'mustache' }
4
4
  let!(:work) do
5
- create(:public_work, title: ["Toothbrush"], keyword: [subject_value], user: user)
5
+ create(:public_work,
6
+ title: ["Toothbrush"],
7
+ keyword: [subject_value, 'taco'],
8
+ user: user)
6
9
  end
7
10
 
8
11
  let!(:collection) do
@@ -44,6 +47,8 @@ describe 'searching' do
44
47
  expect(page).to have_content "Toothbrush"
45
48
  expect(page).to have_content('collection title abc')
46
49
  expect(page).to have_css("span.collection-icon-search")
50
+
51
+ expect(page.body).to include "<span itemprop=\"keywords\"><a href=\"/catalog?f%5Bkeyword_sim%5D%5B%5D=taco\">taco</a></span> and <span itemprop=\"keywords\"><a href=\"/catalog?f%5Bkeyword_sim%5D%5B%5D=mustache\">mustache</a></span>"
47
52
  end
48
53
 
49
54
  it "does not display search options for dashboard files" do
@@ -0,0 +1,20 @@
1
+ describe Sufia::Forms::WorkForm do
2
+ let(:work) { GenericWork.new }
3
+ let(:form) { described_class.new(work, nil) }
4
+ let(:works) { [GenericWork.new, FileSet.new, GenericWork.new] }
5
+ let(:files) { [FileSet.new, GenericWork.new, FileSet.new] }
6
+
7
+ describe "#ordered_fileset_members" do
8
+ it "expects ordered fileset members" do
9
+ allow(work).to receive(:ordered_members).and_return(files)
10
+ expect(form.ordered_fileset_members.size).to eq(2)
11
+ end
12
+ end
13
+
14
+ describe "#ordered_work_members" do
15
+ it "expects ordered work members" do
16
+ allow(work).to receive(:ordered_members).and_return(works)
17
+ expect(form.ordered_work_members.size).to eq(2)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ window.TestFixtures = {
2
+ relationships_table: {
3
+ child_id: 'child1234',
4
+ parent_id: 'parent5678'
5
+ }
6
+ }
7
+
8
+ window.TestFixtures.relationships_table["html"] = "<form action='/concern/generic_works/#{TestFixtures.relationships_table.child_id}'><table class='table table-striped related-files relationships-ajax-enabled' data-query-url='/concern/generic_works/$id'> <thead> <tr> <th>Parent Work</th> <th>Actions</th> </tr> </thead> <tbody> <tr class='new-row'> <td> <a href='' class='title hidden'></a> <input class='new-form-control string multi_value optional related_works_ids form-control multi-text-field' name='generic_work[in_works_ids][]' value='' aria-labelledby='generic_work_in_works_ids_label' type='text'> <div class='message has-warning hidden'></div> </td> <td> <div class='child-actions'> <a href='' class='edit hidden btn btn-default' target='_blank'>Edit</a> <a class='btn btn-danger btn-remove-row hidden'>Remove</a> <a class='btn btn-primary btn-add-row'>Add</a></div></td></tr></tbody></table></form>"
9
+
@@ -1,8 +1,13 @@
1
1
  var TestResponses = {
2
- single_use_link: {
3
- success: {
4
- status: 200,
5
- responseText: "http://test.host/single_use_linkabc123"
6
- }
2
+ relationships_table: {
3
+ query_url_success: {
4
+ id: "parent5678",
5
+ title: ["Parent"]
6
+ },
7
+ ajax_add_success:{},
8
+ ajax_remove_success:{},
9
+ ajax_error: {
10
+ responseText: "Error"
11
+ },
7
12
  }
8
13
  }
@@ -0,0 +1,83 @@
1
+ describe 'RelationshipsTable', ->
2
+ control = require('sufia/relationships/table')
3
+ form = null
4
+ element = null
5
+ btn_remove = null
6
+ btn_add = null
7
+ btn_edit = null
8
+ input = null
9
+ message = null
10
+ test_fixtures = TestFixtures
11
+ test_responses = TestResponses
12
+ deferred_ajax = null
13
+
14
+ beforeEach ->
15
+ form = $(test_fixtures.relationships_table.html)
16
+ element = form.find("table")
17
+ btn_remove = element.find('.btn-remove-row')
18
+ btn_add = element.find('.btn-add-row')
19
+ btn_edit = element.find('.edit')
20
+ input = element.find('.new-form-control')
21
+ message = element.find('.message')
22
+ target = new control.RelationshipsTable(element)
23
+ jasmine.Ajax.install()
24
+ deferred_ajax = new jQuery.Deferred()
25
+ spyOn($,'ajax').and.returnValue(deferred_ajax)
26
+ spyOn($,'getJSON').and.callFake((url, success) ->
27
+ success(test_responses.relationships_table.query_url_success))
28
+
29
+ afterEach ->
30
+ jasmine.Ajax.uninstall()
31
+
32
+ describe 'when adding/removing a row', ->
33
+ # the new-row is properly rendered
34
+ it 'only displays one new row with an add button visible', ->
35
+ expect(btn_remove.hasClass("hidden")).toBeTruthy()
36
+ expect(btn_edit.hasClass("hidden")).toBeTruthy()
37
+ expect(btn_add.hasClass("hidden")).toBeFalsy()
38
+
39
+ it 'clicks add with a valid id', ->
40
+ input.val(test_fixtures.relationships_table.parent_id)
41
+ btn_add.click()
42
+ deferred_ajax.resolve(test_responses.relationships_table.ajax_add_success)
43
+ expect(message.hasClass("hidden")).toBeTruthy()
44
+ expect(element.find("tbody tr").length).toEqual(2)
45
+
46
+ it 'clicks add with an invalid id', ->
47
+ input.val('invalid')
48
+ btn_add.click()
49
+ deferred_ajax.reject(test_responses.relationships_table.ajax_error)
50
+ expect(message.hasClass("hidden")).toBeFalsy()
51
+ expect(element.find("tbody tr").length).toEqual(1)
52
+
53
+ it 'clicks add without an id', ->
54
+ expect(message.hasClass("hidden")).toBeTruthy()
55
+ btn_add.click()
56
+ expect(message.hasClass("hidden")).toBeFalsy()
57
+ expect(message.text()).toContain("ID cannot be empty")
58
+ expect(element.find("tbody tr").length).toEqual(1)
59
+
60
+ it 'clicks remove to remove a work', ->
61
+ input.val(test_fixtures.relationships_table.parent_id)
62
+ btn_add.click()
63
+ deferred_ajax.resolve(test_responses.relationships_table.ajax_add_success)
64
+ expect(element.find("tbody tr").length).toEqual(2)
65
+ parent_row = element.find("tbody tr:first")
66
+ parent_delete = parent_row.find(".btn-remove-row")
67
+ parent_delete.click()
68
+ deferred_ajax.resolve(test_responses.relationships_table.ajax_remove_success)
69
+ expect(element.find("tbody tr").length).toEqual(1)
70
+
71
+ it 'clicks add with a duplicate id', ->
72
+ input.val(test_fixtures.relationships_table.parent_id)
73
+ btn_add.click()
74
+ deferred_ajax.resolve(test_responses.relationships_table.ajax_add_success)
75
+ expect(element.find("tbody tr").length).toEqual(2)
76
+ input = element.find("tbody tr:nth-child(2) .new-form-control")
77
+ input.val(test_fixtures.relationships_table.parent_id)
78
+ btn_add = element.find("tbody tr:nth-child(2) .btn-add-row")
79
+ btn_add.click()
80
+ message = element.find("tbody tr:nth-child(2) .message")
81
+ expect(element.find("tbody tr").length).toEqual(2)
82
+ expect(message.hasClass("hidden")).toBeFalsy()
83
+ expect(message.text()).toContain("Work is already related")
@@ -98,7 +98,8 @@ describe("SaveWorkControl", function() {
98
98
  beforeEach(function() {
99
99
  target = buildTarget(form_id)
100
100
  target.uploads = {
101
- hasFiles: true
101
+ hasFiles: true,
102
+ hasFileRequirement: true
102
103
  };
103
104
  });
104
105
  it("is complete", function() {
@@ -112,7 +113,8 @@ describe("SaveWorkControl", function() {
112
113
  beforeEach(function() {
113
114
  target = buildTarget(form_id)
114
115
  target.uploads = {
115
- hasFiles: false
116
+ hasFiles: false,
117
+ hasFileRequirement: true
116
118
  };
117
119
  });
118
120
 
@@ -38,7 +38,7 @@ stylesheets:
38
38
  # - helpers/**/*.js
39
39
  #
40
40
  helpers:
41
- - 'helpers/**/*.js'
41
+ - 'helpers/**/*.{js,coffee,js.coffee}'
42
42
 
43
43
  # spec_files
44
44
  #
@@ -0,0 +1,23 @@
1
+ describe("UploadedFiles", function() {
2
+ var control = require('sufia/save_work/uploaded_files');
3
+
4
+ describe("hasFileRequirement", function() {
5
+ describe("with required file element", function() {
6
+ it("returns true", function() {
7
+ var fixture = setFixtures('<form><ul class="requirements"><li class="incomplete" id="required-files">Add files</li></ul></form>');
8
+ var element = fixture.find('form');
9
+ target = new control.UploadedFiles(element);
10
+ expect(target.hasFileRequirement).toBe(true);
11
+ });
12
+ });
13
+
14
+ describe("without required file element", function() {
15
+ it("returns false", function() {
16
+ var fixture = setFixtures('<form><ul class="requirements"><li>Not files</li></ul></form>');
17
+ var element = fixture.find('form');
18
+ target = new control.UploadedFiles(element);
19
+ expect(target.hasFileRequirement).toBe(false);
20
+ });
21
+ });
22
+ });
23
+ });
@@ -4,7 +4,7 @@ describe 'batch_edits/edit.html.erb', type: :view do
4
4
  let(:form) { Sufia::Forms::BatchEditForm.new(generic_work, nil, batch) }
5
5
 
6
6
  before do
7
- allow(GenericWork).to receive(:load_instance_from_solr).and_return(generic_work)
7
+ allow(GenericWork).to receive(:find).and_return(generic_work)
8
8
 
9
9
  # this prevents AF from hitting Fedora (permissions is a related object)
10
10
  allow(generic_work).to receive(:permissions_attributes=)
@@ -1,4 +1,3 @@
1
-
2
1
  describe 'catalog/index.html.erb', type: :view do
3
2
  let(:collection) { build(:collection, id: "abc123") }
4
3
  let(:doc) { SolrDocument.new(collection.to_solr) }
@@ -32,9 +31,6 @@ describe 'catalog/index.html.erb', type: :view do
32
31
  allow(resp).to receive(:limit_value).and_return(10)
33
32
  allow(resp).to receive(:empty?).and_return(false)
34
33
 
35
- # This stubs out the SolrDocument#to_model
36
- allow(ActiveFedora::Base).to receive(:load_instance_from_solr).with('abc123', doc).and_return(collection)
37
-
38
34
  assign(:document_list, [doc])
39
35
  end
40
36
 
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe "curation_concerns/base/_form_child_work_relationships.html.erb", type: :view do
4
+ let(:work) do
5
+ stub_model(GenericWork, id: '456', title: ["MyWork"])
6
+ end
7
+
8
+ let(:work_2) do
9
+ stub_model(GenericWork, id: '567', title: ["Child Work"])
10
+ end
11
+
12
+ let(:ability) { double }
13
+
14
+ let(:form) do
15
+ Sufia::Forms::WorkForm.new(work, ability)
16
+ end
17
+
18
+ let(:f) { double }
19
+
20
+ let(:page) do
21
+ render
22
+ Capybara::Node::Simple.new(rendered)
23
+ end
24
+
25
+ before do
26
+ view.lookup_context.view_paths.push 'app/views/curation_concerns'
27
+ allow(view).to receive(:params).and_return(id: work.id)
28
+ allow(view).to receive(:curation_concern).and_return(work)
29
+ allow(view).to receive(:f).and_return(f)
30
+ allow(f).to receive(:object).and_return(form)
31
+ allow(controller).to receive(:current_user).and_return(stub_model(User))
32
+ assign(:form, form)
33
+ end
34
+
35
+ context "When editing a work" do
36
+ context "and no children works are present" do
37
+ before do
38
+ allow(work).to receive(:ordered_members).and_return([])
39
+ end
40
+ it "has 1 empty child work input" do
41
+ expect(page).to have_selector("input[value='']", count: 1)
42
+ end
43
+
44
+ it "will not display the remove button in the actions" do
45
+ expect(page).to have_selector(".btn-remove-row", visible: false)
46
+ end
47
+
48
+ it "will display the add button in the actions" do
49
+ expect(page).to have_selector(".btn-add-row", visible: true, count: 1)
50
+ end
51
+ end
52
+ context "When 1 child work is present" do
53
+ let(:work_2) do
54
+ stub_model(GenericWork, id: '567', title: ["Test Child Work"])
55
+ end
56
+
57
+ before do
58
+ allow(work).to receive(:ordered_members).and_return([work_2])
59
+ end
60
+ it "has 1 empty child work input with add button" do
61
+ expect(page).to have_selector("input[value='']", count: 1)
62
+ expect(page).to have_selector(".btn-add-row", visible: true, count: 1)
63
+ end
64
+
65
+ it "has an input box that is filled in with the child id" do
66
+ expect(page).to have_selector("input[value='#{work_2.id}']", count: 1)
67
+ end
68
+
69
+ it "generates a link for the childs first title" do
70
+ expect(page).to have_link("Test Child Work")
71
+ end
72
+
73
+ it "has an edit and remove button" do
74
+ within ".old-row" do
75
+ expect(page).to have_selector(".btn-remove-row", visible: true, count: 1)
76
+ expect(page).to have_selector(".btn-edit-row", visible: true, count: 1)
77
+ end
78
+ end
79
+ end
80
+ context "When multiple child works are present" do
81
+ let(:work_2) do
82
+ stub_model(GenericWork, id: '567', title: ["Test Child Work"])
83
+ end
84
+ let(:work_3) do
85
+ stub_model(GenericWork, id: '789', title: ["Test Child Work 2"])
86
+ end
87
+ before do
88
+ allow(work).to receive(:ordered_members).and_return([work_2, work_3])
89
+ end
90
+ it "has 1 empty child work input with add button" do
91
+ expect(page).to have_selector("input[value='']", count: 1)
92
+ expect(page).to have_selector(".btn-add-row", visible: true, count: 1)
93
+ end
94
+
95
+ it "has an input box that is filled in with the child ids" do
96
+ expect(page).to have_selector("input[value='#{work_2.id}']", count: 1)
97
+ expect(page).to have_selector("input[value='#{work_3.id}']", count: 1)
98
+ end
99
+
100
+ it "generates a link for the childs first title" do
101
+ expect(page).to have_link("Test Child Work")
102
+ expect(page).to have_link("Test Child Work 2")
103
+ end
104
+
105
+ it "has an edit and remove button" do
106
+ within ".old-row" do
107
+ expect(page).to have_selector(".btn-remove-row", visible: true, count: 2)
108
+ expect(page).to have_selector(".btn-edit-row", visible: true, count: 2)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -4,20 +4,41 @@ describe 'curation_concerns/base/relationships', type: :view do
4
4
  let(:ability) { double }
5
5
  let(:solr_doc) { double(id: '123', human_readable_type: 'Work') }
6
6
  let(:presenter) { Sufia::WorkShowPresenter.new(solr_doc, ability) }
7
+ let(:generic_work) { GenericWork.new(id: '456', title: ['Containing work', 'barbaz']) }
8
+ let(:collection) { Collection.new(id: '345', title: ['Containing collection', 'foobar']) }
7
9
 
8
10
  context "when collections are not present" do
9
11
  before do
10
12
  render 'curation_concerns/base/relationships', presenter: presenter
11
13
  end
12
14
  it "shows the message" do
13
- expect(rendered).to match %r{This Work is not currently in any collections\.}
15
+ expect(rendered).to match %r{There are no Collection relationships\.}
14
16
  end
15
17
  end
16
18
 
17
- context "when collections are present" do
18
- let(:collection_presenters) { [double(id: '456', title: ['Containing collection', 'foobar'], to_s: 'Containing collection')] }
19
+ context "when children are not present" do
20
+ before do
21
+ render 'curation_concerns/base/relationships', presenter: presenter
22
+ end
23
+ it "shows the message" do
24
+ expect(rendered).to match %r{This Work does not have any related works\.}
25
+ end
26
+ end
27
+
28
+ context "when parents are not present" do
29
+ before do
30
+ render 'curation_concerns/base/relationships', presenter: presenter
31
+ end
32
+ it "shows the message" do
33
+ expect(rendered).to match %r{There are no Generic work relationships\.}
34
+ end
35
+ end
36
+
37
+ context "when collections are present and no parents are present" do
38
+ let(:collection_presenters) { [collection] }
19
39
  let(:page) { Capybara::Node::Simple.new(rendered) }
20
40
  before do
41
+ allow(view).to receive(:contextual_path).and_return("/collections/456")
21
42
  allow(presenter).to receive(:collection_presenters).and_return(collection_presenters)
22
43
  render 'curation_concerns/base/relationships', presenter: presenter
23
44
  end
@@ -27,5 +48,70 @@ describe 'curation_concerns/base/relationships', type: :view do
27
48
  it "labels the link using the presenter's #to_s method" do
28
49
  expect(page).not_to have_content 'foobar'
29
50
  end
51
+ it "shows the empty messages for parents" do
52
+ expect(page).not_to have_content "There are no Collection relationships."
53
+ expect(page).to have_content "There are no Generic work relationships."
54
+ end
55
+ end
56
+
57
+ context "when parents are present and no collections are present" do
58
+ let(:collection_presenters) { [generic_work] }
59
+ let(:page) { Capybara::Node::Simple.new(rendered) }
60
+ before do
61
+ allow(view).to receive(:contextual_path).and_return("/concern/generic_works/456")
62
+ allow(presenter).to receive(:collection_presenters).and_return(collection_presenters)
63
+ render 'curation_concerns/base/relationships', presenter: presenter
64
+ end
65
+ it "links to work" do
66
+ expect(page).to have_link 'Containing work'
67
+ end
68
+ it "labels the link using the presenter's #to_s method" do
69
+ expect(page).not_to have_content 'barbaz'
70
+ end
71
+ it "shows the empty messages for collections" do
72
+ expect(page).to have_content "There are no Collection relationships."
73
+ expect(page).not_to have_content "There are no Generic work relationships."
74
+ end
75
+ end
76
+
77
+ context "when parents are present and collections are present" do
78
+ let(:collection_presenters) { [generic_work, collection] }
79
+ let(:page) { Capybara::Node::Simple.new(rendered) }
80
+ before do
81
+ allow(view).to receive(:contextual_path).and_return("/concern/generic_works/456")
82
+ allow(presenter).to receive(:collection_presenters).and_return(collection_presenters)
83
+ render 'curation_concerns/base/relationships', presenter: presenter
84
+ end
85
+ it "links to work and collection" do
86
+ expect(page).to have_link 'Containing work'
87
+ expect(page).to have_link 'Containing collection'
88
+ end
89
+ it "labels the link using the presenter's #to_s method" do
90
+ expect(page).not_to have_content 'barbaz'
91
+ expect(page).not_to have_content 'foobar'
92
+ end
93
+ it "does not show the empty messages" do
94
+ expect(page).not_to have_content "There are no Collection relationships."
95
+ expect(page).not_to have_content "There are no Generic work relationships."
96
+ end
97
+ end
98
+
99
+ context "when children are present" do
100
+ let(:member_presenters) { [generic_work] }
101
+ let(:page) { Capybara::Node::Simple.new(rendered) }
102
+ before do
103
+ allow(view).to receive(:contextual_path).and_return("/concern/generic_works/456")
104
+ allow(presenter).to receive(:member_presenters).and_return(member_presenters)
105
+ render 'curation_concerns/base/relationships', presenter: presenter
106
+ end
107
+ it "links to child work" do
108
+ expect(page).to have_link 'Containing work'
109
+ end
110
+ it "labels the link using the presenter's #to_s method" do
111
+ expect(page).not_to have_content 'barbaz'
112
+ end
113
+ it "does not show the empty message" do
114
+ expect(page).not_to have_content "This Work does not have any related works."
115
+ end
30
116
  end
31
117
  end