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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18844b035c16dde338319e066450327234660c9eb12d3a9c202e3e6f1bf601d4
4
- data.tar.gz: 2a6493246d7d5f8e52d3f73def90060b8391a8423823aba45868da110bb2d77f
3
+ metadata.gz: a4371d59c15e78aa06d592cb0819115f29e771f2e3b726b76c954aea6d0d5c05
4
+ data.tar.gz: 8b297f71b3e94062a713a105b8a383ae0f3728d3b33383d17529f6b9e001a286
5
5
  SHA512:
6
- metadata.gz: 287bbcdcf0f8d507644c53c34f89e8e290b6fabc8478f6b6e7c3cfe973c804029e6d4cd0d647033ad06ffa52cfe522cb47b0523bfc02e17152cc494ce40d63cd
7
- data.tar.gz: f1aa861a3d1c78e21923a7f3491ed53689f37d9cb5aeaa060f8bd5ee0ab2a744e93097c6e6f2a1f466427c92d27e39d733dbed207edd9cc0a8a1aa376cb5c6e2
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
- HEADER_NAME = "HTTP_RAILS_MOCKS"
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
- return @app.call(req) if stubs(req).blank?
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
- private
23
+ header_data.run_shared_contexts(self)
24
+ header_data.run_stubs(self)
26
25
 
27
- def parsed_stubs(req)
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
- end
32
-
33
- def stubs(req)
34
- req[HEADER_NAME]
28
+ [status, headers, response]
35
29
  end
36
30
  end
37
31
  end
@@ -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
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsMocks
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.3"
5
5
  end
data/lib/rails_mocks.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'rails_mocks/header_data'
1
2
  require 'rails_mocks/stub'
3
+ require 'rails_mocks/shared_context'
2
4
  require 'rails_mocks/middleware'
3
5
  require 'rails_mocks/rails'
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.1
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-07-26 00:00:00.000000000 Z
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.3.2
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.3.2
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.2.23
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.