krikri 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/krikri/records_controller.rb +7 -7
  3. data/app/models/krikri/validation_report.rb +1 -1
  4. data/lib/krikri/harvesters/couchdb_harvester.rb +66 -10
  5. data/lib/krikri/version.rb +1 -1
  6. data/spec/internal/Gemfile.lock +9 -9
  7. data/spec/internal/config/initializers/blacklight_initializer.rb +1 -1
  8. data/spec/internal/config/initializers/devise.rb +2 -2
  9. data/spec/internal/config/secrets.yml +2 -2
  10. data/spec/internal/db/development.sqlite3 +0 -0
  11. data/spec/internal/db/migrate/{20150406003020_devise_create_users.rb → 20150408190519_devise_create_users.rb} +0 -0
  12. data/spec/internal/db/migrate/{20150406003043_create_searches.blacklight.rb → 20150408190543_create_searches.blacklight.rb} +0 -0
  13. data/spec/internal/db/migrate/{20150406003044_create_bookmarks.blacklight.rb → 20150408190544_create_bookmarks.blacklight.rb} +0 -0
  14. data/spec/internal/db/migrate/{20150406003045_add_polymorphic_type_to_bookmarks.blacklight.rb → 20150408190545_add_polymorphic_type_to_bookmarks.blacklight.rb} +0 -0
  15. data/spec/internal/db/schema.rb +1 -1
  16. data/spec/internal/db/test.sqlite3 +0 -0
  17. data/spec/internal/log/development.log +53 -53
  18. data/spec/internal/log/test.log +3901 -3777
  19. data/spec/internal/tmp/cache/318/301/krikri%2Fapplication_helper%2Favailable_providers +0 -0
  20. data/spec/internal/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  21. data/spec/internal/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  22. data/spec/internal/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  23. data/spec/internal/tmp/cache/assets/test/sprockets/93aaa9231a32901266b05632f3d35ecd +0 -0
  24. data/spec/internal/tmp/cache/assets/test/sprockets/ad4a54c43c2a4c3874bfde1c9f08c248 +0 -0
  25. data/spec/internal/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  26. data/spec/internal/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  27. data/spec/internal/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  28. data/spec/lib/krikri/harvesters/couchdb_harvester_spec.rb +195 -36
  29. metadata +10 -10
@@ -5,17 +5,80 @@ require 'pry'
5
5
  describe Krikri::Harvesters::CouchdbHarvester do
6
6
 
7
7
  let(:args) { { uri: 'http://example.org:5984/couchdb' } }
8
- let(:svr) { double(Analysand::StreamingViewResponse) }
8
+ # Generic Analysand view responses for all records. Note that we're using a
9
+ # ViewResponse when it could be a StreamingViewResponse in some cases. The
10
+ # interfaces of these classes is the same, so it keeps these tests cleaner to
11
+ # stick to ViewResponse.
12
+ let(:view_response) { double(Analysand::ViewResponse) }
13
+ # Analysand view responses for paginated requests that are used in `#records'
14
+ let(:view_response_page_1) { double(Analysand::ViewResponse) }
15
+ let(:view_response_page_2) { double(Analysand::ViewResponse) }
16
+ # Analysand view responses for `#count'
17
+ let(:view_response_totalrows) { double(Analysand::ViewResponse) }
18
+ let(:view_response_ddcount) { double(Analysand::ViewResponse) }
9
19
 
10
- # Set up some responses to reuse
11
- let(:view_response) do
20
+ # The HTTP response bodies from the view responses above, plus the options
21
+ # passed in the corresponding client.view calls
22
+ #
23
+ let(:view_response_body) do
12
24
  <<-EOS.strip_heredoc
13
- {"total_rows":5,"offset":0,"rows":[
25
+ {"total_rows":8,"offset":0,"rows":[
14
26
  {"id":"10046--http://ark.cdlib.org/ark:/13030/kt009nc254","key":"10046--http://ark.cdlib.org/ark:/13030/kt009nc254","value":{"rev":"11-e68fd829f55b85dec51d044fe4711530"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt009nc254","_rev":"11-e68fd829f55b85dec51d044fe4711530","object":"e6d7a72d8e957175a46965f104b9bb52"}},
15
27
  {"id":"10046--http://ark.cdlib.org/ark:/13030/kt0199p9ph","key":"10046--http://ark.cdlib.org/ark:/13030/kt0199p9ph","value":{"rev":"11-fec45c2c32bf6b468d8d6413796ff85b"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt0199p9ph","_rev":"11-fec45c2c32bf6b468d8d6413796ff85b","object":"744cc17058614440ae6c3722aaacb4c3"}},
16
28
  {"id":"10046--http://ark.cdlib.org/ark:/13030/kt029016nn","key":"10046--http://ark.cdlib.org/ark:/13030/kt029016nn","value":{"rev":"11-b3e9a75b56599a78cb875ffb5c508c2b"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt029016nn","_rev":"11-b3e9a75b56599a78cb875ffb5c508c2b","object":"bfecb6c11db808ca6603cd13def5f9bf"}},
17
29
  {"id":"10046--http://ark.cdlib.org/ark:/13030/kt038nc34r","key":"10046--http://ark.cdlib.org/ark:/13030/kt038nc34r","value":{"rev":"11-c9ebbeb8064280e674ea79c0b16c59d6"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt038nc34r","_rev":"11-c9ebbeb8064280e674ea79c0b16c59d6","object":"d2e3b4d91fba4f77df6fb8fab46f3375"}},
18
- {"id":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","key":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","value":{"rev":"11-7fbb604516852656d30f37bbe1f09d5f"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","_rev":"11-7fbb604516852656d30f37bbe1f09d5f","object":"0162e70cde3d9d77ba8cbe9e146beda4"}}
30
+ {"id":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","key":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","value":{"rev":"11-7fbb604516852656d30f37bbe1f09d5f"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","_rev":"11-7fbb604516852656d30f37bbe1f09d5f","object":"0162e70cde3d9d77ba8cbe9e146beda4"}},
31
+ {"id":"_design/all_provider_docs","key":"_design/all_provider_docs","value":{"rev":"1-5f16aec70767aa294b07ad4396bc56af"},"doc":{"_id":"_design/all_provider_docs","_rev":"1-9347ba9fffa89bdd76092466a0e83d71"}},
32
+ {"id":"_design/auth","key":"_design/auth","value":{"rev":"1-1beca9b6e893c434a7d4fc19d9468d9b"},"doc":{"_id":"_design/auth","_rev":"1-1beca9b6e893c434a7d4fc19d9468d9b"}},
33
+ {"id":"_design/export_database","key":"_design/export_database","value":{"rev":"1-82e865010760bbe7760acd013a0913ba"},"doc":{"_id":"_design/export_database","_rev":"1-82e865010760bbe7760acd013a0913ba"}}
34
+ ]}
35
+ EOS
36
+ end
37
+
38
+ let(:view_opts_page_1) do
39
+ { include_docs: true, stream: false, limit: 4 }
40
+ end
41
+ let(:view_response_body_page_1) do
42
+ <<-EOS.strip_heredoc
43
+ {"total_rows":8,"offset":0,"rows":[
44
+ {"id":"10046--http://ark.cdlib.org/ark:/13030/kt009nc254","key":"10046--http://ark.cdlib.org/ark:/13030/kt009nc254","value":{"rev":"11-e68fd829f55b85dec51d044fe4711530"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt009nc254","_rev":"11-e68fd829f55b85dec51d044fe4711530","object":"e6d7a72d8e957175a46965f104b9bb52"}},
45
+ {"id":"10046--http://ark.cdlib.org/ark:/13030/kt0199p9ph","key":"10046--http://ark.cdlib.org/ark:/13030/kt0199p9ph","value":{"rev":"11-fec45c2c32bf6b468d8d6413796ff85b"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt0199p9ph","_rev":"11-fec45c2c32bf6b468d8d6413796ff85b","object":"744cc17058614440ae6c3722aaacb4c3"}},
46
+ {"id":"10046--http://ark.cdlib.org/ark:/13030/kt029016nn","key":"10046--http://ark.cdlib.org/ark:/13030/kt029016nn","value":{"rev":"11-b3e9a75b56599a78cb875ffb5c508c2b"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt029016nn","_rev":"11-b3e9a75b56599a78cb875ffb5c508c2b","object":"bfecb6c11db808ca6603cd13def5f9bf"}},
47
+ {"id":"10046--http://ark.cdlib.org/ark:/13030/kt038nc34r","key":"10046--http://ark.cdlib.org/ark:/13030/kt038nc34r","value":{"rev":"11-c9ebbeb8064280e674ea79c0b16c59d6"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt038nc34r","_rev":"11-c9ebbeb8064280e674ea79c0b16c59d6","object":"d2e3b4d91fba4f77df6fb8fab46f3375"}}
48
+ ]}
49
+ EOS
50
+ end
51
+
52
+ let(:view_opts_page_2) do
53
+ { include_docs: true, stream: false, limit: 4,
54
+ startkey: '10046--http://ark.cdlib.org/ark:/13030/kt038nc34r0' }
55
+ end
56
+ let(:view_response_body_page_2) do
57
+ <<-EOS.strip_heredoc
58
+ {"total_rows":8,"offset":0,"rows":[
59
+ {"id":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","key":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","value":{"rev":"11-7fbb604516852656d30f37bbe1f09d5f"},"doc":{"_id":"10046--http://ark.cdlib.org/ark:/13030/kt0489p9km","_rev":"11-7fbb604516852656d30f37bbe1f09d5f","object":"0162e70cde3d9d77ba8cbe9e146beda4"}},
60
+ {"id":"_design/all_provider_docs","key":"_design/all_provider_docs","value":{"rev":"1-5f16aec70767aa294b07ad4396bc56af"},"doc":{"_id":"_design/all_provider_docs","_rev":"1-9347ba9fffa89bdd76092466a0e83d71"}},
61
+ {"id":"_design/auth","key":"_design/auth","value":{"rev":"1-1beca9b6e893c434a7d4fc19d9468d9b"},"doc":{"_id":"_design/auth","_rev":"1-1beca9b6e893c434a7d4fc19d9468d9b"}},
62
+ {"id":"_design/export_database","key":"_design/export_database","value":{"rev":"1-82e865010760bbe7760acd013a0913ba"},"doc":{"_id":"_design/export_database","_rev":"1-82e865010760bbe7760acd013a0913ba"}}
63
+ ]}
64
+ EOS
65
+ end
66
+
67
+ let(:view_opts_common_stream) { { include_docs: false, stream: true } }
68
+ let(:view_opts_common_nostream) do
69
+ { include_docs: true, stream: false, limit: 10 }
70
+ end
71
+
72
+ let(:view_opts_designdoc_count) do
73
+ { include_docs: false, stream: false,
74
+ startkey: '_design', endkey: '_design0' }
75
+ end
76
+ let(:view_response_body_designdoc_count) do
77
+ <<-EOS.strip_heredoc
78
+ {"total_rows":8,"offset":5,"rows":[
79
+ {"id":"_design/all_provider_docs","key":"_design/all_provider_docs","value":{"rev":"1-9347ba9fffa89bdd76092466a0e83d71"}},
80
+ {"id":"_design/auth","key":"_design/auth","value":{"rev":"1-1beca9b6e893c434a7d4fc19d9468d9b"}},
81
+ {"id":"_design/export_database","key":"_design/export_database","value":{"rev":"1-82e865010760bbe7760acd013a0913ba"}}
19
82
  ]}
20
83
  EOS
21
84
  end
@@ -28,17 +91,41 @@ EOS
28
91
 
29
92
  let(:identifier) { '10046--http://ark.cdlib.org/ark:/13030/kt009nc254' }
30
93
 
31
- let(:parsed_response) { JSON.parse(view_response) }
94
+ let(:parsed_response) { JSON.parse(view_response_body) }
95
+ let(:parsed_response_page_1) { JSON.parse(view_response_body_page_1) }
96
+ let(:parsed_response_page_2) { JSON.parse(view_response_body_page_2) }
97
+ let(:parsed_response_designdoc_count) do
98
+ JSON.parse(view_response_body_designdoc_count)
99
+ end
100
+ let(:parsed_response_no_dd) do
101
+ rv = parsed_response
102
+ rv['rows'] = parsed_response['rows'].select do |r|
103
+ !r['id'].start_with?('_design')
104
+ end
105
+ rv
106
+ end
32
107
 
33
108
  before do
34
- allow(svr).to receive(:docs)
35
- .and_return(parsed_response['rows'].map { |r| r['doc'] })
36
- allow(svr).to receive(:keys)
109
+ allow(view_response).to receive(:rows)
110
+ .and_return(parsed_response['rows'])
111
+ allow(view_response).to receive(:keys)
37
112
  .and_return(parsed_response['rows'].map { |r| r['key'] })
38
- allow(svr).to receive(:total_rows)
113
+ allow(view_response).to receive(:total_rows)
39
114
  .and_return(parsed_response['total_rows'])
40
- allow(subject.client).to receive(:view)
41
- .with(instance_of(String), instance_of(Hash)).and_return(svr)
115
+
116
+ allow(view_response_page_1).to receive(:rows)
117
+ .and_return(parsed_response_page_1['rows'])
118
+ allow(view_response_page_1).to receive(:total_rows)
119
+ .and_return(parsed_response_page_1['total_rows'])
120
+ allow(view_response_page_2).to receive(:rows)
121
+ .and_return(parsed_response_page_2['rows'])
122
+ allow(view_response_page_2).to receive(:total_rows)
123
+ .and_return(parsed_response_page_2['total_rows'])
124
+
125
+ allow(view_response_ddcount).to receive(:keys)
126
+ .and_return(parsed_response_designdoc_count['rows'].map { |r| r['key'] })
127
+ allow(view_response_ddcount).to receive(:total_rows)
128
+ .and_return(parsed_response_designdoc_count['total_rows'])
42
129
  end
43
130
 
44
131
  subject { described_class.new(args) }
@@ -65,43 +152,110 @@ EOS
65
152
  couchdb: { view: '_all_docs' } }
66
153
  end
67
154
 
68
- let(:request_opts) { { view: 'foo/bar' } }
155
+ # "send options" shared example takes these options:
156
+ #
157
+ # `method`: method to test
158
+ # `m_opts`: options passed into the given method
159
+ # `r_opts`: options that should be passed to client.view for the request,
160
+ # given the method opts
161
+ # `default_r_opts`: default options that should be used for client.view
162
+ # given no options from the caller
163
+ #
164
+ shared_examples 'send options' do |ex_opts|
165
+ before do
166
+ allow(subject.client).to receive(:view).and_return view_response
167
+ allow(view_response).to receive(:keys)
168
+ .and_return(parsed_response['rows'].map { |r| r['key'] })
169
+ allow(view_response).to receive(:total_rows)
170
+ .and_return(parsed_response['total_rows'])
69
171
 
70
- shared_examples 'send options' do
71
- it 'sends request with option' do
72
- result = subject.send(method)
73
- result.first if [:records, :record_ids].include? method
74
- expect(subject.client).to have_received(request_type)
75
- .with(args[:couchdb][:view], hash_including(view_args))
172
+ end
173
+ it 'sends request with correct default options' do
174
+ records = subject.send(ex_opts[:method])
175
+ records.first if ex_opts[:method] == :records # start enumerator
176
+ expect(subject.client).to have_received(:view)
177
+ .with('_all_docs', ex_opts[:default_r_opts])
76
178
  end
77
179
 
78
180
  it 'adds options passed into request' do
79
- result = subject.send(method, request_opts)
80
- result.first if [:records, :record_ids].include? method
81
- expect(subject.client).to have_received(request_type)
82
- .with(request_opts[:view], hash_including(view_args))
181
+ records = subject.send(ex_opts[:method], ex_opts[:m_opts])
182
+ records.first if ex_opts[:method] == :records # start enumerator
183
+ expect(subject.client).to have_received(:view)
184
+ .with(ex_opts[:m_opts][:view], ex_opts[:r_opts])
83
185
  end
84
186
  end
85
187
 
86
188
  describe '#count' do
87
- include_examples 'send options'
88
- let(:request_type) { :view }
89
- let(:method) { :count }
90
- let(:view_args) { { :limit => 0, :include_docs=>false, :stream=>true } }
189
+ default_request_opts = {
190
+ include_docs: false, stream: false,
191
+ startkey: '_design', endkey: '_design0'
192
+ }
193
+ include_examples 'send options', method: :count,
194
+ m_opts: { view: 'foo/bar' },
195
+ r_opts: default_request_opts,
196
+ default_r_opts: default_request_opts
197
+
198
+ it 'returns the correct count' do
199
+ expect(subject.client).to receive(:view)
200
+ .with(instance_of(String), view_opts_designdoc_count)
201
+ .and_return(view_response_ddcount)
202
+ expect(subject.count).to eq 5
203
+ end
91
204
  end
92
205
 
93
206
  describe '#records' do
94
- include_examples 'send options'
95
- let(:request_type) { :view }
96
- let(:method) { :records }
97
- let(:view_args) { { :include_docs=>true, :stream=>true } }
207
+ before do
208
+ allow(Krikri::OriginalRecord).to receive(:build)
209
+ .and_return instance_double(Krikri::OriginalRecord)
210
+ end
211
+
212
+ default_request_opts = {
213
+ include_docs: true, stream: false, limit: 10
214
+ }
215
+ request_opts = {
216
+ include_docs: true, stream: false, limit: 5
217
+ }
218
+ include_examples 'send options', method: :records,
219
+ m_opts: { view: 'foo/bar', limit: 5 },
220
+ r_opts: request_opts,
221
+ default_r_opts: default_request_opts
222
+
223
+ it 'iterates over paginated requests' do
224
+ # See the view_opts_page_* and related mocks above.
225
+ # given those, the call to #records with a limit of 4 will make two
226
+ # Analysand::Database.view calls and return 5 records.
227
+ expect(subject.client).to receive(:view)
228
+ .with(instance_of(String), view_opts_page_1)
229
+ .and_return(view_response_page_1)
230
+ expect(subject.client).to receive(:view)
231
+ .with(instance_of(String), view_opts_page_2)
232
+ .and_return(view_response_page_2)
233
+
234
+ recs = subject.records(limit: 4)
235
+ expect(recs.count).to eq 5
236
+ end
98
237
  end
99
238
 
100
239
  describe '#record_ids' do
101
- include_examples 'send options'
102
- let(:request_type) { :view }
103
- let(:method) { :record_ids }
104
- let(:view_args) { { :include_docs=>false, :stream=>true } }
240
+ default_request_opts = { :include_docs=>false, :stream=>true }
241
+ include_examples 'send options', method: :record_ids,
242
+ m_opts: { view: 'foo/bar' },
243
+ r_opts: default_request_opts,
244
+ default_r_opts: default_request_opts
245
+
246
+ it 'returns record ids without design documents' do
247
+ expect(subject.client).to receive(:view)
248
+ .with(instance_of(String), view_opts_common_stream)
249
+ .and_return(view_response)
250
+ allow(view_response).to receive(:keys)
251
+ .and_return(parsed_response['rows'].map { |r| r['key'] })
252
+ expected_ids = parsed_response_no_dd['rows'].map { |r| r['id'] }
253
+ # The actual IDs will be returned as an emumerator, so create an
254
+ # array for the sake of comparison.
255
+ actual_ids = []
256
+ subject.record_ids.each { |id| actual_ids << id }
257
+ expect(actual_ids).to eq expected_ids
258
+ end
105
259
  end
106
260
  end
107
261
 
@@ -143,7 +297,12 @@ EOS
143
297
  end
144
298
  end
145
299
 
146
- it_behaves_like 'a harvester'
300
+ context do
301
+ before do
302
+ allow(subject.client).to receive(:view).and_return view_response
303
+ end
304
+ it_behaves_like 'a harvester'
305
+ end
147
306
  end
148
307
  end
149
308
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: krikri
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Audrey Altman
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-04-07 00:00:00.000000000 Z
14
+ date: 2015-04-09 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rails
@@ -518,10 +518,10 @@ files:
518
518
  - spec/internal/config/secrets.yml
519
519
  - spec/internal/config/solr.yml
520
520
  - spec/internal/db/development.sqlite3
521
- - spec/internal/db/migrate/20150406003020_devise_create_users.rb
522
- - spec/internal/db/migrate/20150406003043_create_searches.blacklight.rb
523
- - spec/internal/db/migrate/20150406003044_create_bookmarks.blacklight.rb
524
- - spec/internal/db/migrate/20150406003045_add_polymorphic_type_to_bookmarks.blacklight.rb
521
+ - spec/internal/db/migrate/20150408190519_devise_create_users.rb
522
+ - spec/internal/db/migrate/20150408190543_create_searches.blacklight.rb
523
+ - spec/internal/db/migrate/20150408190544_create_bookmarks.blacklight.rb
524
+ - spec/internal/db/migrate/20150408190545_add_polymorphic_type_to_bookmarks.blacklight.rb
525
525
  - spec/internal/db/schema.rb
526
526
  - spec/internal/db/seeds.rb
527
527
  - spec/internal/db/test.sqlite3
@@ -852,10 +852,10 @@ test_files:
852
852
  - spec/internal/config/solr.yml
853
853
  - spec/internal/config.ru
854
854
  - spec/internal/db/development.sqlite3
855
- - spec/internal/db/migrate/20150406003020_devise_create_users.rb
856
- - spec/internal/db/migrate/20150406003043_create_searches.blacklight.rb
857
- - spec/internal/db/migrate/20150406003044_create_bookmarks.blacklight.rb
858
- - spec/internal/db/migrate/20150406003045_add_polymorphic_type_to_bookmarks.blacklight.rb
855
+ - spec/internal/db/migrate/20150408190519_devise_create_users.rb
856
+ - spec/internal/db/migrate/20150408190543_create_searches.blacklight.rb
857
+ - spec/internal/db/migrate/20150408190544_create_bookmarks.blacklight.rb
858
+ - spec/internal/db/migrate/20150408190545_add_polymorphic_type_to_bookmarks.blacklight.rb
859
859
  - spec/internal/db/schema.rb
860
860
  - spec/internal/db/seeds.rb
861
861
  - spec/internal/db/test.sqlite3