kayvee 3.17.0 → 4.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 (61) hide show
  1. package/README.md +147 -202
  2. package/dist/index.d.ts +4 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +29 -0
  5. package/dist/kayvee.d.ts +12 -0
  6. package/dist/kayvee.d.ts.map +1 -0
  7. package/dist/kayvee.js +50 -0
  8. package/dist/logger/logger.d.ts +49 -0
  9. package/dist/logger/logger.d.ts.map +1 -0
  10. package/dist/logger/logger.js +237 -0
  11. package/dist/middleware.d.ts +23 -0
  12. package/dist/middleware.d.ts.map +1 -0
  13. package/dist/middleware.js +196 -0
  14. package/dist/package.json +89 -0
  15. package/dist/router/index.d.ts +23 -0
  16. package/dist/router/index.d.ts.map +1 -0
  17. package/dist/router/index.js +184 -0
  18. package/package.json +64 -24
  19. package/.circleci/config.yml +0 -25
  20. package/.eslintrc.yml +0 -44
  21. package/.nvmrc +0 -1
  22. package/.prettierrc.json +0 -1
  23. package/Makefile +0 -56
  24. package/benchmarks/data/.keep +0 -1
  25. package/benchmarks/data/corpus-basic.json +0 -22
  26. package/benchmarks/data/corpus-pathological.json +0 -22
  27. package/benchmarks/data/corpus-realistic.json +0 -22
  28. package/benchmarks/data/kvconfig-basic.yml +0 -7
  29. package/benchmarks/data/kvconfig-pathological.yml +0 -222
  30. package/benchmarks/data/kvconfig-realistic.yml +0 -39
  31. package/benchmarks/routing.js +0 -116
  32. package/build/lib/kayvee.js +0 -67
  33. package/build/lib/logger/helpers.js +0 -0
  34. package/build/lib/logger/logger.js +0 -221
  35. package/build/lib/middleware.js +0 -302
  36. package/build/lib/router/index.js +0 -198
  37. package/build/package.json +0 -49
  38. package/build/test/context_logger.js +0 -77
  39. package/build/test/kayvee.js +0 -36
  40. package/build/test/logger_test.js +0 -334
  41. package/build/test/middleware.js +0 -557
  42. package/build/test/router.js +0 -311
  43. package/index.js +0 -7
  44. package/lib/kayvee.ts +0 -73
  45. package/lib/logger/helpers.ts +0 -0
  46. package/lib/logger/logger.ts +0 -296
  47. package/lib/middleware.ts +0 -317
  48. package/lib/router/index.ts +0 -234
  49. package/lib/router/schema_definitions.json +0 -158
  50. package/test/context_logger.ts +0 -76
  51. package/test/kayvee.ts +0 -50
  52. package/test/kvconfig.yml +0 -14
  53. package/test/logger_test.ts +0 -378
  54. package/test/middleware.ts +0 -632
  55. package/test/router.ts +0 -558
  56. package/test/static/empty.css +0 -0
  57. package/test/static/js/empty.js +0 -0
  58. package/test/tests.json +0 -100
  59. package/tsconfig.json +0 -10
  60. package/tslint.json +0 -134
  61. /package/{build/lib → dist}/router/schema_definitions.json +0 -0
@@ -1,76 +0,0 @@
1
- var assert = require("assert");
2
- var sinon = require("sinon");
3
-
4
- var middleware = require("../lib/middleware");
5
- var KayveeLogger = require("../lib/logger/logger");
6
-
7
- describe("ContextLogger", () => {
8
- const fake_req = { key1: "val1" };
9
- const fake_handler = (req) => ({ log_key1: req.key1, key2: "val2" });
10
-
11
- for (const level of KayveeLogger.LEVELS) {
12
- it(`correctly adds context to ${level} calls`, () => {
13
- const spy = sinon.spy();
14
- const stub_logger = {};
15
- stub_logger[`${level}D`] = spy;
16
- const log = new middleware.ContextLogger(stub_logger, [fake_handler], fake_req);
17
- log[level]("test_title");
18
- const expected_context = { log_key1: "val1", key2: "val2" };
19
- assert(spy.calledWithExactly("test_title", expected_context));
20
- assert.equal(spy.callCount, 1);
21
- });
22
-
23
- it(`correctly adds context to ${level}D calls`, () => {
24
- const spy = sinon.spy();
25
- const stub_logger = {};
26
- stub_logger[`${level}D`] = spy;
27
- const log = new middleware.ContextLogger(stub_logger, [fake_handler], fake_req);
28
- log[`${level}D`]("test_title", { key2: "new_value", key3: "val3" });
29
- const expected_data = {
30
- log_key1: "val1",
31
- key2: "new_value",
32
- key3: "val3",
33
- };
34
- assert(spy.calledWithExactly("test_title", expected_data));
35
- assert.equal(spy.callCount, 1);
36
- });
37
- }
38
-
39
- for (const metric of KayveeLogger.METRICS) {
40
- it(`correctly adds context to ${metric} calls`, () => {
41
- const spy = sinon.spy();
42
- const stub_logger = {};
43
- stub_logger[`${metric}D`] = spy;
44
- const log = new middleware.ContextLogger(stub_logger, [fake_handler], fake_req);
45
- log[metric]("test_title", 3);
46
- const expected_context = { log_key1: "val1", key2: "val2" };
47
- assert(spy.calledWithExactly("test_title", 3, expected_context));
48
- assert.equal(spy.callCount, 1);
49
- });
50
-
51
- it(`correctly adds context to ${metric}D calls`, () => {
52
- const spy = sinon.spy();
53
- const stub_logger = {};
54
- stub_logger[`${metric}D`] = spy;
55
- const log = new middleware.ContextLogger(stub_logger, [fake_handler], fake_req);
56
- log[`${metric}D`]("test_title", 3, { key2: "new_value", key3: "val3" });
57
- const expected_data = {
58
- log_key1: "val1",
59
- key2: "new_value",
60
- key3: "val3",
61
- };
62
- assert(spy.calledWithExactly("test_title", 3, expected_data));
63
- assert.equal(spy.callCount, 1);
64
- });
65
- }
66
-
67
- it("correctly handles being instantiated with empty list of handlers", () => {
68
- const spy = sinon.spy();
69
- const stub_logger = { infoD: spy };
70
- const log = new middleware.ContextLogger(stub_logger, [], fake_req);
71
- log.info("test_title");
72
- const expected_context = {};
73
- assert(spy.calledWithExactly("test_title", expected_context));
74
- assert.equal(spy.callCount, 1);
75
- });
76
- });
package/test/kayvee.ts DELETED
@@ -1,50 +0,0 @@
1
- var kv = require("../lib/kayvee");
2
- var assert = require("assert");
3
- var _ = require("underscore");
4
- var fs = require("fs");
5
-
6
- describe("kayvee", () => {
7
- const tests = JSON.parse(fs.readFileSync("test/tests.json"));
8
- describe(".format", () => {
9
- _.each(tests.format, (spec) => {
10
- it(spec.title, () => {
11
- const actual = kv.format(spec.input.data);
12
- const expected = spec.output;
13
- assert.deepEqual(
14
- JSON.parse(actual),
15
- _.extend({ deploy_env: "testing", wf_id: "abc" }, JSON.parse(expected)),
16
- );
17
- });
18
- });
19
- });
20
-
21
- describe(".format with Errors", () => {
22
- it("encodes Error objects", () => {
23
- const actual = kv.format({ err: Error("An Error Message") });
24
- const expected = {
25
- deploy_env: "testing",
26
- wf_id: "abc",
27
- err: "Error: An Error Message",
28
- };
29
- assert.deepEqual(JSON.parse(actual), expected);
30
- });
31
- });
32
-
33
- describe(".formatLog", () => {
34
- _.each(tests.formatLog, (spec) => {
35
- it(spec.title, () => {
36
- const actual = kv.formatLog(
37
- spec.input.source,
38
- spec.input.level,
39
- spec.input.title,
40
- spec.input.data,
41
- );
42
- const expected = spec.output;
43
- assert.deepEqual(
44
- JSON.parse(actual),
45
- _.extend({ deploy_env: "testing", wf_id: "abc" }, JSON.parse(expected)),
46
- );
47
- });
48
- });
49
- });
50
- });
package/test/kvconfig.yml DELETED
@@ -1,14 +0,0 @@
1
- routes:
2
- all-kv_middleware:
3
- matchers:
4
- via: [ "kayvee-middleware" ]
5
- output:
6
- type: "analytics"
7
- series: "requests.everything"
8
- rule-two:
9
- matchers:
10
- title: [ "foo-title" ]
11
- deploy_env: [ "testing" ]
12
- output:
13
- type: "analytics"
14
- series: "requests.everything"
@@ -1,378 +0,0 @@
1
- var KayveeLogger = require("../lib/logger/logger");
2
- var assert = require("assert");
3
-
4
- let sample = "";
5
- function outputFunc(text) {
6
- sample = text;
7
- return sample;
8
- }
9
-
10
- describe("logger_test", () => {
11
- let logObj = null;
12
- let logObj2 = null;
13
- beforeEach(() => {
14
- logObj = new KayveeLogger("logger-tester");
15
- sample = "";
16
- return logObj.setOutput(outputFunc);
17
- });
18
-
19
- describe(".constructor", () => {
20
- it("passing in parameters to constructor", () => {
21
- const formatter = (data) => `${data.level}.${data.source}.${data.title}`;
22
- logObj = new KayveeLogger("logger-test", KayveeLogger.Info, formatter, outputFunc);
23
- logObj.debug("testlogdebug");
24
- let expected = "";
25
- assert.equal(sample, expected);
26
-
27
- logObj.info("testloginfo");
28
- expected = `${KayveeLogger.Info}.logger-test.testloginfo`;
29
- assert.equal(sample, expected);
30
- });
31
- });
32
- describe(".validateloglvl", () => {
33
- // Explicit validation checks
34
- it("is case-insensitive in log level name", () => {
35
- let logLvl = logObj._validateLogLvl("debug");
36
- assert.equal(logLvl, KayveeLogger.Debug);
37
- logLvl = logObj._validateLogLvl("Debug");
38
- assert.equal(logLvl, KayveeLogger.Debug);
39
- });
40
-
41
- it("sets non-default log levels", () => {
42
- let logLvl = logObj._validateLogLvl("info");
43
- assert.equal(logLvl, KayveeLogger.Info);
44
- // TODO: for each possible log level ...
45
- logLvl = logObj._validateLogLvl("critical");
46
- assert.equal(logLvl, KayveeLogger.Critical);
47
- });
48
-
49
- it("sets level to Debug, if given an invalid log level", () => {
50
- const logLvl = logObj._validateLogLvl("sometest");
51
- assert.equal(logLvl, KayveeLogger.Debug);
52
- });
53
- });
54
- describe(".invalidlog", () => {
55
- it("check valid debug level JSON output of invalid log level", () => {
56
- // Invalid log levels will default to debug
57
- logObj.setLogLevel("invalidloglevel");
58
- logObj.debug("testlogdebug");
59
- let expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester", "level": "${KayveeLogger.Debug}", "title": "testlogdebug"}`;
60
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
61
-
62
- logObj.setLogLevel("sometest");
63
- logObj.info("testloginfo");
64
- expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester", "level": "${KayveeLogger.Info}", "title": "testloginfo"}`;
65
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
66
- });
67
- });
68
- describe(".debug", () => {
69
- it("test debug function", () => {
70
- logObj.debug("testlogdebug");
71
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester", "level": "${KayveeLogger.Debug}", "title": "testlogdebug"}`;
72
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
73
- });
74
- it("test debugD function", () => {
75
- logObj.debugD("testlogdebug", { key1: "val1", key2: "val2" });
76
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
77
- "level": "${KayveeLogger.Debug}", "title": "testlogdebug","key1": "val1", "key2": "val2"}`;
78
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
79
- });
80
- });
81
-
82
- describe(".info", () => {
83
- it("test info function", () => {
84
- logObj.info("testloginfo");
85
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester", "level": "${KayveeLogger.Info}", "title": "testloginfo"}`;
86
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
87
- });
88
- it("test infoD function", () => {
89
- logObj.infoD("testloginfo", { key1: "val1", key2: "val2" });
90
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
91
- "level": "${KayveeLogger.Info}", "title": "testloginfo","key1": "val1", "key2": "val2"}`;
92
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
93
- });
94
- });
95
-
96
- describe(".warning", () => {
97
- it("test warn function", () => {
98
- logObj.warn("testlogwarning");
99
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester", "level": "${KayveeLogger.Warning}", "title": "testlogwarning"}`;
100
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
101
- });
102
- it("test warnD function", () => {
103
- logObj.warnD("testlogwarning", { key1: "val1", key2: "val2" });
104
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
105
- "level": "${KayveeLogger.Warning}", "title": "testlogwarning","key1": "val1", "key2": "val2"}`;
106
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
107
- });
108
- });
109
-
110
- describe(".error", () => {
111
- it("test error function", () => {
112
- logObj.error("testlogerror");
113
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester", "level": "${KayveeLogger.Error}", "title": "testlogerror"}`;
114
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
115
- });
116
- it("test errorD function", () => {
117
- logObj.errorD("testlogerror", { key1: "val1", key2: "val2" });
118
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
119
- "level": "${KayveeLogger.Error}", "title": "testlogerror","key1": "val1", "key2": "val2"}`;
120
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
121
- });
122
- });
123
-
124
- describe(".critical", () => {
125
- it("test critical function", () => {
126
- logObj.critical("testlogcritical");
127
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester", "level": "${KayveeLogger.Critical}", "title": "testlogcritical"}`;
128
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
129
- });
130
- it("test criticalD function", () => {
131
- logObj.criticalD("testlogcritical", { key1: "val1", key2: "val2" });
132
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
133
- "level": "${KayveeLogger.Critical}", "title": "testlogcritical","key1": "val1", "key2": "val2"}`;
134
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
135
- });
136
- });
137
-
138
- describe(".counter", () => {
139
- it("test counter function", () => {
140
- logObj.counter("testlogcounter");
141
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
142
- "level": "${KayveeLogger.Info}", "title": "testlogcounter", "type": "counter", "value": 1}`;
143
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
144
- });
145
- it("test counterD function", () => {
146
- logObj.counterD("testlogcounter", 2, { key1: "val1", key2: "val2" });
147
- const expected =
148
- `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
149
- "level": "${KayveeLogger.Info}", "title": "testlogcounter","type": "counter", "value": 2,"key1": "val1",` +
150
- ' "key2": "val2"}';
151
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
152
- });
153
- it("test counterD function with overrides", () => {
154
- logObj.counterD("testlogcounter", 2, { key1: "val1", key2: "val2", value: 18 });
155
- const expected = {
156
- deploy_env: "testing",
157
- wf_id: "abc",
158
- source: "logger-tester",
159
- level: KayveeLogger.Info,
160
- title: "testlogcounter",
161
- type: "counter",
162
- value: 18,
163
- key1: "val1",
164
- key2: "val2",
165
- };
166
- assert.deepEqual(JSON.parse(sample), expected);
167
- });
168
- });
169
-
170
- describe(".gauge", () => {
171
- it("test gauge function", () => {
172
- logObj.gauge("testloggauge", 0);
173
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
174
- "level": "${KayveeLogger.Info}", "title": "testloggauge", "type": "gauge", "value": 0}`;
175
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
176
- });
177
- it("test gaugeD function", () => {
178
- logObj.gaugeD("testloggauge", 4, { key1: "val1", key2: "val2" });
179
- const expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester",
180
- "level": "${KayveeLogger.Info}", "title": "testloggauge", "type": "gauge", "value": 4, "key1": "val1", "key2": "val2"}`;
181
- assert.deepEqual(JSON.parse(sample), JSON.parse(expected));
182
- });
183
- it("test gaugeD function with overrids", () => {
184
- logObj.gaugeD("testloggauge", 4, { key1: "val1", key2: "val2", value: 18 });
185
- const expected = {
186
- deploy_env: "testing",
187
- wf_id: "abc",
188
- source: "logger-tester",
189
- level: KayveeLogger.Info,
190
- title: "testloggauge",
191
- type: "gauge",
192
- value: 18,
193
- key1: "val1",
194
- key2: "val2",
195
- };
196
- assert.deepEqual(JSON.parse(sample), expected);
197
- });
198
- });
199
-
200
- describe(".diffoutput", () => {
201
- it("output to different output functions using same logger", () => {
202
- logObj.info("testloginfo");
203
- const infoLog = sample;
204
- let output2 = "";
205
- const outputFunc2 = (text) => {
206
- output2 = text;
207
- return output2;
208
- };
209
- logObj.setOutput(outputFunc2);
210
- logObj.warn("testlogwarning");
211
- assert.deepEqual(JSON.parse(infoLog), JSON.parse(sample));
212
- assert.notDeepEqual(JSON.parse(output2), JSON.parse(sample));
213
- });
214
- });
215
-
216
- describe(".nomodifydata", () => {
217
- before(() => {
218
- logObj.setOutput(outputFunc);
219
- });
220
- it("does not modify data", () => {
221
- const data = {
222
- str: "modify",
223
- obj: {
224
- key: "value",
225
- },
226
- fun: "boo",
227
- };
228
- // not using deepClone since that's what we are
229
- // somewhat testing
230
- const dataCopy = {
231
- str: "modify",
232
- obj: {
233
- key: "value",
234
- },
235
- fun: "boo",
236
- };
237
- logObj.infoD("testInfoWithData", data);
238
- assert.deepEqual(data, dataCopy);
239
-
240
- const output = {
241
- deploy_env: "testing",
242
- wf_id: "abc",
243
- fun: "boo",
244
- level: "info",
245
- obj: {
246
- key: "value",
247
- },
248
- source: "logger-tester",
249
- title: "testInfoWithData",
250
- str: "modify",
251
- };
252
- assert.deepEqual(JSON.parse(sample), output);
253
- });
254
- });
255
-
256
- describe(".hiddenlog", () => {
257
- describe(".logwarning", () => {
258
- beforeEach(() => logObj.setLogLevel(KayveeLogger.Warning));
259
- it("empty cases due to log level", () => {
260
- logObj.debug("testlogdebug");
261
- assert.equal(sample, "");
262
-
263
- logObj.info("testloginfo");
264
- assert.equal(sample, "");
265
- });
266
- it("not empty cases due to log level", () => {
267
- logObj.warn("testlogwarning");
268
- assert.notDeepEqual(JSON.parse(sample), "");
269
-
270
- logObj.error("testlogerror");
271
- assert.notDeepEqual(JSON.parse(sample), "");
272
-
273
- logObj.critical("testlogcritical");
274
- assert.notDeepEqual(JSON.parse(sample), "");
275
- });
276
- });
277
- return describe(".logcritical", () => {
278
- beforeEach(() => {
279
- logObj.setLogLevel(KayveeLogger.Critical);
280
- });
281
- it("empty cases due to log level", () => {
282
- logObj.debug("testlogdebug");
283
- assert.equal(sample, "");
284
-
285
- logObj.info("testloginfo");
286
- assert.equal(sample, "");
287
-
288
- logObj.warn("testlogwarning");
289
- assert.equal(sample, "");
290
-
291
- logObj.error("testlogerror");
292
- assert.equal(sample, "");
293
- });
294
- it("not empty cases due to log level", () => {
295
- logObj.critical("testlogcritical");
296
- assert.notDeepEqual(JSON.parse(sample), "");
297
- });
298
- });
299
- });
300
-
301
- describe(".diffformat", () => {
302
- it("use a different formatter than KV", () => {
303
- const testFormatter = () => '"This is a test"';
304
- logObj.setFormatter(testFormatter);
305
- logObj.warn("testlogwarning");
306
- assert.deepEqual(JSON.parse(sample), "This is a test");
307
- });
308
- });
309
-
310
- describe("global overrides", () => {
311
- it("what data has source prop", () => {
312
- logObj.warnD("global-override", { source: "overrided" });
313
- const output = {
314
- deploy_env: "testing",
315
- wf_id: "abc",
316
- title: "global-override",
317
- source: "overrided",
318
- level: "warning",
319
- };
320
- assert.deepEqual(JSON.parse(sample), output);
321
- });
322
- });
323
-
324
- return describe(".multipleloggers", () => {
325
- before(() => {
326
- logObj2 = new KayveeLogger("logger-tester2");
327
- return logObj2;
328
- });
329
- it("log to same output buffer", () => {
330
- logObj2.setOutput(outputFunc);
331
- logObj.warn("testlogwarning");
332
- const output1 = sample;
333
- logObj2.info("testloginfo");
334
- assert.notDeepEqual(JSON.parse(sample), JSON.parse(output1));
335
- });
336
-
337
- it("log to different output buffer", () => {
338
- let output2 = "";
339
- const outputFunc2 = (text) => {
340
- output2 = text;
341
- return output2;
342
- };
343
- logObj2.setOutput(outputFunc2);
344
- logObj.warn("testlogwarning");
345
- logObj2.info("testloginfo");
346
-
347
- const loggerExpected = `
348
- {"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester", "level": "${KayveeLogger.Warning}", "title": "testlogwarning"}
349
- `;
350
- assert.deepEqual(JSON.parse(sample), JSON.parse(loggerExpected));
351
-
352
- const logger2Expected = `{"deploy_env": "testing", "wf_id": "abc", "source": "logger-tester2", "level": "${KayveeLogger.Info}", "title": "testloginfo"}`;
353
- assert.deepEqual(JSON.parse(output2), JSON.parse(logger2Expected));
354
- });
355
- });
356
- });
357
-
358
- describe("mockRouting", () => {
359
- it("can override routing from setGlobalRouting, and captures routed logs", () => {
360
- const logObj = new KayveeLogger("test-source");
361
- KayveeLogger.mockRouting((kvdone) => {
362
- KayveeLogger.setGlobalRouting("test/kvconfig.yml");
363
- logObj.info("foo-title");
364
- const ruleMatches = kvdone();
365
-
366
- // should match one log
367
- assert.equal(ruleMatches["rule-two"].length, 1);
368
-
369
- // matched log should look like so
370
- const expectedRule = {
371
- type: "analytics",
372
- series: "requests.everything",
373
- rule: "rule-two",
374
- };
375
- assert.deepEqual(ruleMatches["rule-two"][0], expectedRule);
376
- });
377
- });
378
- });