rails_mocks 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|