sufia 4.2.0 → 4.3.1
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.
- checksums.yaml +4 -4
- data/History.md +21 -0
- data/README.md +7 -19
- data/SUFIA_VERSION +1 -1
- data/app/assets/images/orcid.png +0 -0
- data/app/assets/javascripts/sufia.js +6 -1
- data/app/assets/javascripts/sufia/permissions.js +2 -26
- data/app/assets/stylesheets/sufia.css.scss +6 -0
- data/app/assets/stylesheets/sufia/_buttons.scss +6 -1
- data/app/assets/stylesheets/sufia/_dashboard.scss +10 -0
- data/app/assets/stylesheets/sufia/_file-listing.scss +8 -0
- data/app/assets/stylesheets/sufia/_settings.scss +1 -0
- data/app/helpers/batch_edits_helper.rb +1 -1
- data/app/helpers/sufia/sufia_helper_behavior.rb +11 -0
- data/app/models/featured_work_list.rb +4 -1
- data/app/views/batch/edit.html.erb +2 -2
- data/app/views/batch_edits/_check_all.html.erb +8 -6
- data/app/views/collections/_edit_descriptions.html.erb +1 -1
- data/app/views/dashboard/_index_partials/_stats.html.erb +10 -1
- data/app/views/generic_files/_descriptions.html.erb +1 -1
- data/app/views/generic_files/_permission.html.erb +2 -2
- data/app/views/generic_files/_permission_form.html.erb +4 -6
- data/app/views/generic_files/_versioning.html.erb +2 -2
- data/app/views/records/show_fields/_contributor.html.erb +1 -1
- data/app/views/records/show_fields/_creator.html.erb +1 -1
- data/app/views/users/_profile.html.erb +1 -2
- data/app/views/users/_user_info.html.erb +20 -3
- data/app/views/users/edit.html.erb +11 -2
- data/app/views/users/show.html.erb +1 -1
- data/config/locales/sufia.en.yml +5 -0
- data/lib/generators/sufia/install_generator.rb +4 -0
- data/lib/generators/sufia/templates/catalog_controller.rb +4 -0
- data/lib/sufia/version.rb +1 -1
- data/spec/controllers/users_controller_spec.rb +18 -10
- data/spec/features/browse_files_spec.rb +17 -3
- data/spec/features/users_spec.rb +1 -1
- data/spec/helpers/batch_edits_helper_spec.rb +7 -1
- data/spec/lib/sufia/user_stat_importer_spec.rb +206 -0
- data/spec/models/featured_work_list_spec.rb +12 -0
- data/spec/models/file_view_stat_spec.rb +6 -2
- data/spec/models/user_spec.rb +25 -2
- data/spec/models/user_usage_stats_spec.rb +39 -0
- data/spec/views/dashboard/index_spec.rb +4 -0
- data/spec/views/generic_file/_permission_form.html.erb_spec.rb +19 -0
- data/spec/views/generic_file/show.html.erb_spec.rb +2 -2
- data/sufia-models/app/models/concerns/sufia/file_stat_utils.rb +3 -3
- data/sufia-models/app/models/concerns/sufia/user.rb +27 -10
- data/sufia-models/app/models/concerns/sufia/user_usage_stats.rb +15 -0
- data/sufia-models/app/models/file_download_stat.rb +2 -2
- data/sufia-models/app/models/file_usage.rb +7 -3
- data/sufia-models/app/models/file_view_stat.rb +2 -2
- data/sufia-models/app/models/sufia/orcid_validator.rb +8 -0
- data/sufia-models/app/models/user_stat.rb +2 -0
- data/sufia-models/lib/generators/sufia/models/abstract_migration_generator.rb +30 -0
- data/sufia-models/lib/generators/sufia/models/cached_stats_generator.rb +2 -31
- data/sufia-models/lib/generators/sufia/models/install_generator.rb +11 -31
- data/sufia-models/lib/generators/sufia/models/orcid_field_generator.rb +19 -0
- data/sufia-models/lib/generators/sufia/models/proxies_generator.rb +2 -31
- data/sufia-models/lib/generators/sufia/models/templates/config/sufia.rb +3 -5
- data/sufia-models/lib/generators/sufia/models/templates/migrations/add_orcid_to_users.rb +5 -0
- data/sufia-models/lib/generators/sufia/models/templates/migrations/create_user_stats.rb +19 -0
- data/sufia-models/lib/generators/sufia/models/upgrade400_generator.rb +2 -33
- data/sufia-models/lib/generators/sufia/models/user_stats_generator.rb +31 -0
- data/sufia-models/lib/sufia/models/stats/user_stat_importer.rb +85 -0
- data/sufia-models/lib/sufia/models/version.rb +1 -1
- data/sufia-models/lib/tasks/stats_tasks.rake +12 -0
- data/sufia.gemspec +0 -1
- metadata +21 -19
- data/app/views/users/_social_media_info.html.erb +0 -20
@@ -1,5 +1,5 @@
|
|
1
1
|
<h1>Edit Profile</h1>
|
2
|
-
<div class="col-xs-12 col-sm-5">
|
2
|
+
<div class="col-xs-12 col-sm-5 profile">
|
3
3
|
<div class="well">
|
4
4
|
<%= form_for @user, url: sufia.profile_path(@user.to_param), html: {multipart: true, class: 'form-horizontal' } do |f| %>
|
5
5
|
<div class="form-group">
|
@@ -29,6 +29,15 @@
|
|
29
29
|
</div>
|
30
30
|
</div>
|
31
31
|
|
32
|
+
<div class="form-group">
|
33
|
+
<%= f.label :orcid, class: 'col-xs-4 control-label' do %>
|
34
|
+
<%= orcid_label %>
|
35
|
+
<% end %>
|
36
|
+
<div class="col-xs-8">
|
37
|
+
<%= f.text_field :orcid, class: "form-control" %>
|
38
|
+
</div>
|
39
|
+
</div><!-- .form-group -->
|
40
|
+
|
32
41
|
<div class="form-group">
|
33
42
|
<%= f.label :twitter_handle, '<i class="fa fa-twitter"></i> Twitter Handle'.html_safe, class: 'col-xs-4 control-label' %>
|
34
43
|
<div class="col-xs-8">
|
@@ -60,7 +69,7 @@
|
|
60
69
|
</div>
|
61
70
|
</div><!-- .col-xs-5 /well-->
|
62
71
|
|
63
|
-
<div class="col-xs-12 col-sm-offset-1 col-sm-6 well">
|
72
|
+
<div class="col-xs-12 col-sm-offset-1 col-sm-6 well profile">
|
64
73
|
<h2><i class="glyphicon glyphicon-user"></i> Directory Info (LDAP) <%= link_to 'Edit Instructions', 'http://www.psu.edu/directory/#update', class: 'btn btn-mini btn-primary' %></h3>
|
65
74
|
<%= render partial: 'user_info', locals: {user: @user} %>
|
66
75
|
|
data/config/locales/sufia.en.yml
CHANGED
@@ -80,6 +80,8 @@ en:
|
|
80
80
|
stats:
|
81
81
|
heading: "Your Statistics"
|
82
82
|
files: "Files you've deposited"
|
83
|
+
file_views: "View"
|
84
|
+
file_downloads: "Download"
|
83
85
|
collections: "Collections you've created"
|
84
86
|
following: "People you follow"
|
85
87
|
followers: "People who are following you"
|
@@ -147,6 +149,9 @@ en:
|
|
147
149
|
user_profile:
|
148
150
|
no_followers: "No one is following you."
|
149
151
|
no_following: "You are not following anyone."
|
152
|
+
orcid:
|
153
|
+
alt: "ORCID icon"
|
154
|
+
label: "ORCID Profile"
|
150
155
|
batch:
|
151
156
|
help:
|
152
157
|
title: "Filename will be the default title. Please provide a more meaningful title, and filenames will still be preserved by the system."
|
@@ -23,6 +23,10 @@ module Sufia
|
|
23
23
|
generate "sufia:models:install"
|
24
24
|
end
|
25
25
|
|
26
|
+
def banner
|
27
|
+
say_status("warning", "GENERATING SUFIA", :yellow)
|
28
|
+
end
|
29
|
+
|
26
30
|
def insert_abilities
|
27
31
|
insert_into_file 'app/models/ability.rb', after: /Hydra::Ability/ do
|
28
32
|
"\n include Sufia::Ability\n"
|
@@ -30,6 +30,10 @@ class CatalogController < ApplicationController
|
|
30
30
|
end
|
31
31
|
|
32
32
|
configure_blacklight do |config|
|
33
|
+
#Show gallery view
|
34
|
+
config.view.gallery.partials = [:index_header, :index]
|
35
|
+
config.view.slideshow.partials = [:index]
|
36
|
+
|
33
37
|
## Default parameters to send to solr for all search-like requests. See also SolrHelper#solr_search_params
|
34
38
|
config.default_solr_params = {
|
35
39
|
qt: "search",
|
data/lib/sufia/version.rb
CHANGED
@@ -23,10 +23,10 @@ describe UsersController, :type => :controller do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
describe "when the user has trophies" do
|
26
|
-
let(:user) { @user }
|
27
|
-
let(:file1) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
28
|
-
let(:file2) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
29
|
-
let(:file3) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
26
|
+
let(:user) { @user }
|
27
|
+
let(:file1) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
28
|
+
let(:file2) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
29
|
+
let(:file3) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
30
30
|
let!(:trophy1) { user.trophies.create!(generic_file_id: file1.noid) }
|
31
31
|
let!(:trophy2) { user.trophies.create!(generic_file_id: file2.noid) }
|
32
32
|
let!(:trophy3) { user.trophies.create!(generic_file_id: file3.noid) }
|
@@ -105,10 +105,10 @@ describe UsersController, :type => :controller do
|
|
105
105
|
expect(flash[:alert]).to include("Permission denied: cannot access this page.")
|
106
106
|
end
|
107
107
|
describe "when the user has trophies" do
|
108
|
-
let(:user) { @user }
|
109
|
-
let(:file1) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
110
|
-
let(:file2) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
111
|
-
let(:file3) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
108
|
+
let(:user) { @user }
|
109
|
+
let(:file1) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
110
|
+
let(:file2) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
111
|
+
let(:file3) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
112
112
|
let!(:trophy1) { user.trophies.create!(generic_file_id: file1.noid) }
|
113
113
|
let!(:trophy2) { user.trophies.create!(generic_file_id: file2.noid) }
|
114
114
|
let!(:trophy3) { user.trophies.create!(generic_file_id: file3.noid) }
|
@@ -182,7 +182,8 @@ describe UsersController, :type => :controller do
|
|
182
182
|
expect(@user.facebook_handle).to be_blank
|
183
183
|
expect(@user.googleplus_handle).to be_blank
|
184
184
|
expect(@user.linkedin_handle).to be_blank
|
185
|
-
|
185
|
+
expect(@user.orcid).to be_blank
|
186
|
+
post :update, id: @user.user_key, user: { twitter_handle: 'twit', facebook_handle: 'face', googleplus_handle: 'goo', linkedin_handle: "link", orcid: '0000-0000-1111-2222' }
|
186
187
|
expect(response).to redirect_to(@routes.url_helpers.profile_path(@user.to_param))
|
187
188
|
expect(flash[:notice]).to include("Your profile has been updated")
|
188
189
|
u = User.find_by_user_key(@user.user_key)
|
@@ -190,11 +191,18 @@ describe UsersController, :type => :controller do
|
|
190
191
|
expect(u.facebook_handle).to eq 'face'
|
191
192
|
expect(u.googleplus_handle).to eq 'goo'
|
192
193
|
expect(u.linkedin_handle).to eq 'link'
|
194
|
+
expect(u.orcid).to eq 'http://orcid.org/0000-0000-1111-2222'
|
195
|
+
end
|
196
|
+
it 'displays a flash when invalid ORCID is entered' do
|
197
|
+
expect(@user.orcid).to be_blank
|
198
|
+
post :update, id: @user.user_key, user: { orcid: 'foobar' }
|
199
|
+
expect(response).to redirect_to(@routes.url_helpers.edit_profile_path(@user.to_param))
|
200
|
+
expect(flash[:alert]).to include('Orcid must be a string of 19 characters, e.g., "0000-0000-0000-0000"')
|
193
201
|
end
|
194
202
|
|
195
203
|
context "when removing a trophy" do
|
196
204
|
let(:user) { @user }
|
197
|
-
let(:file) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
205
|
+
let(:file) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
|
198
206
|
before do
|
199
207
|
user.trophies.create!(generic_file_id: file.noid)
|
200
208
|
end
|
@@ -7,9 +7,14 @@ describe "Browse files", :type => :feature do
|
|
7
7
|
@fixtures = find_or_create_file_fixtures
|
8
8
|
@fixtures[0].tag = ["key"]
|
9
9
|
(1..25).each do |i|
|
10
|
-
@fixtures[0].tag << i
|
10
|
+
@fixtures[0].tag << "key_#{i}"
|
11
11
|
end
|
12
|
+
@fixtures[1].tag = ["key"]
|
12
13
|
@fixtures[0].save
|
14
|
+
(1..20).each do |i|
|
15
|
+
@fixtures[1].tag << "key_#{i}"
|
16
|
+
end
|
17
|
+
@fixtures[1].save
|
13
18
|
end
|
14
19
|
|
15
20
|
after :all do
|
@@ -23,21 +28,30 @@ describe "Browse files", :type => :feature do
|
|
23
28
|
click_button "search-submit-header"
|
24
29
|
click_link "Keyword"
|
25
30
|
click_link "more Keywords»"
|
31
|
+
expect(page).to have_css "h3", text: "Keyword"
|
26
32
|
end
|
27
33
|
|
28
34
|
describe "when not logged in" do
|
29
35
|
it "should let us browse some of the fixtures" do
|
30
36
|
click_link "18"
|
31
37
|
expect(page).to have_content "Search Results"
|
38
|
+
expect(page).to have_css "a", text: @fixtures[0].title[0]
|
32
39
|
click_link @fixtures[0].title[0]
|
33
40
|
expect(page).to have_content "Download"
|
34
41
|
expect(page).not_to have_content "Edit"
|
35
42
|
end
|
36
43
|
it "should allow you to click next" do
|
44
|
+
expect(page).to have_content "Numerical Sort"
|
45
|
+
expect(page).to have_css "a.sort_change", text:"A-Z Sort"
|
46
|
+
within(".modal-body") do
|
47
|
+
expect(page).to have_content "key_1 "
|
48
|
+
expect(page).not_to have_content "key_25 "
|
49
|
+
end
|
37
50
|
click_link 'Next »'
|
51
|
+
expect(page).to have_css "a.btn-link", text:"« Previous", wait: Capybara.default_wait_time*4
|
38
52
|
within(".modal-body") do
|
39
|
-
expect(page).to have_content "
|
40
|
-
expect(page).not_to have_content "
|
53
|
+
expect(page).to have_content "key_25 "
|
54
|
+
expect(page).not_to have_content "key_1 "
|
41
55
|
end
|
42
56
|
end
|
43
57
|
end
|
data/spec/features/users_spec.rb
CHANGED
@@ -30,7 +30,7 @@ describe "User Profile", :type => :feature do
|
|
30
30
|
click_button 'Save Profile'
|
31
31
|
expect(page).to have_content 'Your profile has been updated'
|
32
32
|
click_link 'Profile'
|
33
|
-
expect(page).to
|
33
|
+
expect(page).to have_link('curatorOfData', href: 'http://twitter.com/curatorOfData')
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -16,6 +16,12 @@ describe BatchEditsHelper, :type => :helper do
|
|
16
16
|
allow(helper).to receive(:controller_name).and_return("batch_edits")
|
17
17
|
expect(helper.render_check_all).to have_css("span.glyphicon-cog")
|
18
18
|
end
|
19
|
+
|
20
|
+
it "should show my action menu for my controller" do
|
21
|
+
allow(helper).to receive(:params).and_return({ controller: "my" })
|
22
|
+
allow(helper).to receive(:controller_name).and_return("my")
|
23
|
+
expect(helper.render_check_all).not_to have_content("ABC")
|
24
|
+
end
|
19
25
|
end
|
20
26
|
|
21
27
|
context "with my collections" do
|
@@ -29,7 +35,7 @@ describe BatchEditsHelper, :type => :helper do
|
|
29
35
|
it "should not show the check all dropdown" do
|
30
36
|
allow(helper).to receive(:params).and_return({ controller: "foo" })
|
31
37
|
assign(:disable_select_all, true)
|
32
|
-
expect(helper.render_check_all).to
|
38
|
+
expect(helper.render_check_all).to have_css("input[disabled=disabled]")
|
33
39
|
end
|
34
40
|
end
|
35
41
|
|
@@ -0,0 +1,206 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../../sufia-models/lib/sufia/models/stats/user_stat_importer'
|
3
|
+
|
4
|
+
describe Sufia::UserStatImporter do
|
5
|
+
|
6
|
+
before do
|
7
|
+
GenericFile.delete_all
|
8
|
+
User.delete_all
|
9
|
+
|
10
|
+
UserStat.delete_all
|
11
|
+
FileViewStat.delete_all
|
12
|
+
FileDownloadStat.delete_all
|
13
|
+
|
14
|
+
allow(Sufia.config).to receive(:analytic_start_date) { dates[0] }
|
15
|
+
stub_out_call_to_google_analytics
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:bilbo) { FactoryGirl.create(:user, email: 'bilbo@example.com') }
|
19
|
+
let(:frodo) { FactoryGirl.create(:user, email: 'frodo@example.com') }
|
20
|
+
|
21
|
+
let!(:bilbo_file_1) do
|
22
|
+
GenericFile.new(pid: 'bilbo:1').tap do |f|
|
23
|
+
f.apply_depositor_metadata(bilbo.email)
|
24
|
+
f.save
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
let!(:bilbo_file_2) do
|
29
|
+
GenericFile.new(pid: 'bilbo:2').tap do |f|
|
30
|
+
f.apply_depositor_metadata(bilbo.email)
|
31
|
+
f.save
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
let!(:frodo_file_1) do
|
36
|
+
GenericFile.new(pid: 'frodo:1').tap do |f|
|
37
|
+
f.apply_depositor_metadata(frodo.email)
|
38
|
+
f.save
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:dates) {
|
43
|
+
ldates = []
|
44
|
+
4.downto(0) {|idx| ldates << (Date.today-idx.day) }
|
45
|
+
ldates
|
46
|
+
}
|
47
|
+
|
48
|
+
let(:date_strs) {
|
49
|
+
ldate_strs = []
|
50
|
+
dates.each {|date| ldate_strs << date.strftime("%Y%m%d") }
|
51
|
+
ldate_strs
|
52
|
+
}
|
53
|
+
|
54
|
+
# This is what the data looks like that's returned from Google Analytics via the Legato gem.
|
55
|
+
let(:bilbo_file_1_pageview_stats) {
|
56
|
+
[
|
57
|
+
OpenStruct.new(date: date_strs[0], pageviews: 1),
|
58
|
+
OpenStruct.new(date: date_strs[1], pageviews: 2),
|
59
|
+
OpenStruct.new(date: date_strs[2], pageviews: 3),
|
60
|
+
OpenStruct.new(date: date_strs[3], pageviews: 4),
|
61
|
+
OpenStruct.new(date: date_strs[4], pageviews: 5)
|
62
|
+
]
|
63
|
+
}
|
64
|
+
|
65
|
+
let(:bilbo_file_2_pageview_stats) {
|
66
|
+
[
|
67
|
+
OpenStruct.new(date: date_strs[0], pageviews: 11),
|
68
|
+
OpenStruct.new(date: date_strs[1], pageviews: 12),
|
69
|
+
OpenStruct.new(date: date_strs[2], pageviews: 13),
|
70
|
+
OpenStruct.new(date: date_strs[3], pageviews: 14),
|
71
|
+
OpenStruct.new(date: date_strs[4], pageviews: 15)
|
72
|
+
]
|
73
|
+
}
|
74
|
+
|
75
|
+
let(:frodo_file_1_pageview_stats) {
|
76
|
+
[
|
77
|
+
OpenStruct.new(date: date_strs[0], pageviews: 2),
|
78
|
+
OpenStruct.new(date: date_strs[1], pageviews: 4),
|
79
|
+
OpenStruct.new(date: date_strs[2], pageviews: 1),
|
80
|
+
OpenStruct.new(date: date_strs[3], pageviews: 1),
|
81
|
+
OpenStruct.new(date: date_strs[4], pageviews: 9)
|
82
|
+
]
|
83
|
+
}
|
84
|
+
|
85
|
+
let(:bilbo_file_1_download_stats) {
|
86
|
+
[
|
87
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:1", date: date_strs[0], totalEvents: "2"),
|
88
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:1", date: date_strs[1], totalEvents: "3"),
|
89
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:1", date: date_strs[2], totalEvents: "5"),
|
90
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:1", date: date_strs[3], totalEvents: "3"),
|
91
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:1", date: date_strs[4], totalEvents: "7"),
|
92
|
+
]
|
93
|
+
}
|
94
|
+
|
95
|
+
let(:bilbo_file_2_download_stats) {
|
96
|
+
[
|
97
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:2", date: date_strs[0], totalEvents: "1"),
|
98
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:2", date: date_strs[1], totalEvents: "4"),
|
99
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:2", date: date_strs[2], totalEvents: "3"),
|
100
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:2", date: date_strs[3], totalEvents: "2"),
|
101
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "bilbo:2", date: date_strs[4], totalEvents: "3"),
|
102
|
+
]
|
103
|
+
}
|
104
|
+
|
105
|
+
let(:frodo_file_1_download_stats) {
|
106
|
+
[
|
107
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "frodo:1", date: date_strs[0], totalEvents: "5"),
|
108
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "frodo:1", date: date_strs[1], totalEvents: "4"),
|
109
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "frodo:1", date: date_strs[2], totalEvents: "2"),
|
110
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "frodo:1", date: date_strs[3], totalEvents: "1"),
|
111
|
+
OpenStruct.new(eventCategory: "Files", eventAction: "Downloaded", eventLabel: "frodo:1", date: date_strs[4], totalEvents: "6"),
|
112
|
+
]
|
113
|
+
}
|
114
|
+
|
115
|
+
|
116
|
+
describe 'with empty cache' do
|
117
|
+
it 'for each user it adds one entry per day to the cache' do
|
118
|
+
Sufia::UserStatImporter.new.import
|
119
|
+
|
120
|
+
bilbos_stats = UserStat.where(user_id: bilbo.id).order(date: :asc)
|
121
|
+
expect(bilbos_stats.count).to eq 4
|
122
|
+
|
123
|
+
bilbos_stats.each_with_index do |actual_values, i|
|
124
|
+
expected_file_views = bilbo_file_1_pageview_stats[i].pageviews + bilbo_file_2_pageview_stats[i].pageviews
|
125
|
+
expected_file_downloads = bilbo_file_1_download_stats[i].totalEvents.to_i + bilbo_file_2_download_stats[i].totalEvents.to_i
|
126
|
+
expected_values = { date: dates[i], views: expected_file_views, downloads: expected_file_downloads }
|
127
|
+
assert_stats_match(expected_values, actual_values)
|
128
|
+
end
|
129
|
+
|
130
|
+
frodos_stats = UserStat.where(user_id: frodo.id).order(date: :asc)
|
131
|
+
expect(frodos_stats.count).to eq 4
|
132
|
+
|
133
|
+
frodos_stats.each_with_index do |actual_values, i|
|
134
|
+
expected_file_views = frodo_file_1_pageview_stats[i].pageviews
|
135
|
+
expected_file_downloads = frodo_file_1_download_stats[i].totalEvents.to_i
|
136
|
+
expected_values = { date: dates[i], views: expected_file_views, downloads: expected_file_downloads }
|
137
|
+
assert_stats_match(expected_values, actual_values)
|
138
|
+
end
|
139
|
+
|
140
|
+
expect(UserStat.count).to eq bilbos_stats.count + frodos_stats.count
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe 'with existing data in cache' do
|
145
|
+
before do
|
146
|
+
[dates[0], dates[1]].each_with_index do |date, i|
|
147
|
+
UserStat.create!(user_id: bilbo.id, date: date, file_views: 100 + i, file_downloads: 200 + i)
|
148
|
+
end
|
149
|
+
UserStat.create!(user_id: frodo.id, date: dates[0], file_views: 300, file_downloads: 400)
|
150
|
+
end
|
151
|
+
|
152
|
+
it "doesn't duplicate entries for existing dates" do
|
153
|
+
expect(User.count).to eq 2
|
154
|
+
expect(UserStat.count).to eq 3
|
155
|
+
|
156
|
+
Sufia::UserStatImporter.new.import
|
157
|
+
|
158
|
+
bilbos_stats = UserStat.where(user_id: bilbo.id).order(date: :asc)
|
159
|
+
expect(bilbos_stats.count).to eq 4
|
160
|
+
|
161
|
+
expect(bilbos_stats[0].file_views).to eq(bilbo_file_1_pageview_stats[0].pageviews + bilbo_file_2_pageview_stats[0].pageviews)
|
162
|
+
expect(bilbos_stats[0].file_downloads).to eq(bilbo_file_1_download_stats[0].totalEvents.to_i + bilbo_file_2_download_stats[0].totalEvents.to_i)
|
163
|
+
|
164
|
+
expect(bilbos_stats[1].file_views).to eq(bilbo_file_1_pageview_stats[1].pageviews + bilbo_file_2_pageview_stats[1].pageviews)
|
165
|
+
expect(bilbos_stats[1].file_downloads).to eq(bilbo_file_1_download_stats[1].totalEvents.to_i + bilbo_file_2_download_stats[1].totalEvents.to_i)
|
166
|
+
|
167
|
+
frodos_stats = UserStat.where(user_id: frodo.id).order(date: :asc)
|
168
|
+
expect(frodos_stats.count).to eq 4
|
169
|
+
|
170
|
+
expect(frodos_stats[0].file_views).to eq(frodo_file_1_pageview_stats[0].pageviews)
|
171
|
+
|
172
|
+
expect(frodos_stats[0].file_downloads).to eq(frodo_file_1_download_stats[0].totalEvents.to_i)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
def stub_out_call_to_google_analytics
|
179
|
+
allow(FileViewStat).to receive(:ga_statistics) do |date, file_id|
|
180
|
+
case file_id
|
181
|
+
when bilbo_file_1.id
|
182
|
+
bilbo_file_1_pageview_stats
|
183
|
+
when bilbo_file_2.id
|
184
|
+
bilbo_file_2_pageview_stats
|
185
|
+
else
|
186
|
+
frodo_file_1_pageview_stats
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
allow(FileDownloadStat).to receive(:ga_statistics) do |date, file_id|
|
191
|
+
case file_id
|
192
|
+
when bilbo_file_1.id
|
193
|
+
bilbo_file_1_download_stats
|
194
|
+
when bilbo_file_2.id
|
195
|
+
bilbo_file_2_download_stats
|
196
|
+
else
|
197
|
+
frodo_file_1_download_stats
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def assert_stats_match(expected_value, actual_value)
|
203
|
+
expect(actual_value.date).to eq expected_value[:date]
|
204
|
+
expect(actual_value.file_views).to eq expected_value[:views]
|
205
|
+
expect(actual_value.file_downloads).to eq expected_value[:downloads]
|
206
|
+
end
|
@@ -19,4 +19,16 @@ describe FeaturedWorkList, :type => :model do
|
|
19
19
|
expect(solr_doc.noid).to eq file1.noid
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
describe 'file deleted' do
|
24
|
+
before do
|
25
|
+
file1.destroy
|
26
|
+
end
|
27
|
+
it 'should be a list of the remaining featured work objects, each with the generic_file\'s solr_doc' do
|
28
|
+
expect(subject.featured_works.size).to eq 1
|
29
|
+
solr_doc = subject.featured_works.first.generic_file_solr_document
|
30
|
+
expect(solr_doc).to be_kind_of SolrDocument
|
31
|
+
expect(solr_doc.noid).to eq file2.noid
|
32
|
+
end
|
33
|
+
end
|
22
34
|
end
|