fixturama 0.2.0 → 0.5.1

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: ed87b651886697aaea8b0a79ddbf5b875372ca382926f3dc07d8f3bec2a4d07d
4
- data.tar.gz: 76248c5bb6b75d335c80387d11b6446cee23829bf1ca8f6fb319c12a1b5f0e52
3
+ metadata.gz: 222290b374b18f7f1e7cd95844e1a8f37d79bb79ee5aa6938fd47de8322800c2
4
+ data.tar.gz: 915dd027bd5aef3e76d69d21ca5e9cb7b2e367aa0c0a2d5105a4c14e9e9119dd
5
5
  SHA512:
6
- metadata.gz: 20607f5c8bc2ed14ac8bef4bf207495946a02f4a39e2d6d77661b4fa154c01b3f4072e62aaf9083509369eb4b9fe01b2c9dfe1aa4e87b7bf2bb9a3b31b0a1827
7
- data.tar.gz: baf0b2716a960d8885dda3dde622009ebf8a1335912358898283b42b7beea04137e9d2ee1bcc58d305b8cdf14c21f3bdfa4442674a4dbb780aad61486b0e2682
6
+ metadata.gz: 1697a3dbda65ccae635338c933ae0c3267e98573d225796139f9997275a810469cf9e9f0429e14a0edad4044a6ddbaa089015658ff769e3f843a0b6245585289
7
+ data.tar.gz: 64f98e4b799ca9cf5ac572f8924e3ba537bcb01b284db932b0a81fbaca5ab1695bf444d6ae70494570852de327f77946aab045abeeb4cd7ddcfb6b7ab15b7c13
data/CHANGELOG.md CHANGED
@@ -5,6 +5,78 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/).
7
7
 
8
+ ## [0.5.1] - [2021-04-12]
9
+
10
+ ### Fixed
11
+
12
+ - Marshalling of short strings (nepalez)
13
+
14
+ ## [0.5.0] - [2021-04-03]
15
+
16
+ ### Added
17
+
18
+ - Support for <de>serialization PORO objects (nepalez)
19
+
20
+ ```yaml
21
+ # target.yml
22
+ ---
23
+ number: <%= object(be_positive) %>
24
+ ```
25
+
26
+ ```ruby
27
+ RSpec.describe "something" do
28
+ subject { { "number" => 42 } }
29
+
30
+ # no explicit params is needed here
31
+ let(:target) { load_fixture "target.yml" }
32
+
33
+ it { is_expected.to match(target) }
34
+ end
35
+ ```
36
+
37
+ ## [0.4.1] - [2021-03-31]
38
+
39
+ ### Fixed
40
+
41
+ - Dependency from hashie updated to allow v4+ (nepalez)
42
+
43
+ ## [0.4.0] - [2020-03-15]
44
+
45
+ ### Added
46
+
47
+ - Support for stubbing ENV variables (nepalez)
48
+
49
+ ```yaml
50
+ ---
51
+ - env: GOOGLE_CLOUD_KEY
52
+ value: foo
53
+
54
+ - env: GOOGLE_CLOUD_PASSWORD
55
+ value: bar
56
+ ```
57
+
58
+ This would stub selected variables only, not touching the others
59
+
60
+ ## [0.3.0] - [2020-03-08]
61
+
62
+ ### Added
63
+
64
+ - Support for exception arguments (nepalez)
65
+
66
+ ```yaml
67
+ ---
68
+ - class: API
69
+ chain: get_product
70
+ arguments:
71
+ - 1
72
+ actions:
73
+ - raise: API::NotFoundError
74
+ arguments: # <--- that's that
75
+ - "Cannot find a product by id: 1"
76
+ ```
77
+
78
+ which would raise `API::NotFoundError.new("Cannot find a product by id: 1")`
79
+
8
80
  ## [0.2.0] - [2020-02-17]
9
81
 
10
82
  ### Added
@@ -229,3 +301,8 @@ This is a first public release with features extracted from production app.
229
301
  [0.0.7]: https://github.com/nepalez/fixturama/compare/v0.0.6...v0.0.7
230
302
  [0.1.0]: https://github.com/nepalez/fixturama/compare/v0.0.7...v0.1.0
231
303
  [0.2.0]: https://github.com/nepalez/fixturama/compare/v0.1.0...v0.2.0
304
+ [0.3.0]: https://github.com/nepalez/fixturama/compare/v0.2.0...v0.3.0
305
+ [0.4.0]: https://github.com/nepalez/fixturama/compare/v0.3.0...v0.4.0
306
+ [0.4.1]: https://github.com/nepalez/fixturama/compare/v0.4.0...v0.4.1
307
+ [0.5.0]: https://github.com/nepalez/fixturama/compare/v0.4.1...v0.5.0
308
+ [0.5.1]: https://github.com/nepalez/fixturama/compare/v0.5.0...v0.5.1
data/README.md CHANGED
@@ -99,6 +99,38 @@ This feature can also be useful to produce a "partially defined" fixtures with [
99
99
  subject { load_fixture "#{__dir__}/data.yml", user: kind_of(ActiveRecord::Base) }
100
100
  ```
101
101
 
102
+ Since the v0.5.0 we support another way to serialize PORO objects in fixtures. Just wrap them to the `object()` method:
103
+
104
+ ```yaml
105
+ ---
106
+ :account: <%= object(user) %>
107
+ ```
108
+
109
+ This time you don't need sending objects explicitly.
110
+
111
+ ```ruby
112
+ RSpec.describe "example" do
113
+ subject { load_fixture "#{__dir__}/data.yml" }
114
+
115
+ let(:user) { FactoryBot.create(:user) }
116
+
117
+ # The same object will be returned
118
+ it { is_expected.to eq(account: user) }
119
+ end
120
+ ```
121
+
122
+ Under the hood we use `Marshal.dump` and `Marshal.restore` to serialize and deserialize the object back.
123
+
124
+ **Notice**, that deserialization creates a new instance of the object which is not equivalent to the source (`user` in the example above)!
125
+ In most cases this is enough. For example, you can provide matchers like:
126
+
127
+ ```yaml
128
+ ---
129
+ number: <%= object(be_positive) %>
130
+ ```
131
+
132
+ The loaded object would contain `{ "number" => be_positive }`.
133
+
102
134
  ### Seeding
103
135
 
104
136
  The seed (`seed_fixture`) file should be a YAML/JSON with opinionated parameters, namely:
@@ -141,6 +173,11 @@ For constants:
141
173
  - `const` for stubbed constant
142
174
  - `value` for a value of the constant
143
175
 
176
+ For environment variables:
177
+
178
+ - `env` for the name of a variable
179
+ `value` for a value of the variable
180
+
144
181
  For http requests:
145
182
 
146
183
  - `url` or `uri` for the URI of the request (treats values like `/.../` as regular expressions)
@@ -183,10 +220,17 @@ For http requests:
183
220
  - return: true
184
221
  repeate: 1 # this is the default value
185
222
  - raise: ActiveRecord::RecordNotFound
223
+ arguments:
224
+ - "Profile with id: 1 not found" # for error message
186
225
 
226
+ # Here we stubbing a constant
187
227
  - const: NOTIFIER_TIMEOUT_SEC
188
228
  value: 10
189
229
 
230
+ # This is a stub for ENV['DEFAULT_EMAIL']
231
+ - env: DEFAULT_EMAIL
232
+ value: foo@example.com
233
+
190
234
  # Examples for stubbing HTTP
191
235
  - uri: /example.com/foo/ # regexp!
192
236
  method: delete
data/lib/fixturama.rb CHANGED
@@ -42,7 +42,7 @@ module Fixturama
42
42
  # @param (see #read_fixture)
43
43
  # @return [Object]
44
44
  def load_fixture(path, **options)
45
- Loader.new(path, options).call
45
+ Loader.new(self, path, options).call
46
46
  end
47
47
 
48
48
  # @!method call_fixture(path, options)
@@ -7,6 +7,7 @@ module Fixturama
7
7
  require_relative "changes/base"
8
8
  require_relative "changes/chain"
9
9
  require_relative "changes/const"
10
+ require_relative "changes/env"
10
11
  require_relative "changes/request"
11
12
  require_relative "changes/seed"
12
13
 
@@ -20,6 +21,7 @@ module Fixturama
20
21
  class: Chain,
21
22
  const: Const,
22
23
  count: Seed,
24
+ env: Env,
23
25
  headers: Request,
24
26
  http_method: Request,
25
27
  object: Chain,
@@ -31,7 +33,6 @@ module Fixturama
31
33
  type: Seed,
32
34
  uri: Request,
33
35
  url: Request,
34
- value: Const,
35
36
  }.freeze
36
37
 
37
38
  # Adds new change to the registry
@@ -14,7 +14,7 @@ class Fixturama::Changes
14
14
  # @return [Fixturama::Changes::Base]
15
15
  def merge(other)
16
16
  # By default just take the other change if applicable
17
- other.class == self.class && other.key == key ? other : self
17
+ other.instance_of?(self.class) && other.key == key ? other : self
18
18
  end
19
19
 
20
20
  # @abstract
@@ -14,7 +14,7 @@ class Fixturama::Changes
14
14
  end
15
15
 
16
16
  def merge(other)
17
- return self unless other.class == self.class && other.key == key
17
+ return self unless other.instance_of?(self.class) && other.key == key
18
18
 
19
19
  tap { @arguments = (other.arguments | arguments).sort_by(&:order) }
20
20
  end
@@ -15,16 +15,24 @@ class Fixturama::Changes::Chain
15
15
  def initialize(**options)
16
16
  @error = error_from options
17
17
  @repeat = repeat_from options
18
+ rescue StandardError => err
19
+ raise Fixturama::FixtureError.new("an exception class", options, err)
18
20
  end
19
21
 
20
22
  def error_from(options)
21
- case value = options[:raise]
22
- when NilClass, TrueClass, "true" then StandardError
23
- when Class then value < Exception ? value : raise("Not an exception")
23
+ klass = klass_from(options)
24
+ params = options[:arguments]
25
+ params.is_a?(Array) ? klass.new(*params) : klass
26
+ end
27
+
28
+ def klass_from(options)
29
+ klass = case value = options[:raise]
30
+ when NilClass, TrueClass, "true" then StandardError
31
+ when Class then value
24
32
  else Kernel.const_get(value)
25
33
  end
26
- rescue StandardError => err
27
- raise Fixturama::FixtureError.new("an exception class", options, err)
34
+
35
+ klass < Exception ? klass : raise("#{klass} is not an exception")
28
36
  end
29
37
 
30
38
  def repeat_from(options)
@@ -0,0 +1,35 @@
1
+ class Fixturama::Changes
2
+ #
3
+ # @private
4
+ # Stub an environment variable
5
+ #
6
+ class Env < Base
7
+ # All changes has the same +key+
8
+ # They will be merged before stubbing (see +call+)
9
+ def key
10
+ "ENV"
11
+ end
12
+
13
+ # When we merge 2 env-s, we just merge their options
14
+ def merge(other)
15
+ return self unless other.is_a?(self.class)
16
+ dup.tap { |env| env.options.update(other.options) }
17
+ end
18
+
19
+ def call(example)
20
+ original = Hash ENV
21
+ example.send(:stub_const, "ENV", original.merge(options))
22
+ self
23
+ end
24
+
25
+ protected
26
+
27
+ attr_reader :options
28
+
29
+ private
30
+
31
+ def initialize(**options)
32
+ @options = { options[:env].to_s => options[:value].to_s }
33
+ end
34
+ end
35
+ end
@@ -15,7 +15,8 @@ class Fixturama::Loader
15
15
 
16
16
  private
17
17
 
18
- def initialize(path, opts = {})
18
+ def initialize(example, path, opts = {})
19
+ @example = example
19
20
  @path = path
20
21
  @opts = opts.to_h
21
22
  end
@@ -33,7 +34,7 @@ class Fixturama::Loader
33
34
  end
34
35
 
35
36
  def context
36
- @context ||= (yaml? || json?) ? Context.new(@opts) : Hashie::Mash.new(@opts)
37
+ @context ||= Context.new(@example, @opts)
37
38
  end
38
39
 
39
40
  def content
@@ -71,6 +72,8 @@ class Fixturama::Loader
71
72
  # @param [String] string
72
73
  # @return [Object]
73
74
  def finalize_string(string)
75
+ Marshal.restore(string)
76
+ rescue StandardError
74
77
  key = string.match(Value::MATCHER)&.captures&.first&.to_s
75
78
  key ? context[key] : string
76
79
  end
@@ -1,9 +1,13 @@
1
1
  class Fixturama::Loader
2
2
  #
3
3
  # @private
4
- # The context of some fixture
4
+ # The context bound to some fixture
5
5
  #
6
6
  class Context
7
+ def object(value)
8
+ Marshal.dump(value).dump
9
+ end
10
+
7
11
  # Get value by key
8
12
  # @param [#to_s] key
9
13
  # @return [Object]
@@ -13,7 +17,8 @@ class Fixturama::Loader
13
17
 
14
18
  private
15
19
 
16
- def initialize(values)
20
+ def initialize(example, values)
21
+ @example = example
17
22
  @values = \
18
23
  Hash(values).each_with_object(Hashie::Mash.new) do |(key, val), obj|
19
24
  obj[key] = Value.new(key, val)
@@ -21,11 +26,14 @@ class Fixturama::Loader
21
26
  end
22
27
 
23
28
  def respond_to_missing?(name, *)
24
- @values.respond_to?(name) || super
29
+ @values.key?(name) || @example.respond_to?(name) || super
25
30
  end
26
31
 
27
- def method_missing(name, *args)
28
- @values.respond_to?(name) ? @values.send(name, *args) : super
32
+ def method_missing(name, *args, &block)
33
+ return @values[name] if @values.key?(name)
34
+ return super unless @example.respond_to?(name)
35
+
36
+ @example.send(name, *args, &block)
29
37
  end
30
38
  end
31
39
  end
@@ -0,0 +1,4 @@
1
+ module Fixturama
2
+ # The current version of the gem
3
+ VERSION = "0.5.1"
4
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixturama
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kozin (nepalez)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-17 00:00:00.000000000 Z
11
+ date: 2021-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: factory_bot
@@ -42,16 +42,22 @@ dependencies:
42
42
  name: hashie
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '3'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '5'
48
51
  type: :runtime
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
- - - "~>"
55
+ - - ">"
53
56
  - !ruby/object:Gem::Version
54
- version: '3.0'
57
+ version: '3'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '5'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: webmock
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -72,43 +78,61 @@ dependencies:
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '10'
81
+ version: '13.0'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '10'
88
+ version: '13.0'
83
89
  - !ruby/object:Gem::Dependency
84
90
  name: rspec-its
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
93
  - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: '1.0'
95
+ version: '1.3'
90
96
  type: :development
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
100
  - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: '1.0'
102
+ version: '1.3'
97
103
  - !ruby/object:Gem::Dependency
98
104
  name: rubocop
99
105
  requirement: !ruby/object:Gem::Requirement
100
106
  requirements:
101
107
  - - "~>"
102
108
  - !ruby/object:Gem::Version
103
- version: '0.49'
109
+ version: '0.80'
104
110
  type: :development
105
111
  prerelease: false
106
112
  version_requirements: !ruby/object:Gem::Requirement
107
113
  requirements:
108
114
  - - "~>"
109
115
  - !ruby/object:Gem::Version
110
- version: '0.49'
111
- description:
116
+ version: '0.80'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop-packaging
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ description: |
132
+ Use fixtures to extract verbosity from RSpec specifications:
133
+ - load data,
134
+ - stub classes, modules and constants,
135
+ - seed the database via FactoryBot.
112
136
  email: andrew.kozin@gmail.com
113
137
  executables: []
114
138
  extensions: []
@@ -116,16 +140,8 @@ extra_rdoc_files:
116
140
  - README.md
117
141
  - CHANGELOG.md
118
142
  files:
119
- - ".gitignore"
120
- - ".rspec"
121
- - ".rubocop.yml"
122
- - ".travis.yml"
123
143
  - CHANGELOG.md
124
- - Gemfile
125
- - LICENSE.txt
126
144
  - README.md
127
- - Rakefile
128
- - fixturama.gemspec
129
145
  - lib/fixturama.rb
130
146
  - lib/fixturama/changes.rb
131
147
  - lib/fixturama/changes/base.rb
@@ -135,6 +151,7 @@ files:
135
151
  - lib/fixturama/changes/chain/raise_action.rb
136
152
  - lib/fixturama/changes/chain/return_action.rb
137
153
  - lib/fixturama/changes/const.rb
154
+ - lib/fixturama/changes/env.rb
138
155
  - lib/fixturama/changes/request.rb
139
156
  - lib/fixturama/changes/request/response.rb
140
157
  - lib/fixturama/changes/request/responses.rb
@@ -145,21 +162,25 @@ files:
145
162
  - lib/fixturama/loader/context.rb
146
163
  - lib/fixturama/loader/value.rb
147
164
  - lib/fixturama/rspec.rb
148
- - spec/fixturama/load_fixture/_spec.rb
149
- - spec/fixturama/load_fixture/data.json
150
- - spec/fixturama/load_fixture/data.yaml
151
- - spec/fixturama/load_fixture/data.yml
152
- - spec/fixturama/seed_fixture/_spec.rb
153
- - spec/fixturama/seed_fixture/seed.yml
154
- - spec/fixturama/stub_fixture/_spec.rb
155
- - spec/fixturama/stub_fixture/stub.yml
156
- - spec/spec_helper.rb
165
+ - lib/fixturama/version.rb
157
166
  homepage: https://github.com/nepalez/fixturama
158
167
  licenses:
159
168
  - MIT
160
- metadata: {}
169
+ metadata:
170
+ bug_tracker_uri: https://github.com/nepalez/fixturama/issues
171
+ changelog_uri: https://github.com/nepalez/fixturama/blob/master/CHANGELOG.md
172
+ documentation_uri: https://www.rubydocs.info/gems/fixturama
173
+ homepage_uri: https://github.com/nepalez/fixturama
174
+ source_code_uri: https://github.com/nepalez/fixturama
161
175
  post_install_message:
162
- rdoc_options: []
176
+ rdoc_options:
177
+ - "--title"
178
+ - Fixturama - fixtures on steroids
179
+ - "--main"
180
+ - README.md
181
+ - "--line-numbers"
182
+ - "--inline-source"
183
+ - "--quiet"
163
184
  require_paths:
164
185
  - lib
165
186
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -173,17 +194,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
194
  - !ruby/object:Gem::Version
174
195
  version: '0'
175
196
  requirements: []
176
- rubygems_version: 3.0.6
197
+ rubygems_version: 3.0.8
177
198
  signing_key:
178
199
  specification_version: 4
179
200
  summary: A set of helpers to prettify specs with fixtures
180
- test_files:
181
- - spec/fixturama/load_fixture/_spec.rb
182
- - spec/fixturama/load_fixture/data.json
183
- - spec/fixturama/load_fixture/data.yaml
184
- - spec/fixturama/load_fixture/data.yml
185
- - spec/fixturama/seed_fixture/_spec.rb
186
- - spec/fixturama/seed_fixture/seed.yml
187
- - spec/fixturama/stub_fixture/_spec.rb
188
- - spec/fixturama/stub_fixture/stub.yml
189
- - spec/spec_helper.rb
201
+ test_files: []
data/.gitignore DELETED
@@ -1,12 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.gem
11
- .rspec_status
12
- .idea/
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --require spec_helper
2
- --color
data/.rubocop.yml DELETED
@@ -1,22 +0,0 @@
1
- ---
2
- AllCops:
3
- DisplayCopNames: true
4
- DisplayStyleGuide: true
5
- StyleGuideCopsOnly: true
6
- TargetRubyVersion: 2.3
7
-
8
- Layout/LineLength:
9
- AllowHeredoc: true
10
- AllowURI: true
11
- URISchemes:
12
- - http
13
- - https
14
-
15
- Style/ClassAndModuleChildren:
16
- Enabled: false
17
-
18
- Style/Documentation:
19
- Enabled: false
20
-
21
- Style/StringLiterals:
22
- EnforcedStyle: double_quotes
data/.travis.yml DELETED
@@ -1,17 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- before_install:
6
- - gem install bundler --no-document
7
- - gem update --system
8
- script:
9
- - bundle exec rspec
10
- - bundle exec rubocop
11
- rvm:
12
- - 2.3.0
13
- - 2.7.0
14
- - ruby-head
15
- matrix:
16
- allow_failures:
17
- - rvm: ruby-head
data/Gemfile DELETED
@@ -1,9 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in sms_aero.gemspec
4
- gemspec
5
-
6
- group :development, :test do
7
- gem "pry", platform: :mri
8
- gem "pry-byebug", platform: :mri
9
- end
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2019 Andrew Kozin (aka nepalez)
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task default: :spec
data/fixturama.gemspec DELETED
@@ -1,24 +0,0 @@
1
- Gem::Specification.new do |gem|
2
- gem.name = "fixturama"
3
- gem.version = "0.2.0"
4
- gem.author = "Andrew Kozin (nepalez)"
5
- gem.email = "andrew.kozin@gmail.com"
6
- gem.homepage = "https://github.com/nepalez/fixturama"
7
- gem.summary = "A set of helpers to prettify specs with fixtures"
8
- gem.license = "MIT"
9
-
10
- gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
11
- gem.test_files = gem.files.grep(/^spec/)
12
- gem.extra_rdoc_files = Dir["README.md", "LICENSE", "CHANGELOG.md"]
13
-
14
- gem.required_ruby_version = ">= 2.2"
15
-
16
- gem.add_runtime_dependency "factory_bot", "~> 4.0"
17
- gem.add_runtime_dependency "rspec", "~> 3.0"
18
- gem.add_runtime_dependency "hashie", "~> 3.0"
19
- gem.add_runtime_dependency "webmock", "~> 3.0"
20
-
21
- gem.add_development_dependency "rake", "~> 10"
22
- gem.add_development_dependency "rspec-its", "~> 1.0"
23
- gem.add_development_dependency "rubocop", "~> 0.49"
24
- end
@@ -1,53 +0,0 @@
1
- RSpec.describe "load_fixture" do
2
- let(:expected) { { "foo" => { "bar" => 42 } } }
3
-
4
- context "YAML" do
5
- subject { load_fixture("#{__dir__}/data.yaml", id: 42) }
6
-
7
- it { is_expected.to eq expected }
8
- end
9
-
10
- context "YML" do
11
- subject { load_fixture("#{__dir__}/data.yml", id: 42) }
12
-
13
- it { is_expected.to eq expected }
14
- end
15
-
16
- context "YAML with ruby object" do
17
- subject { load_fixture("#{__dir__}/data.yaml", id: foobar) }
18
-
19
- before { class Test::Foobar; end }
20
-
21
- let(:foobar) { Test::Foobar.new }
22
- let(:expected) { { "foo" => { "bar" => foobar } } }
23
-
24
- it { is_expected.to eq expected }
25
- end
26
-
27
- context "JSON" do
28
- subject { load_fixture("#{__dir__}/data.json", id: 42) }
29
-
30
- it { is_expected.to eq expected }
31
- end
32
-
33
- context "JSON with ruby object" do
34
- subject { load_fixture("#{__dir__}/data.json", id: foobar) }
35
-
36
- before { class Test::Foobar; end }
37
-
38
- let(:foobar) { Test::Foobar.new }
39
- let(:expected) { { "foo" => { "bar" => foobar } } }
40
-
41
- it { is_expected.to eq expected }
42
- end
43
-
44
- context "with RSpec argument matchers" do
45
- subject { load_fixture("#{__dir__}/data.yaml", id: kind_of(Numeric)) }
46
-
47
- it "loads the matcher", aggregate_failures: true do
48
- expect("foo" => { "bar" => 42 }).to include subject
49
- expect("foo" => { "bar" => 99 }).to include subject
50
- expect("foo" => { "bar" => :a }).not_to include subject
51
- end
52
- end
53
- end
@@ -1,5 +0,0 @@
1
- {
2
- "foo": {
3
- "bar": <%= id %>
4
- }
5
- }
@@ -1,3 +0,0 @@
1
- ---
2
- foo:
3
- bar: <%= id %>
@@ -1,3 +0,0 @@
1
- ---
2
- foo:
3
- bar: <%= id %>
@@ -1,37 +0,0 @@
1
- RSpec.describe "seed_fixture" do
2
- subject { seed_fixture "#{__dir__}/seed.yml" }
3
-
4
- before do
5
- FactoryBot.define do
6
- factory :foo, class: Hash do
7
- transient do
8
- bar { 0 }
9
- baz { 0 }
10
- qux { 0 }
11
- end
12
-
13
- trait :bar do
14
- bar { 99 }
15
- end
16
-
17
- trait :baz do
18
- baz { 77 }
19
- end
20
-
21
- skip_create
22
- initialize_with { { bar: bar, baz: baz, qux: qux } }
23
- end
24
- end
25
- end
26
-
27
- it "runs the factory", aggregate_failures: true do
28
- expect(FactoryBot).to receive(:create_list).with(:foo, 1, :baz, qux: 42)
29
-
30
- expect(FactoryBot).to receive(:create_list) do |*args, **opts|
31
- expect(args).to eq [:foo, 3, :bar]
32
- expect(opts).to be_empty
33
- end
34
-
35
- subject
36
- end
37
- end
@@ -1,11 +0,0 @@
1
- ---
2
- - type: foo
3
- traits:
4
- - baz
5
- params:
6
- qux: 42
7
-
8
- - type: foo
9
- count: 3
10
- traits:
11
- - bar
@@ -1,120 +0,0 @@
1
- RSpec.describe "stub_fixture" do
2
- subject { arguments.map { |argument| Payment.new.pay(argument) } }
3
-
4
- before do
5
- class Payment
6
- def pay(_)
7
- 5
8
- end
9
- end
10
- end
11
-
12
- context "without stubbing" do
13
- let(:arguments) { [0] }
14
-
15
- it { is_expected.to eq [5] }
16
- end
17
-
18
- context "when message chain stubbed" do
19
- before { stub_fixture "#{__dir__}/stub.yml" }
20
-
21
- context "with a :raise option" do
22
- let(:arguments) { [0] }
23
-
24
- it "raises an exception" do
25
- expect { subject }.to raise_error ArgumentError
26
- end
27
- end
28
-
29
- context "with a :return option" do
30
- let(:arguments) { [1] }
31
-
32
- it "returns stubbed value" do
33
- expect(subject).to eq [8]
34
- end
35
- end
36
-
37
- context "with several actions" do
38
- let(:arguments) { [2] * 4 }
39
-
40
- it "calls the consecutive actions and then repeates the last one" do
41
- expect(subject).to eq [4, 2, 0, 0]
42
- end
43
- end
44
-
45
- context "with multi-count actions" do
46
- let(:arguments) { [3] * 4 }
47
-
48
- it "repeats the action a specified number of times" do
49
- expect(subject).to eq [6, 6, 0, 0]
50
- end
51
- end
52
-
53
- context "with several arguments" do
54
- let(:arguments) { [2, 3, 2, 3, 2, 3] }
55
-
56
- it "counts actions for every stub in isolation from the others" do
57
- expect(subject).to eq [4, 6, 2, 6, 0, 0]
58
- end
59
- end
60
-
61
- context "with partially defined options" do
62
- subject { Payment.new.pay(10, overdraft: true, notiy: true) }
63
-
64
- it "uses the stub" do
65
- expect(subject).to eq(-5)
66
- end
67
- end
68
-
69
- context "when options differ" do
70
- subject { Payment.new.pay(10, overdraft: false) }
71
-
72
- it "uses universal stub" do
73
- expect(subject).to eq(-1)
74
- end
75
- end
76
-
77
- context "with unspecified argument" do
78
- let(:arguments) { [4] }
79
-
80
- it "uses universal stub" do
81
- expect(subject).to eq [-1]
82
- end
83
- end
84
- end
85
-
86
- context "when constant stubbed" do
87
- before do
88
- TIMEOUT = 20
89
- stub_fixture "#{__dir__}/stub.yml"
90
- end
91
-
92
- it "stubs the constant" do
93
- expect(TIMEOUT).to eq 10
94
- end
95
- end
96
-
97
- context "when http request stubbed" do
98
- before { stub_fixture "#{__dir__}/stub.yml" }
99
-
100
- it "stubs the request properly" do
101
- req = Net::HTTP::Get.new("/foo")
102
- res = Net::HTTP.start("www.example.com") { |http| http.request(req) }
103
-
104
- expect(res.code).to eq "200"
105
- expect(res.body).to eq "foo"
106
- expect(res["Content-Length"]).to eq "3"
107
- end
108
-
109
- def delete_request
110
- req = Net::HTTP::Delete.new("/foo")
111
- Net::HTTP.start("www.example.com") { |http| http.request(req) }
112
- end
113
-
114
- it "stubs repetitive requests properly" do
115
- expect(delete_request.code).to eq "200"
116
- expect(delete_request.code).to eq "404"
117
- expect(delete_request.code).to eq "404"
118
- end
119
- end
120
- end
@@ -1,73 +0,0 @@
1
- ---
2
- - class: Payment
3
- chain:
4
- - new
5
- - pay
6
- actions:
7
- - return: -1
8
-
9
- - class: Payment
10
- chain:
11
- - new
12
- - pay
13
- arguments:
14
- - 0
15
- actions:
16
- - raise: ArgumentError
17
-
18
- - class: Payment
19
- chain:
20
- - new
21
- - pay
22
- arguments:
23
- - 1
24
- actions:
25
- - return: 8
26
-
27
- - class: Payment
28
- chain:
29
- - new
30
- - pay
31
- arguments:
32
- - 2
33
- actions:
34
- - return: 4
35
- - return: 2
36
- - return: 0
37
-
38
- - object: Payment.itself
39
- chain:
40
- - new
41
- - pay
42
- arguments:
43
- - 3
44
- actions:
45
- - return: 6
46
- repeat: 2
47
- - return: 0
48
-
49
- - class: Payment
50
- chain:
51
- - new
52
- - pay
53
- arguments:
54
- - 10
55
- - :overdraft: true
56
- actions:
57
- - return: -5
58
-
59
- - const: TIMEOUT
60
- value: 10
61
-
62
- - method: get
63
- uri: www.example.com/foo
64
- responses:
65
- - body: foo
66
- headers:
67
- Content-Length: 3
68
-
69
- - method: delete
70
- uri: /example.com/foo/ # Regexp!
71
- responses:
72
- - status: 200
73
- - status: 404 # for any request except for the first one
data/spec/spec_helper.rb DELETED
@@ -1,26 +0,0 @@
1
- begin
2
- require "pry"
3
- rescue LoadError
4
- nil
5
- end
6
-
7
- require "bundler/setup"
8
- require "fixturama/rspec"
9
-
10
- RSpec.configure do |config|
11
- # Enable flags like --only-failures and --next-failure
12
- config.example_status_persistence_file_path = ".rspec_status"
13
-
14
- # Disable RSpec exposing methods globally on `Module` and `main`
15
- config.disable_monkey_patching!
16
-
17
- config.expect_with :rspec do |c|
18
- c.syntax = :expect
19
- end
20
-
21
- config.around do |example|
22
- module Test; end
23
- example.run
24
- Object.send(:remove_const, :Test)
25
- end
26
- end