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