lhs 19.10.0 → 21.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -9
- data/README.md +78 -5
- data/lhs.gemspec +2 -0
- data/lib/lhs/concerns/option_blocks.rb +1 -0
- data/lib/lhs/interceptors/extended_rollbar/thread_registry.rb +1 -0
- data/lib/lhs/interceptors/request_cycle_cache/thread_registry.rb +1 -0
- data/lib/lhs/{test/request_cycle_cache_helper.rb → rspec.rb} +3 -0
- data/lib/lhs/test/stubbable_records.rb +34 -0
- data/lib/lhs/version.rb +1 -1
- data/spec/stubs/all_spec.rb +72 -0
- metadata +35 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80228cca0e4b14a7a21cf408db24114f85648afccc58fbc658fbe7ef579b69a9
|
4
|
+
data.tar.gz: 774070abf3a426ef7f68c9ee707c540f53c91499f8576220fcae2e610baca1bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33f14c2fe5cd5e6cc9a8bdbee060d247bc3f62fe9a3dfde38ff87aadb4370de371996455a4ea55865c2ee13aa7b3728e405c73ad7185e29ec48a8f2a657b750d
|
7
|
+
data.tar.gz: 8aebc91f90fe095c4dc7d0d10dd8c389c0b1935928299421fce9df6c6245caa69a4991ce9f9a73758b5e316ea871a4437b7128243413634e4e7949ce96ac9405
|
data/Gemfile
CHANGED
@@ -1,13 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
source 'https://rubygems.org/'
|
4
|
-
|
5
|
-
# Declare your gem's dependencies in lhs.gemspec.
|
6
|
-
# Bundler will treat runtime dependencies like base dependencies, and
|
7
|
-
# development dependencies will be added by default to the :development group.
|
8
4
|
gemspec
|
9
|
-
|
10
|
-
# Declare any dependencies that are still in development here instead of in
|
11
|
-
# your gemspec. These might include edge Rails or gems from your path or
|
12
|
-
# Git. Remember to move these dependencies to your gemspec before releasing
|
13
|
-
# your gem to rubygems.org.
|
data/README.md
CHANGED
@@ -139,7 +139,9 @@ record.review # "Lunch was great
|
|
139
139
|
* [Request tracing](#request-tracing)
|
140
140
|
* [Extended Rollbar Logging](#extended-rollbar-logging)
|
141
141
|
* [Testing with LHS](#testing-with-lhs)
|
142
|
-
* [Test helper
|
142
|
+
* [Test helper](#test-helper)
|
143
|
+
* [Stub](#stub)
|
144
|
+
* [Stub All](#stub-all)
|
143
145
|
* [Test query chains](#test-query-chains)
|
144
146
|
* [By explicitly resolving the chain: fetch](#by-explicitly-resolving-the-chain-fetch)
|
145
147
|
* [Without resolving the chain: where_values_hash](#without-resolving-the-chain-where_values_hash)
|
@@ -1629,6 +1631,15 @@ POST https://service.example.com/records/1z-5r1fkaj { body: "{ 'name': 'Starbuck
|
|
1629
1631
|
|
1630
1632
|
-> See [record validation](#record-validation) for how to handle validation errors when updating records.
|
1631
1633
|
|
1634
|
+
You can also pass explicit request options to `update`, by passing two explicit hashes:
|
1635
|
+
|
1636
|
+
```ruby
|
1637
|
+
# app/controllers/some_controller.rb
|
1638
|
+
|
1639
|
+
record.update({ recommended: true }, { method: 'put' })
|
1640
|
+
|
1641
|
+
```
|
1642
|
+
|
1632
1643
|
##### partial_update
|
1633
1644
|
|
1634
1645
|
`partial_update` updates just the provided parameters.
|
@@ -1660,6 +1671,15 @@ POST https://service.example.com/records/1z-5r1fkaj { body: "{ 'name': 'Starbuck
|
|
1660
1671
|
|
1661
1672
|
-> See [record validation](#record-validation) for how to handle validation errors when updating records.
|
1662
1673
|
|
1674
|
+
You can also pass explicit request options to `partial_update`, by passing two explicit hashes:
|
1675
|
+
|
1676
|
+
```ruby
|
1677
|
+
# app/controllers/some_controller.rb
|
1678
|
+
|
1679
|
+
record.partial_update({ recommended: true }, { method: 'put' })
|
1680
|
+
|
1681
|
+
```
|
1682
|
+
|
1663
1683
|
#### Endpoint url parameter injection during record creation/change
|
1664
1684
|
|
1665
1685
|
LHS injects parameters provided to `create`, `update`, `partial_update`, `save` etc. into an endpoint's URL when matching:
|
@@ -2502,17 +2522,70 @@ it 'displays contracts' do
|
|
2502
2522
|
end
|
2503
2523
|
```
|
2504
2524
|
|
2505
|
-
### Test helper
|
2525
|
+
### Test helper
|
2506
2526
|
|
2507
|
-
In order to
|
2527
|
+
In order to load LHS test helpers into your tests, add the following to your spec helper:
|
2508
2528
|
|
2509
2529
|
```ruby
|
2510
2530
|
# spec/spec_helper.rb
|
2511
2531
|
|
2512
|
-
require 'lhs/
|
2532
|
+
require 'lhs/rspec'
|
2533
|
+
```
|
2534
|
+
|
2535
|
+
This e.g. will prevent running into caching issues during your tests, when (request cycle cache)[#request-cycle-cache] is enabled.
|
2536
|
+
It will initialize a MemoryStore cache for LHC::Caching interceptor and resets the cache before every test.
|
2537
|
+
|
2538
|
+
#### Stub
|
2539
|
+
|
2540
|
+
LHS offers stub helpers that simplify stubbing https request to your apis through your defined Records.
|
2541
|
+
|
2542
|
+
##### stub_all
|
2543
|
+
|
2544
|
+
`Record.stub_all(url, items, additional_options)`
|
2545
|
+
|
2546
|
+
```ruby
|
2547
|
+
# your_spec.rb
|
2548
|
+
|
2549
|
+
before do
|
2550
|
+
class Record < LHS::Record
|
2551
|
+
endpoint 'https://records'
|
2552
|
+
end
|
2553
|
+
|
2554
|
+
Record.stub_all(
|
2555
|
+
'https://records',
|
2556
|
+
200.times.map{ |index| { name: "Item #{index}" } },
|
2557
|
+
headers: {
|
2558
|
+
'Authorization' => 'Bearer 123'
|
2559
|
+
}
|
2560
|
+
)
|
2561
|
+
end
|
2562
|
+
```
|
2563
|
+
```
|
2564
|
+
GET https://records?limit=100
|
2565
|
+
GET https://records?limit=100&offset=100
|
2513
2566
|
```
|
2514
2567
|
|
2515
|
-
|
2568
|
+
LHS also uses Record configuration when stubbing all.
|
2569
|
+
```ruby
|
2570
|
+
# your_spec.rb
|
2571
|
+
|
2572
|
+
before do
|
2573
|
+
class Record < LHS::Record
|
2574
|
+
configuration limit_key: :per_page, pagination_strategy: :page, pagination_key: :page
|
2575
|
+
|
2576
|
+
endpoint 'https://records'
|
2577
|
+
end
|
2578
|
+
|
2579
|
+
Record.stub_all(
|
2580
|
+
'https://records',
|
2581
|
+
200.times.map{ |index| { name: "Item #{index}" } }
|
2582
|
+
)
|
2583
|
+
end
|
2584
|
+
```
|
2585
|
+
```
|
2586
|
+
GET https://records?per_page=100
|
2587
|
+
GET https://records?per_page=100&page=2
|
2588
|
+
```
|
2516
2589
|
|
2517
2590
|
### Test query chains
|
2518
2591
|
|
data/lhs.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_dependency 'activemodel'
|
26
26
|
s.add_dependency 'activesupport', '>= 4.2.11'
|
27
27
|
s.add_dependency 'lhc', '~> 10.2'
|
28
|
+
s.add_dependency 'local_uri'
|
28
29
|
|
29
30
|
s.add_development_dependency 'capybara'
|
30
31
|
s.add_development_dependency 'json', '>= 1.8.2'
|
@@ -35,6 +36,7 @@ Gem::Specification.new do |s|
|
|
35
36
|
s.add_development_dependency 'rspec-rails', '>= 3.7.0'
|
36
37
|
s.add_development_dependency 'rubocop', '~> 0.57.1'
|
37
38
|
s.add_development_dependency 'rubocop-rspec', '~> 1.26.0'
|
39
|
+
s.add_development_dependency 'sprockets', '< 4'
|
38
40
|
s.add_development_dependency 'webmock'
|
39
41
|
|
40
42
|
s.license = 'GPL-3'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'local_uri'
|
4
|
+
require 'webmock'
|
5
|
+
|
6
|
+
class LHS::Record
|
7
|
+
DEFAULT_LIMIT = LHS::Pagination::Base::DEFAULT_LIMIT
|
8
|
+
|
9
|
+
def self.stub_all(url, items, options = {})
|
10
|
+
extend WebMock::API
|
11
|
+
|
12
|
+
items.each_slice(DEFAULT_LIMIT).with_index do |(*batch), index|
|
13
|
+
uri = LocalUri::URI.new(url)
|
14
|
+
uri.query.merge!(
|
15
|
+
limit_key(:parameter) => DEFAULT_LIMIT
|
16
|
+
)
|
17
|
+
offset = pagination_class.page_to_offset(index + 1, DEFAULT_LIMIT)
|
18
|
+
unless index.zero?
|
19
|
+
uri.query.merge!(
|
20
|
+
pagination_key(:parameter) => offset
|
21
|
+
)
|
22
|
+
end
|
23
|
+
request_stub = stub_request(:get, uri.to_s)
|
24
|
+
request_stub.with(options) if options.present?
|
25
|
+
request_stub.to_return(
|
26
|
+
body: {
|
27
|
+
items: batch,
|
28
|
+
offset: index.zero? ? 0 : offset,
|
29
|
+
total: items.length
|
30
|
+
}.to_json
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/lhs/version.rb
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
require 'lhs/rspec'
|
5
|
+
|
6
|
+
describe LHS do
|
7
|
+
|
8
|
+
before do
|
9
|
+
class Record < LHS::Record
|
10
|
+
endpoint 'https://records'
|
11
|
+
end
|
12
|
+
|
13
|
+
Record.stub_all(
|
14
|
+
'https://records',
|
15
|
+
200.times.map { |index| { name: "Item #{index}" } },
|
16
|
+
headers: {
|
17
|
+
'Authorization' => 'Bearer 123'
|
18
|
+
}
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'stubs all requests' do
|
23
|
+
records = Record.options(headers: { 'Authorization' => 'Bearer 123' }).all.fetch
|
24
|
+
expect(records.count).to eq 200
|
25
|
+
expect(records.length).to eq 200
|
26
|
+
expect(records.first.name).to eq 'Item 0'
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'without conditions' do
|
30
|
+
|
31
|
+
before do
|
32
|
+
class Record < LHS::Record
|
33
|
+
endpoint 'https://records'
|
34
|
+
end
|
35
|
+
|
36
|
+
Record.stub_all(
|
37
|
+
'https://records',
|
38
|
+
200.times.map { |index| { name: "Item #{index}" } }
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'stubs all requests without a webmock "with"' do
|
43
|
+
records = Record.all.fetch
|
44
|
+
expect(records.count).to eq 200
|
45
|
+
expect(records.length).to eq 200
|
46
|
+
expect(records.first.name).to eq 'Item 0'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'with configured record' do
|
51
|
+
|
52
|
+
before do
|
53
|
+
class Record < LHS::Record
|
54
|
+
configuration limit_key: :per_page, pagination_strategy: :page, pagination_key: :page
|
55
|
+
|
56
|
+
endpoint 'https://records'
|
57
|
+
end
|
58
|
+
|
59
|
+
Record.stub_all(
|
60
|
+
'https://records',
|
61
|
+
200.times.map { |index| { name: "Item #{index}" } }
|
62
|
+
)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'stubs all requests with record configurations for pagination' do
|
66
|
+
records = Record.all.fetch
|
67
|
+
expect(records.count).to eq 200
|
68
|
+
expect(records.length).to eq 200
|
69
|
+
expect(records.first.name).to eq 'Item 0'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lhs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 21.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- https://github.com/local-ch/lhs/graphs/contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '10.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: local_uri
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: capybara
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,6 +192,20 @@ dependencies:
|
|
178
192
|
- - "~>"
|
179
193
|
- !ruby/object:Gem::Version
|
180
194
|
version: 1.26.0
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: sprockets
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "<"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '4'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "<"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '4'
|
181
209
|
- !ruby/object:Gem::Dependency
|
182
210
|
name: webmock
|
183
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -300,7 +328,8 @@ files:
|
|
300
328
|
- lib/lhs/proxy.rb
|
301
329
|
- lib/lhs/railtie.rb
|
302
330
|
- lib/lhs/record.rb
|
303
|
-
- lib/lhs/
|
331
|
+
- lib/lhs/rspec.rb
|
332
|
+
- lib/lhs/test/stubbable_records.rb
|
304
333
|
- lib/lhs/unprocessable.rb
|
305
334
|
- lib/lhs/version.rb
|
306
335
|
- script/ci/build.sh
|
@@ -487,6 +516,7 @@ files:
|
|
487
516
|
- spec/request_cycle_cache_spec.rb
|
488
517
|
- spec/require_lhs_spec.rb
|
489
518
|
- spec/spec_helper.rb
|
519
|
+
- spec/stubs/all_spec.rb
|
490
520
|
- spec/support/fixtures/json/feedback.json
|
491
521
|
- spec/support/fixtures/json/feedbacks.json
|
492
522
|
- spec/support/fixtures/json/localina_content_ad.json
|
@@ -514,8 +544,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
514
544
|
version: '0'
|
515
545
|
requirements:
|
516
546
|
- Ruby >= 2.3.0
|
517
|
-
|
518
|
-
rubygems_version: 2.7.8
|
547
|
+
rubygems_version: 3.0.6
|
519
548
|
signing_key:
|
520
549
|
specification_version: 4
|
521
550
|
summary: 'REST services accelerator: Rails gem providing an easy, active-record-like
|
@@ -703,6 +732,7 @@ test_files:
|
|
703
732
|
- spec/request_cycle_cache_spec.rb
|
704
733
|
- spec/require_lhs_spec.rb
|
705
734
|
- spec/spec_helper.rb
|
735
|
+
- spec/stubs/all_spec.rb
|
706
736
|
- spec/support/fixtures/json/feedback.json
|
707
737
|
- spec/support/fixtures/json/feedbacks.json
|
708
738
|
- spec/support/fixtures/json/localina_content_ad.json
|