defmastership 1.3.2 → 1.3.4

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +9 -9
  3. data/Guardfile +2 -5
  4. data/Rakefile +1 -1
  5. data/config/mutant.yml +2 -1
  6. data/config/rubocop.yml +20 -8
  7. data/defmastership.gemspec +6 -15
  8. data/features/changeref.feature +108 -0
  9. data/features/definition_checksum.feature +118 -0
  10. data/features/definition_version.feature +168 -0
  11. data/features/export.feature +122 -22
  12. data/features/external_ref_checksum.feature +169 -0
  13. data/features/external_ref_version.feature +173 -0
  14. data/features/internal_ref_checksum.feature +77 -0
  15. data/features/internal_ref_version.feature +81 -0
  16. data/features/rename_included_files.feature +55 -0
  17. data/features/step_definitions/git_steps.rb +3 -0
  18. data/lib/defmastership/app.rb +35 -8
  19. data/lib/defmastership/comment_filter.rb +2 -0
  20. data/lib/defmastership/def_type_list.rb +25 -0
  21. data/lib/defmastership/definition_parser.rb +2 -6
  22. data/lib/defmastership/document.rb +6 -9
  23. data/lib/defmastership/export/csv/formatter.rb +8 -60
  24. data/lib/defmastership/export/formatter.rb +88 -0
  25. data/lib/defmastership/export/json/formatter.rb +34 -0
  26. data/lib/defmastership/export/xlsx/formatter.rb +87 -0
  27. data/lib/defmastership/export/yaml/formatter.rb +34 -0
  28. data/lib/defmastership/modifier/change_ref.rb +24 -39
  29. data/lib/defmastership/modifier/factory.rb +5 -1
  30. data/lib/defmastership/modifier/modifier_common.rb +4 -4
  31. data/lib/defmastership/modifier/rename_included_files.rb +16 -5
  32. data/lib/defmastership/modifier/replacement_formatter.rb +37 -0
  33. data/lib/defmastership/modifier/update_def.rb +7 -2
  34. data/lib/defmastership/modifier/update_eref_checksum.rb +46 -0
  35. data/lib/defmastership/modifier/update_eref_common.rb +78 -0
  36. data/lib/defmastership/modifier/update_eref_version.rb +46 -0
  37. data/lib/defmastership/modifier/update_iref_checksum.rb +52 -0
  38. data/lib/defmastership/modifier/update_iref_common.rb +45 -0
  39. data/lib/defmastership/modifier/update_iref_version.rb +59 -0
  40. data/lib/defmastership/version.rb +1 -1
  41. data/spec/spec_helper.rb +11 -10
  42. data/spec/unit/defmastership/app_spec.rb +57 -20
  43. data/spec/unit/defmastership/batch_modifier_spec.rb +9 -7
  44. data/spec/unit/defmastership/def_type_list_spec.rb +22 -0
  45. data/spec/unit/defmastership/definition_spec.rb +8 -51
  46. data/spec/unit/defmastership/document_spec.rb +12 -36
  47. data/spec/unit/defmastership/export/body_formatter_spec.rb +5 -18
  48. data/spec/unit/defmastership/export/csv/formatter_spec.rb +45 -231
  49. data/spec/unit/defmastership/export/formatter_spec.rb +97 -0
  50. data/spec/unit/defmastership/export/header_formatter_spec.rb +2 -6
  51. data/spec/unit/defmastership/export/json/formatter_spec.rb +85 -0
  52. data/spec/unit/defmastership/export/xlsx/formatter_spec.rb +82 -0
  53. data/spec/unit/defmastership/export/yaml/formatter_spec.rb +85 -0
  54. data/spec/unit/defmastership/hash_spec.rb +2 -0
  55. data/spec/unit/defmastership/modifier/change_ref_spec.rb +66 -97
  56. data/spec/unit/defmastership/modifier/factory_spec.rb +40 -17
  57. data/spec/unit/defmastership/modifier/modifier_common_spec.rb +7 -5
  58. data/spec/unit/defmastership/modifier/rename_included_files_spec.rb +105 -85
  59. data/spec/unit/defmastership/modifier/update_def_checksum_spec.rb +6 -13
  60. data/spec/unit/defmastership/modifier/update_def_spec.rb +79 -22
  61. data/spec/unit/defmastership/modifier/update_def_version_spec.rb +13 -37
  62. data/spec/unit/defmastership/modifier/update_eref_checksum_spec.rb +209 -0
  63. data/spec/unit/defmastership/modifier/update_eref_version_spec.rb +227 -0
  64. data/spec/unit/defmastership/modifier/update_iref_checksum_spec.rb +133 -0
  65. data/spec/unit/defmastership/modifier/update_iref_version_spec.rb +162 -0
  66. data/tasks/code_quality.rake +1 -8
  67. data/tasks/test.rake +15 -0
  68. metadata +59 -6
@@ -1,10 +1,13 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
+ require('defmastership/document')
4
5
  require('defmastership/export/csv/formatter')
5
6
 
7
+ COLUMN_METHODS = %i[type reference value checksum].freeze
8
+
6
9
  RSpec.describe(Defmastership::Export::CSV::Formatter) do
7
- subject(:formatter) { described_class.new(document, ';') }
10
+ subject(:formatter) { described_class.new(document, separator: ';') }
8
11
 
9
12
  let(:document) { instance_double(Defmastership::Document, 'document') }
10
13
 
@@ -20,6 +23,7 @@ RSpec.describe(Defmastership::Export::CSV::Formatter) do
20
23
  instance_double(Defmastership::Export::BodyFormatter, 'bodies[1]')
21
24
  ]
22
25
  end
26
+
23
27
  let(:csv) { instance_double(CSV, 'csv') }
24
28
 
25
29
  before do
@@ -45,10 +49,8 @@ RSpec.describe(Defmastership::Export::CSV::Formatter) do
45
49
  end
46
50
 
47
51
  context 'when no variable columns' do
48
- methods = %i[type reference value checksum]
49
-
50
52
  before do
51
- methods.each do |method|
53
+ COLUMN_METHODS.each do |method|
52
54
  allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
53
55
  bodies.each_with_index do |body, index|
54
56
  allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
@@ -59,88 +61,7 @@ RSpec.describe(Defmastership::Export::CSV::Formatter) do
59
61
 
60
62
  it { expect(CSV).to(have_received(:open).with('whatever', 'w:ISO-8859-1', col_sep: ';')) }
61
63
 
62
- methods.each do |method|
63
- it { expect(header).to(have_received(method).with(no_args)) }
64
-
65
- 2.times do |index|
66
- it { expect(bodies[index]).to(have_received(method).with(no_args)) }
67
- end
68
- end
69
-
70
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
71
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
72
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
73
- end
74
-
75
- context 'when summary' do
76
- methods = %i[type reference summary value checksum]
77
-
78
- before do
79
- methods.each do |method|
80
- allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
81
- bodies.each_with_index do |body, index|
82
- allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
83
- end
84
- end
85
- allow(document).to(receive(:summaries?).with(no_args).and_return([:whatever]))
86
- formatter.export_to('whatever')
87
- end
88
-
89
- methods.each do |method|
90
- it { expect(header).to(have_received(method).with(no_args)) }
91
-
92
- 2.times do |index|
93
- it { expect(bodies[index]).to(have_received(method).with(no_args)) }
94
- end
95
- end
96
-
97
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
98
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
99
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
100
- end
101
-
102
- context 'when wrong_explicit_checksum' do
103
- methods = %i[type reference value checksum wrong_explicit_checksum]
104
-
105
- before do
106
- methods.each do |method|
107
- allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
108
- bodies.each_with_index do |body, index|
109
- allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
110
- end
111
- end
112
- allow(document).to(receive(:wrong_explicit_checksum?).with(no_args).and_return(true))
113
- formatter.export_to('whatever')
114
- end
115
-
116
- methods.each do |method|
117
- it { expect(header).to(have_received(method).with(no_args)) }
118
-
119
- 2.times do |index|
120
- it { expect(bodies[index]).to(have_received(method).with(no_args)) }
121
- end
122
- end
123
-
124
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
125
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
126
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
127
- end
128
-
129
- context 'when explicit_version' do
130
- methods = %i[type reference value checksum explicit_version]
131
-
132
- before do
133
- methods.each do |method|
134
- allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
135
- bodies.each_with_index do |body, index|
136
- allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
137
- end
138
- end
139
- allow(document).to(receive(:explicit_version?).with(no_args).and_return(true))
140
- formatter.export_to('whatever')
141
- end
142
-
143
- methods.each do |method|
64
+ COLUMN_METHODS.each do |method|
144
65
  it { expect(header).to(have_received(method).with(no_args)) }
145
66
 
146
67
  2.times do |index|
@@ -148,162 +69,55 @@ RSpec.describe(Defmastership::Export::CSV::Formatter) do
148
69
  end
149
70
  end
150
71
 
151
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
152
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
153
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
72
+ it { expect(csv).to(have_received(:<<).with(COLUMN_METHODS.map { |method| "#{method} header" })) }
73
+ it { expect(csv).to(have_received(:<<).with(COLUMN_METHODS.map { |method| "#{method} def0 body" })) }
74
+ it { expect(csv).to(have_received(:<<).with(COLUMN_METHODS.map { |method| "#{method} def1 body" })) }
154
75
  end
76
+ end
155
77
 
156
- context 'when labels' do
157
- methods = %i[type reference value checksum labels]
158
-
159
- before do
160
- methods.each do |method|
161
- allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
162
- bodies.each_with_index do |body, index|
163
- allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
164
- end
165
- end
166
- allow(document).to(receive(:labels).with(no_args).and_return([:whatever]))
167
- formatter.export_to('whatever')
168
- end
169
-
170
- methods.each do |method|
171
- it { expect(header).to(have_received(method).with(no_args)) }
172
-
173
- 2.times do |index|
174
- it { expect(bodies[index]).to(have_received(method).with(no_args)) }
175
- end
176
- end
177
-
178
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
179
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
180
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
181
- end
182
-
183
- context 'when eref' do
184
- methods = %i[type reference value checksum eref]
185
-
186
- before do
187
- methods.each do |method|
188
- allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
189
- bodies.each_with_index do |body, index|
190
- allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
191
- end
192
- end
193
- allow(document).to(receive(:eref).with(no_args).and_return([:whatever]))
194
- formatter.export_to('whatever')
195
- end
196
-
197
- methods.each do |method|
198
- it { expect(header).to(have_received(method).with(no_args)) }
199
-
200
- 2.times do |index|
201
- it { expect(bodies[index]).to(have_received(method).with(no_args)) }
202
- end
203
- end
204
-
205
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
206
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
207
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
208
- end
209
-
210
- context 'when iref' do
211
- methods = %i[type reference value checksum iref]
212
-
213
- before do
214
- methods.each do |method|
215
- allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
216
- bodies.each_with_index do |body, index|
217
- allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
218
- end
219
- end
220
- allow(document).to(receive(:iref).with(no_args).and_return(true))
221
- formatter.export_to('whatever')
222
- end
223
-
224
- methods.each do |method|
225
- it { expect(header).to(have_received(method).with(no_args)) }
78
+ describe '#export_to with default separator' do
79
+ subject(:formatter) { described_class.new(document) }
226
80
 
227
- 2.times do |index|
228
- it { expect(bodies[index]).to(have_received(method).with(no_args)) }
229
- end
230
- end
231
-
232
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
233
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
234
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
81
+ let(:header) { instance_double(Defmastership::Export::HeaderFormatter, 'header') }
82
+ let(:bodies) do
83
+ [
84
+ instance_double(Defmastership::Export::BodyFormatter, 'bodies[0]'),
85
+ instance_double(Defmastership::Export::BodyFormatter, 'bodies[1]')
86
+ ]
235
87
  end
236
88
 
237
- context 'when attributes' do
238
- methods = %i[type reference value checksum attributes]
89
+ let(:csv) { instance_double(CSV, 'csv') }
239
90
 
240
- before do
241
- methods.each do |method|
242
- allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
243
- bodies.each_with_index do |body, index|
244
- allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
245
- end
246
- end
247
- allow(document).to(receive(:attributes).with(no_args).and_return([:whatever]))
248
- formatter.export_to('whatever')
91
+ before do
92
+ allow(CSV).to(receive(:open).with('whatever', 'w:ISO-8859-1', col_sep: ',').and_yield(csv))
93
+ allow(csv).to(receive(:<<))
94
+ allow(Defmastership::Export::HeaderFormatter).to(receive(:new).with(document).and_return(header))
95
+ bodies.each_with_index do |body, index|
96
+ allow(Defmastership::Export::BodyFormatter).to(
97
+ receive(:new).with(
98
+ document,
99
+ :"def#{index}"
100
+ ).and_return(body)
101
+ )
249
102
  end
103
+ allow(document).to(receive(:definitions).and_return(%i[def0 def1]))
104
+ allow(document).to(receive(:summaries?).with(no_args).and_return(false))
105
+ allow(document).to(receive(:wrong_explicit_checksum?).with(no_args).and_return(false))
106
+ allow(document).to(receive(:explicit_version?).with(no_args).and_return(false))
107
+ allow(document).to(receive(:labels).with(no_args).and_return([]))
108
+ allow(document).to(receive(:eref).with(no_args).and_return([]))
109
+ allow(document).to(receive(:iref).with(no_args).and_return(false))
110
+ allow(document).to(receive(:attributes).with(no_args).and_return([]))
250
111
 
251
- methods.each do |method|
252
- it { expect(header).to(have_received(method).with(no_args)) }
253
-
254
- 2.times do |index|
255
- it { expect(bodies[index]).to(have_received(method).with(no_args)) }
112
+ %i[type reference value checksum].each do |method|
113
+ allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
114
+ bodies.each_with_index do |body, index|
115
+ allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
256
116
  end
257
117
  end
258
-
259
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
260
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
261
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
118
+ formatter.export_to('whatever')
262
119
  end
263
120
 
264
- context 'when every colums' do
265
- methods = %i[
266
- type
267
- reference
268
- summary
269
- value
270
- checksum
271
- wrong_explicit_checksum
272
- explicit_version
273
- labels
274
- eref
275
- iref
276
- attributes
277
- ]
278
-
279
- before do
280
- methods.each do |method|
281
- allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
282
- bodies.each_with_index do |body, index|
283
- allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
284
- end
285
- end
286
- allow(document).to(receive(:summaries?).with(no_args).and_return(true))
287
- allow(document).to(receive(:wrong_explicit_checksum?).with(no_args).and_return(true))
288
- allow(document).to(receive(:explicit_version?).with(no_args).and_return(true))
289
- allow(document).to(receive(:labels).with(no_args).and_return([:whatever]))
290
- allow(document).to(receive(:eref).with(no_args).and_return([:whatever]))
291
- allow(document).to(receive(:iref).with(no_args).and_return(true))
292
- allow(document).to(receive(:attributes).with(no_args).and_return([:whatever]))
293
- formatter.export_to('whatever')
294
- end
295
-
296
- methods.each do |method|
297
- it { expect(header).to(have_received(method).with(no_args)) }
298
-
299
- 2.times do |index|
300
- it { expect(bodies[index]).to(have_received(method).with(no_args)) }
301
- end
302
- end
303
-
304
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} header" })) }
305
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def0 body" })) }
306
- it { expect(csv).to(have_received(:<<).with(methods.map { |method| "#{method} def1 body" })) }
307
- end
121
+ it { expect(CSV).to(have_received(:open).with('whatever', 'w:ISO-8859-1', col_sep: ',')) }
308
122
  end
309
123
  end
@@ -0,0 +1,97 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('defmastership/export/formatter')
5
+
6
+ # Defmastership::Export::Formatter is an abstract class and need to be derived for test
7
+ class ConcreteFormatter < Defmastership::Export::Formatter
8
+ def export_to(_filename)
9
+ # allow to indirectly test a private method
10
+ build_column_list
11
+ end
12
+ end
13
+
14
+ RSpec.describe(Defmastership::Export::Formatter) do
15
+ context('when class is not derived') do
16
+ subject(:formatter) { described_class.new(:whatever) }
17
+
18
+ describe '#export_to' do
19
+ it {
20
+ expect { formatter.export_to(:something) }
21
+ .to(raise_error(
22
+ NotImplementedError,
23
+ 'Defmastership::Export::Formatter has not implemented the \'export_to\' method'
24
+ ))
25
+ }
26
+ end
27
+ end
28
+
29
+ context('when class is derived') do
30
+ subject(:formatter) { ConcreteFormatter.new(document) }
31
+
32
+ let(:document) { instance_double(Defmastership::Document, 'document') }
33
+
34
+ describe '#export_to' do
35
+ it {
36
+ expect { formatter.export_to(:something) }
37
+ .not_to(raise_error(NotImplementedError))
38
+ }
39
+ end
40
+
41
+ describe '#header' do
42
+ let(:header_formatter) { instance_double(Defmastership::Export::HeaderFormatter, 'header_formatter') }
43
+
44
+ before do
45
+ allow(Defmastership::Export::HeaderFormatter).to(receive(:new).and_return(header_formatter))
46
+ allow(header_formatter).to(receive_messages(type: ['type value'], reference: ['reference value']))
47
+ formatter.header(%i[type reference])
48
+ end
49
+
50
+ it { expect(Defmastership::Export::HeaderFormatter).to(have_received(:new).with(document)) }
51
+ it { expect(header_formatter).to(have_received(:type)) }
52
+ it { expect(header_formatter).to(have_received(:reference)) }
53
+ it { expect(formatter.header(%i[type reference])).to(eq(['type value', 'reference value'])) }
54
+ end
55
+
56
+ describe '#body' do
57
+ let(:body_formatter) { instance_double(Defmastership::Export::BodyFormatter, 'body_formatter') }
58
+
59
+ before do
60
+ allow(Defmastership::Export::BodyFormatter).to(receive(:new).and_return(body_formatter))
61
+ allow(body_formatter).to(receive_messages(type: ['type value'], reference: ['reference value']))
62
+ formatter.body(:definition, %i[type reference])
63
+ end
64
+
65
+ it { expect(Defmastership::Export::BodyFormatter).to(have_received(:new).with(document, :definition)) }
66
+ it { expect(body_formatter).to(have_received(:type)) }
67
+ it { expect(body_formatter).to(have_received(:reference)) }
68
+ it { expect(formatter.body(:definition, %i[type reference])).to(eq(['type value', 'reference value'])) }
69
+ end
70
+
71
+ describe '#build_column_list' do
72
+ before do
73
+ allow(document).to(
74
+ receive_messages(
75
+ summaries?: true,
76
+ wrong_explicit_checksum?: false,
77
+ explicit_version?: false,
78
+ labels: ['toto'],
79
+ eref: [],
80
+ iref: false,
81
+ attributes: []
82
+ )
83
+ )
84
+ formatter.export_to(:whatever)
85
+ end
86
+
87
+ it { expect(document).to(have_received(:summaries?)) }
88
+ it { expect(document).to(have_received(:wrong_explicit_checksum?)) }
89
+ it { expect(document).to(have_received(:explicit_version?)) }
90
+ it { expect(document).to(have_received(:labels)) }
91
+ it { expect(document).to(have_received(:eref)) }
92
+ it { expect(document).to(have_received(:iref)) }
93
+ it { expect(document).to(have_received(:attributes)) }
94
+ it { expect(formatter.export_to(:whatever)).to(eq(%i[type reference summary value checksum labels])) }
95
+ end
96
+ end
97
+ end
@@ -1,6 +1,7 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
+ require('defmastership/document')
4
5
  require('defmastership/export/header_formatter')
5
6
 
6
7
  RSpec.describe(Defmastership::Export::HeaderFormatter) do
@@ -110,12 +111,7 @@ RSpec.describe(Defmastership::Export::HeaderFormatter) do
110
111
 
111
112
  context 'when eref' do
112
113
  before do
113
- allow(document).to(
114
- receive(:eref).and_return(
115
- whatever: { prefix: 'A' },
116
- other: { prefix: 'C', url: 'D' }
117
- )
118
- )
114
+ allow(document).to(receive(:eref).and_return(whatever: { prefix: 'A' }, other: { prefix: 'C', url: 'D' }))
119
115
  end
120
116
 
121
117
  it { expect(formatter.eref).to(eq(%w[A C])) }
@@ -0,0 +1,85 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('defmastership/document')
5
+ require('defmastership/export/json/formatter')
6
+
7
+ RSpec.describe(Defmastership::Export::JSON::Formatter) do
8
+ subject(:formatter) { described_class.new(document) }
9
+
10
+ let(:document) { instance_double(Defmastership::Document, 'document') }
11
+
12
+ describe '.new' do
13
+ it { is_expected.not_to(be_nil) }
14
+ end
15
+
16
+ describe '#export_to' do
17
+ let(:header) { instance_double(Defmastership::Export::HeaderFormatter, 'header') }
18
+ let(:bodies) do
19
+ [
20
+ instance_double(Defmastership::Export::BodyFormatter, 'bodies[0]'),
21
+ instance_double(Defmastership::Export::BodyFormatter, 'bodies[1]')
22
+ ]
23
+ end
24
+
25
+ let(:json) { instance_double(JSON, 'json') }
26
+ let(:expected_hash_array) do
27
+ [
28
+ {
29
+ 'checksum header': 'checksum def0 body',
30
+ 'reference header': 'reference def0 body',
31
+ 'type header': 'type def0 body',
32
+ 'value header': 'value def0 body'
33
+ },
34
+ {
35
+ 'checksum header': 'checksum def1 body',
36
+ 'reference header': 'reference def1 body',
37
+ 'type header': 'type def1 body',
38
+ 'value header': 'value def1 body'
39
+ }
40
+ ]
41
+ end
42
+
43
+ before do
44
+ allow(Defmastership::Export::HeaderFormatter).to(receive(:new).with(document).and_return(header))
45
+ bodies.each_with_index do |body, index|
46
+ allow(Defmastership::Export::BodyFormatter).to(
47
+ receive(:new).with(
48
+ document,
49
+ :"def#{index}"
50
+ ).and_return(body)
51
+ )
52
+ end
53
+ allow(document).to(receive(:definitions).and_return(%i[def0 def1]))
54
+ allow(document).to(receive(:summaries?).with(no_args).and_return(false))
55
+ allow(document).to(receive(:wrong_explicit_checksum?).with(no_args).and_return(false))
56
+ allow(document).to(receive(:explicit_version?).with(no_args).and_return(false))
57
+ allow(document).to(receive(:labels).with(no_args).and_return([]))
58
+ allow(document).to(receive(:eref).with(no_args).and_return([]))
59
+ allow(document).to(receive(:iref).with(no_args).and_return(false))
60
+ allow(document).to(receive(:attributes).with(no_args).and_return([]))
61
+
62
+ COLUMN_METHODS.each do |method|
63
+ allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
64
+ bodies.each_with_index do |body, index|
65
+ allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
66
+ end
67
+ end
68
+
69
+ allow(JSON).to(receive(:pretty_generate)).and_return('the generated json')
70
+ allow(File).to(receive(:write).with('filename', 'the generated json'))
71
+ formatter.export_to('filename')
72
+ end
73
+
74
+ COLUMN_METHODS.each do |method|
75
+ it { expect(header).to(have_received(method).with(no_args)) }
76
+
77
+ 2.times do |index|
78
+ it { expect(bodies[index]).to(have_received(method).with(no_args)) }
79
+ end
80
+ end
81
+
82
+ it { expect(JSON).to(have_received(:pretty_generate).with(expected_hash_array)) }
83
+ it { expect(File).to(have_received(:write).with('filename', 'the generated json')) }
84
+ end
85
+ end
@@ -0,0 +1,82 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('defmastership/export/xlsx/formatter')
5
+ require('rubyXL')
6
+
7
+ RSpec.describe(Defmastership::Export::XLSX::Formatter) do
8
+ subject(:formatter) { described_class.new(document) }
9
+
10
+ let(:document) { instance_double(Defmastership::Document, 'document') }
11
+
12
+ describe '.new' do
13
+ it { is_expected.not_to(be_nil) }
14
+ end
15
+
16
+ describe '#export_to' do
17
+ let(:header) { instance_double(Defmastership::Export::HeaderFormatter, 'header') }
18
+ let(:bodies) do
19
+ [
20
+ instance_double(Defmastership::Export::BodyFormatter, 'bodies[0]'),
21
+ instance_double(Defmastership::Export::BodyFormatter, 'bodies[1]')
22
+ ]
23
+ end
24
+ let(:workbook) { instance_double(RubyXL::Workbook, 'workbook') }
25
+ let(:worksheet) { instance_double(RubyXL::Worksheet, 'worksheet') }
26
+
27
+ before do
28
+ allow(RubyXL::Workbook).to(receive(:new).and_return(workbook))
29
+ allow(workbook).to(receive(:worksheets).with(no_args).and_return([worksheet]))
30
+ allow(worksheet).to(receive(:add_cell))
31
+ allow(workbook).to(receive(:write))
32
+ allow(Defmastership::Export::HeaderFormatter).to(receive(:new).with(document).and_return(header))
33
+ bodies.each_with_index do |body, index|
34
+ allow(Defmastership::Export::BodyFormatter).to(
35
+ receive(:new).with(
36
+ document,
37
+ :"def#{index}"
38
+ ).and_return(body)
39
+ )
40
+ end
41
+ allow(document).to(receive(:definitions).and_return(%i[def0 def1]))
42
+ allow(document).to(receive(:summaries?).with(no_args).and_return(false))
43
+ allow(document).to(receive(:wrong_explicit_checksum?).with(no_args).and_return(false))
44
+ allow(document).to(receive(:explicit_version?).with(no_args).and_return(false))
45
+ allow(document).to(receive(:labels).with(no_args).and_return([]))
46
+ allow(document).to(receive(:eref).with(no_args).and_return([]))
47
+ allow(document).to(receive(:iref).with(no_args).and_return(false))
48
+ allow(document).to(receive(:attributes).with(no_args).and_return([]))
49
+ end
50
+
51
+ context 'when no variable columns' do
52
+ before do
53
+ COLUMN_METHODS.each do |method|
54
+ allow(header).to(receive(method).with(no_args).and_return(["#{method} header"]))
55
+ bodies.each_with_index do |body, index|
56
+ allow(body).to(receive(method).with(no_args).and_return(["#{method} def#{index} body"]))
57
+ end
58
+ end
59
+ formatter.export_to('whatever')
60
+ end
61
+
62
+ it { expect(RubyXL::Workbook).to(have_received(:new)) }
63
+ it { expect(workbook).to(have_received(:worksheets)) }
64
+
65
+ COLUMN_METHODS.each do |method|
66
+ it { expect(header).to(have_received(method).with(no_args)) }
67
+
68
+ 2.times do |index|
69
+ it { expect(bodies[index]).to(have_received(method).with(no_args)) }
70
+ end
71
+ end
72
+
73
+ COLUMN_METHODS.each_with_index do |method, index|
74
+ it { expect(worksheet).to(have_received(:add_cell).with(0, index, "#{method} header")) }
75
+ it { expect(worksheet).to(have_received(:add_cell).with(1, index, "#{method} def0 body")) }
76
+ it { expect(worksheet).to(have_received(:add_cell).with(2, index, "#{method} def1 body")) }
77
+ end
78
+
79
+ it { expect(workbook).to(have_received(:write).with('whatever')) }
80
+ end
81
+ end
82
+ end