umlaut 3.2.0 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/app/assets/stylesheets/umlaut/_resolve.scss +1 -1
- data/app/controllers/feedback_controller.rb +46 -0
- data/app/controllers/resource_controller.rb +19 -1
- data/app/controllers/search_methods/sfx4.rb +15 -0
- data/app/controllers/umlaut_controller.rb +6 -0
- data/app/helpers/emailer_helper.rb +17 -3
- data/app/mailers/feedback_mailer.rb +25 -0
- data/app/mixin_logic/metadata_helper.rb +37 -0
- data/app/models/referent.rb +22 -19
- data/app/models/request.rb +3 -0
- data/app/referent_filters/dissertation_catch.rb +1 -1
- data/app/service_adaptors/all_books_dot_com.rb +17 -0
- data/app/service_adaptors/illiad.rb +161 -0
- data/app/service_adaptors/isbn_db.rb +6 -1
- data/app/service_adaptors/isbn_link.rb +57 -0
- data/app/service_adaptors/scopus.rb +4 -0
- data/app/service_adaptors/scopus2.rb +330 -0
- data/app/views/feedback/_resolve_section.html.erb +16 -0
- data/app/views/feedback/new.html.erb +33 -0
- data/app/views/feedback_mailer/feedback.text.erb +23 -0
- data/app/views/layouts/umlaut.html.erb +2 -0
- data/app/views/umlaut/_alerts.html.erb +14 -0
- data/lib/generators/templates/umlaut_services.yml +8 -8
- data/lib/umlaut/routes.rb +8 -1
- data/lib/umlaut/version.rb +1 -1
- data/test/dummy/tmp/cache/assets/BFF/760/sprockets%2Fe00969069e468419c393709f042b4527 +0 -0
- data/test/dummy/tmp/cache/assets/C9D/060/sprockets%2F5c8956a1666824a1d214531abd22e2a2 +0 -0
- data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/D15/FC0/sprockets%2F8cbf3a8b7acb7fc27a42168846226385 +0 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/D98/990/sprockets%2F710ede3e7f5ebab14e9772fa88c00c02 +0 -0
- data/test/dummy/tmp/cache/assets/DAD/BA0/sprockets%2F193f81f7e4eae26eaaa7d909c0c8e956 +0 -0
- data/test/dummy/tmp/cache/assets/DCB/620/sprockets%2F2332a294ceeab3ab9b5ee643989dc0eb +0 -0
- data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/functional/feedback_controller_test.rb +59 -0
- data/test/test_helper.rb +13 -0
- data/test/unit/feedback_mailer_test.rb +57 -0
- data/test/unit/illiad_test.rb +146 -0
- data/test/unit/metadata_helper_test.rb +49 -0
- data/test/unit/referent_to_citation_test.rb +45 -0
- data/test/unit/scopus2_test.rb +147 -0
- data/test/vcr_cassettes/scopus/live_test_with_no_hits.yml +52 -0
- data/test/vcr_cassettes/scopus/live_test_with_result.yml +62 -0
- data/test/vcr_cassettes/scopus/live_trigger_scopus_error.yml +50 -0
- metadata +34 -120
- data/test/dummy/tmp/cache/sass/b43409235ed55124ccf6a0235156711682d0fe98/umlaut.css.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d2b87393a9fcb33d01e765e1c09b76db7f14f647/bootstrap-responsive.scssc +0 -0
- data/test/dummy/tmp/cache/sass/d2b87393a9fcb33d01e765e1c09b76db7f14f647/bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_accordion.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_button-groups.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_carousel.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_close.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_code.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_component-animations.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_dropdowns.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_hero-unit.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_labels-badges.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_layouts.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_media.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_modals.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_navbar.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_navs.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_pager.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_popovers.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_progress-bars.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_reset.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-1200px-min.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-767px-max.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-768px-979px.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-navbar.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-utilities.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_scaffolding.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_sprites.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_tables.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_thumbnails.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_tooltip.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_type.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_wells.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/responsive.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_admin.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_az.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_icons.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_layout.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_misc.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_modal.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_resolve.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_results.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_search.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_spinner.scssc +0 -0
- data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_variables.scssc +0 -0
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
class IlliadTest < ActiveSupport::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@service = Illiad.new('service_id' => 'test_illiad', 'base_url' => 'http://example.org/illiad.dll/OpenURL', 'priority' => 0)
|
8
|
+
end
|
9
|
+
|
10
|
+
def make_test_request(params)
|
11
|
+
# hard to figure out how to mock a request, this seems to work
|
12
|
+
ActionController::TestRequest.new(Rack::MockRequest.env_for("?#{params.to_query}"))
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute_service(params)
|
16
|
+
rails_request = make_test_request(params)
|
17
|
+
umlaut_request = Request.find_or_create(params, {}, rails_request)
|
18
|
+
@service.handle_wrapper(umlaut_request)
|
19
|
+
return umlaut_request
|
20
|
+
end
|
21
|
+
|
22
|
+
def parsed_params_from_first_response(umlaut_request)
|
23
|
+
response = umlaut_request.service_responses.first
|
24
|
+
target_url = response.url
|
25
|
+
target_url =~ %r{\Ahttp://example.org/illiad.dll/OpenURL\?(.*)\Z}
|
26
|
+
query_string = $1
|
27
|
+
out_params = CGI.parse(query_string)
|
28
|
+
|
29
|
+
return out_params
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_basic_case
|
33
|
+
params = {
|
34
|
+
'sid' => 'SomeSource',
|
35
|
+
'genre' => 'article',
|
36
|
+
'aulast' => 'Smith',
|
37
|
+
'aufirst' => 'John',
|
38
|
+
'au' => 'Smith, Johnny, Jr., Esq.',
|
39
|
+
'volume' => '100',
|
40
|
+
'issue' => '1',
|
41
|
+
'spage' => '500',
|
42
|
+
'epage' => '505',
|
43
|
+
'pages' => 'do not use',
|
44
|
+
'issn' => '12345678',
|
45
|
+
'jtitle' => 'Journal Of Lots Of Things',
|
46
|
+
'stitle' => 'J L Things',
|
47
|
+
'atitle' => 'Article Title',
|
48
|
+
'date' => '2011-05-12',
|
49
|
+
'pub' => 'Johnson Publishing',
|
50
|
+
'place' => 'Baltimore, MD',
|
51
|
+
'edition' => '1st ed.'
|
52
|
+
}
|
53
|
+
|
54
|
+
umlaut_request = execute_service(params)
|
55
|
+
|
56
|
+
|
57
|
+
assert_length 1, umlaut_request.service_responses
|
58
|
+
|
59
|
+
response = umlaut_request.service_responses.first
|
60
|
+
|
61
|
+
assert_equal "document_delivery", response.service_type_value_name
|
62
|
+
|
63
|
+
target_url = response.url
|
64
|
+
assert_present target_url
|
65
|
+
assert_match %r{\Ahttp://example.org/illiad.dll/OpenURL\?(.*)\Z}, target_url
|
66
|
+
|
67
|
+
|
68
|
+
target_url =~ %r{\Ahttp://example.org/illiad.dll/OpenURL\?(.*)\Z}
|
69
|
+
query_string = $1
|
70
|
+
out_params = CGI.parse(query_string)
|
71
|
+
|
72
|
+
assert_equal ['SomeSource (via Umlaut)'], out_params['sid']
|
73
|
+
|
74
|
+
# Ones that just get passed through
|
75
|
+
['genre', 'aulast', 'aufirst', 'volume', 'issue', 'spage', 'epage',
|
76
|
+
'issn', 'stitle', 'atitle'].each do |key|
|
77
|
+
assert_equal [params[key]], out_params[key]
|
78
|
+
end
|
79
|
+
|
80
|
+
assert_equal ['2011'], out_params['year']
|
81
|
+
assert_equal ['05'], out_params['month']
|
82
|
+
|
83
|
+
assert_equal [params['jtitle']], out_params['title']
|
84
|
+
|
85
|
+
assert_equal [params['pub']], out_params['rft.pub']
|
86
|
+
assert_equal [params['place']], out_params['rft.place']
|
87
|
+
assert_equal [params['edition']], out_params['rft.edition']
|
88
|
+
|
89
|
+
assert_empty out_params['au']
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_genre_dissertation_normalize
|
93
|
+
params = {
|
94
|
+
'rft_val_fmt'=> 'info:ofi/fmt:kev:mtx:dissertation',
|
95
|
+
'title' => 'our title',
|
96
|
+
'au' => 'our author'
|
97
|
+
}
|
98
|
+
umlaut_request = execute_service(params)
|
99
|
+
out_params = parsed_params_from_first_response(umlaut_request)
|
100
|
+
|
101
|
+
assert_equal ['dissertation'], out_params['genre']
|
102
|
+
assert_equal ['our title'], out_params['title']
|
103
|
+
assert_equal ['our author'], out_params['au']
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_genre_bookitem_normalize
|
107
|
+
params = {
|
108
|
+
'genre' => 'book',
|
109
|
+
'atitle' => 'Chapter Title',
|
110
|
+
'title' => 'Book Title',
|
111
|
+
'isbn' => '978-3-16-148410-0'
|
112
|
+
}
|
113
|
+
umlaut_request = execute_service(params)
|
114
|
+
out_params = parsed_params_from_first_response(umlaut_request)
|
115
|
+
|
116
|
+
assert_equal ['bookitem'], out_params['genre']
|
117
|
+
assert_equal [params['atitle']], out_params['atitle']
|
118
|
+
assert_equal [params['title']], out_params['title']
|
119
|
+
assert_equal [params['isbn']], out_params['isbn']
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_genre_force_issn_article
|
123
|
+
params = {
|
124
|
+
'atitle' => "A title",
|
125
|
+
'jtitle' => 'Journal Title',
|
126
|
+
'issn' => '12345678'
|
127
|
+
}
|
128
|
+
|
129
|
+
umlaut_request = execute_service(params)
|
130
|
+
out_params = parsed_params_from_first_response(umlaut_request)
|
131
|
+
|
132
|
+
assert_equal ['article'], out_params['genre']
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_genre_force_book
|
136
|
+
params = {
|
137
|
+
'title' => 'DVD Title?',
|
138
|
+
'genre' => 'unknown',
|
139
|
+
'isbn' => '978-3-16-148410-0'
|
140
|
+
}
|
141
|
+
umlaut_request = execute_service(params)
|
142
|
+
out_params = parsed_params_from_first_response(umlaut_request)
|
143
|
+
|
144
|
+
assert_equal ['book'], out_params['genre']
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# Doesn't yet cover everything, but started it to cover new func we wrote at least
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
class MetadataHelperTest < ActiveSupport::TestCase
|
5
|
+
include MetadataHelper
|
6
|
+
|
7
|
+
ContextObject = OpenURL::ContextObject
|
8
|
+
|
9
|
+
|
10
|
+
def test_get_month
|
11
|
+
co = ContextObject.new_from_kev("date=2012-9-01&foo=bar")
|
12
|
+
assert_equal "9", get_month(co.referent)
|
13
|
+
|
14
|
+
co = ContextObject.new_from_kev("date=2012-10-01&foo=bar")
|
15
|
+
assert_equal "10", get_month(co.referent)
|
16
|
+
|
17
|
+
co = ContextObject.new_from_kev("date=2012-10&foo=bar")
|
18
|
+
assert_equal "10", get_month(co.referent)
|
19
|
+
|
20
|
+
co = ContextObject.new_from_kev("date=2012-10-01&month=9")
|
21
|
+
assert_equal "10", get_month(co.referent)
|
22
|
+
|
23
|
+
# If no date, try non-standard month
|
24
|
+
co = ContextObject.new_from_kev("month=9&foo=bar")
|
25
|
+
assert_equal "9", get_month(co.referent)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_get_spage
|
29
|
+
co = ContextObject.new_from_kev("spage=20&epage=22&pages=unused&foo=bar")
|
30
|
+
assert_equal "20", get_spage(co.referent)
|
31
|
+
|
32
|
+
co = ContextObject.new_from_kev("pages=20+-+22&foo=bar")
|
33
|
+
assert_equal "20", get_spage(co.referent)
|
34
|
+
|
35
|
+
co = ContextObject.new_from_kev("pages=20&foo=bar")
|
36
|
+
assert_equal "20", get_spage(co.referent)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_get_epage
|
40
|
+
co = ContextObject.new_from_kev("spage=20&epage=22&pages=unused&foo=bar")
|
41
|
+
assert_equal "22", get_epage(co.referent)
|
42
|
+
|
43
|
+
co = ContextObject.new_from_kev("pages=20+-+22&foo=bar")
|
44
|
+
assert_equal "22", get_epage(co.referent)
|
45
|
+
|
46
|
+
co = ContextObject.new_from_kev("pages=20&foo=bar")
|
47
|
+
assert_equal "20", get_epage(co.referent)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# Some basic tests for referent.to_citation, which returns a hash of various citation
|
4
|
+
# information.
|
5
|
+
class ReferentToCitationTest < Test::Unit::TestCase
|
6
|
+
# referent = make_test_referent("title=foo&au=bar&genre=book")
|
7
|
+
def make_test_referent(openurl_kev)
|
8
|
+
co = OpenURL::ContextObject.new_from_kev( openurl_kev )
|
9
|
+
ref = Referent.create_by_context_object( co )
|
10
|
+
|
11
|
+
return ref
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_simple_book
|
15
|
+
# an exmaple from Borrow Direct as it happens
|
16
|
+
ref = make_test_referent("genre=Book&sid=BD&rft.title=The%20monk&rft.aufirst=%20M.%20G.&rft.aulast=Lewis&rft.date=1797&rft.pub=Printed%20by%20William%20Porter&rft.place=Dublin¨aut.force_new_request=true")
|
17
|
+
cit_hash = ref.to_citation
|
18
|
+
|
19
|
+
assert_equal "The monk", cit_hash[:title]
|
20
|
+
assert_equal "1797", cit_hash[:date]
|
21
|
+
assert_equal "Lewis, M. G.", cit_hash[:author]
|
22
|
+
assert_equal "Book", cit_hash[:title_label]
|
23
|
+
assert_equal "Printed by William Porter", cit_hash[:pub]
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_article
|
27
|
+
# an article from Google Scholar
|
28
|
+
ref = make_test_referent("sid=google&auinit=S&aulast=Madsbad&atitle=Mechanisms+of+changes+in+glucose+metabolism+and+bodyweight+after+bariatric+surgery&id=doi:10.1016/S2213-8587(13)70218-3&title=The+Lancet+Diabetes+%26+Endocrinology&volume=2&issue=2&date=2014&spage=152&issn=2213-8587")
|
29
|
+
cit_hash = ref.to_citation
|
30
|
+
|
31
|
+
assert_equal "Mechanisms of changes in glucose metabolism and bodyweight after bariatric surgery",
|
32
|
+
cit_hash[:title]
|
33
|
+
assert_equal "Article Title", cit_hash[:title_label]
|
34
|
+
assert_equal "The Lancet Diabetes & Endocrinology", cit_hash[:container_title]
|
35
|
+
assert_equal "Journal", cit_hash[:container_label]
|
36
|
+
assert_equal "22138587", cit_hash[:issn]
|
37
|
+
assert_equal "2", cit_hash[:volume]
|
38
|
+
assert_equal "2", cit_hash[:issue]
|
39
|
+
assert_equal "2014", cit_hash[:date]
|
40
|
+
assert_equal "Madsbad, S", cit_hash[:author]
|
41
|
+
assert_equal "152", cit_hash[:page]
|
42
|
+
assert_equal ["info:doi/10.1016/S2213-8587(13)70218-3"], cit_hash[:identifiers]
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
class Scopus2Test < ActiveSupport::TestCase
|
5
|
+
extend TestWithCassette
|
6
|
+
|
7
|
+
# Set shell env SCOPUS_KEY to your api key to test fresh http
|
8
|
+
# connections, if you can't use the ones cached by VCR.
|
9
|
+
|
10
|
+
# Filter API key out of VCR cache for tag :scopus, which we'll use
|
11
|
+
# in this test.
|
12
|
+
@@api_key = (ENV["SCOPUS_KEY"] || "DUMMY_API_KEY")
|
13
|
+
VCR.configure do |c|
|
14
|
+
c.filter_sensitive_data("DUMMY_API_KEY", :scopus) { @@api_key }
|
15
|
+
end
|
16
|
+
|
17
|
+
def setup
|
18
|
+
@service = Scopus2.new('service_id' => 'test_scopus2', 'api_key' => @@api_key, 'priority' => 0)
|
19
|
+
end
|
20
|
+
|
21
|
+
def make_rails_request(umlaut_url)
|
22
|
+
# hard to figure out how to mock a request, this seems to work
|
23
|
+
ActionController::TestRequest.new(Rack::MockRequest.env_for(umlaut_url))
|
24
|
+
end
|
25
|
+
|
26
|
+
def make_umlaut_request(umlaut_url)
|
27
|
+
rails_request = make_rails_request(umlaut_url)
|
28
|
+
Request.find_or_create(rails_request.params, {}, rails_request)
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# Actual openurl sent by google scholar, including a doi.
|
33
|
+
# Do we correctly create a scopus doi query?
|
34
|
+
def test_doi_query
|
35
|
+
doi = '10.1007/s10350-006-0578-2'
|
36
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&auinit=J&aulast=Rafferty&atitle=Practice+parameters+for+sigmoid+diverticulitis&id=doi:#{CGI.escape doi}&title=Diseases+of+the+colon+%26+rectum&volume=49&issue=7&date=2006&spage=939&issn=0012-3706")
|
37
|
+
|
38
|
+
scopus_query = @service.scopus_query(umlaut_request)
|
39
|
+
|
40
|
+
assert_equal %Q{DOI("#{doi}")}, scopus_query
|
41
|
+
end
|
42
|
+
|
43
|
+
# No doi, but full citation. scopus query?
|
44
|
+
def test_non_doi_query
|
45
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&auinit=J&aulast=Rafferty&atitle=Practice+parameters+for+sigmoid+diverticulitis&title=Diseases+of+the+colon+%26+rectum&volume=49&issue=7&date=2006&spage=939&issn=0012-3706")
|
46
|
+
|
47
|
+
scopus_query = @service.scopus_query(umlaut_request)
|
48
|
+
|
49
|
+
expected_query = "VOLUME(\"49\") AND ISSUE(\"7\") AND PAGEFIRST(\"939\") AND (ISSN(\"00123706\") OR EISSN(\"00123706\"))"
|
50
|
+
assert_equal expected_query, scopus_query
|
51
|
+
end
|
52
|
+
|
53
|
+
# journal title but no issn
|
54
|
+
def test_no_issn_query
|
55
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&auinit=J&aulast=Rafferty&atitle=Practice+parameters+for+sigmoid+diverticulitis&title=Diseases+of+the+colon+%26+rectum&volume=49&issue=7&date=2006&spage=939&jtitle=Diseases+of+the+colon+%26+rectum")
|
56
|
+
|
57
|
+
scopus_query = @service.scopus_query(umlaut_request)
|
58
|
+
|
59
|
+
expected_query = "VOLUME(\"49\") AND ISSUE(\"7\") AND PAGEFIRST(\"939\") AND EXACTSRCTITLE(\"Diseases of the colon & rectum\")"
|
60
|
+
assert_equal expected_query, scopus_query
|
61
|
+
end
|
62
|
+
|
63
|
+
# Not enough to make a query, no journal title or issn
|
64
|
+
def test_insufficient_metadata_query
|
65
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&auinit=J&aulast=Rafferty&atitle=Practice+parameters+for+sigmoid+diverticulitis&title=Diseases+of+the+colon+%26+rectum&volume=49&issue=7&date=2006&spage=939")
|
66
|
+
|
67
|
+
scopus_query = @service.scopus_query(umlaut_request)
|
68
|
+
|
69
|
+
assert_nil scopus_query
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_pmid_query
|
73
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&pmid=123456&atitle=ignore&aulast=ignore&issn=12345678")
|
74
|
+
|
75
|
+
scopus_query = @service.scopus_query(umlaut_request)
|
76
|
+
|
77
|
+
assert_equal "PMID(\"123456\")", scopus_query
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_isbn_query
|
81
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&isbn=1234567890&title=ignore&aulast=ignore")
|
82
|
+
|
83
|
+
scopus_query = @service.scopus_query(umlaut_request)
|
84
|
+
|
85
|
+
assert_equal "ISBN(\"1234567890\")", scopus_query
|
86
|
+
end
|
87
|
+
|
88
|
+
# Live test, with VCR recording
|
89
|
+
test_with_cassette("live test with result", :scopus) do
|
90
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&auinit=J&aulast=Rafferty&atitle=Practice+parameters+for+sigmoid+diverticulitis&title=Diseases+of+the+colon+%26+rectum&volume=49&issue=7&date=2006&spage=939&issn=0012-3706")
|
91
|
+
|
92
|
+
@service.handle_wrapper(umlaut_request)
|
93
|
+
|
94
|
+
cited_by_responses = umlaut_request.service_responses.find_all {|r| r.service_type_value_name == "cited_by"}
|
95
|
+
assert_length 1, cited_by_responses
|
96
|
+
|
97
|
+
cited_by_response = cited_by_responses.first
|
98
|
+
assert_match URI::regexp, cited_by_response.url, "cited_by has valid url"
|
99
|
+
assert_present cited_by_response.display_text
|
100
|
+
|
101
|
+
similar_responses = umlaut_request.service_responses.find_all {|r| r.service_type_value_name == "similar"}
|
102
|
+
assert_length 2, similar_responses
|
103
|
+
|
104
|
+
similar_responses.each do |similar_response|
|
105
|
+
assert_match URI::regexp, similar_response.url, "similar-type response has valid url"
|
106
|
+
assert_present similar_response.display_text, "similar-type response has display_text"
|
107
|
+
end
|
108
|
+
|
109
|
+
dispatch = umlaut_request.dispatched_services.find {|ds| ds.service_id == @service.service_id}
|
110
|
+
assert_present dispatch
|
111
|
+
assert_equal DispatchedService::Successful, dispatch.status
|
112
|
+
end
|
113
|
+
|
114
|
+
test_with_cassette("live test with no hits", :scopus) do
|
115
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&atitle=adfadfadf&title=adfadf&volume=4900&issue=700&date=1900&spage=93900&issn=0012-3706")
|
116
|
+
|
117
|
+
@service.handle_wrapper(umlaut_request)
|
118
|
+
|
119
|
+
assert_length 0, umlaut_request.service_responses
|
120
|
+
|
121
|
+
dispatch = umlaut_request.dispatched_services.find {|ds| ds.service_id == @service.service_id}
|
122
|
+
assert_present dispatch
|
123
|
+
assert_equal DispatchedService::Successful, dispatch.status
|
124
|
+
end
|
125
|
+
|
126
|
+
test_with_cassette("live trigger scopus error", :scopus) do
|
127
|
+
# Make a new service object that we mock to send a back request to Scopus, so
|
128
|
+
# we can verify our error handling
|
129
|
+
service = Scopus2.new('service_id' => 'test_scopus2', 'api_key' => @@api_key, 'priority' => 0)
|
130
|
+
service.extend( Module.new do
|
131
|
+
def scopus_query(request)
|
132
|
+
# malformed query meant to trigger an error from scopus
|
133
|
+
"DOI("
|
134
|
+
end
|
135
|
+
end)
|
136
|
+
|
137
|
+
umlaut_request = make_umlaut_request("/resolve?sid=google&atitle=adfadfadf&title=adfadf&volume=4900&issue=700&date=1900&spage=93900&issn=0012-3706")
|
138
|
+
service.handle_wrapper(umlaut_request)
|
139
|
+
|
140
|
+
assert_empty umlaut_request.service_responses
|
141
|
+
|
142
|
+
dispatch = umlaut_request.dispatched_services.find {|ds| ds.service_id == service.service_id}
|
143
|
+
assert_present dispatch
|
144
|
+
assert_equal DispatchedService::FailedFatal, dispatch.status
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://api.elsevier.com/content/search/index:SCOPUS?apiKey=DUMMY_API_KEY&query=VOLUME(%224900%22)%20AND%20ISSUE(%22700%22)%20AND%20PAGEFIRST(%2293900%22)%20%20AND%20(ISSN(%2200123706%22)%20OR%20EISSN(%2200123706%22))
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/xml
|
12
|
+
User-Agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message: OK
|
18
|
+
headers:
|
19
|
+
Server:
|
20
|
+
- api.elsevier.com 9999
|
21
|
+
X-Els-Status:
|
22
|
+
- NO_SEARCH_RESULTS(Result set was empty)
|
23
|
+
X-Els-Reqid:
|
24
|
+
- 000001458afaadb1-220e6ff
|
25
|
+
X-Els-Apikey:
|
26
|
+
- DUMMY_API_KEY
|
27
|
+
X-Els-Transid:
|
28
|
+
- 495f47aa-0aef-4cd2-889d-18e8c466779d
|
29
|
+
Allow:
|
30
|
+
- GET
|
31
|
+
Content-Type:
|
32
|
+
- application/atom+xml;charset=UTF-8
|
33
|
+
Content-Length:
|
34
|
+
- '1001'
|
35
|
+
Date:
|
36
|
+
- Thu, 08 May 2014 17:49:28 GMT
|
37
|
+
X-Re-Ref:
|
38
|
+
- 1 440851037
|
39
|
+
P3p:
|
40
|
+
- CP="IDC DSP LAW ADM DEV TAI PSA PSD IVA IVD CON HIS TEL OUR DEL SAM OTR IND
|
41
|
+
OTC"
|
42
|
+
body:
|
43
|
+
encoding: US-ASCII
|
44
|
+
string: <search-results xmlns="http://www.w3.org/2005/Atom" xmlns:atom="http://www.w3.org/2005/Atom"
|
45
|
+
xmlns:prism="http://prismstandard.org/namespaces/basic/2.0/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"
|
46
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"><opensearch:totalResults>0</opensearch:totalResults><opensearch:startIndex>0</opensearch:startIndex><opensearch:itemsPerPage>0</opensearch:itemsPerPage><opensearch:Query
|
47
|
+
role="request" searchTerms="VOLUME%28%224900%22%29+AND+ISSUE%28%22700%22%29+AND+PAGEFIRST%28%2293900%22%29++AND+%28ISSN%28%2200123706%22%29+OR+EISSN%28%2200123706%22%29%29"
|
48
|
+
startPage="0"/><link ref="self" href="http://api.elsevier.com:80/content/search/index:SCOPUS?start=0&count=25&apiKey=DUMMY_API_KEY&query=VOLUME%28%224900%22%29+AND+ISSUE%28%22700%22%29+AND+PAGEFIRST%28%2293900%22%29++AND+%28ISSN%28%2200123706%22%29+OR+EISSN%28%2200123706%22%29%29"
|
49
|
+
type="application/xml"/><entry><error>Result set was empty</error></entry></search-results>
|
50
|
+
http_version:
|
51
|
+
recorded_at: Thu, 08 May 2014 17:49:29 GMT
|
52
|
+
recorded_with: VCR 2.5.0
|
@@ -0,0 +1,62 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://api.elsevier.com/content/search/index:SCOPUS?apiKey=DUMMY_API_KEY&query=VOLUME(%2249%22)%20AND%20ISSUE(%227%22)%20AND%20PAGEFIRST(%22939%22)%20%20AND%20(ISSN(%2200123706%22)%20OR%20EISSN(%2200123706%22))
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/xml
|
12
|
+
User-Agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message: OK
|
18
|
+
headers:
|
19
|
+
Server:
|
20
|
+
- api.elsevier.com 9999
|
21
|
+
X-Els-Status:
|
22
|
+
- OK
|
23
|
+
X-Els-Reqid:
|
24
|
+
- 000001458afaadb1-220e752
|
25
|
+
X-Els-Apikey:
|
26
|
+
- DUMMY_API_KEY
|
27
|
+
X-Els-Transid:
|
28
|
+
- 5e47cd41-743c-41fc-8e61-822bcc3fdcdf
|
29
|
+
Allow:
|
30
|
+
- GET
|
31
|
+
Content-Type:
|
32
|
+
- application/xml;charset=UTF-8
|
33
|
+
Content-Length:
|
34
|
+
- '2625'
|
35
|
+
Date:
|
36
|
+
- Thu, 08 May 2014 17:49:30 GMT
|
37
|
+
X-Re-Ref:
|
38
|
+
- 1 442840349
|
39
|
+
P3p:
|
40
|
+
- CP="IDC DSP LAW ADM DEV TAI PSA PSD IVA IVD CON HIS TEL OUR DEL SAM OTR IND
|
41
|
+
OTC"
|
42
|
+
body:
|
43
|
+
encoding: US-ASCII
|
44
|
+
string: ! '<?xml version="1.0" encoding="UTF-8"?><search-results xmlns="http://www.w3.org/2005/Atom"
|
45
|
+
xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"
|
46
|
+
xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:prism="http://prismstandard.org/namespaces/basic/2.0/"><opensearch:totalResults>1</opensearch:totalResults><opensearch:startIndex>0</opensearch:startIndex><opensearch:itemsPerPage>1</opensearch:itemsPerPage><opensearch:Query
|
47
|
+
role="request" searchTerms="VOLUME%28%2249%22%29+AND+ISSUE%28%227%22%29+AND+PAGEFIRST%28%22939%22%29++AND+%28ISSN%28%2200123706%22%29+OR+EISSN%28%2200123706%22%29%29"
|
48
|
+
startPage="0"/><link href="http://api.elsevier.com:80/content/search/index:scopus?start=0&count=25&apiKey=DUMMY_API_KEY&query=VOLUME%28%2249%22%29+AND+ISSUE%28%227%22%29+AND+PAGEFIRST%28%22939%22%29++AND+%28ISSN%28%2200123706%22%29+OR+EISSN%28%2200123706%22%29%29"
|
49
|
+
ref="self" title="alt abstract link" type="application/xml"/><link href="http://api.elsevier.com:80/content/search/index:scopus?start=0&count=25&apiKey=DUMMY_API_KEY&query=VOLUME%28%2249%22%29+AND+ISSUE%28%227%22%29+AND+PAGEFIRST%28%22939%22%29++AND+%28ISSN%28%2200123706%22%29+OR+EISSN%28%2200123706%22%29%29"
|
50
|
+
ref="first" title="alt abstract link" type="application/xml"/><entry><link
|
51
|
+
href="http://api.elsevier.com/content/abstract/scopus_id:33745938780" ref="self"
|
52
|
+
title="alt abstract link"/><link href="http://www.scopus.com/inward/record.url?partnerID=HzOxMe3b&scp=33745938780"
|
53
|
+
ref="scopus" title="alt abstract link"/><link href="http://www.scopus.com/inward/citedby.url?partnerID=HzOxMe3b&scp=33745938780"
|
54
|
+
ref="scopus-citedby" title="alt abstract link"/><prism:url>http://api.elsevier.com/content/abstract/scopus_id:33745938780</prism:url><dc:identifier>SCOPUS_ID:33745938780</dc:identifier><eid>2-s2.0-33745938780</eid><dc:title>Practice
|
55
|
+
parameters for sigmoid diverticulitis</dc:title><dc:creator>Rafferty, J.</dc:creator><prism:publicationName>Diseases
|
56
|
+
of the Colon and Rectum</prism:publicationName><prism:issn>00123706</prism:issn><prism:eIssn>15300358</prism:eIssn><prism:volume>49</prism:volume><prism:issueIdentifier>7</prism:issueIdentifier><prism:pageRange>939-944</prism:pageRange><prism:coverDate>2006-07-01</prism:coverDate><prism:coverDisplayDate>July
|
57
|
+
2006</prism:coverDisplayDate><prism:doi>10.1007/s10350-006-0578-2</prism:doi><citedby-count>304</citedby-count><pubmed-id>16741596</pubmed-id><prism:aggregationType>Journal</prism:aggregationType><subtype>re</subtype><subtypeDescription>Review</subtypeDescription></entry></search-results>
|
58
|
+
|
59
|
+
'
|
60
|
+
http_version:
|
61
|
+
recorded_at: Thu, 08 May 2014 17:49:31 GMT
|
62
|
+
recorded_with: VCR 2.5.0
|
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://api.elsevier.com/content/search/index:SCOPUS?apiKey=DUMMY_API_KEY&query=DOI(
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/xml
|
12
|
+
User-Agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 400
|
17
|
+
message: Bad Request
|
18
|
+
headers:
|
19
|
+
Server:
|
20
|
+
- api.elsevier.com 9999
|
21
|
+
X-Els-Status:
|
22
|
+
- INVALID_INPUT(Unable to translate query provided)
|
23
|
+
X-Els-Reqid:
|
24
|
+
- 000001458ad94e47-221faa3
|
25
|
+
X-Els-Apikey:
|
26
|
+
- DUMMY_API_KEY
|
27
|
+
X-Els-Transid:
|
28
|
+
- 31f73f96-ec26-4ccf-8404-0fa010688248
|
29
|
+
Allow:
|
30
|
+
- GET
|
31
|
+
Content-Type:
|
32
|
+
- text/xml;charset=UTF-8
|
33
|
+
Content-Length:
|
34
|
+
- '156'
|
35
|
+
Date:
|
36
|
+
- Thu, 08 May 2014 17:49:31 GMT
|
37
|
+
X-Cnection:
|
38
|
+
- close
|
39
|
+
X-Re-Ref:
|
40
|
+
- 1 444135611
|
41
|
+
P3p:
|
42
|
+
- CP="IDC DSP LAW ADM DEV TAI PSA PSD IVA IVD CON HIS TEL OUR DEL SAM OTR IND
|
43
|
+
OTC"
|
44
|
+
body:
|
45
|
+
encoding: US-ASCII
|
46
|
+
string: ! "<service-error>\n\t<status>\n\t\t<statusCode>INVALID_INPUT</statusCode>\n\t\t<statusText>Unable
|
47
|
+
to translate query provided</statusText>\n\t</status>\n</service-error>"
|
48
|
+
http_version:
|
49
|
+
recorded_at: Thu, 08 May 2014 17:49:32 GMT
|
50
|
+
recorded_with: VCR 2.5.0
|