ae_easy-test 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +7 -0
  4. data/.yardopts +1 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +65 -0
  8. data/LICENSE +21 -0
  9. data/README.md +16 -0
  10. data/Rakefile +22 -0
  11. data/ae_easy-test.gemspec +49 -0
  12. data/doc/AeEasy.html +117 -0
  13. data/doc/AeEasy/Core.html +117 -0
  14. data/doc/AeEasy/Core/Mock.html +115 -0
  15. data/doc/AeEasy/Core/Mock/FakeExecutor.html +2037 -0
  16. data/doc/AeEasy/Core/Modk.html +105 -0
  17. data/doc/AeEasy/Core/Plugin.html +117 -0
  18. data/doc/AeEasy/Core/Plugin/ExecutorBehavior.html +196 -0
  19. data/doc/AeEasy/Test.html +616 -0
  20. data/doc/AeEasy/Test/Helper.html +1721 -0
  21. data/doc/AeEasy/Test/RecordTask.html +2493 -0
  22. data/doc/_index.html +237 -0
  23. data/doc/class_list.html +51 -0
  24. data/doc/css/common.css +1 -0
  25. data/doc/css/full_list.css +58 -0
  26. data/doc/css/style.css +496 -0
  27. data/doc/file.README.html +91 -0
  28. data/doc/file_list.html +56 -0
  29. data/doc/frames.html +17 -0
  30. data/doc/index.html +91 -0
  31. data/doc/js/app.js +292 -0
  32. data/doc/js/full_list.js +216 -0
  33. data/doc/js/jquery.js +4 -0
  34. data/doc/method_list.html +419 -0
  35. data/doc/top-level-namespace.html +110 -0
  36. data/lib/ae_easy/test.rb +52 -0
  37. data/lib/ae_easy/test/helper.rb +224 -0
  38. data/lib/ae_easy/test/rake.rb +335 -0
  39. data/lib/ae_easy/test/version.rb +6 -0
  40. data/lib/ae_easy_override/core.rb +7 -0
  41. data/lib/ae_easy_override/core/mock.rb +8 -0
  42. data/lib/ae_easy_override/core/mock/fake_executor.rb +324 -0
  43. data/lib/ae_easy_override/core/plugin.rb +8 -0
  44. data/lib/ae_easy_override/core/plugin/executor_behavior.rb +11 -0
  45. metadata +201 -0
@@ -0,0 +1,6 @@
1
+ module AeEasy
2
+ module Test
3
+ # Gem version
4
+ VERSION = "0.0.0"
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ require 'ae_easy_override/core/plugin'
2
+ require 'ae_easy_override/core/mock'
3
+
4
+ module AeEasy
5
+ module Core
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ require 'ae_easy_override/core/mock/fake_executor'
2
+
3
+ module AeEasy
4
+ module Core
5
+ module Modk
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,324 @@
1
+ module AeEasy
2
+ module Core
3
+ module Mock
4
+ module FakeExecutor
5
+ # Root input directory.
6
+ attr_accessor :root_input_dir
7
+
8
+ # Current assigned input directory.
9
+ attr_accessor :input_dir
10
+
11
+ # Expand a relative input directory.
12
+ #
13
+ # @param [String, nil] dir Relative input directory
14
+ #
15
+ # @return [String] Absolute path
16
+ def expand_relative_input dir
17
+ return nil if dir.nil?
18
+ File.expand_path File.join(root_input_dir, dir)
19
+ end
20
+
21
+ # Load data into executor from options or input files.
22
+ #
23
+ # @param [Hash] opts ({}) Configuration options.
24
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
25
+ # directory. The files map as follows (file_name -> variable):
26
+ # ```
27
+ # content -> content
28
+ # page.json -> page
29
+ # vars.json -> page['vars']
30
+ # pages.json -> saved_pages
31
+ # outputs.json -> saved_outputs
32
+ # ```
33
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
34
+ # but relative to root input directory (see #root_input_dir).
35
+ # @option opts [String,nil] :content Content to load. It will override
36
+ # `content` file from input directory.
37
+ # @option opts [Hash,nil] :page Page to load. It will override `page.json`
38
+ # from input directory.
39
+ # @option opts [Hash,nil] :vars Variables to load. It will override
40
+ # `vars.json` from input directory.
41
+ # @option opts [Hash,nil] :pages Pages to load. It will override
42
+ # `pages.json` from input directory.
43
+ # @option opts [Hash,nil] :outputs Outputs to load. It will override
44
+ # `outputs.json` from input directory.
45
+ #
46
+ # @return [FakeExecutor]
47
+ def load_input opts = {}
48
+ opts = {
49
+ rel_dir: nil,
50
+ input_dir: nil,
51
+ content: nil,
52
+ page: nil,
53
+ vars: nil,
54
+ pages: nil,
55
+ outputs: nil
56
+ }.merge opts
57
+ dir = opts[:input_dir] || expand_relative_input(opts[:rel_dir]) || self.input_dir
58
+
59
+ # Load overrides
60
+ self.content = opts[:content]
61
+ new_page = AeEasy::Core.deep_stringify_keys(opts[:page]) unless opts[:page].nil?
62
+ save_pages opts[:pages] unless opts[:pages].nil?
63
+ save_outputs opts[:outputs] unless opts[:outputs].nil?
64
+ vars = nil
65
+ vars = AeEasy::Core.deep_stringify_keys(opts[:vars]) unless opts[:vars]
66
+
67
+ # Load input files
68
+ unless dir.nil?
69
+ self.content ||= AeEasy::Test::Helper.load_file(File.join(dir, 'content'))
70
+ new_page ||= AeEasy::Test::Helper.load_json_file(File.join(dir, 'page.json'))
71
+ input_pages = AeEasy::Test::Helper.load_json_file(File.join(dir, 'pages.json'))
72
+ save_pages input_pages unless input_pages.nil?
73
+ input_outputs = AeEasy::Test::Helper.load_json_file(File.join(dir, 'outputs.json'))
74
+ save_outputs outputs unless input_outputs.nil?
75
+ input_vars = AeEasy::Test::Helper.load_json_file(File.join(dir, 'vars.json'))
76
+ vars ||= input_vars if opts[:page].nil?
77
+ end
78
+
79
+ # Load vars only when no page override and not nil
80
+ self.page = new_page unless new_page.nil?
81
+ page['vars'] = vars unless vars.nil?
82
+ self
83
+ end
84
+
85
+ # Load failed content into executor from options or input files.
86
+ #
87
+ # @param [Hash] opts ({}) Configuration options.
88
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
89
+ # directory. The files map as follows (file_name -> variable):
90
+ # ```
91
+ # failed_content.json -> failed_content
92
+ # ```
93
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
94
+ # but relative to root input directory (see #root_input_dir).
95
+ # @option opts [Hash,nil] :failed_content Failed content to load. It
96
+ # will override `failed_content.json` from input directory.
97
+ #
98
+ # @return [FakeExecutor]
99
+ def load_failed_content opts = {}
100
+ opts = {
101
+ rel_dir: nil,
102
+ input_dir: nil,
103
+ failed_content: nil
104
+ }.merge opts
105
+ dir = opts[:input_dir] || expand_relative_input(opts[:rel_dir]) || self.input_dir
106
+
107
+ # Load overrides
108
+ self.failed_content = opts[:failed_content]
109
+
110
+ # Load input files
111
+ unless dir.nil?
112
+ self.failed_content ||= AeEasy::Test::Helper.load_file(File.join(dir, 'failed_content.json'))
113
+ end
114
+
115
+ self
116
+ end
117
+
118
+ # Load expected pages into executor from options or input files.
119
+ #
120
+ # @param [Hash] opts ({}) Configuration options.
121
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
122
+ # directory. The files map as follows (file_name -> variable):
123
+ # ```
124
+ # expected_pages.json -> saved_pages
125
+ # ```
126
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
127
+ # but relative to root input directory (see #root_input_dir).
128
+ # @option opts [Hash,nil] :pages Pages to load. It will override
129
+ # `expected_pages.json` from input directory.
130
+ #
131
+ # @return [FakeExecutor]
132
+ def load_expected_pages opts = {}
133
+ opts = {
134
+ rel_dir: nil,
135
+ input_dir: nil,
136
+ pages: nil
137
+ }.merge opts
138
+ dir = opts[:input_dir] || expand_relative_input(opts[:rel_dir]) || self.input_dir
139
+
140
+ # Load overrides
141
+ save_pages opts[:pages] unless opts[:pages].nil?
142
+
143
+ # Load input files
144
+ unless dir.nil?
145
+ expected_pages = AeEasy::Test::Helper.load_json_file(File.join(dir, 'expected_pages.json'))
146
+ save_pages expected_pages unless expected_pages.nil?
147
+ end
148
+
149
+ self
150
+ end
151
+
152
+ # Load expected outputs into executor from options or input files.
153
+ #
154
+ # @param [Hash] opts ({}) Configuration options.
155
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
156
+ # directory. The files map as follows (file_name -> variable):
157
+ # ```
158
+ # expected_outputs.json -> saved_outputs
159
+ # ```
160
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
161
+ # but relative to root input directory (see #root_input_dir).
162
+ # @option opts [Hash,nil] :outputs Outputs to load. It will override
163
+ # `expected_outputs.json` from input directory.
164
+ #
165
+ # @return [FakeExecutor]
166
+ def load_expected_outputs opts = {}
167
+ opts = {
168
+ rel_dir: nil,
169
+ input_dir: nil,
170
+ outputs: nil
171
+ }.merge opts
172
+ dir = opts[:input_dir] || expand_relative_input(opts[:rel_dir]) || self.input_dir
173
+
174
+ # Load overrides
175
+ save_outputs opts[:outputs] unless opts[:outputs].nil?
176
+
177
+ # Load input files
178
+ unless dir.nil?
179
+ expected_outputs = AeEasy::Test::Helper.load_json_file(File.join(dir, 'expected_outputs.json'))
180
+ save_outputs expected_outputs unless expected_outputs.nil?
181
+ end
182
+
183
+ self
184
+ end
185
+
186
+ # Match expected pages.
187
+ #
188
+ # @param [Hash] opts ({}) Configuration options.
189
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
190
+ # directory. The files map as follows (file_name -> description):
191
+ # ```
192
+ # expected_pages.json -> expected pages to compare with saved_pages.
193
+ # ```
194
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
195
+ # but relative to root input directory (see #root_input_dir).
196
+ # @option opts [Hash,nil] :pages Expected pages to load. It will override
197
+ # `expected_pages.json` from input directory.
198
+ # @option opts [Array] :skip_fields (nil) Fields to skip on match.
199
+ # @option opts [Boolean] :default_skip_fields (true) Add `gid` and
200
+ # `job_id` to the `:skip_fields` list when `true`.
201
+ #
202
+ # @return [Hash] A hash with the following fields:
203
+ # * `[Boolean] match` `true` when match, `false` when diff.
204
+ # * `[Hash] saved` Non matching saved pages.
205
+ # * `[Hash] expected` Non matching expected pages.
206
+ def match_expected_pages opts = {}
207
+ opts = {
208
+ rel_dir: nil,
209
+ input_dir: nil,
210
+ pages: nil,
211
+ skip_fields: [],
212
+ default_skip_fields: true,
213
+ }.merge opts
214
+ opts[:input_dir] ||= input_dir
215
+
216
+ # Expected context
217
+ expected = AeEasy::Core::Mock::FakeExecutor.new
218
+ expected.root_input_dir = root_input_dir
219
+ expected.load_expected_pages opts
220
+
221
+ # Config skip fields
222
+ skip_fields = opts[:skip_fields]
223
+ skip_fields += ['gid', 'job_id'] if opts[:default_skip_fields]
224
+ skip_fields.uniq!
225
+
226
+ # Diff
227
+ diff = AeEasy::Test::Helper.match_collections(
228
+ saved_pages,
229
+ expected.saved_pages,
230
+ skip: skip_fields
231
+ )
232
+ {
233
+ match: diff[:match],
234
+ saved: diff[:diff][:item_a],
235
+ expected: diff[:diff][:item_b]
236
+ }
237
+ end
238
+
239
+ # Match saved pages with expected and verbose diff.
240
+ # {AeEasy::Test::Helper#match_expected}
241
+ # @option opts [Array] :log_caller (nil) Log caller. Defaults to method
242
+ # `caller`.
243
+ #
244
+ # @return [Boolean] `true` when pass, else `false`.
245
+ def should_match_pages opts = {}
246
+ diff = match_expected_pages opts
247
+ log_caller = opts[:log_caller] || ([] + caller)
248
+ unless diff[:match]
249
+ AeEasy::Test.verbose_match_diff 'pages', diff, log_caller
250
+ end
251
+ diff[:match]
252
+ end
253
+
254
+ # Match expected outputs.
255
+ #
256
+ # @param [Hash] opts ({}) Configuration options.
257
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
258
+ # directory. The files map as follows (file_name -> description):
259
+ # ```
260
+ # expected_outputs.json -> expected outputs to compare with saved_outputs.
261
+ # ```
262
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
263
+ # but relative to root input directory (see #root_input_dir).
264
+ # @option opts [Hash,nil] :outputs Expected outputs to load. It will
265
+ # override `expected_outputs.json` from input directory.
266
+ # @option opts [Array] :skip_fields (nil) Fields to skip on match.
267
+ # @option opts [Boolean] :default_skip_fields (true) Add `_gid`,
268
+ # `_job_id` and `_created_at` to the `:skip_fields` list when `true`.
269
+ #
270
+ # @return [Hash] A hash with the following structure:
271
+ # * `[Boolean] match` `true` when match, `false` when diff.
272
+ # * `[Hash] expected` Non matching expected outputs.
273
+ # * `[Hash] saved` Non matching saved outputs.
274
+ def self.match_expected_outputs opts = {}
275
+ opts = {
276
+ rel_dir: nil,
277
+ input_dir: nil,
278
+ outputs: nil,
279
+ skip_fields: [],
280
+ default_skip_fields: true,
281
+ }.merge opts
282
+ opts[:input_dir] ||= input_dir
283
+
284
+ # Expected context
285
+ expected = AeEasy::Core::Mock::FakeExecutor.new
286
+ expected.root_input_dir = root_input_dir
287
+ expected.load_expected_outputs opts
288
+
289
+ # Config skip fields
290
+ skip_fields = opts[:skip_fields]
291
+ skip_fields += ['_created_at', '_gid', '_job_id'] if opts[:default_skip_fields]
292
+ skip_fields.uniq!
293
+
294
+ # Diff
295
+ diff = AeEasy::Test::Helper.match_collections(
296
+ saved_outputs,
297
+ expected.saved_outputs,
298
+ skip: skip_fields
299
+ )
300
+ {
301
+ match: diff[:match],
302
+ saved: diff[:diff][:item_a],
303
+ expected: diff[:diff][:item_b]
304
+ }
305
+ end
306
+
307
+ # Match saved outputs with expected and verbose diff.
308
+ # {AeEasy::Test::Helper#match_expected_outputs}
309
+ # @option opts [Array] :log_caller (nil) Log caller. Defaults to method
310
+ # `caller`.
311
+ #
312
+ # @return [Boolean] `true` when pass, else `false`.
313
+ def should_match_outputs opts = {}
314
+ diff = match_expected_outputs opts
315
+ log_caller = opts[:log_caller] || ([] + caller)
316
+ unless diff[:match]
317
+ AeEasy::Test::Helper.verbose_match_diff 'outputs', diff, log_caller
318
+ end
319
+ diff[:match]
320
+ end
321
+ end
322
+ end
323
+ end
324
+ end
@@ -0,0 +1,8 @@
1
+ require 'ae_easy_override/core/plugin/executor_behavior'
2
+
3
+ module AeEasy
4
+ module Core
5
+ module Plugin
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module AeEasy
2
+ module Core
3
+ module Plugin
4
+ module ExecutorBehavior
5
+ def test_mode?
6
+ AeEasy::Test.test_mode?
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,201 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ae_easy-test
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Eduardo Rosales
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ae_easy-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.16.3
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.16.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '5.11'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '5.11'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.16.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 0.16.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov-console
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.4.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.4.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 0.9.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 0.9.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: AnswersEngine Easy toolkit test module to support other complex modules.
126
+ email:
127
+ - eduardo@datahen.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".travis.yml"
134
+ - ".yardopts"
135
+ - CODE_OF_CONDUCT.md
136
+ - Gemfile
137
+ - Gemfile.lock
138
+ - LICENSE
139
+ - README.md
140
+ - Rakefile
141
+ - ae_easy-test.gemspec
142
+ - doc/AeEasy.html
143
+ - doc/AeEasy/Core.html
144
+ - doc/AeEasy/Core/Mock.html
145
+ - doc/AeEasy/Core/Mock/FakeExecutor.html
146
+ - doc/AeEasy/Core/Modk.html
147
+ - doc/AeEasy/Core/Plugin.html
148
+ - doc/AeEasy/Core/Plugin/ExecutorBehavior.html
149
+ - doc/AeEasy/Test.html
150
+ - doc/AeEasy/Test/Helper.html
151
+ - doc/AeEasy/Test/RecordTask.html
152
+ - doc/_index.html
153
+ - doc/class_list.html
154
+ - doc/css/common.css
155
+ - doc/css/full_list.css
156
+ - doc/css/style.css
157
+ - doc/file.README.html
158
+ - doc/file_list.html
159
+ - doc/frames.html
160
+ - doc/index.html
161
+ - doc/js/app.js
162
+ - doc/js/full_list.js
163
+ - doc/js/jquery.js
164
+ - doc/method_list.html
165
+ - doc/top-level-namespace.html
166
+ - lib/ae_easy/test.rb
167
+ - lib/ae_easy/test/helper.rb
168
+ - lib/ae_easy/test/rake.rb
169
+ - lib/ae_easy/test/version.rb
170
+ - lib/ae_easy_override/core.rb
171
+ - lib/ae_easy_override/core/mock.rb
172
+ - lib/ae_easy_override/core/mock/fake_executor.rb
173
+ - lib/ae_easy_override/core/plugin.rb
174
+ - lib/ae_easy_override/core/plugin/executor_behavior.rb
175
+ homepage: https://answersengine.com
176
+ licenses:
177
+ - MIT
178
+ metadata:
179
+ homepage_uri: https://answersengine.com
180
+ source_code_uri: https://github.com/answersengine/ae_easy-test
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: 2.2.2
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.7.6
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: AnswersEngine Easy toolkit test module
201
+ test_files: []