ae_easy-test 0.0.0

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 (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: []