sufia 7.0.0.beta4 → 7.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +0 -1
  3. data/.rubocop_todo.yml +1 -2
  4. data/.travis.yml +1 -0
  5. data/Gemfile +18 -9
  6. data/README.md +23 -3
  7. data/app/assets/javascripts/sufia.js +4 -1
  8. data/app/assets/javascripts/sufia/app.js +15 -3
  9. data/app/assets/javascripts/sufia/autocomplete.es6 +51 -0
  10. data/app/assets/javascripts/sufia/autocomplete/language.es6 +25 -0
  11. data/app/assets/javascripts/sufia/autocomplete/location.es6 +24 -0
  12. data/app/assets/javascripts/sufia/autocomplete/subject.es6 +26 -0
  13. data/app/assets/javascripts/sufia/batch_edit.js +8 -5
  14. data/app/assets/javascripts/sufia/permissions/control.es6 +7 -3
  15. data/app/assets/javascripts/sufia/save_work/required_fields.es6 +10 -4
  16. data/app/assets/javascripts/sufia/save_work/save_work_control.es6 +14 -4
  17. data/app/assets/stylesheets/sufia/_fixedsticky.scss +23 -21
  18. data/app/assets/stylesheets/sufia/_form-progress.scss +16 -7
  19. data/app/assets/stylesheets/sufia/_header.scss +2 -1
  20. data/app/assets/stylesheets/sufia/_settings.scss +4 -0
  21. data/app/controllers/api/items_controller.rb +2 -2
  22. data/app/controllers/api/zotero_controller.rb +1 -1
  23. data/app/controllers/citations_controller.rb +0 -2
  24. data/app/controllers/concerns/sufia/batch_edits_controller_behavior.rb +7 -7
  25. data/app/controllers/concerns/sufia/batch_uploads_controller_behavior.rb +9 -3
  26. data/app/controllers/concerns/sufia/singular_subresource_controller.rb +6 -1
  27. data/app/controllers/concerns/sufia/transfers_controller_behavior.rb +1 -1
  28. data/app/controllers/concerns/sufia/users_controller_behavior.rb +3 -3
  29. data/app/controllers/concerns/sufia/works_controller_behavior.rb +11 -4
  30. data/app/controllers/my/highlights_controller.rb +1 -1
  31. data/app/forms/sufia/forms/batch_edit_form.rb +10 -6
  32. data/app/forms/sufia/forms/batch_upload_form.rb +2 -2
  33. data/app/forms/sufia/forms/collection_form.rb +4 -0
  34. data/app/forms/sufia/forms/work_form.rb +4 -0
  35. data/app/helpers/sufia/blacklight_override.rb +0 -20
  36. data/app/helpers/sufia/collections_helper.rb +12 -0
  37. data/app/helpers/sufia/sufia_helper_behavior.rb +84 -56
  38. data/app/jobs/batch_create_job.rb +18 -2
  39. data/app/jobs/content_depositor_change_event_job.rb +13 -6
  40. data/app/jobs/create_work_job.rb +6 -2
  41. data/app/models/batch_upload_item.rb +15 -0
  42. data/app/models/concerns/sufia/ability.rb +7 -4
  43. data/app/models/concerns/sufia/user.rb +0 -11
  44. data/app/models/concerns/sufia/work_behavior.rb +1 -0
  45. data/app/models/concerns/sufia/works/featured.rb +23 -0
  46. data/app/models/file_download_stat.rb +9 -12
  47. data/app/models/file_view_stat.rb +5 -15
  48. data/app/models/proxy_deposit_request.rb +11 -7
  49. data/app/models/sufia/statistic.rb +65 -0
  50. data/app/models/work_view_stat.rb +5 -16
  51. data/app/presenters/file_usage.rb +3 -4
  52. data/app/presenters/sufia/file_set_presenter.rb +1 -3
  53. data/app/presenters/sufia/trophy_presenter.rb +28 -0
  54. data/app/presenters/sufia/user_profile_presenter.rb +1 -1
  55. data/app/presenters/work_usage.rb +5 -4
  56. data/app/search_builders/deposit_search_builder.rb +4 -3
  57. data/app/search_builders/parent_collection_search_builder.rb +1 -1
  58. data/app/services/sufia/collection_member_service.rb +1 -1
  59. data/app/services/sufia/user_stat_importer.rb +11 -6
  60. data/app/views/_controls.html.erb +11 -9
  61. data/app/views/batch_edits/edit.html.erb +8 -2
  62. data/app/views/catalog/_index_list_default.html.erb +2 -1
  63. data/app/views/curation_concerns/base/_form_metadata.html.erb +1 -1
  64. data/app/views/curation_concerns/base/_form_progress.html.erb +1 -1
  65. data/app/views/curation_concerns/base/_form_relationships.html.erb +1 -1
  66. data/app/views/curation_concerns/base/_guts4form.html.erb +6 -2
  67. data/app/views/curation_concerns/base/_items.html.erb +1 -1
  68. data/app/views/curation_concerns/base/edit.html.erb +1 -1
  69. data/app/views/curation_concerns/base/new.html.erb +1 -1
  70. data/app/views/curation_concerns/file_sets/_permission.html.erb +5 -1
  71. data/app/views/curation_concerns/file_sets/media_display/_default.html.erb +1 -1
  72. data/app/views/curation_concerns/file_sets/show.html.erb +1 -1
  73. data/app/views/dashboard/_index_partials/_heading_actions.html.erb +1 -1
  74. data/app/views/{error → errors}/404.html.erb +0 -0
  75. data/app/views/records/edit_fields/_based_near.html.erb +8 -0
  76. data/app/views/records/edit_fields/_language.html.erb +8 -0
  77. data/app/views/records/edit_fields/_subject.html.erb +8 -0
  78. data/app/views/stats/work.html.erb +1 -1
  79. data/app/views/sufia/batch_uploads/_form.html.erb +1 -1
  80. data/app/views/sufia/homepage/_home_header.html.erb +1 -1
  81. data/app/views/sufia/homepage/_sortable_featured.html.erb +1 -1
  82. data/app/views/transfers/new.html.erb +3 -1
  83. data/app/views/users/_contributions.html.erb +1 -1
  84. data/config/locales/sufia.en.yml +3 -2
  85. data/config/routes.rb +0 -7
  86. data/lib/generators/sufia/install_generator.rb +0 -24
  87. data/lib/generators/sufia/templates/catalog_controller.rb +4 -3
  88. data/lib/generators/sufia/templates/config/sufia.rb +4 -2
  89. data/lib/generators/sufia/upgrade700_generator.rb +7 -9
  90. data/lib/generators/sufia/work_generator.rb +56 -0
  91. data/lib/sufia.rb +4 -1
  92. data/lib/sufia/arkivo/actor.rb +1 -1
  93. data/lib/sufia/configuration.rb +15 -3
  94. data/lib/sufia/engine.rb +1 -10
  95. data/lib/sufia/version.rb +1 -1
  96. data/spec/controllers/api/items_controller_spec.rb +20 -7
  97. data/spec/controllers/sufia/batch_uploads_controller_spec.rb +4 -3
  98. data/spec/controllers/transfers_controller_spec.rb +3 -11
  99. data/spec/controllers/users_controller_spec.rb +2 -1
  100. data/spec/features/batch_edit_spec.rb +17 -2
  101. data/spec/forms/sufia/forms/batch_edit_form_spec.rb +2 -0
  102. data/spec/forms/sufia/forms/batch_upload_form_spec.rb +1 -1
  103. data/spec/helpers/blacklight_helper_spec.rb +36 -26
  104. data/spec/helpers/{generic_work_helper_spec.rb → sufia/collections_helper_spec.rb} +1 -1
  105. data/spec/helpers/sufia_helper_spec.rb +70 -32
  106. data/spec/javascripts/autocomplete_spec.js.coffee +7 -7
  107. data/spec/javascripts/save_work_spec.js +20 -20
  108. data/spec/lib/sufia/configuration_spec.rb +30 -0
  109. data/spec/lib/sufia/user_stat_importer_spec.rb +21 -36
  110. data/spec/models/file_download_stat_spec.rb +8 -8
  111. data/spec/models/file_view_stat_spec.rb +8 -8
  112. data/spec/models/generic_work_spec.rb +24 -0
  113. data/spec/models/proxy_deposit_request_spec.rb +2 -4
  114. data/spec/models/sufia/ability_spec.rb +7 -13
  115. data/spec/models/user_spec.rb +0 -14
  116. data/spec/models/work_view_stat_spec.rb +22 -8
  117. data/spec/presenters/sufia/file_usage_spec.rb +0 -4
  118. data/spec/presenters/sufia/trophy_presenter_spec.rb +46 -0
  119. data/spec/presenters/sufia/user_profile_presenter_spec.rb +4 -1
  120. data/spec/presenters/sufia/work_usage_spec.rb +8 -17
  121. data/spec/routing/route_spec.rb +0 -6
  122. data/spec/spec_helper.rb +8 -2
  123. data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -0
  124. data/spec/views/batch_edits/edit.html.erb_spec.rb +8 -2
  125. data/spec/views/catalog/_index_list_default.html.erb_spec.rb +8 -6
  126. data/spec/views/curation_concerns/base/_form.html.erb_spec.rb +3 -0
  127. data/spec/views/curation_concerns/file_sets/_permission.html.erb_spec.rb +16 -0
  128. data/spec/views/curation_concerns/file_sets/show.html.erb_spec.rb +0 -2
  129. data/spec/views/records/edit_fields/_based_near.html.erb_spec.rb +20 -0
  130. data/spec/views/records/edit_fields/_language.html.erb_spec.rb +20 -0
  131. data/spec/views/records/edit_fields/_subject.html.erb_spec.rb +20 -0
  132. data/spec/views/{homepage → sufia/homepage}/_announcement.html.erb_spec.rb +0 -0
  133. data/spec/views/{homepage → sufia/homepage}/_featured_works.html.erb_spec.rb +0 -0
  134. data/spec/views/{homepage → sufia/homepage}/_home_header.html.erb_spec.rb +0 -0
  135. data/spec/views/sufia/homepage/_sortable_featured.html.erb_spec.rb +21 -0
  136. data/spec/views/users/edit.html.erb_spec.rb +5 -5
  137. data/spec/views/users/show.html.erb_spec.rb +5 -3
  138. data/sufia.gemspec +4 -3
  139. data/tasks/noid.rake +2 -2
  140. data/tasks/sufia-dev.rake +1 -1
  141. metadata +73 -68
  142. data/app/assets/javascripts/sufia/edit_metadata.js +0 -87
  143. data/app/controllers/authorities_controller.rb +0 -19
  144. data/app/helpers/generic_work_helper.rb +0 -10
  145. data/app/helpers/sufia_url_helper.rb +0 -14
  146. data/app/models/concerns/sufia/file_stat_utils.rb +0 -33
  147. data/app/models/concerns/sufia/work_stat_utils.rb +0 -33
  148. data/app/models/geo_names_resource.rb +0 -18
  149. data/app/models/local_authority.rb +0 -101
  150. data/app/models/local_authority_entry.rb +0 -3
  151. data/app/models/subject_local_authority_entry.rb +0 -2
  152. data/app/views/curation_concerns/generic_works/_generic_work.html.erb +0 -3
  153. data/app/views/error/401.html.erb +0 -18
  154. data/app/views/error/500.html.erb +0 -9
  155. data/app/views/error/single_use_error.html.erb +0 -19
  156. data/lib/generators/sufia/geonames_username_config_generator.rb +0 -20
  157. data/spec/controllers/authorities_controller_spec.rb +0 -18
  158. data/spec/fixtures/cities15000.tsv +0 -149
  159. data/spec/fixtures/genreForms.nt +0 -471
  160. data/spec/fixtures/lexvo.rdf +0 -3108
  161. data/spec/helpers/sufia_url_helper_spec.rb +0 -18
  162. data/spec/models/geo_names_resource_spec.rb +0 -30
  163. data/spec/models/local_authority_spec.rb +0 -108
  164. data/vendor/assets/javascripts/almond.js +0 -430
@@ -1,7 +1,8 @@
1
1
  describe FileDownloadStat, type: :model do
2
- let(:file_id) { "99" }
2
+ let(:file_id) { file.id }
3
3
  let(:date) { Time.current }
4
4
  let(:file_stat) { described_class.create(downloads: "2", date: date, file_id: file_id) }
5
+ let(:file) { mock_model(FileSet, id: 99) }
5
6
 
6
7
  it "has attributes" do
7
8
  expect(file_stat).to respond_to(:downloads)
@@ -12,7 +13,7 @@ describe FileDownloadStat, type: :model do
12
13
  expect(file_stat.downloads).to eq(2)
13
14
  end
14
15
 
15
- describe "#get_float_statistics" do
16
+ describe "#statistics" do
16
17
  let(:dates) {
17
18
  ldates = []
18
19
  4.downto(0) { |idx| ldates << (Time.zone.today - idx.day) }
@@ -36,15 +37,14 @@ describe FileDownloadStat, type: :model do
36
37
  OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "sufia:x920fw85p", date: date_strs[0], totalEvents: "1"),
37
38
  OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "sufia:x920fw85p", date: date_strs[1], totalEvents: "1"),
38
39
  OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "sufia:x920fw85p", date: date_strs[2], totalEvents: "2"),
39
- OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "sufia:x920fw85p", date: date_strs[3], totalEvents: "3"),
40
- # OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "sufia:x920fw85p", date: date_strs[4], totalEvents: "5"),
40
+ OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "sufia:x920fw85p", date: date_strs[3], totalEvents: "3")
41
41
  ]
42
42
  }
43
43
 
44
44
  describe "cache empty" do
45
45
  let(:stats) do
46
46
  expect(described_class).to receive(:ga_statistics).and_return(sample_download_statistics)
47
- described_class.statistics(file_id, Time.zone.today - 4.days)
47
+ described_class.statistics(file, Time.zone.today - 4.days)
48
48
  end
49
49
 
50
50
  it "includes cached ga data" do
@@ -55,9 +55,9 @@ describe FileDownloadStat, type: :model do
55
55
  expect(described_class.to_flots(stats)).to include(*download_output)
56
56
 
57
57
  # at this point all data should be cached
58
- allow(described_class).to receive(:ga_statistics).with(Time.zone.today, file_id).and_raise("We should not call Google Analytics All data should be cached!")
58
+ allow(described_class).to receive(:ga_statistics).with(Time.zone.today, file).and_raise("We should not call Google Analytics All data should be cached!")
59
59
 
60
- stats2 = described_class.statistics(file_id, Time.zone.today - 4.days)
60
+ stats2 = described_class.statistics(file, Time.zone.today - 4.days)
61
61
  expect(described_class.to_flots(stats2)).to include(*download_output)
62
62
  end
63
63
  end
@@ -67,7 +67,7 @@ describe FileDownloadStat, type: :model do
67
67
 
68
68
  let(:stats) do
69
69
  expect(described_class).to receive(:ga_statistics).and_return(sample_download_statistics)
70
- described_class.statistics(file_id, Time.zone.today - 5.days)
70
+ described_class.statistics(file, Time.zone.today - 5.days)
71
71
  end
72
72
 
73
73
  it "includes cached data" do
@@ -1,8 +1,9 @@
1
1
  RSpec.describe FileViewStat, type: :model do
2
- let(:file_id) { "99" }
2
+ let(:file_id) { file.id }
3
3
  let(:user_id) { 123 }
4
4
  let(:date) { Time.current }
5
5
  let(:file_stat) { described_class.create(views: "25", date: date, file_id: file_id, user_id: user_id) }
6
+ let(:file) { mock_model(FileSet, id: 99) }
6
7
 
7
8
  it "has attributes" do
8
9
  expect(file_stat).to respond_to(:views)
@@ -14,7 +15,7 @@ RSpec.describe FileViewStat, type: :model do
14
15
  expect(file_stat.user_id).to eq(user_id)
15
16
  end
16
17
 
17
- describe "#get_float_statistics" do
18
+ describe "#statistics" do
18
19
  let(:dates) {
19
20
  ldates = []
20
21
  4.downto(0) { |idx| ldates << (Time.zone.today - idx.day) }
@@ -38,14 +39,13 @@ RSpec.describe FileViewStat, type: :model do
38
39
  OpenStruct.new(date: date_strs[0], pageviews: 4),
39
40
  OpenStruct.new(date: date_strs[1], pageviews: 8),
40
41
  OpenStruct.new(date: date_strs[2], pageviews: 6),
41
- OpenStruct.new(date: date_strs[3], pageviews: 10),
42
- # OpenStruct.new(date: date_strs[4], pageviews: 2)
42
+ OpenStruct.new(date: date_strs[3], pageviews: 10)
43
43
  ]
44
44
  }
45
45
  describe "cache empty" do
46
46
  let(:stats) do
47
47
  expect(described_class).to receive(:ga_statistics).and_return(sample_pageview_statistics)
48
- described_class.statistics(file_id, Time.zone.today - 4.days, user_id)
48
+ described_class.statistics(file, Time.zone.today - 4.days, user_id)
49
49
  end
50
50
 
51
51
  it "includes cached ga data" do
@@ -57,9 +57,9 @@ RSpec.describe FileViewStat, type: :model do
57
57
  expect(stats.first.user_id).to eq user_id
58
58
 
59
59
  # at this point all data should be cached
60
- allow(described_class).to receive(:ga_statistics).with(Time.zone.today, file_id).and_raise("We should not call Google Analytics All data should be cached!")
60
+ allow(described_class).to receive(:ga_statistics).with(Time.zone.today, file).and_raise("We should not call Google Analytics All data should be cached!")
61
61
 
62
- stats2 = described_class.statistics(file_id, Time.zone.today - 5.days)
62
+ stats2 = described_class.statistics(file, Time.zone.today - 5.days)
63
63
  expect(described_class.to_flots(stats2)).to include(*view_output)
64
64
  end
65
65
  end
@@ -69,7 +69,7 @@ RSpec.describe FileViewStat, type: :model do
69
69
 
70
70
  let(:stats) do
71
71
  expect(described_class).to receive(:ga_statistics).and_return(sample_pageview_statistics)
72
- described_class.statistics(file_id, Time.zone.today - 5.days)
72
+ described_class.statistics(file, Time.zone.today - 5.days)
73
73
  end
74
74
 
75
75
  it "includes cached data" do
@@ -49,6 +49,30 @@ describe GenericWork do
49
49
  end
50
50
  end
51
51
 
52
+ describe "featured works" do
53
+ let(:work) { create(:public_work) }
54
+ before { FeaturedWork.create(work_id: work.id) }
55
+
56
+ subject { work }
57
+ it { is_expected.to be_featured }
58
+
59
+ context "when a previously featured work is deleted" do
60
+ it "deletes the featured work as well" do
61
+ expect { work.destroy }.to change { FeaturedWork.all.count }.from(1).to(0)
62
+ end
63
+ end
64
+
65
+ context "when the work becomes private" do
66
+ it "deletes the featured work" do
67
+ expect do
68
+ work.visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
69
+ work.save!
70
+ end.to change { FeaturedWork.all.count }.from(1).to(0)
71
+ expect(work).not_to be_featured
72
+ end
73
+ end
74
+ end
75
+
52
76
  describe "metadata" do
53
77
  it "has descriptive metadata" do
54
78
  expect(subject).to respond_to(:relative_path)
@@ -3,10 +3,8 @@ describe ProxyDepositRequest, type: :model do
3
3
  let(:receiver) { create(:user) }
4
4
  let(:receiver2) { create(:user) }
5
5
  let(:work) do
6
- GenericWork.new do |w|
7
- w.title = ["Test work"]
6
+ GenericWork.create(title: ["Test work"]) do |w|
8
7
  w.apply_depositor_metadata(sender.user_key)
9
- w.save!
10
8
  end
11
9
  end
12
10
 
@@ -20,7 +18,7 @@ describe ProxyDepositRequest, type: :model do
20
18
  its(:fulfillment_date) { is_expected.to be_nil }
21
19
  its(:sender_comment) { is_expected.to eq 'please take this' }
22
20
 
23
- it { is_expected.to delegate_method(:to_s).to(:work) }
21
+ it { is_expected.to delegate_method(:to_s).to(:solr_doc) }
24
22
 
25
23
  context "After approval" do
26
24
  before do
@@ -1,9 +1,10 @@
1
1
  require 'cancan/matchers'
2
2
 
3
3
  describe Sufia::Ability, type: :model do
4
+ let(:ability) { Ability.new(user) }
5
+ subject { ability }
4
6
  describe "a user with no roles" do
5
7
  let(:user) { nil }
6
- subject { Ability.new(user) }
7
8
  it { is_expected.not_to be_able_to(:create, FileSet) }
8
9
  it { is_expected.not_to be_able_to(:create, TinymceAsset) }
9
10
  it { is_expected.not_to be_able_to(:create, ContentBlock) }
@@ -16,7 +17,6 @@ describe Sufia::Ability, type: :model do
16
17
 
17
18
  describe "a registered user" do
18
19
  let(:user) { create(:user) }
19
- subject { Ability.new(user) }
20
20
  it { is_expected.to be_able_to(:create, FileSet) }
21
21
  it { is_expected.not_to be_able_to(:create, TinymceAsset) }
22
22
  it { is_expected.not_to be_able_to(:create, ContentBlock) }
@@ -28,7 +28,6 @@ describe Sufia::Ability, type: :model do
28
28
  describe "a user in the admin group" do
29
29
  let(:user) { create(:user) }
30
30
  before { allow(user).to receive_messages(groups: ['admin', 'registered']) }
31
- subject { Ability.new(user) }
32
31
  it { is_expected.to be_able_to(:create, FileSet) }
33
32
  it { is_expected.to be_able_to(:create, TinymceAsset) }
34
33
  it { is_expected.to be_able_to(:create, ContentBlock) }
@@ -40,18 +39,13 @@ describe Sufia::Ability, type: :model do
40
39
  describe "proxies and transfers" do
41
40
  let(:sender) { create(:user) }
42
41
  let(:user) { create(:user) }
43
- let(:work) do
44
- GenericWork.create!(title: ["Test work"]) do |work|
45
- work.apply_depositor_metadata(sender.user_key)
46
- end
47
- end
48
- subject { Ability.new(user) }
42
+ let(:work) { create(:work, user: sender) }
43
+
49
44
  it { should_not be_able_to(:transfer, work.id) }
50
45
 
51
- describe "depositor_for_document" do
52
- it "returns the depositor" do
53
- expect(subject.send(:depositor_for_document, work.id)).to eq sender.user_key
54
- end
46
+ describe "user_is_depositor?" do
47
+ subject { ability.send(:user_is_depositor?, work.id) }
48
+ it { is_expected.to be false }
55
49
  end
56
50
 
57
51
  context "with a ProxyDepositRequest for a work they have deposited" do
@@ -116,20 +116,6 @@ describe User, type: :model do
116
116
  end
117
117
  end
118
118
 
119
- describe "trophy_works" do
120
- let(:user) { FactoryGirl.create(:user) }
121
- let(:work1) { GenericWork.create(title: ["work A"]) { |w| w.apply_depositor_metadata(user) } }
122
- let(:work2) { GenericWork.create(title: ["work B"]) { |w| w.apply_depositor_metadata(user) } }
123
- let(:work3) { GenericWork.create(title: ["work C"]) { |w| w.apply_depositor_metadata(user) } }
124
- let!(:trophy1) { user.trophies.create!(work_id: work1.id) }
125
- let!(:trophy2) { user.trophies.create!(work_id: work2.id) }
126
- let!(:trophy3) { user.trophies.create!(work_id: work3.id) }
127
-
128
- it "returns a list of generic works" do
129
- expect(user.trophy_works).to eq [work1, work2, work3]
130
- end
131
- end
132
-
133
119
  describe "activity streams" do
134
120
  let(:now) { Time.zone.now.to_i }
135
121
  let(:activities) {
@@ -1,8 +1,9 @@
1
1
  RSpec.describe WorkViewStat, type: :model do
2
- let(:work_id) { "199" }
2
+ let(:work_id) { work.id }
3
3
  let(:user_id) { 123 }
4
4
  let(:date) { DateTime.new.in_time_zone }
5
5
  let(:work_stat) { described_class.create(work_views: "25", date: date, work_id: work_id, user_id: user_id) }
6
+ let(:work) { mock_model(GenericWork, id: 199) }
6
7
 
7
8
  it "has attributes" do
8
9
  expect(work_stat).to respond_to(:work_views)
@@ -14,7 +15,21 @@ RSpec.describe WorkViewStat, type: :model do
14
15
  expect(work_stat.user_id).to eq(user_id)
15
16
  end
16
17
 
17
- describe "#get_float_statistics" do
18
+ describe ".ga_statistic" do
19
+ let(:start_date) { 2.days.ago }
20
+ let(:views) { double }
21
+ let(:profile) { double(sufia__pageview: views) }
22
+ let(:expected_path) { Rails.application.routes.url_helpers.curation_concerns_generic_work_path(work) }
23
+ before do
24
+ allow(Sufia::Analytics).to receive(:profile).and_return(profile)
25
+ end
26
+ it "calls the Legato method with the correct path" do
27
+ expect(views).to receive(:for_path).with(expected_path)
28
+ described_class.ga_statistics(start_date, work)
29
+ end
30
+ end
31
+
32
+ describe "#statistics" do
18
33
  let(:dates) {
19
34
  ldates = []
20
35
  4.downto(0) { |idx| ldates << (Time.zone.today - idx.day) }
@@ -38,14 +53,13 @@ RSpec.describe WorkViewStat, type: :model do
38
53
  OpenStruct.new(date: date_strs[0], pageviews: 4),
39
54
  OpenStruct.new(date: date_strs[1], pageviews: 8),
40
55
  OpenStruct.new(date: date_strs[2], pageviews: 6),
41
- OpenStruct.new(date: date_strs[3], pageviews: 10),
42
- # OpenStruct.new(date: date_strs[4], pageviews: 2)
56
+ OpenStruct.new(date: date_strs[3], pageviews: 10)
43
57
  ]
44
58
  }
45
59
  describe "cache empty" do
46
60
  let(:stats) do
47
61
  expect(described_class).to receive(:ga_statistics).and_return(sample_work_pageview_statistics)
48
- described_class.statistics(work_id, Time.zone.today - 4.days, user_id)
62
+ described_class.statistics(work, Time.zone.today - 4.days, user_id)
49
63
  end
50
64
 
51
65
  it "includes cached ga data" do
@@ -57,9 +71,9 @@ RSpec.describe WorkViewStat, type: :model do
57
71
  expect(stats.first.user_id).to eq user_id
58
72
 
59
73
  # at this point all data should be cached
60
- allow(described_class).to receive(:ga_statistics).with(Time.zone.today, work_id).and_raise("We should not call Google Analytics All data should be cached!")
74
+ allow(described_class).to receive(:ga_statistics).with(Time.zone.today, work).and_raise("We should not call Google Analytics All data should be cached!")
61
75
 
62
- stats2 = described_class.statistics(work_id, Time.zone.today - 5.days)
76
+ stats2 = described_class.statistics(work, Time.zone.today - 5.days)
63
77
  expect(described_class.to_flots(stats2)).to include(*view_output)
64
78
  end
65
79
  end
@@ -69,7 +83,7 @@ RSpec.describe WorkViewStat, type: :model do
69
83
 
70
84
  let(:stats) do
71
85
  expect(described_class).to receive(:ga_statistics).and_return(sample_work_pageview_statistics)
72
- described_class.statistics(work_id, Time.zone.today - 5.days)
86
+ described_class.statistics(work, Time.zone.today - 5.days)
73
87
  end
74
88
 
75
89
  it "includes cached data" do
@@ -63,10 +63,6 @@ describe FileUsage, type: :model do
63
63
  expect(usage.id).to eq(file.id)
64
64
  end
65
65
 
66
- it "sets the path" do
67
- expect(usage.path).to eq("/concern/file_sets/#{URI.encode(file.id, '/')}")
68
- end
69
-
70
66
  it "sets the created date" do
71
67
  expect(usage.created).to eq(file.create_date)
72
68
  end
@@ -0,0 +1,46 @@
1
+ RSpec.describe Sufia::TrophyPresenter do
2
+ describe "find_by_user" do
3
+ let(:user) { create(:user) }
4
+ let(:work1) { create(:work, user: user) }
5
+ let(:work2) { create(:work, user: user) }
6
+ let(:work3) { create(:work, user: user) }
7
+ let!(:trophy1) { user.trophies.create!(work_id: work1.id) }
8
+ let!(:trophy2) { user.trophies.create!(work_id: work2.id) }
9
+ let!(:trophy3) { user.trophies.create!(work_id: work3.id) }
10
+
11
+ subject { described_class.find_by_user(user) }
12
+ it "returns a list of generic works" do
13
+ expect(subject.size).to eq 3
14
+ expect(subject).to all(be_kind_of described_class)
15
+ end
16
+ end
17
+
18
+ let(:presenter) { described_class.new(solr_document) }
19
+ let(:solr_document) { SolrDocument.new(id: '123456', has_model_ssim: 'GenericWork', title_tesim: ['A Title']) }
20
+
21
+ describe "id" do
22
+ subject { presenter.id }
23
+ it { is_expected.to eq '123456' }
24
+ end
25
+
26
+ describe "to_param" do
27
+ subject { presenter.to_param }
28
+ it { is_expected.to eq '123456' }
29
+ end
30
+
31
+ describe "model_name" do
32
+ subject { presenter.model_name }
33
+ it { is_expected.to eq GenericWork.model_name }
34
+ end
35
+
36
+ describe 'thumbnail_path' do
37
+ let(:solr_document) { SolrDocument.new(thumbnail_path_ss: '/foo/bar.png') }
38
+ subject { presenter.thumbnail_path }
39
+ it { is_expected.to eq '/foo/bar.png' }
40
+ end
41
+
42
+ describe '#to_s' do
43
+ subject { presenter.to_s }
44
+ it { is_expected.to eq("A Title") }
45
+ end
46
+ end
@@ -18,6 +18,9 @@ RSpec.describe Sufia::UserProfilePresenter do
18
18
  let!(:badtrophy) { user.trophies.create!(work_id: 'not_a_generic_work') }
19
19
  subject { presenter.trophies }
20
20
 
21
- it { is_expected.to match_array [work1, work2, work3] }
21
+ it "has an array of presenters" do
22
+ expect(subject).to all(be_kind_of Sufia::TrophyPresenter)
23
+ expect(subject.map(&:id)).to match_array [work1.id, work2.id, work3.id]
24
+ end
22
25
  end
23
26
  end
@@ -1,9 +1,5 @@
1
1
  describe WorkUsage, type: :model do
2
- let!(:work) do
3
- GenericWork.create(id: 'abc12345xy', title: ['bilbo work 1']) do |work|
4
- work.apply_depositor_metadata("gordonl")
5
- end
6
- end
2
+ let!(:work) { create(:work, id: 'abc12345xy') }
7
3
 
8
4
  let(:dates) {
9
5
  ldates = []
@@ -47,15 +43,17 @@ describe WorkUsage, type: :model do
47
43
  expect(usage.id).to eq(work.id)
48
44
  end
49
45
 
50
- it "sets the path" do
51
- expect(usage.path).to eq("/concern/generic_works/#{URI.encode(work.id, '/')}")
52
- end
53
-
54
46
  it "sets the created date" do
55
47
  expect(usage.created).to eq(work.create_date)
56
48
  end
57
49
  end
58
50
 
51
+ describe "#to_s" do
52
+ let(:work) { create(:work, title: ['Butter sculpture']) }
53
+ subject { usage.to_s }
54
+ it { is_expected.to eq 'Butter sculpture' }
55
+ end
56
+
59
57
  describe "statistics" do
60
58
  let!(:system_timezone) { ENV['TZ'] }
61
59
  before do
@@ -125,14 +123,7 @@ describe WorkUsage, type: :model do
125
123
 
126
124
  describe "on a migrated work" do
127
125
  let(:date_uploaded) { "2014-12-31" }
128
-
129
- let(:work_migrated) do
130
- GenericWork.create(id: '678901234', title: ['bilbo work 2']) do |work|
131
- work.apply_depositor_metadata("gordonl")
132
- work.date_uploaded = date_uploaded
133
- work.save
134
- end
135
- end
126
+ let(:work_migrated) { create(:work, id: '678901234', date_uploaded: date_uploaded) }
136
127
 
137
128
  let(:usage) {
138
129
  expect(WorkViewStat).to receive(:ga_statistics).and_return(sample_pageview_statistics)
@@ -115,12 +115,6 @@ describe 'Routes', type: :routing do
115
115
  end
116
116
  end
117
117
 
118
- describe 'Authorities' do
119
- it "routes to query" do
120
- expect(get: '/authorities/subject/bio').to route_to(controller: 'authorities', action: 'query', model: 'subject', term: 'bio')
121
- end
122
- end
123
-
124
118
  describe 'Trophies' do
125
119
  it 'routes to user trophies' do
126
120
  expect(post: '/works/1234abc/trophy').to route_to(controller: 'sufia/trophies', action: 'toggle_trophy', id: '1234abc')
@@ -21,6 +21,7 @@ require 'engine_cart'
21
21
  EngineCart.load_application!
22
22
 
23
23
  require 'devise'
24
+ require 'devise/version'
24
25
  require 'mida'
25
26
  require 'rspec/rails'
26
27
  require 'rspec/its'
@@ -150,9 +151,14 @@ RSpec.configure do |config|
150
151
 
151
152
  config.include Shoulda::Matchers::Independent
152
153
 
153
- config.include Devise::TestHelpers, type: :controller
154
- config.include EngineRoutes, type: :controller
154
+ if Devise::VERSION >= '4.2'
155
+ # This is for an unreleased version of Devise (will either be 4.2 or 5.0)
156
+ config.include Devise::Test::ControllerHelpers, type: :controller
157
+ else
158
+ config.include Devise::TestHelpers, type: :controller
159
+ end
155
160
 
161
+ config.include EngineRoutes, type: :controller
156
162
  config.include Warden::Test::Helpers, type: :feature
157
163
  config.after(:each, type: :feature) { Warden.test_reset! }
158
164