krikri 0.5.3 → 0.5.4

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.
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