Skip to content

Commit fc37010

Browse files
dreamorosisthulb
andauthored
test(jmespath): 100% coverage and spec compliance (#2271)
* feat(jmespath): add parser component * feat: add envelopes & entrypoint * test(jmespath): full test coverage * test(jmespath): full test coverage * chore: add missing export file --------- Co-authored-by: Simon Thulbourn <[email protected]>
1 parent 90d3b84 commit fc37010

20 files changed

+8608
-5
lines changed

Diff for: .github/actions/cached-node-modules/action.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,6 @@ runs:
4545
npm run build -w packages/parameters & \
4646
npm run build -w packages/idempotency & \
4747
npm run build -w packages/batch & \
48-
npm run build -w packages/testing
48+
npm run build -w packages/testing & \
49+
npm run build -w packages/jmespath
4950
shell: bash

Diff for: .github/workflows/reusable-run-linting-check-and-unit-tests.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ jobs:
2828
with:
2929
nodeVersion: ${{ matrix.version }}
3030
- name: Run linting
31-
run: npm run lint -w packages/commons -w packages/logger -w packages/tracer -w packages/metrics -w packages/parameters -w packages/idempotency -w packages/batch
31+
run: npm run lint -w packages/commons -w packages/logger -w packages/tracer -w packages/metrics -w packages/parameters -w packages/idempotency -w packages/batch -w packages/jmespath
3232
- name: Run unit tests
33-
run: npm t -w packages/commons -w packages/logger -w packages/tracer -w packages/metrics -w packages/parameters -w packages/idempotency -w packages/batch
33+
run: npm t -w packages/commons -w packages/logger -w packages/tracer -w packages/metrics -w packages/parameters -w packages/idempotency -w packages/batch -w packages/jmespath
3434
check-examples:
3535
runs-on: ubuntu-latest
3636
env:

Diff for: packages/jmespath/src/index.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export { search } from './search.js';
2+
export {
3+
JMESPathError,
4+
LexerError,
5+
ParseError,
6+
IncompleteExpressionError,
7+
ArityError,
8+
VariadicArityError,
9+
JMESPathTypeError,
10+
EmptyExpressionError,
11+
UnknownFunctionError,
12+
} from './errors.js';

Diff for: packages/jmespath/tests/unit/compliance/base.test.ts

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
/**
2+
* Test Compliance with the JMESPath specification
3+
*
4+
* @group unit/jmespath/compliance/base
5+
*/
6+
import { search } from '../../../src/index.js';
7+
8+
describe('Base tests', () => {
9+
it.each([
10+
{
11+
expression: 'foo',
12+
expected: { bar: { baz: 'correct' } },
13+
},
14+
{
15+
expression: 'foo.bar',
16+
expected: { baz: 'correct' },
17+
},
18+
{
19+
expression: 'foo.bar.baz',
20+
expected: 'correct',
21+
},
22+
{
23+
expression: 'foo\n.\nbar\n.baz',
24+
expected: 'correct',
25+
},
26+
{
27+
expression: 'foo.bar.baz.bad',
28+
expected: null,
29+
},
30+
{
31+
expression: 'foo.bar.bad',
32+
expected: null,
33+
},
34+
{
35+
expression: 'foo.bad',
36+
expected: null,
37+
},
38+
{
39+
expression: 'bad',
40+
expected: null,
41+
},
42+
{
43+
expression: 'bad.morebad.morebad',
44+
expected: null,
45+
},
46+
])(
47+
'should parse a multi-level nested object: $expression',
48+
({ expression, expected }) => {
49+
// Prepare
50+
const data = { foo: { bar: { baz: 'correct' } } };
51+
52+
// Act
53+
const result = search(expression, data);
54+
55+
// Assess
56+
expect(result).toStrictEqual(expected);
57+
}
58+
);
59+
60+
it.each([
61+
{
62+
expression: 'foo',
63+
expected: { bar: ['one', 'two', 'three'] },
64+
},
65+
{
66+
expression: 'foo.bar',
67+
expected: ['one', 'two', 'three'],
68+
},
69+
])(
70+
'should parse multi-level objects with arrays: $expression',
71+
({ expression, expected }) => {
72+
// Prepare
73+
const data = { foo: { bar: ['one', 'two', 'three'] } };
74+
75+
// Act
76+
const result = search(expression, data);
77+
78+
// Assess
79+
expect(result).toStrictEqual(expected);
80+
}
81+
);
82+
83+
it.each([
84+
{
85+
expression: 'one',
86+
expected: null,
87+
},
88+
{
89+
expression: 'two',
90+
expected: null,
91+
},
92+
{
93+
expression: 'three',
94+
expected: null,
95+
},
96+
{
97+
expression: 'one.two',
98+
expected: null,
99+
},
100+
])('should parse an array: $expression', ({ expression, expected }) => {
101+
// Prepare
102+
const data = ['one', 'two', 'three'];
103+
104+
// Act
105+
const result = search(expression, data);
106+
107+
// Assess
108+
expect(result).toStrictEqual(expected);
109+
});
110+
111+
it.each([
112+
{
113+
expression: 'foo."1"',
114+
expected: ['one', 'two', 'three'],
115+
},
116+
{
117+
expression: 'foo."1"[0]',
118+
expected: 'one',
119+
},
120+
{
121+
expression: 'foo."-1"',
122+
expected: 'bar',
123+
},
124+
])(
125+
'should parse an object with arrays and numeric values as keys: $expression',
126+
({ expression, expected }) => {
127+
// Prepare
128+
const data = { foo: { '1': ['one', 'two', 'three'], '-1': 'bar' } };
129+
130+
// Act
131+
const result = search(expression, data);
132+
133+
// Assess
134+
expect(result).toStrictEqual(expected);
135+
}
136+
);
137+
});

0 commit comments

Comments
 (0)