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.
- checksums.yaml +4 -4
- data/.rubocop.yml +0 -1
- data/.rubocop_todo.yml +1 -2
- data/.travis.yml +1 -0
- data/Gemfile +18 -9
- data/README.md +23 -3
- data/app/assets/javascripts/sufia.js +4 -1
- data/app/assets/javascripts/sufia/app.js +15 -3
- data/app/assets/javascripts/sufia/autocomplete.es6 +51 -0
- data/app/assets/javascripts/sufia/autocomplete/language.es6 +25 -0
- data/app/assets/javascripts/sufia/autocomplete/location.es6 +24 -0
- data/app/assets/javascripts/sufia/autocomplete/subject.es6 +26 -0
- data/app/assets/javascripts/sufia/batch_edit.js +8 -5
- data/app/assets/javascripts/sufia/permissions/control.es6 +7 -3
- data/app/assets/javascripts/sufia/save_work/required_fields.es6 +10 -4
- data/app/assets/javascripts/sufia/save_work/save_work_control.es6 +14 -4
- data/app/assets/stylesheets/sufia/_fixedsticky.scss +23 -21
- data/app/assets/stylesheets/sufia/_form-progress.scss +16 -7
- data/app/assets/stylesheets/sufia/_header.scss +2 -1
- data/app/assets/stylesheets/sufia/_settings.scss +4 -0
- data/app/controllers/api/items_controller.rb +2 -2
- data/app/controllers/api/zotero_controller.rb +1 -1
- data/app/controllers/citations_controller.rb +0 -2
- data/app/controllers/concerns/sufia/batch_edits_controller_behavior.rb +7 -7
- data/app/controllers/concerns/sufia/batch_uploads_controller_behavior.rb +9 -3
- data/app/controllers/concerns/sufia/singular_subresource_controller.rb +6 -1
- data/app/controllers/concerns/sufia/transfers_controller_behavior.rb +1 -1
- data/app/controllers/concerns/sufia/users_controller_behavior.rb +3 -3
- data/app/controllers/concerns/sufia/works_controller_behavior.rb +11 -4
- data/app/controllers/my/highlights_controller.rb +1 -1
- data/app/forms/sufia/forms/batch_edit_form.rb +10 -6
- data/app/forms/sufia/forms/batch_upload_form.rb +2 -2
- data/app/forms/sufia/forms/collection_form.rb +4 -0
- data/app/forms/sufia/forms/work_form.rb +4 -0
- data/app/helpers/sufia/blacklight_override.rb +0 -20
- data/app/helpers/sufia/collections_helper.rb +12 -0
- data/app/helpers/sufia/sufia_helper_behavior.rb +84 -56
- data/app/jobs/batch_create_job.rb +18 -2
- data/app/jobs/content_depositor_change_event_job.rb +13 -6
- data/app/jobs/create_work_job.rb +6 -2
- data/app/models/batch_upload_item.rb +15 -0
- data/app/models/concerns/sufia/ability.rb +7 -4
- data/app/models/concerns/sufia/user.rb +0 -11
- data/app/models/concerns/sufia/work_behavior.rb +1 -0
- data/app/models/concerns/sufia/works/featured.rb +23 -0
- data/app/models/file_download_stat.rb +9 -12
- data/app/models/file_view_stat.rb +5 -15
- data/app/models/proxy_deposit_request.rb +11 -7
- data/app/models/sufia/statistic.rb +65 -0
- data/app/models/work_view_stat.rb +5 -16
- data/app/presenters/file_usage.rb +3 -4
- data/app/presenters/sufia/file_set_presenter.rb +1 -3
- data/app/presenters/sufia/trophy_presenter.rb +28 -0
- data/app/presenters/sufia/user_profile_presenter.rb +1 -1
- data/app/presenters/work_usage.rb +5 -4
- data/app/search_builders/deposit_search_builder.rb +4 -3
- data/app/search_builders/parent_collection_search_builder.rb +1 -1
- data/app/services/sufia/collection_member_service.rb +1 -1
- data/app/services/sufia/user_stat_importer.rb +11 -6
- data/app/views/_controls.html.erb +11 -9
- data/app/views/batch_edits/edit.html.erb +8 -2
- data/app/views/catalog/_index_list_default.html.erb +2 -1
- data/app/views/curation_concerns/base/_form_metadata.html.erb +1 -1
- data/app/views/curation_concerns/base/_form_progress.html.erb +1 -1
- data/app/views/curation_concerns/base/_form_relationships.html.erb +1 -1
- data/app/views/curation_concerns/base/_guts4form.html.erb +6 -2
- data/app/views/curation_concerns/base/_items.html.erb +1 -1
- data/app/views/curation_concerns/base/edit.html.erb +1 -1
- data/app/views/curation_concerns/base/new.html.erb +1 -1
- data/app/views/curation_concerns/file_sets/_permission.html.erb +5 -1
- data/app/views/curation_concerns/file_sets/media_display/_default.html.erb +1 -1
- data/app/views/curation_concerns/file_sets/show.html.erb +1 -1
- data/app/views/dashboard/_index_partials/_heading_actions.html.erb +1 -1
- data/app/views/{error → errors}/404.html.erb +0 -0
- data/app/views/records/edit_fields/_based_near.html.erb +8 -0
- data/app/views/records/edit_fields/_language.html.erb +8 -0
- data/app/views/records/edit_fields/_subject.html.erb +8 -0
- data/app/views/stats/work.html.erb +1 -1
- data/app/views/sufia/batch_uploads/_form.html.erb +1 -1
- data/app/views/sufia/homepage/_home_header.html.erb +1 -1
- data/app/views/sufia/homepage/_sortable_featured.html.erb +1 -1
- data/app/views/transfers/new.html.erb +3 -1
- data/app/views/users/_contributions.html.erb +1 -1
- data/config/locales/sufia.en.yml +3 -2
- data/config/routes.rb +0 -7
- data/lib/generators/sufia/install_generator.rb +0 -24
- data/lib/generators/sufia/templates/catalog_controller.rb +4 -3
- data/lib/generators/sufia/templates/config/sufia.rb +4 -2
- data/lib/generators/sufia/upgrade700_generator.rb +7 -9
- data/lib/generators/sufia/work_generator.rb +56 -0
- data/lib/sufia.rb +4 -1
- data/lib/sufia/arkivo/actor.rb +1 -1
- data/lib/sufia/configuration.rb +15 -3
- data/lib/sufia/engine.rb +1 -10
- data/lib/sufia/version.rb +1 -1
- data/spec/controllers/api/items_controller_spec.rb +20 -7
- data/spec/controllers/sufia/batch_uploads_controller_spec.rb +4 -3
- data/spec/controllers/transfers_controller_spec.rb +3 -11
- data/spec/controllers/users_controller_spec.rb +2 -1
- data/spec/features/batch_edit_spec.rb +17 -2
- data/spec/forms/sufia/forms/batch_edit_form_spec.rb +2 -0
- data/spec/forms/sufia/forms/batch_upload_form_spec.rb +1 -1
- data/spec/helpers/blacklight_helper_spec.rb +36 -26
- data/spec/helpers/{generic_work_helper_spec.rb → sufia/collections_helper_spec.rb} +1 -1
- data/spec/helpers/sufia_helper_spec.rb +70 -32
- data/spec/javascripts/autocomplete_spec.js.coffee +7 -7
- data/spec/javascripts/save_work_spec.js +20 -20
- data/spec/lib/sufia/configuration_spec.rb +30 -0
- data/spec/lib/sufia/user_stat_importer_spec.rb +21 -36
- data/spec/models/file_download_stat_spec.rb +8 -8
- data/spec/models/file_view_stat_spec.rb +8 -8
- data/spec/models/generic_work_spec.rb +24 -0
- data/spec/models/proxy_deposit_request_spec.rb +2 -4
- data/spec/models/sufia/ability_spec.rb +7 -13
- data/spec/models/user_spec.rb +0 -14
- data/spec/models/work_view_stat_spec.rb +22 -8
- data/spec/presenters/sufia/file_usage_spec.rb +0 -4
- data/spec/presenters/sufia/trophy_presenter_spec.rb +46 -0
- data/spec/presenters/sufia/user_profile_presenter_spec.rb +4 -1
- data/spec/presenters/sufia/work_usage_spec.rb +8 -17
- data/spec/routing/route_spec.rb +0 -6
- data/spec/spec_helper.rb +8 -2
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -0
- data/spec/views/batch_edits/edit.html.erb_spec.rb +8 -2
- data/spec/views/catalog/_index_list_default.html.erb_spec.rb +8 -6
- data/spec/views/curation_concerns/base/_form.html.erb_spec.rb +3 -0
- data/spec/views/curation_concerns/file_sets/_permission.html.erb_spec.rb +16 -0
- data/spec/views/curation_concerns/file_sets/show.html.erb_spec.rb +0 -2
- data/spec/views/records/edit_fields/_based_near.html.erb_spec.rb +20 -0
- data/spec/views/records/edit_fields/_language.html.erb_spec.rb +20 -0
- data/spec/views/records/edit_fields/_subject.html.erb_spec.rb +20 -0
- data/spec/views/{homepage → sufia/homepage}/_announcement.html.erb_spec.rb +0 -0
- data/spec/views/{homepage → sufia/homepage}/_featured_works.html.erb_spec.rb +0 -0
- data/spec/views/{homepage → sufia/homepage}/_home_header.html.erb_spec.rb +0 -0
- data/spec/views/sufia/homepage/_sortable_featured.html.erb_spec.rb +21 -0
- data/spec/views/users/edit.html.erb_spec.rb +5 -5
- data/spec/views/users/show.html.erb_spec.rb +5 -3
- data/sufia.gemspec +4 -3
- data/tasks/noid.rake +2 -2
- data/tasks/sufia-dev.rake +1 -1
- metadata +73 -68
- data/app/assets/javascripts/sufia/edit_metadata.js +0 -87
- data/app/controllers/authorities_controller.rb +0 -19
- data/app/helpers/generic_work_helper.rb +0 -10
- data/app/helpers/sufia_url_helper.rb +0 -14
- data/app/models/concerns/sufia/file_stat_utils.rb +0 -33
- data/app/models/concerns/sufia/work_stat_utils.rb +0 -33
- data/app/models/geo_names_resource.rb +0 -18
- data/app/models/local_authority.rb +0 -101
- data/app/models/local_authority_entry.rb +0 -3
- data/app/models/subject_local_authority_entry.rb +0 -2
- data/app/views/curation_concerns/generic_works/_generic_work.html.erb +0 -3
- data/app/views/error/401.html.erb +0 -18
- data/app/views/error/500.html.erb +0 -9
- data/app/views/error/single_use_error.html.erb +0 -19
- data/lib/generators/sufia/geonames_username_config_generator.rb +0 -20
- data/spec/controllers/authorities_controller_spec.rb +0 -18
- data/spec/fixtures/cities15000.tsv +0 -149
- data/spec/fixtures/genreForms.nt +0 -471
- data/spec/fixtures/lexvo.rdf +0 -3108
- data/spec/helpers/sufia_url_helper_spec.rb +0 -18
- data/spec/models/geo_names_resource_spec.rb +0 -30
- data/spec/models/local_authority_spec.rb +0 -108
- data/vendor/assets/javascripts/almond.js +0 -430
@@ -1,7 +1,8 @@
|
|
1
1
|
describe FileDownloadStat, type: :model do
|
2
|
-
let(:file_id) {
|
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 "#
|
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(
|
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,
|
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(
|
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(
|
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) {
|
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 "#
|
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(
|
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,
|
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(
|
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(
|
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.
|
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(:
|
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)
|
44
|
-
|
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 "
|
52
|
-
|
53
|
-
|
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
|
data/spec/models/user_spec.rb
CHANGED
@@ -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) {
|
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 "
|
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(
|
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,
|
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(
|
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(
|
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
|
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)
|
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)
|
data/spec/routing/route_spec.rb
CHANGED
@@ -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')
|
data/spec/spec_helper.rb
CHANGED
@@ -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
|
-
|
154
|
-
|
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
|
|