rspec_request_helpers 0.1.1 → 0.2.0

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: 69e19b4a72e694e48266c3fd82963bdc49d29e1047afa3f9e8e58a20eb66ecca
4
- data.tar.gz: 2c90b13de3ae5897644d4291639152ef439a808046f5b7119354939af37735b5
3
+ metadata.gz: 6123bd35683c01320a81b8b564d8dd518298489c2063be3ea2b83460cde16153
4
+ data.tar.gz: 595d6b0cede37d70e8e0a6fabc2efae031c1cb33d2a737ed7bc49391a76ab5c3
5
5
  SHA512:
6
- metadata.gz: 9c049a3267279fdd1b30f3356e3568615dd0f528d1ce546d32040c7246b49d37c26f625949644038451a21073f3fbcfcd3ea0b2606804938f77ca2f2cadb101e
7
- data.tar.gz: 96ae41fccbd1bbce862512002e94d5d0db5edf9701d2844154be0babfb4c1eb3986d816d484bd1b9048fca891331cc6da73b8e5bdc646ea56c9074223ff52742
6
+ metadata.gz: 552e36a4241ab85cc6933ced18d29b315fee8e7436a5b98f1cedc071981d5c94e0b46400f0a05bc9a7642a3c3c6346c69cd48482c0f161002d26dd8886005238
7
+ data.tar.gz: 0329fc125a3c35e2477b5d91e8908658c77c36c9fef6dd382b94964c46e151c21344981309b6ef80be9c9f9c61aff20414382197ec072434a790de21cd4fafca
@@ -1,9 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec_request_helpers (0.1.1)
4
+ rspec_request_helpers (0.2.0)
5
5
  actionpack (>= 3.0)
6
6
  activesupport (>= 3.0)
7
+ factory_bot
8
+ parser
7
9
  rack (~> 2.0)
8
10
  railties (>= 3.0)
9
11
  rspec (~> 3.0)
@@ -29,12 +31,15 @@ GEM
29
31
  i18n (>= 0.7, < 2)
30
32
  minitest (~> 5.1)
31
33
  tzinfo (~> 1.1)
34
+ ast (2.4.0)
32
35
  builder (3.2.3)
33
36
  coderay (1.1.2)
34
37
  concurrent-ruby (1.0.5)
35
38
  crass (1.0.4)
36
39
  diff-lcs (1.3)
37
40
  erubi (1.7.1)
41
+ factory_bot (4.11.1)
42
+ activesupport (>= 3.0.0)
38
43
  i18n (1.1.1)
39
44
  concurrent-ruby (~> 1.0)
40
45
  loofah (2.2.2)
@@ -45,6 +50,8 @@ GEM
45
50
  minitest (5.11.3)
46
51
  nokogiri (1.8.5)
47
52
  mini_portile2 (~> 2.3.0)
53
+ parser (2.5.1.2)
54
+ ast (~> 2.4.0)
48
55
  pry (0.11.3)
49
56
  coderay (~> 1.1.0)
50
57
  method_source (~> 0.9.0)
data/README.md CHANGED
@@ -9,13 +9,32 @@ In order to use it in your `rspec/requests` specs you need to follow one rule:
9
9
  NOTE: version 0.1.1 introduced the helpers which ensure naming conventions. They have identical names and in fact are
10
10
  wrappers around RSpec `let` functionality.
11
11
 
12
- So what you'll got for that? Few handy methods for the testing routine
12
+ So what you'll got for that? - Few handy methods for the testing routine
13
13
 
14
- * `do_get`, `do_post`, `do_put`, `do_delete`, `do_patch` shorthands for sending appropriate requests.
15
- * `assert_201_json`, `assert_404_xml`, `assert_422_json` etc. shorthands for asserting content type and HTTP status code only. This methods are generated depends on configuration defined in `config/initializers/rspec_request_helpers.rb`.
16
- * `assert_201_json_response_body`, `assert_422_json_responce_body` etc. shorthands for asserting content type, HTTP status code and if parsed body of the response is equal to `valid_response`.
17
- * `assert_201_json_response_object`, `assert_422_json_responce_body` etc. same as previous assert specific attribute rather than whole response body.
18
- * one lined form for simple examples `do_post_and_assert_201_json_response_body`
14
+ | Action | Meaning | RSpec Example |
15
+ |---|---|---|
16
+ | `do_get`, `do_post`, `do_put`, `do_delete`, `do_patch` | Sends apropriate request to endpoint with valid params and headers | `get(path, valid_params, valid_headers)` |
17
+ | `assert_201_json`, `assert_404_xml`, `assert_422_json` etc | Assert response status code and mime type (Dynamicly generated based on config ) | `expect(response).to have_http_status(status)`<br>`expect(response.content_type).to eq mime_type` |
18
+ | `do_post_and_assert_201_json_response_body` | Shorthand for asserting content type, HTTP status code and if parsed body of the response is equal to | `expect(parsed_body).to eq(expected_response)` |
19
+
20
+ Version 0.2.0 introduced `database` method which acceps the code block witch allow creation of database records via `FactoryBot` and Rspec `let`, `let!` syntax.
21
+
22
+ ```ruby
23
+ #
24
+ # Usage:
25
+ # user(:user, name: 'Bob') translates to let(:user) { FactoryBot.create(:user, name: 'Bob') }
26
+ # user!(:user, name: 'Bob') translates to let!(:user) { FactoryBot.create(:user, name: 'Bob') }
27
+ # user_list(:user, name: 'Bob', 3) translates to let(:user) { FactoryBot.create_list(:user, 3, name: 'Bob') }
28
+ # user_list!(:user, name: 'Bob', 3) translates to let!(:user) { FactoryBot.create_list(:user, 3, name: 'Bob') }
29
+ #
30
+ database do
31
+ company2!(:company, name: name, domain_name: domain, location: location_name)
32
+ company3!(:company, name: name2, domain_name: domain, location: location_name)
33
+ order1!(:order, :ordered, :with_items, items_count: 1, status: IN_QC, company_id: company3.id, delivered_at: Time.zone.now)
34
+ order2!(:order, :ordered, :with_items, items_count: 1, status: COMPLETED, company_id: company3.id, delivered_at: Time.zone.now, order_date: (Time.zone.now - 1.day))
35
+ order3!(:order, :ordered, :with_items, items_count: 1, status: NOT_READY, company_id: company3.id)
36
+ end
37
+ ```
19
38
 
20
39
  ## Installation
21
40
 
@@ -54,6 +73,20 @@ RSpec.configure do |config|
54
73
  end
55
74
  ```
56
75
 
76
+ ## Configuration
77
+
78
+ Create file `config/initializers/rspec_request_helpers.rb`
79
+
80
+ ```ruby
81
+ RspecRequestHelpers.configure do |config|
82
+ # Supporded content types
83
+ config.content_types = { json: 'application/json' }
84
+
85
+ # Supported status codes
86
+ config.status_codes = [404, 401, 422, 200, 201]
87
+ end
88
+ ```
89
+
57
90
  Generate new file for API endpoint
58
91
 
59
92
  $ rails g rspec:endpoint show api/v1/users
@@ -1,6 +1,45 @@
1
1
  module RspecRequestHelpers
2
2
  module Helpers
3
3
  module ClassMethods
4
+ require 'parser/current'
5
+
6
+ class DatabaseDSLTranslator < ::Parser::TreeRewriter
7
+ def on_send(node)
8
+ _, method_name, *args = node.children
9
+
10
+ factory_attrs = args.map { |e| e.loc.expression.source }.join(', ')
11
+
12
+ case method_name
13
+ when /list!$/
14
+ replace(node.loc.expression, "let!(:#{method_name.to_s.sub(/list!$/,'')}) { FactoryBot.create_list(#{factory_attrs}) }")
15
+ when /list$/
16
+ replace(node.loc.expression, "let(:#{method_name.to_s.sub(/list$/,'')}) { FactoryBot.create_list(#{factory_attrs}) }")
17
+ when /!$/
18
+ replace(node.loc.expression, "let!(:#{method_name.to_s.sub(/!$/,'')}) { FactoryBot.create(#{factory_attrs}) }")
19
+ else
20
+ replace(node.loc.expression, "let(:#{method_name}) { FactoryBot.create(#{factory_attrs}) }")
21
+ end
22
+ end
23
+ end
24
+
25
+ #
26
+ # Tiny DSL for creating list or single database records
27
+ # via factory_bot syntax and Rspec :let or :let! methods
28
+ # Usage:
29
+ # user(:user, name: 'Bob') is translated to let(:user) { FactoryBot.create(:user, name: 'Bob') }
30
+ # user!(:user, name: 'Bob') is translated to let!(:user) { FactoryBot.create(:user, name: 'Bob') }
31
+ # user_list(:user, name: 'Bob', 3) is translated to let(:user) { FactoryBot.create_list(:user, 3, name: 'Bob') }
32
+ # user_list!(:user, name: 'Bob', 3) is translated to let!(:user) { FactoryBot.create_list(:user, 3, name: 'Bob') }
33
+ #
34
+ def database(&block)
35
+ parser = Parser::CurrentRuby.new
36
+ rewriter = DatabaseDSLTranslator.new
37
+ buffer = Parser::Source::Buffer.new('(string)')
38
+ buffer.source = Parser::CurrentRuby.parse(block.source).children.last.loc.expression.source
39
+ rspec_factory = rewriter.rewrite(buffer, parser.parse(buffer))
40
+ self.class_eval(rspec_factory)
41
+ end
42
+
4
43
  def path(&block)
5
44
  let(:path, &block)
6
45
  end
@@ -1,3 +1,3 @@
1
1
  module RspecRequestHelpers
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,33 +1,33 @@
1
1
 
2
- lib = File.expand_path("../lib", __FILE__)
2
+ lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "rspec_request_helpers/version"
4
+ require 'rspec_request_helpers/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "rspec_request_helpers"
7
+ spec.name = 'rspec_request_helpers'
8
8
  spec.version = RspecRequestHelpers::VERSION
9
- spec.authors = ["Andrii Baran"]
10
- spec.email = ["andriy.baran.v@gmail.com"]
9
+ spec.authors = ['Andrii Baran']
10
+ spec.email = ['andriy.baran.v@gmail.com']
11
11
 
12
12
  spec.summary = %q{A set of helpers for request test with RSpec}
13
- spec.homepage = "https://github.com/andriy-baran/rspec_request_helpers"
14
- spec.license = "MIT"
13
+ spec.homepage = 'https://github.com/andriy-baran/rspec_request_helpers'
14
+ spec.license = 'MIT'
15
15
 
16
16
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
17
  # to allow pushing to a single host or delete this section to allow pushing to any host.
18
18
  if spec.respond_to?(:metadata)
19
- spec.metadata["allowed_push_host"] = 'https://rubygems.org'
19
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
20
20
  else
21
- raise "RubyGems 2.0 or newer is required to protect against " \
22
- "public gem pushes."
21
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
22
+ 'public gem pushes.'
23
23
  end
24
24
 
25
25
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
26
  f.match(%r{^(test|spec|features)/})
27
27
  end
28
- spec.bindir = "exe"
28
+ spec.bindir = 'exe'
29
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
- spec.require_paths = ["lib"]
30
+ spec.require_paths = ['lib']
31
31
  spec.required_ruby_version = '>= 2.2.2'
32
32
 
33
33
  version_string = ['>= 3.0']
@@ -35,11 +35,13 @@ Gem::Specification.new do |spec|
35
35
  spec.add_runtime_dependency 'activesupport', version_string
36
36
  spec.add_runtime_dependency 'actionpack', version_string
37
37
  spec.add_runtime_dependency 'railties', version_string
38
+ spec.add_runtime_dependency 'factory_bot'
38
39
 
39
- spec.add_dependency "rspec", "~> 3.0"
40
- spec.add_dependency "rack", "~> 2.0"
40
+ spec.add_dependency 'rspec', '~> 3.0'
41
+ spec.add_dependency 'rack', '~> 2.0'
42
+ spec.add_dependency 'parser'
41
43
 
42
- spec.add_development_dependency "bundler", "~> 1.16"
43
- spec.add_development_dependency "rake", "~> 10.0"
44
- spec.add_development_dependency "pry"
44
+ spec.add_development_dependency 'bundler', '~> 1.16'
45
+ spec.add_development_dependency 'rake', '~> 10.0'
46
+ spec.add_development_dependency 'pry'
45
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec_request_helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrii Baran
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-20 00:00:00.000000000 Z
11
+ date: 2018-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: factory_bot
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: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
96
  version: '2.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: parser
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: bundler
85
113
  requirement: !ruby/object:Gem::Requirement