umlaut 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/README.md +1 -1
  2. data/app/assets/stylesheets/umlaut/_resolve.scss +1 -1
  3. data/app/controllers/feedback_controller.rb +46 -0
  4. data/app/controllers/resource_controller.rb +19 -1
  5. data/app/controllers/search_methods/sfx4.rb +15 -0
  6. data/app/controllers/umlaut_controller.rb +6 -0
  7. data/app/helpers/emailer_helper.rb +17 -3
  8. data/app/mailers/feedback_mailer.rb +25 -0
  9. data/app/mixin_logic/metadata_helper.rb +37 -0
  10. data/app/models/referent.rb +22 -19
  11. data/app/models/request.rb +3 -0
  12. data/app/referent_filters/dissertation_catch.rb +1 -1
  13. data/app/service_adaptors/all_books_dot_com.rb +17 -0
  14. data/app/service_adaptors/illiad.rb +161 -0
  15. data/app/service_adaptors/isbn_db.rb +6 -1
  16. data/app/service_adaptors/isbn_link.rb +57 -0
  17. data/app/service_adaptors/scopus.rb +4 -0
  18. data/app/service_adaptors/scopus2.rb +330 -0
  19. data/app/views/feedback/_resolve_section.html.erb +16 -0
  20. data/app/views/feedback/new.html.erb +33 -0
  21. data/app/views/feedback_mailer/feedback.text.erb +23 -0
  22. data/app/views/layouts/umlaut.html.erb +2 -0
  23. data/app/views/umlaut/_alerts.html.erb +14 -0
  24. data/lib/generators/templates/umlaut_services.yml +8 -8
  25. data/lib/umlaut/routes.rb +8 -1
  26. data/lib/umlaut/version.rb +1 -1
  27. data/test/dummy/tmp/cache/assets/BFF/760/sprockets%2Fe00969069e468419c393709f042b4527 +0 -0
  28. data/test/dummy/tmp/cache/assets/C9D/060/sprockets%2F5c8956a1666824a1d214531abd22e2a2 +0 -0
  29. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  30. data/test/dummy/tmp/cache/assets/D15/FC0/sprockets%2F8cbf3a8b7acb7fc27a42168846226385 +0 -0
  31. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  32. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  33. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  34. data/test/dummy/tmp/cache/assets/D98/990/sprockets%2F710ede3e7f5ebab14e9772fa88c00c02 +0 -0
  35. data/test/dummy/tmp/cache/assets/DAD/BA0/sprockets%2F193f81f7e4eae26eaaa7d909c0c8e956 +0 -0
  36. data/test/dummy/tmp/cache/assets/DCB/620/sprockets%2F2332a294ceeab3ab9b5ee643989dc0eb +0 -0
  37. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  38. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  39. data/test/functional/feedback_controller_test.rb +59 -0
  40. data/test/test_helper.rb +13 -0
  41. data/test/unit/feedback_mailer_test.rb +57 -0
  42. data/test/unit/illiad_test.rb +146 -0
  43. data/test/unit/metadata_helper_test.rb +49 -0
  44. data/test/unit/referent_to_citation_test.rb +45 -0
  45. data/test/unit/scopus2_test.rb +147 -0
  46. data/test/vcr_cassettes/scopus/live_test_with_no_hits.yml +52 -0
  47. data/test/vcr_cassettes/scopus/live_test_with_result.yml +62 -0
  48. data/test/vcr_cassettes/scopus/live_trigger_scopus_error.yml +50 -0
  49. metadata +34 -120
  50. data/test/dummy/tmp/cache/sass/b43409235ed55124ccf6a0235156711682d0fe98/umlaut.css.scssc +0 -0
  51. data/test/dummy/tmp/cache/sass/d2b87393a9fcb33d01e765e1c09b76db7f14f647/bootstrap-responsive.scssc +0 -0
  52. data/test/dummy/tmp/cache/sass/d2b87393a9fcb33d01e765e1c09b76db7f14f647/bootstrap.scssc +0 -0
  53. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_accordion.scssc +0 -0
  54. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_alerts.scssc +0 -0
  55. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_breadcrumbs.scssc +0 -0
  56. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_button-groups.scssc +0 -0
  57. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_buttons.scssc +0 -0
  58. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_carousel.scssc +0 -0
  59. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_close.scssc +0 -0
  60. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_code.scssc +0 -0
  61. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_component-animations.scssc +0 -0
  62. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_dropdowns.scssc +0 -0
  63. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_forms.scssc +0 -0
  64. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_grid.scssc +0 -0
  65. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_hero-unit.scssc +0 -0
  66. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_labels-badges.scssc +0 -0
  67. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_layouts.scssc +0 -0
  68. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_media.scssc +0 -0
  69. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_mixins.scssc +0 -0
  70. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_modals.scssc +0 -0
  71. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_navbar.scssc +0 -0
  72. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_navs.scssc +0 -0
  73. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_pager.scssc +0 -0
  74. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_pagination.scssc +0 -0
  75. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_popovers.scssc +0 -0
  76. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_progress-bars.scssc +0 -0
  77. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_reset.scssc +0 -0
  78. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-1200px-min.scssc +0 -0
  79. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-767px-max.scssc +0 -0
  80. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-768px-979px.scssc +0 -0
  81. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-navbar.scssc +0 -0
  82. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_responsive-utilities.scssc +0 -0
  83. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_scaffolding.scssc +0 -0
  84. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_sprites.scssc +0 -0
  85. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_tables.scssc +0 -0
  86. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_thumbnails.scssc +0 -0
  87. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_tooltip.scssc +0 -0
  88. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_type.scssc +0 -0
  89. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_utilities.scssc +0 -0
  90. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_variables.scssc +0 -0
  91. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/_wells.scssc +0 -0
  92. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/bootstrap.scssc +0 -0
  93. data/test/dummy/tmp/cache/sass/db21ae7b0d8da2224e8e1d588985ee0507dc926a/responsive.scssc +0 -0
  94. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_admin.scssc +0 -0
  95. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_az.scssc +0 -0
  96. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_forms.scssc +0 -0
  97. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_icons.scssc +0 -0
  98. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_layout.scssc +0 -0
  99. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_misc.scssc +0 -0
  100. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_mixins.scssc +0 -0
  101. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_modal.scssc +0 -0
  102. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_resolve.scssc +0 -0
  103. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_results.scssc +0 -0
  104. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_search.scssc +0 -0
  105. data/test/dummy/tmp/cache/sass/fc140da5c32e19b5c3f84a23bb2383ebc83fcc20/_spinner.scssc +0 -0
  106. 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&umlaut.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&amp;count=25&amp;apiKey=DUMMY_API_KEY&amp;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&amp;count=25&amp;apiKey=DUMMY_API_KEY&amp;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&amp;count=25&amp;apiKey=DUMMY_API_KEY&amp;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&amp;scp=33745938780"
53
+ ref="scopus" title="alt abstract link"/><link href="http://www.scopus.com/inward/citedby.url?partnerID=HzOxMe3b&amp;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