rails_mocks 0.0.1 → 0.0.3
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.
- checksums.yaml +4 -4
- data/README.md +103 -0
- data/lib/rails_mocks/header_data.rb +47 -0
- data/lib/rails_mocks/middleware.rb +11 -17
- data/lib/rails_mocks/rails.rb +5 -0
- data/lib/rails_mocks/shared_context.rb +24 -0
- data/lib/rails_mocks/stub.rb +8 -4
- data/lib/rails_mocks/version.rb +1 -1
- data/lib/rails_mocks.rb +2 -0
- metadata +21 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4371d59c15e78aa06d592cb0819115f29e771f2e3b726b76c954aea6d0d5c05
|
4
|
+
data.tar.gz: 8b297f71b3e94062a713a105b8a383ae0f3728d3b33383d17529f6b9e001a286
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32ebe5518215d2dd4e516162ebafc9b2dc1865910eee37f93e8f64918e85d0c0571536e7af995dd7cb939d6a8793802ed8ae6b763d647a52128468be467e0507
|
7
|
+
data.tar.gz: abe002326c17f96a8b7b3c0e281e7371ee44d067ecbfca3fcb6c10d5d06547fb0d0693dfa6d87016c10fc34c653499c85133b18a2c7da9ceffb4865c5266c7d5
|
data/README.md
CHANGED
@@ -1,3 +1,106 @@
|
|
1
1
|
# Rails Mocks
|
2
2
|
|
3
3
|
`Rails Mocks` Makes stubbing in your Rails application from an external resource easier.
|
4
|
+
|
5
|
+
The gem adds middleware to rails to execute [stubs](https://github.com/rspec/rspec-mocks/blob/main/README.md#method-stubs)
|
6
|
+
before make any query. It based on [rspec-mocks](https://github.com/rspec/rspec-mocks/blob/main/README.md) library.
|
7
|
+
|
8
|
+
## Install
|
9
|
+
```ruby
|
10
|
+
group :test do
|
11
|
+
gem "rails_mocks", "~> 0.0.1"
|
12
|
+
end
|
13
|
+
```
|
14
|
+
|
15
|
+
## Available functionality
|
16
|
+
|
17
|
+
What we can execute before make request on the rails side:
|
18
|
+
```ruby
|
19
|
+
# Instead of User we can use any rails constant
|
20
|
+
# It can be name of service, model, controller, etc
|
21
|
+
allow(User).to receive(:name)
|
22
|
+
allow(Book).to receive(:title).and_return("The Book")
|
23
|
+
allow(OrderService).to receive(:new).with(sum: 543).and_return(double(total: 543, id: 1))
|
24
|
+
allow(SumService).to receive(:new).with(double(a: 1, b: 5, c: 4)).and_return(double(sum: 10))
|
25
|
+
```
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
To stub something from external resource we should set header `RAILS_MOCKS` in the http request with the syntax below.
|
30
|
+
|
31
|
+
```javascript
|
32
|
+
req.headers["RAILS_MOCKS"] = JSON.stringify([
|
33
|
+
{
|
34
|
+
allow: "User",
|
35
|
+
receive: "name"
|
36
|
+
},
|
37
|
+
|
38
|
+
{
|
39
|
+
allow: "Book",
|
40
|
+
receive: "title",
|
41
|
+
and_return: { body: "The Book" }
|
42
|
+
},
|
43
|
+
|
44
|
+
{
|
45
|
+
allow: "OrderService",
|
46
|
+
receive: "new",
|
47
|
+
with: { body: { sum: 543 } },
|
48
|
+
and_return: { body: { total: 543, id: 1 }, double: true }
|
49
|
+
},
|
50
|
+
|
51
|
+
{
|
52
|
+
allow: "SumService",
|
53
|
+
receive: "new",
|
54
|
+
with: { body: { a: 1, b: 5, c: 4 }, double: true },
|
55
|
+
and_return: { body: { sum: 10 }, double: true }
|
56
|
+
}
|
57
|
+
])
|
58
|
+
```
|
59
|
+
|
60
|
+
### Cypress
|
61
|
+
|
62
|
+
Here the example how to stub Stripe from cypress:
|
63
|
+
|
64
|
+
```javascript
|
65
|
+
describe("when do refund", function() {
|
66
|
+
beforeEach(function () {
|
67
|
+
const chargeID = "frefef-43referf-43fref"
|
68
|
+
|
69
|
+
cy.intercept("*", req => {
|
70
|
+
req.headers["RAILS_MOCKS"] = JSON.stringify([
|
71
|
+
{
|
72
|
+
allow: "Stripe::Refund",
|
73
|
+
receive: "create",
|
74
|
+
with: { body: { charge: chargeID }},
|
75
|
+
and_return: { body: { source: chargeID, status: "refunded" }, double: true}
|
76
|
+
}
|
77
|
+
])
|
78
|
+
})
|
79
|
+
})
|
80
|
+
|
81
|
+
it("then we click on the button and make refund",function() {
|
82
|
+
|
83
|
+
})
|
84
|
+
})
|
85
|
+
```
|
86
|
+
|
87
|
+
We can use `cy.intercept` to modify headers of any request from the front-end application.
|
88
|
+
But if we want to make stub when do `cy.request` we should set headers in the cy.request [source](https://docs.cypress.io/api/commands/intercept#Controlling-the-outgoing-request):
|
89
|
+
|
90
|
+
```javascript
|
91
|
+
cy.request({
|
92
|
+
method: "POST",
|
93
|
+
headers: {
|
94
|
+
RAILS_MOCKS: JSON.stringify([
|
95
|
+
{
|
96
|
+
allow: "User",
|
97
|
+
receive: "create"
|
98
|
+
}
|
99
|
+
])
|
100
|
+
},
|
101
|
+
url: "/users",
|
102
|
+
body: body
|
103
|
+
})
|
104
|
+
```
|
105
|
+
|
106
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsMocks
|
4
|
+
class HeaderData
|
5
|
+
MOCKS_HEADER = "HTTP_RAILS_MOCKS"
|
6
|
+
CONTEXTS_HEADER = "HTTP_RAILS_CONTEXTS"
|
7
|
+
|
8
|
+
def initialize(req)
|
9
|
+
@mocks_data = req[MOCKS_HEADER]
|
10
|
+
@shared_contexts_data = req[CONTEXTS_HEADER]
|
11
|
+
end
|
12
|
+
|
13
|
+
def run_shared_contexts(scope)
|
14
|
+
parsed_shared_contexts.each do |shared_context|
|
15
|
+
shared_context.execute(scope)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def run_stubs(scope)
|
20
|
+
parsed_stubs.each do |stub|
|
21
|
+
stub.execute(scope)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def empty?
|
26
|
+
mocks_data.blank? && shared_contexts_data.blank?
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :mocks_data, :shared_contexts_data
|
32
|
+
|
33
|
+
def parsed_stubs
|
34
|
+
return [] if mocks_data.blank?
|
35
|
+
JSON.parse(mocks_data, symbolize_names: true).map do |stub|
|
36
|
+
RailsMocks::Stub.new(stub)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def parsed_shared_contexts
|
41
|
+
return [] if shared_contexts_data.blank?
|
42
|
+
JSON.parse(shared_contexts_data).map do |shared_context_name|
|
43
|
+
RailsMocks::SharedContext.new(shared_context_name)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -2,36 +2,30 @@
|
|
2
2
|
|
3
3
|
module RailsMocks
|
4
4
|
class Middleware
|
5
|
-
|
5
|
+
include RSpec::Core::Hooks
|
6
|
+
|
7
|
+
alias :let :define_singleton_method
|
8
|
+
def metadata; end
|
6
9
|
|
7
10
|
def initialize(app)
|
8
11
|
@app = app
|
9
12
|
end
|
10
13
|
|
11
14
|
def call(req)
|
12
|
-
|
15
|
+
header_data = RailsMocks::HeaderData.new(req)
|
16
|
+
return @app.call(req) if header_data.empty?
|
13
17
|
|
14
18
|
status, headers, response = nil
|
19
|
+
|
15
20
|
RSpec::Mocks.with_temporary_scope do
|
16
21
|
RSpec::Mocks::Syntax.enable_expect(self.class)
|
17
|
-
parsed_stubs(req).each do |stub|
|
18
|
-
allow(stub.allow).to(stub.receiver)
|
19
|
-
end
|
20
|
-
status, headers, response = @app.call(req)
|
21
|
-
end
|
22
|
-
[status, headers, response]
|
23
|
-
end
|
24
22
|
|
25
|
-
|
23
|
+
header_data.run_shared_contexts(self)
|
24
|
+
header_data.run_stubs(self)
|
26
25
|
|
27
|
-
|
28
|
-
JSON.parse(stubs(req), symbolize_names: true).map do |stub|
|
29
|
-
RailsMocks::Stub.new(stub)
|
26
|
+
status, headers, response = @app.call(req)
|
30
27
|
end
|
31
|
-
|
32
|
-
|
33
|
-
def stubs(req)
|
34
|
-
req[HEADER_NAME]
|
28
|
+
[status, headers, response]
|
35
29
|
end
|
36
30
|
end
|
37
31
|
end
|
data/lib/rails_mocks/rails.rb
CHANGED
@@ -4,12 +4,17 @@ module RailsMocks
|
|
4
4
|
class Railtie < Rails::Railtie
|
5
5
|
initializer "rails_mocks.configure_rails_initialization" do
|
6
6
|
insert_middleware
|
7
|
+
load_shared_contexts
|
7
8
|
end
|
8
9
|
|
9
10
|
def insert_middleware
|
10
11
|
app.middleware.use RailsMocks::Middleware
|
11
12
|
end
|
12
13
|
|
14
|
+
def load_shared_contexts
|
15
|
+
Dir[Rails.root.join('spec/support/shared_contexts/**/*.rb')].each { |f| require f }
|
16
|
+
end
|
17
|
+
|
13
18
|
def app
|
14
19
|
Rails.application
|
15
20
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsMocks
|
4
|
+
class SharedContext
|
5
|
+
|
6
|
+
def initialize(context_name)
|
7
|
+
@context_name = context_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute(scope)
|
11
|
+
scope.instance_exec(&context_definition)
|
12
|
+
scope.hooks.send(:run_owned_hooks_for, :before, :example, scope)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :context_name
|
18
|
+
|
19
|
+
def context_definition
|
20
|
+
RSpec.world.shared_example_group_registry
|
21
|
+
.send(:shared_example_groups)[:main][context_name].definition
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/rails_mocks/stub.rb
CHANGED
@@ -8,6 +8,14 @@ module RailsMocks
|
|
8
8
|
@stub = stub
|
9
9
|
end
|
10
10
|
|
11
|
+
def execute(scope)
|
12
|
+
scope.allow(allow).to(receiver)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :stub
|
18
|
+
|
11
19
|
def allow
|
12
20
|
stub[:allow].constantize
|
13
21
|
end
|
@@ -19,10 +27,6 @@ module RailsMocks
|
|
19
27
|
receiver
|
20
28
|
end
|
21
29
|
|
22
|
-
private
|
23
|
-
|
24
|
-
attr_reader :stub
|
25
|
-
|
26
30
|
def _receive
|
27
31
|
stub[:receive]
|
28
32
|
end
|
data/lib/rails_mocks/version.rb
CHANGED
data/lib/rails_mocks.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_mocks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Kachan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 6.1.
|
19
|
+
version: 6.1.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 6.1.
|
26
|
+
version: 6.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec-mocks
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 3.9.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec-core
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.9.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.9.0
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: pry-byebug
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,8 +75,10 @@ extra_rdoc_files: []
|
|
61
75
|
files:
|
62
76
|
- README.md
|
63
77
|
- lib/rails_mocks.rb
|
78
|
+
- lib/rails_mocks/header_data.rb
|
64
79
|
- lib/rails_mocks/middleware.rb
|
65
80
|
- lib/rails_mocks/rails.rb
|
81
|
+
- lib/rails_mocks/shared_context.rb
|
66
82
|
- lib/rails_mocks/stub.rb
|
67
83
|
- lib/rails_mocks/version.rb
|
68
84
|
homepage: https://github.com/anton-kachan/rails_mocks
|
@@ -87,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
103
|
- !ruby/object:Gem::Version
|
88
104
|
version: '0'
|
89
105
|
requirements: []
|
90
|
-
rubygems_version: 3.
|
106
|
+
rubygems_version: 3.0.9
|
91
107
|
signing_key:
|
92
108
|
specification_version: 4
|
93
109
|
summary: Makes stubbing in your Rails application from an external resource easier.
|