sufia 6.0.0.rc2 → 6.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (198) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -5
  3. data/History.md +14 -0
  4. data/LICENSE +15 -0
  5. data/SUFIA_VERSION +1 -1
  6. data/app/assets/javascripts/sufia/batch_edit.js +1 -1
  7. data/app/assets/javascripts/sufia/permissions.js +8 -12
  8. data/app/assets/stylesheets/sufia.css.scss +1 -1
  9. data/app/assets/stylesheets/sufia/_multi_value_fields.css.scss +67 -0
  10. data/app/assets/stylesheets/sufia/_settings.scss +1 -0
  11. data/app/assets/stylesheets/sufia/_styles.scss +4 -0
  12. data/app/assets/stylesheets/sufia/_tinymce.scss +14 -0
  13. data/app/controllers/batch_controller.rb +11 -2
  14. data/app/controllers/concerns/sufia/breadcrumbs.rb +2 -3
  15. data/app/controllers/concerns/sufia/collections_controller_behavior.rb +0 -1
  16. data/app/controllers/concerns/sufia/contact_form_controller_behavior.rb +1 -2
  17. data/app/controllers/concerns/sufia/controller.rb +1 -7
  18. data/app/controllers/concerns/sufia/downloads_controller_behavior.rb +3 -8
  19. data/app/controllers/concerns/sufia/files_controller/local_ingest_behavior.rb +2 -3
  20. data/app/controllers/concerns/sufia/files_controller/upload_complete_behavior.rb +1 -2
  21. data/app/controllers/concerns/sufia/files_controller_behavior.rb +27 -14
  22. data/app/controllers/concerns/sufia/homepage_controller.rb +3 -2
  23. data/app/controllers/content_blocks_controller.rb +17 -1
  24. data/app/controllers/downloads_controller.rb +0 -1
  25. data/app/controllers/my/shares_controller.rb +1 -0
  26. data/app/controllers/single_use_links_controller.rb +0 -1
  27. data/app/controllers/single_use_links_viewer_controller.rb +3 -8
  28. data/app/forms/sufia/forms/generic_file_edit_form.rb +1 -8
  29. data/app/helpers/content_block_helper.rb +30 -10
  30. data/app/helpers/generic_file_helper.rb +4 -4
  31. data/app/helpers/sufia/dashboard_helper_behavior.rb +2 -2
  32. data/app/helpers/sufia/sufia_helper_behavior.rb +4 -4
  33. data/app/helpers/trophy_helper.rb +3 -3
  34. data/app/jobs/content_delete_event_job.rb +1 -2
  35. data/app/jobs/content_deposit_event_job.rb +1 -1
  36. data/app/jobs/content_depositor_change_event_job.rb +1 -1
  37. data/app/jobs/content_new_version_event_job.rb +1 -1
  38. data/app/jobs/content_restored_version_event_job.rb +1 -1
  39. data/app/jobs/content_update_event_job.rb +1 -1
  40. data/app/models/concerns/sufia/solr_document_behavior.rb +5 -9
  41. data/app/models/content_block.rb +20 -0
  42. data/app/models/featured_work_list.rb +4 -0
  43. data/app/presenters/sufia/collection_presenter.rb +14 -2
  44. data/app/presenters/sufia/generic_file_presenter.rb +16 -0
  45. data/app/presenters/sufia/version_list_presenter.rb +1 -1
  46. data/app/views/batch/_metadata.html.erb +4 -4
  47. data/app/views/batch_edits/edit.html.erb +1 -1
  48. data/app/views/collections/_action_menu.html.erb +4 -5
  49. data/app/views/collections/_show_descriptions.html.erb +1 -5
  50. data/app/views/collections/_show_document_list.html.erb +0 -2
  51. data/app/views/collections/_show_document_list_menu.html.erb +5 -6
  52. data/app/views/collections/_show_document_list_row.html.erb +9 -9
  53. data/app/views/collections/_sort_and_per_page.html.erb +1 -1
  54. data/app/views/collections/_view_type_group.html.erb +1 -1
  55. data/app/views/collections/show.html.erb +3 -3
  56. data/app/views/generic_files/_asset_permissions_denial_flash.html.erb +1 -1
  57. data/app/views/generic_files/_asset_saved_flash.html.erb +1 -1
  58. data/app/views/generic_files/_asset_updated_flash.html.erb +1 -1
  59. data/app/views/generic_files/_browse_everything.html.erb +4 -4
  60. data/app/views/generic_files/_media_display.html.erb +9 -9
  61. data/app/views/generic_files/_permission_form.html.erb +1 -1
  62. data/app/views/generic_files/_show_actions.html.erb +1 -1
  63. data/app/views/generic_files/_show_collections.html.erb +2 -2
  64. data/app/views/generic_files/_show_details.html.erb +1 -1
  65. data/app/views/generic_files/_versioning.html.erb +9 -5
  66. data/app/views/generic_files/jq_upload.json.jbuilder +1 -1
  67. data/app/views/generic_files/new.html.erb +2 -3
  68. data/app/views/generic_files/show.html.erb +13 -16
  69. data/app/views/generic_files/upload/_alerts.html.erb +2 -2
  70. data/app/views/generic_files/upload/_form_fields.html.erb +1 -1
  71. data/app/views/generic_files/upload/_local_file_import_chooser.html.erb +1 -1
  72. data/app/views/generic_files/upload/_script_templates.html.erb +2 -2
  73. data/app/views/homepage/_featured.html.erb +2 -4
  74. data/app/views/homepage/_featured_researcher.html.erb +1 -1
  75. data/app/views/homepage/_featured_works.html.erb +5 -3
  76. data/app/views/homepage/_home_content.html.erb +1 -1
  77. data/app/views/homepage/_recent_document.html.erb +2 -2
  78. data/app/views/homepage/_sortable_featured.html.erb +1 -2
  79. data/app/views/my/_action_menu.html.erb +8 -8
  80. data/app/views/my/_collection_action_menu.html.erb +4 -4
  81. data/app/views/my/_index_partials/_list_collections.html.erb +9 -12
  82. data/app/views/my/_index_partials/_list_files.html.erb +9 -9
  83. data/app/views/my/index.html.erb +0 -1
  84. data/app/views/records/_rights_modal.html.erb +1 -0
  85. data/app/views/users/_contributions.html.erb +2 -3
  86. data/app/views/users/_edit_primary.html.erb +68 -0
  87. data/app/views/users/_edit_secondary.html.erb +1 -0
  88. data/app/views/users/_trophy_edit.html.erb +1 -3
  89. data/app/views/users/edit.html.erb +4 -78
  90. data/config/initializers/simple_form.rb +167 -0
  91. data/config/initializers/simple_form_bootstrap.rb +137 -0
  92. data/config/locales/simple_form.en.yml +31 -0
  93. data/config/locales/sufia.en.yml +7 -4
  94. data/config/routes.rb +1 -1
  95. data/lib/generators/sufia/templates/catalog_controller.rb +1 -1
  96. data/lib/sufia/single_use_error.rb +1 -1
  97. data/lib/sufia/version.rb +1 -1
  98. data/spec/actors/generic_file/actor_spec.rb +5 -5
  99. data/spec/controllers/batch_controller_spec.rb +15 -0
  100. data/spec/controllers/collections_controller_spec.rb +1 -1
  101. data/spec/controllers/content_blocks_controller_spec.rb +23 -3
  102. data/spec/controllers/downloads_controller_spec.rb +5 -5
  103. data/spec/controllers/generic_files_controller_spec.rb +12 -12
  104. data/spec/controllers/homepage_controller_spec.rb +19 -6
  105. data/spec/controllers/my/files_controller_spec.rb +8 -10
  106. data/spec/controllers/my/shares_controller_spec.rb +34 -23
  107. data/spec/controllers/single_use_links_controller_spec.rb +2 -3
  108. data/spec/controllers/single_use_links_viewer_controller_spec.rb +19 -20
  109. data/spec/controllers/users_controller_spec.rb +8 -8
  110. data/spec/factories/generic_files.rb +4 -4
  111. data/spec/factories/users.rb +2 -3
  112. data/spec/features/browse_dashboard_files_spec.rb +8 -8
  113. data/spec/features/collection_spec.rb +15 -8
  114. data/spec/features/edit_file_spec.rb +26 -0
  115. data/spec/features/single_use_links_spec.rb +3 -3
  116. data/spec/forms/generic_file_edit_form_spec.rb +8 -1
  117. data/spec/helpers/content_block_helper_spec.rb +10 -0
  118. data/spec/helpers/dashboard_helper_spec.rb +42 -0
  119. data/spec/helpers/sufia_helper_spec.rb +34 -7
  120. data/spec/helpers/trophy_helper_spec.rb +6 -6
  121. data/spec/inputs/select_with_help_input_spec.rb +16 -0
  122. data/spec/jobs/audit_job_spec.rb +1 -1
  123. data/spec/jobs/characterize_job_spec.rb +2 -7
  124. data/spec/jobs/create_derivatives_job_spec.rb +27 -38
  125. data/spec/jobs/import_url_job_spec.rb +2 -2
  126. data/spec/jobs/ingest_local_file_job_spec.rb +6 -8
  127. data/spec/lib/sufia/id_service_spec.rb +0 -7
  128. data/spec/lib/sufia/messages_spec.rb +16 -13
  129. data/spec/models/ability_spec.rb +3 -0
  130. data/spec/models/checksum_audit_log_spec.rb +1 -1
  131. data/spec/models/content_block_spec.rb +41 -0
  132. data/spec/models/featured_work_list_spec.rb +23 -9
  133. data/spec/models/file_content_datastream_spec.rb +4 -4
  134. data/spec/models/file_usage_spec.rb +1 -1
  135. data/spec/models/fits_datastream_spec.rb +4 -4
  136. data/spec/models/generic_file_spec.rb +31 -15
  137. data/spec/models/single_use_link_spec.rb +2 -2
  138. data/spec/models/solr_document_spec.rb +8 -5
  139. data/spec/models/user_spec.rb +3 -3
  140. data/spec/presenters/sufia/collection_presenter_spec.rb +34 -0
  141. data/spec/presenters/sufia/generic_file_presenter_spec.rb +41 -1
  142. data/spec/presenters/sufia/version_list_presenter_spec.rb +12 -2
  143. data/spec/services/generic_file_audit_service_spec.rb +3 -3
  144. data/spec/services/noid_spec.rb +4 -11
  145. data/spec/services/repository_audit_service_spec.rb +1 -1
  146. data/spec/spec_helper.rb +1 -0
  147. data/spec/support/fixture_helpers.rb +2 -3
  148. data/spec/support/selectors.rb +7 -7
  149. data/spec/test_app_templates/Gemfile.extra +1 -0
  150. data/spec/views/batch/edit.html.erb_spec.rb +14 -17
  151. data/spec/views/collections/_show_descriptions.html.erb_spec.rb +1 -1
  152. data/spec/views/generic_file/_permission_form.html.erb_spec.rb +29 -7
  153. data/spec/views/generic_file/edit.html.erb_spec.rb +1 -1
  154. data/spec/views/generic_file/show.html.erb_spec.rb +69 -151
  155. data/spec/views/generic_file/stats.html.erb_spec.rb +1 -1
  156. data/spec/views/homepage/_featured_works.html.erb_spec.rb +29 -0
  157. data/spec/views/users/show.html.erb_spec.rb +1 -1
  158. data/sufia-models/app/actors/sufia/generic_file/actor.rb +12 -8
  159. data/sufia-models/app/jobs/batch_update_job.rb +2 -2
  160. data/sufia-models/app/jobs/import_url_job.rb +5 -3
  161. data/sufia-models/app/jobs/ingest_local_file_job.rb +46 -0
  162. data/sufia-models/app/jobs/resolrize_job.rb +1 -8
  163. data/sufia-models/app/models/batch.rb +0 -7
  164. data/sufia-models/app/models/concerns/sufia/ability.rb +1 -1
  165. data/sufia-models/app/models/concerns/sufia/{collection.rb → collection_behavior.rb} +1 -13
  166. data/sufia-models/app/models/concerns/sufia/generic_file/batches.rb +3 -4
  167. data/sufia-models/app/models/concerns/sufia/generic_file/export.rb +1 -1
  168. data/sufia-models/app/models/concerns/sufia/generic_file/featured.rb +1 -4
  169. data/sufia-models/app/models/concerns/sufia/generic_file/metadata.rb +7 -7
  170. data/sufia-models/app/models/concerns/sufia/generic_file/trophies.rb +1 -2
  171. data/sufia-models/app/models/concerns/sufia/generic_file/virus_check.rb +16 -11
  172. data/sufia-models/app/models/concerns/sufia/model_methods.rb +1 -14
  173. data/sufia-models/app/models/concerns/sufia/user.rb +5 -0
  174. data/sufia-models/app/models/file_usage.rb +1 -1
  175. data/sufia-models/app/models/file_view_stat.rb +1 -1
  176. data/sufia-models/app/models/sufia/collection.rb +5 -0
  177. data/sufia-models/app/services/sufia/generic_file_indexing_service.rb +1 -1
  178. data/sufia-models/app/services/sufia/id_service.rb +1 -2
  179. data/sufia-models/app/services/sufia/noid.rb +4 -24
  180. data/sufia-models/lib/generators/sufia/models/install_generator.rb +6 -1
  181. data/sufia-models/lib/generators/sufia/models/templates/app/models/collection.rb +2 -0
  182. data/sufia-models/lib/generators/sufia/models/templates/config/resque_config.rb +1 -1
  183. data/sufia-models/lib/generators/sufia/models/templates/config/solrconfig.xml +46 -0
  184. data/sufia-models/lib/generators/sufia/models/templates/config/sufia.rb +9 -5
  185. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_external_key_to_content_blocks.rb +6 -0
  186. data/sufia-models/lib/generators/sufia/models/update_content_blocks_generator.rb +18 -0
  187. data/sufia-models/lib/sufia/messages.rb +11 -12
  188. data/sufia-models/lib/sufia/models/engine.rb +2 -1
  189. data/sufia-models/lib/sufia/models/stats/user_stat_importer.rb +9 -5
  190. data/sufia-models/lib/sufia/models/version.rb +1 -1
  191. data/sufia-models/sufia-models.gemspec +5 -5
  192. data/sufia.gemspec +15 -15
  193. data/tasks/sufia-dev.rake +0 -16
  194. metadata +86 -64
  195. data/LICENSE.md +0 -14
  196. data/app/jobs/ingest_local_file_job.rb +0 -39
  197. data/sufia-models/app/models/collection.rb +0 -3
  198. data/sufia-models/app/services/sufia/indexing_service.rb +0 -15
@@ -0,0 +1 @@
1
+ gem 'kaminari', github: 'harai/kaminari', branch: 'route_prefix_prototype'
@@ -12,29 +12,26 @@ describe 'batch/edit.html.erb' do
12
12
  render
13
13
  end
14
14
 
15
- it "should draw tooltip for visibility" do
15
+ it "should draw the page" do
16
+ # form
17
+ expect(rendered).to have_selector "form#new_generic_file"
18
+ # should have browser validations
19
+ expect(rendered).not_to have_selector "form#new_generic_file[novalidate]"
20
+
21
+ # tooltip for visibility
16
22
  expect(rendered).to have_selector "span#visibility_tooltip a i.help-icon"
17
- end
18
23
 
19
- it "should draw tooltip for share_with" do
24
+ # tooltip for share_with
20
25
  expect(rendered).to have_selector "span#share_with_tooltip a i.help-icon"
21
- end
22
26
 
23
- context "rights" do
24
- it "should have a modal" do
25
- expect(rendered).to have_selector("div#rightsModal .modal-dialog .modal-content")
27
+ # access rights
28
+ expect(rendered).to have_selector("div#rightsModal .modal-dialog .modal-content")
29
+ expect(rendered).to have_selector('select#generic_file_rights[name="generic_file[rights][]"]')
30
+ page = Capybara::Node::Simple.new(rendered)
31
+ page.all('select#generic_file_rights option').each do |elem|
32
+ expect(elem.value).to_not be_empty
26
33
  end
27
34
 
28
- it "should allow setting many rights" do
29
- expect(rendered).to have_selector('select#generic_file_rights[name="generic_file[rights][]"]')
30
- end
31
-
32
- it "should not have an empty rights element" do
33
- page = Capybara::Node::Simple.new(rendered)
34
- page.all('select#generic_file_rights option').each do |elem|
35
- expect(elem.value).to_not be_empty
36
- end
37
- end
38
35
  end
39
36
  end
40
37
 
@@ -5,6 +5,7 @@ describe 'collections/_show_descriptions.html.erb', :type => :view do
5
5
  let(:collection) do
6
6
  mock_model(Collection,
7
7
  resource_type: [], creator: [], contributor: [], tag: [],
8
+ description: '', title: 'hmm',
8
9
  rights: [], publisher: [], date_created: ['2000-01-01'], subject: [],
9
10
  language: [], identifier: [], based_near: [], related_url: [],
10
11
  members: ['foo', 'bar'], bytes: 123456678
@@ -12,7 +13,6 @@ describe 'collections/_show_descriptions.html.erb', :type => :view do
12
13
  end
13
14
  before do
14
15
  assign(:presenter, presenter)
15
- assign(:collection, collection)
16
16
  end
17
17
 
18
18
  let(:presenter) { Sufia::CollectionPresenter.new(collection) }
@@ -2,22 +2,44 @@ require 'spec_helper'
2
2
 
3
3
  describe 'generic_files/_permission_form.html.erb', :type => :view do
4
4
  let(:generic_file) {
5
- stub_model(GenericFile, noid: '123',
5
+ stub_model(GenericFile, id: '123',
6
6
  depositor: 'bob',
7
7
  resource_type: ['Dataset'])
8
8
  }
9
9
 
10
+ let(:form) do
11
+ form_for(generic_file, url: '/update') do |gf_form|
12
+ return gf_form
13
+ end
14
+ end
15
+
10
16
  before do
11
17
  allow(controller).to receive(:current_user).and_return(stub_model(User))
12
- allow(generic_file).to receive(:permissions).and_return([])
13
- form_for(generic_file, url: '/update') do |f|
14
- @f = f
18
+ allow(generic_file).to receive(:permissions).and_return(permissions)
19
+ allow(view).to receive(:f).and_return(form)
20
+ render
21
+ end
22
+
23
+ context "without additional users" do
24
+ let(:permissions) { [] }
25
+
26
+ it "should draw the permissions form without error" do
27
+ expect(rendered).to have_css("input#new_user_name_skel")
28
+ expect(rendered).not_to have_css("button.remove_perm")
15
29
  end
16
30
  end
17
31
 
18
- it "should draw the permissions form without error" do
19
- render 'generic_files/permission_form.html.erb', f: @f
20
- expect(rendered).to have_css("input#new_user_name_skel")
32
+ context "with additional users" do
33
+ let(:depositor_permission) { Hydra::AccessControls::Permission.new(id: '123', name: 'bob', type: 'person', access: 'edit') }
34
+ let(:public_permission) { Hydra::AccessControls::Permission.new(id: '124', name: 'public', type: 'group', access: 'read') }
35
+ let(:other_permission) { Hydra::AccessControls::Permission.new(id: '125', name: 'joe@example.com', type: 'person', access: 'edit') }
36
+ let(:permissions) { [ depositor_permission, public_permission, other_permission] }
37
+
38
+ it "should draw the permissions form without error" do
39
+ expect(rendered).to have_css("input#new_user_name_skel")
40
+ expect(rendered).to have_css("button.remove_perm", count: 1) # depositor and public should be filtered out
41
+ expect(rendered).to have_css("button.remove_perm[data-index='2']")
42
+ end
21
43
  end
22
44
 
23
45
  end
@@ -14,7 +14,7 @@ describe 'generic_files/edit.html.erb', :no_clean do
14
14
  let(:content) { double('content', mimeType: 'application/pdf') }
15
15
 
16
16
  let(:generic_file) {
17
- stub_model(GenericFile, id: '123', noid: '123',
17
+ stub_model(GenericFile, id: '123',
18
18
  depositor: 'bob',
19
19
  resource_type: ['Book', 'Dataset'])
20
20
  }
@@ -12,7 +12,7 @@ describe 'generic_files/show.html.erb', :type => :view do
12
12
  end
13
13
 
14
14
  let(:generic_file) do
15
- stub_model(GenericFile, id: '123', noid: '123',
15
+ stub_model(GenericFile, id: '123',
16
16
  depositor: depositor.user_key,
17
17
  audit_stat: 1,
18
18
  title: ['My Title'],
@@ -46,283 +46,202 @@ describe 'generic_files/show.html.erb', :type => :view do
46
46
  end
47
47
 
48
48
  describe 'schema.org' do
49
+ let(:item) { Mida::Document.new(rendered).items.first }
49
50
  describe 'descriptive metadata' do
50
51
  before do
51
52
  render template: 'generic_files/show.html.erb', layout: 'layouts/sufia-one-column'
52
- @item = Mida::Document.new(rendered).items.first
53
53
  end
54
54
 
55
- it 'sets itemtype to CreativeWork' do
56
- expect(@item.type).to eq('http://schema.org/CreativeWork')
57
- end
55
+ it 'draws schema.org fields' do
56
+ # set itemtype to CreativeWork
57
+ expect(item.type).to eq('http://schema.org/CreativeWork')
58
58
 
59
- it 'sets title as name' do
60
- expect(@item.properties['name'].first).to eq('My Title')
61
- end
59
+ # set title as name
60
+ expect(item.properties['name'].first).to eq('My Title')
62
61
 
63
- it 'sets description' do
64
- expect(@item.properties['description'].first).to eq('Lorem ipsum lorem ipsum.')
65
- end
62
+ expect(item.properties['description'].first).to eq('Lorem ipsum lorem ipsum.')
66
63
 
67
- it 'sets tag as keywords' do
68
- expect(@item.properties['keywords']).to include('bacon', 'sausage', 'eggs')
69
- end
64
+ # tag as keywords
65
+ expect(item.properties['keywords']).to include('bacon', 'sausage', 'eggs')
70
66
 
71
- it 'sets based_near as contentLocation' do
72
- based_near = @item.properties['contentLocation'].first
67
+ # based_near as contentLocation
68
+ based_near = item.properties['contentLocation'].first
73
69
  expect(based_near.type).to eq('http://schema.org/Place')
74
70
  expect(based_near.properties['name'].first).to eq('Seattle, WA, US')
75
- end
76
71
 
77
- it 'sets contributor' do
78
- contributors = @item.properties['contributor']
72
+ contributors = item.properties['contributor']
79
73
  expect(contributors.count).to eq(2)
80
74
  contributor = contributors.first
81
75
  expect(contributor.type).to eq('http://schema.org/Person')
82
76
  expect(contributor.properties['name'].first).to eq('Tweedledee')
83
- end
84
77
 
85
- it 'sets creator' do
86
- creators = @item.properties['creator']
78
+ creators = item.properties['creator']
87
79
  expect(creators.count).to eq(2)
88
80
  creator = creators.first
89
81
  expect(creator.type).to eq('http://schema.org/Person')
90
82
  expect(creator.properties['name'].first).to eq('Doe, John')
91
- end
92
83
 
93
- it 'sets date_created as dateCreated' do
94
- expect(@item.properties['dateCreated'].first).to eq('1984-01-02')
95
- end
84
+ expect(item.properties['dateCreated'].first).to eq('1984-01-02')
96
85
 
97
- it 'sets language as inLanguage' do
98
- expect(@item.properties['inLanguage'].first).to eq('Quechua')
99
- end
86
+ expect(item.properties['inLanguage'].first).to eq('Quechua')
100
87
 
101
- it 'sets publisher' do
102
- publisher = @item.properties['publisher'].first
88
+ publisher = item.properties['publisher'].first
103
89
  expect(publisher.type).to eq('http://schema.org/Organization')
104
90
  expect(publisher.properties['name'].first).to eq('Random Publishing, Inc.')
105
- end
106
91
 
107
- it 'sets subjects' do
108
- subjects = @item.properties['about']
92
+ subjects = item.properties['about']
109
93
  expect(subjects.count).to eq(3)
110
94
  subject = subjects.first
111
95
  expect(subject.type).to eq('http://schema.org/Thing')
112
96
  expect(subject.properties['name'].first).to eq('Biology')
113
- end
114
97
 
115
- it 'sets depositor as accountablePerson' do
116
- depositor = @item.properties['accountablePerson'].first
98
+ depositor = item.properties['accountablePerson'].first
117
99
  expect(depositor.type).to eq('http://schema.org/Person')
118
100
  expect(depositor.properties['name'].first).to eq('bob')
119
101
  end
120
102
  end
121
-
122
- describe 'resource type-specific itemtypes' do
123
- context 'when resource_type is Audio' do
124
- it 'sets itemtype to AudioObject' do
125
- generic_file.resource_type = ['Audio']
126
- render template: 'generic_files/show.html.erb', layout: 'layouts/sufia-one-column'
127
- @item = Mida::Document.new(rendered).items.first
128
- expect(@item.type).to eq('http://schema.org/AudioObject')
129
- end
130
- end
131
- context 'when resource_type is Conference Proceeding' do
132
- it 'sets itemtype to ScholarlyArticle' do
133
- generic_file.resource_type = ['Conference Proceeding']
134
- render template: 'generic_files/show.html.erb', layout: 'layouts/sufia-one-column'
135
- @item = Mida::Document.new(rendered).items.first
136
- expect(@item.type).to eq('http://schema.org/ScholarlyArticle')
137
- end
138
- end
139
- end
140
103
  end
141
104
 
142
105
  describe 'google scholar' do
143
- # NOTE: before(:all) will not work in this context
144
- before(:each) do
106
+ before do
145
107
  render template: 'generic_files/show.html.erb', layout: 'layouts/sufia-one-column'
146
108
  end
109
+ let(:doc) { Nokogiri::HTML(rendered) }
147
110
 
148
- it 'appears in meta tags' do
149
- gscholar_meta_tags = Nokogiri::HTML(rendered).xpath("//meta[contains(@name, 'citation_')]")
111
+ it 'displays meta tags' do
112
+ gscholar_meta_tags = doc.xpath("//meta[contains(@name, 'citation_')]")
150
113
  expect(gscholar_meta_tags.count).to eq(5)
151
- end
152
114
 
153
- it 'displays title' do
154
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='citation_title']")
115
+ tag = doc.xpath("//meta[@name='citation_title']")
155
116
  expect(tag.attribute('content').value).to eq('My Title')
156
- end
157
117
 
158
- it 'displays authors' do
159
- tags = Nokogiri::HTML(rendered).xpath("//meta[@name='citation_author']")
118
+ tags = doc.xpath("//meta[@name='citation_author']")
160
119
  expect(tags.first.attribute('content').value).to eq('Doe, John')
161
120
  expect(tags.last.attribute('content').value).to eq('Doe, Jane')
162
- end
163
121
 
164
- it 'displays publication date' do
165
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='citation_publication_date']")
122
+ tag = doc.xpath("//meta[@name='citation_publication_date']")
166
123
  expect(tag.attribute('content').value).to eq('1984-01-02')
167
- end
168
124
 
169
- it 'displays download URL' do
170
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='citation_pdf_url']")
125
+ tag = doc.xpath("//meta[@name='citation_pdf_url']")
171
126
  expect(tag.attribute('content').value).to eq('http://test.host/downloads/123')
172
127
  end
173
128
  end
174
129
 
175
130
  describe 'twitter cards' do
176
- # NOTE: before(:all) will not work in this context
177
- before(:each) do
131
+ before do
178
132
  render template: 'generic_files/show.html.erb', layout: 'layouts/sufia-one-column'
179
133
  end
134
+ let(:doc) { Nokogiri::HTML(rendered) }
180
135
 
181
136
  it 'appears in meta tags' do
182
- twitter_meta_tags = Nokogiri::HTML(rendered).xpath("//meta[contains(@name, 'twitter:') or contains(@property, 'og:')]")
137
+ twitter_meta_tags = doc.xpath("//meta[contains(@name, 'twitter:') or contains(@property, 'og:')]")
183
138
  expect(twitter_meta_tags.count).to eq(13)
184
- end
185
139
 
186
- it 'displays twitter:card' do
187
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='twitter:card']")
140
+ tag = doc.xpath("//meta[@name='twitter:card']")
188
141
  expect(tag.attribute('content').value).to eq('product')
189
- end
190
142
 
191
- it 'displays twitter:site' do
192
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='twitter:site']")
143
+ tag = doc.xpath("//meta[@name='twitter:site']")
193
144
  expect(tag.attribute('content').value).to eq('@HydraSphere')
194
- end
195
145
 
196
- it 'displays twitter:creator' do
197
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='twitter:creator']")
146
+ tag = doc.xpath("//meta[@name='twitter:creator']")
198
147
  expect(tag.attribute('content').value).to eq('@bot4lib')
199
- end
200
148
 
201
- it 'displays og:site_name' do
202
- tag = Nokogiri::HTML(rendered).xpath("//meta[@property='og:site_name']")
149
+ tag = doc.xpath("//meta[@property='og:site_name']")
203
150
  expect(tag.attribute('content').value).to eq('Sufia')
204
- end
205
151
 
206
- it 'displays og:type' do
207
- tag = Nokogiri::HTML(rendered).xpath("//meta[@property='og:type']")
152
+ tag = doc.xpath("//meta[@property='og:type']")
208
153
  expect(tag.attribute('content').value).to eq('object')
209
- end
210
154
 
211
- it 'displays og:title' do
212
- tag = Nokogiri::HTML(rendered).xpath("//meta[@property='og:title']")
155
+ tag = doc.xpath("//meta[@property='og:title']")
213
156
  expect(tag.attribute('content').value).to eq('My Title')
214
- end
215
157
 
216
- it 'displays og:description' do
217
- tag = Nokogiri::HTML(rendered).xpath("//meta[@property='og:description']")
158
+ tag = doc.xpath("//meta[@property='og:description']")
218
159
  expect(tag.attribute('content').value).to eq('Lorem ipsum lorem ipsum.')
219
- end
220
160
 
221
- it 'displays og:image' do
222
- tag = Nokogiri::HTML(rendered).xpath("//meta[@property='og:image']")
223
- expect(tag.attribute('content').value).to eq('http://test.host/downloads/123?datastream_id=thumbnail')
224
- end
161
+ tag = doc.xpath("//meta[@property='og:image']")
162
+ expect(tag.attribute('content').value).to eq('http://test.host/downloads/123?file=thumbnail')
225
163
 
226
- it 'displays og:url' do
227
- tag = Nokogiri::HTML(rendered).xpath("//meta[@property='og:url']")
164
+ tag = doc.xpath("//meta[@property='og:url']")
228
165
  expect(tag.attribute('content').value).to eq('http://test.host/files/123')
229
- end
230
166
 
231
- it 'displays twitter:data1' do
232
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='twitter:data1']")
167
+ tag = doc.xpath("//meta[@name='twitter:data1']")
233
168
  expect(tag.attribute('content').value).to eq('bacon, sausage, eggs')
234
- end
235
169
 
236
- it 'displays twitter:label1' do
237
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='twitter:label1']")
170
+ tag = doc.xpath("//meta[@name='twitter:label1']")
238
171
  expect(tag.attribute('content').value).to eq('Keywords')
239
- end
240
172
 
241
- it 'displays twitter:data2' do
242
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='twitter:data2']")
173
+ tag = doc.xpath("//meta[@name='twitter:data2']")
243
174
  expect(tag.attribute('content').value).to eq('http://example.org/rights/1')
244
- end
245
175
 
246
- it 'displays twitter:label2' do
247
- tag = Nokogiri::HTML(rendered).xpath("//meta[@name='twitter:label2']")
176
+ tag = doc.xpath("//meta[@name='twitter:label2']")
248
177
  expect(tag.attribute('content').value).to eq('Rights')
249
178
  end
250
179
  end
251
180
 
252
181
  describe 'analytics' do
182
+ let(:page) { Capybara::Node::Simple.new(rendered) }
183
+ before do
184
+ Sufia.config.analytics = analytics
185
+ render
186
+ end
253
187
  context 'when enabled' do
254
- before do
255
- Sufia.config.analytics = true
256
- end
188
+ let(:analytics) { true }
257
189
 
258
190
  it 'appears on page' do
259
- render
260
- page = Capybara::Node::Simple.new(rendered)
261
191
  expect(page).to have_selector('a#stats', count: 1)
262
192
  end
263
193
  end
264
194
 
265
195
  context 'when disabled' do
266
- before do
267
- Sufia.config.analytics = false
268
- end
196
+ let(:analytics) { false }
269
197
 
270
198
  it 'does not appear on page' do
271
- render
272
- page = Capybara::Node::Simple.new(rendered)
273
199
  expect(page).to have_no_selector('a#stats')
274
200
  end
275
201
  end
276
202
  end
277
203
 
278
204
  describe 'featured' do
205
+ before do
206
+ allow(generic_file).to receive(:public?).and_return(public)
207
+ render
208
+ end
209
+ let(:page) { Capybara::Node::Simple.new(rendered) }
210
+
279
211
  context "public file" do
280
- before do
281
- allow(generic_file).to receive(:public?).and_return(true)
282
- end
212
+ let(:public) { true }
283
213
 
284
214
  it "shows featured feature link for public file" do
285
- render
286
- page = Capybara::Node::Simple.new(rendered)
287
215
  expect(page).to have_selector('a[data-behavior="feature"]', count: 1)
288
216
  end
289
217
  end
290
218
 
291
219
  context "non public file" do
292
- before do
293
- allow(generic_file).to receive(:public?).and_return(false)
294
- end
220
+ let(:public) { false }
295
221
 
296
222
  it "does not show feature link for non public file" do
297
- render
298
- page = Capybara::Node::Simple.new(rendered)
299
223
  expect(page).to have_no_selector('a[data-behavior="feature"]', count: 1)
300
224
  end
301
225
  end
302
226
  end
303
227
 
304
228
  describe 'collections list' do
305
- context "when the file is not featured in any collections" do
229
+ before do
230
+ allow(generic_file).to receive(:collections).and_return(collections)
231
+ render
232
+ end
306
233
 
234
+ context "when the file is not featured in any collections" do
235
+ let(:collections) { [] }
307
236
  it "should display the empty message" do
308
- render
309
237
  expect(rendered).to have_text(t('sufia.file.collections_list.empty'))
310
238
  end
311
239
  end
312
240
 
313
241
  context "when the file is featured in collections" do
314
- let(:collection1) {
315
- stub_model(Collection,
316
- title: 'collection1',
317
- noid: '456')
318
- }
319
-
320
- before do
321
- allow(generic_file).to receive(:collections).and_return([collection1])
322
- end
242
+ let(:collections) { [stub_model(Collection, title: 'collection1', id: '456') ] }
323
243
 
324
244
  it "should display the header and titles of collections it belongs to" do
325
- render
326
245
  expect(rendered).to have_text(t('sufia.file.collections_list.heading'))
327
246
  expect(rendered).to have_text('collection1')
328
247
  end
@@ -330,12 +249,11 @@ describe 'generic_files/show.html.erb', :type => :view do
330
249
  end
331
250
 
332
251
  describe 'visibility' do
333
- let(:expected) do
334
- '<span class="label label-danger" title="'+t('sufia.visibility.private')+'">'+t('sufia.visibility.private')+'</span></a>'
252
+ before do
253
+ render
335
254
  end
336
255
  it "should display the visibility badge" do
337
- render
338
- expect(rendered).to include(expected)
256
+ expect(rendered).to include('<span class="label label-danger" title="'+t('sufia.visibility.private')+'">'+t('sufia.visibility.private')+'</span></a>')
339
257
  end
340
258
  end
341
259