fixturama 0.0.7 → 0.4.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +100 -0
  3. data/README.md +71 -3
  4. data/lib/fixturama.rb +49 -20
  5. data/lib/fixturama/changes.rb +72 -0
  6. data/lib/fixturama/changes/base.rb +28 -0
  7. data/lib/fixturama/changes/chain.rb +64 -0
  8. data/lib/fixturama/changes/chain/actions.rb +31 -0
  9. data/lib/fixturama/changes/chain/arguments.rb +59 -0
  10. data/lib/fixturama/changes/chain/raise_action.rb +43 -0
  11. data/lib/fixturama/changes/chain/return_action.rb +33 -0
  12. data/lib/fixturama/changes/const.rb +30 -0
  13. data/lib/fixturama/changes/env.rb +35 -0
  14. data/lib/fixturama/changes/request.rb +91 -0
  15. data/lib/fixturama/changes/request/response.rb +62 -0
  16. data/lib/fixturama/changes/request/responses.rb +22 -0
  17. data/lib/fixturama/changes/seed.rb +39 -0
  18. data/lib/fixturama/config.rb +5 -0
  19. data/lib/fixturama/fixture_error.rb +31 -0
  20. data/lib/fixturama/loader.rb +1 -0
  21. data/lib/fixturama/loader/context.rb +1 -0
  22. data/lib/fixturama/loader/value.rb +1 -0
  23. data/lib/fixturama/version.rb +4 -0
  24. metadata +80 -50
  25. data/.gitignore +0 -12
  26. data/.rspec +0 -2
  27. data/.rubocop.yml +0 -22
  28. data/.travis.yml +0 -23
  29. data/Gemfile +0 -9
  30. data/LICENSE.txt +0 -21
  31. data/Rakefile +0 -6
  32. data/fixturama.gemspec +0 -23
  33. data/lib/fixturama/seed.rb +0 -15
  34. data/lib/fixturama/stubs.rb +0 -57
  35. data/lib/fixturama/stubs/chain.rb +0 -89
  36. data/lib/fixturama/stubs/chain/actions.rb +0 -39
  37. data/lib/fixturama/stubs/chain/actions/raise.rb +0 -21
  38. data/lib/fixturama/stubs/chain/actions/return.rb +0 -23
  39. data/lib/fixturama/stubs/chain/arguments.rb +0 -86
  40. data/lib/fixturama/stubs/const.rb +0 -42
  41. data/lib/fixturama/utils.rb +0 -39
  42. data/spec/fixturama/load_fixture/_spec.rb +0 -53
  43. data/spec/fixturama/load_fixture/data.json +0 -5
  44. data/spec/fixturama/load_fixture/data.yaml +0 -3
  45. data/spec/fixturama/load_fixture/data.yml +0 -3
  46. data/spec/fixturama/seed_fixture/_spec.rb +0 -33
  47. data/spec/fixturama/seed_fixture/seed.yml +0 -16
  48. data/spec/fixturama/stub_fixture/_spec.rb +0 -96
  49. data/spec/fixturama/stub_fixture/stub.yml +0 -60
  50. data/spec/spec_helper.rb +0 -26
@@ -1,89 +0,0 @@
1
- module Fixturama
2
- #
3
- # Stubbed chain of messages
4
- #
5
- class Stubs::Chain
6
- require_relative "chain/actions"
7
- require_relative "chain/arguments"
8
-
9
- attr_reader :receiver, :messages
10
-
11
- #
12
- # Human-readable representation of the chain
13
- # @return [String]
14
- #
15
- def to_s
16
- "#{receiver}.#{messages.join(".")}"
17
- end
18
- alias to_str to_s
19
-
20
- #
21
- # Register new action for some arguments
22
- #
23
- # @option [Array<#to_s>, #to_s] :arguments The specific arguments
24
- # @option (see Fixturama::Stubs::Arguments#add_action)
25
- # @return [self]
26
- #
27
- def update!(actions:, arguments: nil, **)
28
- Utils.array(arguments).tap do |args|
29
- stub = find_by(args)
30
- unless stub
31
- stub = Stubs::Chain::Arguments.new(self, args)
32
- stubs << stub
33
- end
34
- stub.add!(*actions)
35
- stubs.sort_by! { |stub| -stub.arguments.count }
36
- end
37
-
38
- self
39
- end
40
-
41
- #
42
- # Apply the stub to RSpec example
43
- #
44
- def apply!(example)
45
- reset!
46
-
47
- call_action = example.send(:receive_message_chain, *messages) do |*args|
48
- call! args
49
- end
50
-
51
- example.send(:allow, receiver).to call_action
52
- end
53
-
54
- private
55
-
56
- def initialize(**options)
57
- @receiver = Utils.constantize options[:class] if options.key?(:class)
58
- @receiver ||= Object.send :eval, options[:object] if options.key?(:object)
59
- raise SyntaxError, "Undefined receiver of messages" unless receiver
60
-
61
- @messages = Utils.symbolize_array options[:chain]
62
- return if messages.any?
63
-
64
- raise SyntaxError, <<~MESSAGE.squish
65
- Undefined message chain for stubbing #{receiver}.
66
- Use option `chain` to define it.
67
- MESSAGE
68
- end
69
-
70
- def stubs
71
- @stubs ||= []
72
- end
73
-
74
- def find_by(arguments)
75
- stubs.find { |stub| stub.arguments == arguments }
76
- end
77
-
78
- def reset!
79
- tap { stubs.each(&:reset!) }
80
- end
81
-
82
- def call!(actual_arguments)
83
- stub = stubs.find { |item| item.applicable_to?(actual_arguments) }
84
- raise "Unexpected arguments #{actual_arguments}" unless stub
85
-
86
- stub.call_next!
87
- end
88
- end
89
- end
@@ -1,39 +0,0 @@
1
- module Fixturama
2
- #
3
- # Factory to provide a specific action from options
4
- #
5
- module Stubs::Chain::Actions
6
- extend self
7
-
8
- require_relative "actions/raise"
9
- require_relative "actions/return"
10
-
11
- #
12
- # Builds an action
13
- # @option [#to_s] :raise
14
- # @option [Object] :return
15
- # @option [true] :call_original
16
- # @return [#call] a callable action
17
- #
18
- def build(stub, **options)
19
- check!(stub, options)
20
- key, value = options.to_a.first
21
- TYPES[key].new(stub, value)
22
- end
23
-
24
- private
25
-
26
- def check!(stub, options)
27
- keys = options.keys & TYPES.keys
28
- return if keys.count == 1
29
-
30
- raise SyntaxError, <<~MESSAGE.squish
31
- Invalid settings for stubbing message chain #{stub}: #{options}.
32
- The action MUST have one and only one of the keys:
33
- `#{TYPES.keys.join('`, `')}`.
34
- MESSAGE
35
- end
36
-
37
- TYPES = { raise: Raise, return: Return }.freeze
38
- end
39
- end
@@ -1,21 +0,0 @@
1
- class Fixturama::Stubs::Chain::Actions::Raise
2
- def call
3
- raise @exception
4
- end
5
-
6
- #
7
- # Human-readable representation of the expectation
8
- # @return [String]
9
- #
10
- def to_s
11
- "#{@stub} # raise #{@exception}"
12
- end
13
-
14
- private
15
-
16
- def initialize(stub, name)
17
- @stub = stub
18
- name = name.to_s
19
- @exception = name == "true" ? StandardError : Kernel.const_get(name)
20
- end
21
- end
@@ -1,23 +0,0 @@
1
- class Fixturama::Stubs::Chain::Actions::Return
2
- attr_reader :stub, :call
3
-
4
- #
5
- # Human-readable representation of the expectation
6
- # @return [String]
7
- #
8
- def to_s
9
- "#{@stub} # => #{call}"
10
- end
11
-
12
- private
13
-
14
- def initialize(stub, output)
15
- @stub = stub
16
- @call = \
17
- begin # in ruby 2.3.0 Fixnum#dup is defined, but raises TypeError
18
- output.respond_to?(:dup) ? output.dup : output
19
- rescue TypeError
20
- output
21
- end
22
- end
23
- end
@@ -1,86 +0,0 @@
1
- module Fixturama
2
- #
3
- # Collection of arguments for a stub with a list of actions to be called
4
- #
5
- class Stubs::Chain::Arguments
6
- attr_reader :chain, :arguments
7
-
8
- #
9
- # Register new action for these set of arguments
10
- # @option [#to_i] :repeat (1)
11
- # How much the action should be repeated during the consecutive calls
12
- # @return [self] itself
13
- #
14
- def add!(*actions)
15
- actions.each do |settings|
16
- settings = Utils.symbolize_hash(settings)
17
- repeat = [0, settings.fetch(:repeat, 1).to_i].max
18
- repeat.times { list << Stubs::Chain::Actions.build(self, settings) }
19
- end
20
-
21
- self
22
- end
23
-
24
- #
25
- # Whether the current stub is applicable to actual arguments
26
- # @param [Array<Object>] actual_arguments
27
- # @return [Boolean]
28
- #
29
- def applicable_to?(actual_arguments)
30
- last_index = actual_arguments.count
31
- @arguments.zip(actual_arguments)
32
- .each.with_index(1)
33
- .reduce(true) do |obj, ((expected, actual), index)|
34
- obj && (
35
- expected == actual ||
36
- index == last_index &&
37
- Fixturama::Utils.matched_hash_args?(actual, expected)
38
- )
39
- end
40
- end
41
-
42
- #
43
- # Reset the counter of calls
44
- # @return [self] itself
45
- #
46
- def reset!
47
- @counter = 0
48
- self
49
- end
50
-
51
- #
52
- # Calls the next action for these set of agruments
53
- # @return [Object]
54
- # @raise [StandardError]
55
- #
56
- def call_next!
57
- list.fetch(counter) { list.last }.call.tap { @counter += 1 }
58
- end
59
-
60
- #
61
- # Human-readable representation of arguments
62
- # @return [String]
63
- #
64
- def to_s
65
- args = [*arguments.map(&:to_s), "*"].join(", ")
66
- "#{chain}(#{args})"
67
- end
68
-
69
- private
70
-
71
- # @param [Fixturama::Stubs::Chain] chain Back reference
72
- # @param [Array<Object>] list Definition of arguments
73
- def initialize(chain, list)
74
- @chain = chain
75
- @arguments = Utils.array(list)
76
- end
77
-
78
- def counter
79
- @counter ||= 0
80
- end
81
-
82
- def list
83
- @list ||= []
84
- end
85
- end
86
- end
@@ -1,42 +0,0 @@
1
- module Fixturama
2
- #
3
- # Definition for stubbing a constant
4
- #
5
- class Stubs::Const
6
- attr_reader :const, :value
7
-
8
- #
9
- # Human-readable representation of the chain
10
- # @return [String]
11
- #
12
- def to_s
13
- const.to_s
14
- end
15
- alias to_str to_s
16
-
17
- #
18
- # Overload the definition for the constant
19
- # @option [Object] value
20
- # @return [self]
21
- #
22
- def update!(value:, **)
23
- @value = value
24
- self
25
- end
26
-
27
- #
28
- # Apply the stub to RSpec example
29
- # @return [self]
30
- #
31
- def apply!(example)
32
- example.send(:stub_const, const, value)
33
- self
34
- end
35
-
36
- private
37
-
38
- def initialize(const:, **)
39
- @const = const.to_s
40
- end
41
- end
42
- end
@@ -1,39 +0,0 @@
1
- module Fixturama
2
- module Utils
3
- module_function
4
-
5
- def symbolize(item)
6
- item.to_s.to_sym
7
- end
8
-
9
- def symbolize_hash(data)
10
- Hash(data).transform_keys { |key| symbolize(key)}
11
- end
12
-
13
- def symbolize_array(data)
14
- Array(data).map { |item| symbolize(item) }
15
- end
16
-
17
- def constantize(item)
18
- Kernel.const_get(item.to_s)
19
- end
20
-
21
- def clone(item)
22
- item.respond_to?(:dup) ? item.dup : item
23
- end
24
-
25
- def array(list)
26
- case list
27
- when NilClass then []
28
- when Array then list
29
- else [list]
30
- end
31
- end
32
-
33
- def matched_hash_args?(actual, expected)
34
- return unless actual.is_a?(Hash) && expected.is_a?(Hash)
35
-
36
- expected.all? { |key, val| actual[key] == val }
37
- end
38
- end
39
- 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,33 +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
- expect(FactoryBot).to receive(:create_list).with(:foo, 3, :bar, {})
30
-
31
- subject
32
- end
33
- end