Skip to content

Commit 6ea6485

Browse files
committed
test(validation): add test suite for reference-token validation
1 parent 3542fe0 commit 6ea6485

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

src/test/reference-token.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const grammar = new Grammar();
66
const parser = new Parser();
77

88
const testReferenceToken = (referenceToken) => {
9+
if (typeof referenceToken !== 'string') return false;
10+
911
try {
1012
return parser.parse(grammar, 'reference-token', referenceToken).success;
1113
} catch {

test/test/reference-token.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { assert } from 'chai';
2+
import { testReferenceToken } from '../../src/index.js';
3+
4+
describe('testReferenceToken', function () {
5+
context('valid reference tokens', function () {
6+
specify('should return true for valid reference tokens (rfc 6901)', function () {
7+
const validTokens = [
8+
'foo', // simple name
9+
'bar123', // alphanumeric
10+
'hello.world', // period is allowed
11+
'json_pointer', // underscore allowed
12+
'0abcDEF', // mix of cases and digits
13+
'~0', // valid escaped '~'
14+
'~1', // valid escaped '/'
15+
'some~0thing', // mixed escape sequence
16+
'some~1thing', // mixed escape sequence
17+
'value$', // special character allowed
18+
'emoji😀', // unicode allowed
19+
'unicodeΩ', // unicode allowed
20+
'bar~01', // partial escape followed by invalid char
21+
'', // empty
22+
];
23+
24+
validTokens.forEach((token) => {
25+
assert.isTrue(testReferenceToken(token), `failed for token: ${token}`);
26+
});
27+
});
28+
});
29+
30+
context('invalid reference tokens', function () {
31+
specify('should return false for tokens with disallowed characters', function () {
32+
const invalidTokens = [
33+
'foo/bar', // `/` is not allowed unless escaped
34+
'foo~', // `~` must be followed by `0` or `1`
35+
'foo~2', // invalid escape sequence
36+
'foo~x', // invalid escape sequence
37+
'~3', // invalid escape sequence
38+
'foo~1bar/', // contains `/`
39+
'test~0~', // dangling `~`
40+
'/leadingSlash', // must not start with '/'
41+
'trailingSlash/', // must not end with '/'
42+
'mid~slash/', // misplaced `/`
43+
];
44+
45+
invalidTokens.forEach((token) => {
46+
assert.isFalse(testReferenceToken(token), `failed for token: ${token}`);
47+
});
48+
});
49+
});
50+
51+
context('edge cases', function () {
52+
specify('should return false for non-string inputs', function () {
53+
assert.isFalse(testReferenceToken(42));
54+
assert.isFalse(testReferenceToken(null));
55+
assert.isFalse(testReferenceToken(undefined));
56+
assert.isFalse(testReferenceToken({}));
57+
assert.isFalse(testReferenceToken([]));
58+
});
59+
60+
specify('should allow a single character if valid', function () {
61+
assert.isTrue(testReferenceToken('a'));
62+
assert.isTrue(testReferenceToken('1'));
63+
assert.isTrue(testReferenceToken('~0'));
64+
assert.isTrue(testReferenceToken('~1'));
65+
});
66+
67+
specify('should disallow a single invalid character', function () {
68+
assert.isFalse(testReferenceToken('/'));
69+
assert.isFalse(testReferenceToken('~'));
70+
});
71+
});
72+
});

0 commit comments

Comments
 (0)