rspec-terraform 0.1.0.pre.16 → 0.1.0.pre.19

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: f6ac4e2b2d77dd35725d9b20272c00e2dc5169b0a7a95b6855b8922490f10c3c
4
- data.tar.gz: aef35909c6f6fd8ac38e08361d9938dca36889a48546edaf65ffb4df1c9787a5
3
+ metadata.gz: d18507e1fb2c9cb75f1d78660709319e3addcc1eeee92538c2b3134d6c3c6783
4
+ data.tar.gz: 794b11b381d232bbbfa5e61ca2a759e8240366768ce7462ad2ea5e6489dddada
5
5
  SHA512:
6
- metadata.gz: '038f3ef462faa363b6502df52393220c9905bffaf8169a6766e93fc7842a8ff3c3c0517f038e424c098670eeea22bf72ca3d291ba26b7066942d1d061d440c35'
7
- data.tar.gz: d0eaae468c9796b7e76e4607229901ffbc538be736da7934c20305e118d522874df8f3bb65d7a1e7123adf297f040d1b37265dfa5098a8c1c753e1cbe93e9e9b
6
+ metadata.gz: b7bcc363f2779b425e544abd7065263e974d36351ed4526b7e768f3d93cc66bd2241c8afc81a65c7ede3418df35eb70bb3fd0cdfca77b3dcca629f20ab9091a1
7
+ data.tar.gz: 9fd86d2510ffcd78213d9ebf8770a1fa70ed4a3a18fca758a2824388e61afcad802d4f1c3bfa85c9612f4abfefb10307a0c5f282e432ea7d490ff9d1c991d8a6
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec-terraform (0.1.0.pre.16)
4
+ rspec-terraform (0.1.0.pre.19)
5
5
  rspec (>= 3.0)
6
6
  ruby-terraform (= 1.7.0.pre.13)
7
7
 
@@ -3,27 +3,175 @@
3
3
  module RSpec
4
4
  module Terraform
5
5
  module Matchers
6
+ # rubocop:disable Metrics/ClassLength
6
7
  class IncludeOutputChange
7
- attr_reader :definition
8
+ attr_reader :definition, :value, :plan
8
9
 
9
- def initialize(definition)
10
+ def initialize(definition = {})
10
11
  @definition = definition
12
+ @value = nil
11
13
  end
12
14
 
13
15
  def matches?(plan)
14
- !definition_matches(plan).empty?
16
+ @plan = plan
17
+
18
+ !value_matches(plan).empty?
15
19
  end
16
20
 
17
- def with_value(_)
21
+ def with_value(value)
22
+ @value = maybe_box_value(value)
18
23
  self
19
24
  end
20
25
 
26
+ def failure_message
27
+ "\nexpected: #{positive_expected_line}" \
28
+ "\n got: #{positive_got_line}"
29
+ end
30
+
21
31
  private
22
32
 
23
33
  def definition_matches(plan)
24
34
  plan.output_changes_matching(definition)
25
35
  end
36
+
37
+ def value_matches(plan)
38
+ matches = definition_matches(plan)
39
+ return matches unless value
40
+
41
+ expected = value_matcher(value)
42
+
43
+ matches.filter do |output_change|
44
+ change = output_change.change
45
+ after = change.after_object
46
+ actual = resolved_value(value, after)
47
+
48
+ expected&.matches?(actual)
49
+ end
50
+ end
51
+
52
+ def maybe_box_value(value)
53
+ if value.respond_to?(:matches?)
54
+ value
55
+ else
56
+ RubyTerraform::Models::Objects.box(value)
57
+ end
58
+ end
59
+
60
+ def value_matcher(expected)
61
+ return expected if expected.respond_to?(:matches?)
62
+
63
+ RSpec::Matchers::BuiltIn::Eq.new(expected)
64
+ end
65
+
66
+ def resolved_value(expected, actual)
67
+ return actual&.unbox if expected.respond_to?(:matches?)
68
+
69
+ actual
70
+ end
71
+
72
+ def positive_expected_line
73
+ maybe_with_expected_value(
74
+ maybe_with_definition(
75
+ positive_plan_line
76
+ )
77
+ )
78
+ end
79
+
80
+ def positive_plan_line
81
+ 'a plan including at least one output change'
82
+ end
83
+
84
+ def maybe_with_definition(expected_line)
85
+ unless definition.empty?
86
+ expected_line =
87
+ "#{expected_line} matching definition:\n#{definition_lines}"
88
+ end
89
+ expected_line
90
+ end
91
+
92
+ def maybe_with_expected_value(expected_line)
93
+ unless value.nil?
94
+ expected_line =
95
+ "#{expected_line}\n with value after " \
96
+ "the output change is applied of:\n#{expected_value_lines}"
97
+ end
98
+ expected_line
99
+ end
100
+
101
+ def definition_lines
102
+ indent = ' '
103
+ definition
104
+ .collect { |k, v| "#{indent}#{k} = #{v.inspect}" }
105
+ .join("\n")
106
+ end
107
+
108
+ def expected_value_lines
109
+ renderable_value = with_matcher_renderable(value)
110
+ value_object =
111
+ RubyTerraform::Models::Values.map(value: renderable_value)
112
+ value_object.render(level: 6, bare: true)
113
+ end
114
+
115
+ def positive_got_line
116
+ if plan.output_changes.empty?
117
+ 'a plan including no output changes.'
118
+ else
119
+ with_available_output_changes(
120
+ maybe_with_relevant_output_changes(
121
+ 'a plan including no matching output changes.'
122
+ )
123
+ )
124
+ end
125
+ end
126
+
127
+ def with_available_output_changes(got_line)
128
+ "#{got_line}\n available output changes are:" \
129
+ "\n#{available_output_change_lines}"
130
+ end
131
+
132
+ def maybe_with_relevant_output_changes(got_line)
133
+ unless value.nil?
134
+ got_line =
135
+ "#{got_line}\n relevant output changes are:" \
136
+ "\n#{relevant_output_change_lines}"
137
+ end
138
+ got_line
139
+ end
140
+
141
+ def available_output_change_lines
142
+ available_lines = plan.output_changes.collect do |oc|
143
+ name = oc.name
144
+ actions = oc.change.actions.join(', ')
145
+ " - #{name} (#{actions})"
146
+ end
147
+ available_lines.join("\n")
148
+ end
149
+
150
+ def relevant_output_change_lines
151
+ relevant_lines = definition_matches(plan).collect do |oc|
152
+ name = oc.name
153
+ actions = oc.change.actions.join(', ')
154
+ value = oc.change.after_object
155
+ value_object =
156
+ RubyTerraform::Models::Values.map(value: value)
157
+ value_lines = value_object.render(level: 8, bare: true)
158
+
159
+ " - #{name} (#{actions})\n#{value_lines}"
160
+ end
161
+ relevant_lines.join("\n")
162
+ end
163
+
164
+ def with_matcher_renderable(value)
165
+ return value if value.respond_to?(:render)
166
+
167
+ value.define_singleton_method(:render) do |_|
168
+ "a value satisfying: #{value.description}"
169
+ end
170
+
171
+ value
172
+ end
26
173
  end
174
+ # rubocop:enable Metrics/ClassLength
27
175
  end
28
176
  end
29
177
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module Terraform
5
- VERSION = '0.1.0.pre.16'
5
+ VERSION = '0.1.0.pre.19'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-terraform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre.16
4
+ version: 0.1.0.pre.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - InfraBlocks Maintainers
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-16 00:00:00.000000000 Z
11
+ date: 2022-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec