This repository was archived by the owner on May 14, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathparse-expression.test.js
115 lines (97 loc) · 3.19 KB
/
parse-expression.test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
'use strict'
const tap = require('tap')
const parse = require('./parse-expression')
const ApproximateFilter = require('../filters/approximate')
const EqualityFilter = require('../filters/equality')
const ExtensibleFilter = require('../filters/extensible')
const GreaterThanEqualsFilter = require('../filters/greater-than-equals')
const LessThanEqualsFilter = require('../filters/less-than-equals')
const PresenceFilter = require('../filters/presence')
const SubstringFilter = require('../filters/substring')
tap.test('throws for invalid attribute name', async t => {
t.throws(
() => parse('$foo=bar'),
Error('invalid attribute name')
)
})
tap.test('throws for invalid exspression', async t => {
t.throws(
() => parse('this is invalid'),
Error('invalid expression')
)
})
tap.test('parses PresenceFilter', async t => {
const result = parse('cn=*')
t.type(result, PresenceFilter)
t.equal(result.toString(), '(cn=*)')
})
tap.test('parses a complete SubstringFilter', async t => {
const result = parse('cn=J*o*h*n*D*o*e')
t.type(result, SubstringFilter)
t.equal(result.toString(), '(cn=J*o*h*n*D*o*e)')
t.equal(result.initial, 'J')
t.equal(result.final, 'e')
t.strictSame(result.any, ['o', 'h', 'n', 'D', 'o'])
})
tap.test('parses an EqualityFilter', async t => {
const result = parse('cn=foo')
t.type(result, EqualityFilter)
t.equal(result.toString(), '(cn=foo)')
})
tap.test('parses an GreaterThanEqualsFilter', async t => {
const result = parse('cn>=foo')
t.type(result, GreaterThanEqualsFilter)
t.equal(result.toString(), '(cn>=foo)')
})
tap.test('parses an LessThanEqualsFilter', async t => {
const result = parse('cn<=foo')
t.type(result, LessThanEqualsFilter)
t.equal(result.toString(), '(cn<=foo)')
})
tap.test('parses an ApproximateFilter', async t => {
const result = parse('cn~=foo')
t.type(result, ApproximateFilter)
t.equal(result.toString(), '(cn~=foo)')
})
tap.test('ExtensibleFilter', t => {
t.test('when expression starts with :', async t => {
const result = parse(':caseExactMatch:=foo')
t.type(result, ExtensibleFilter)
t.equal(result.toString(), '(:caseExactMatch:=foo)')
})
t.test('when expression contains :=', async t => {
const result = parse('sn:caseExactMatch:=foo')
t.type(result, ExtensibleFilter)
t.equal(result.toString(), '(sn:caseExactMatch:=foo)')
})
t.test('missing :=', async t => {
t.throws(
() => parse(':dn:oops'),
Error('missing := in extensible filter string')
)
})
t.end()
})
tap.test('parses filter with non-ascii characters', t => {
t.test('í', async t => {
const result = parse('cn=í')
t.type(result, EqualityFilter)
t.equal(result.value, 'í')
t.equal(result.toString(), '(cn=\\c3\\ad)')
})
t.test('ø', async t => {
const result = parse('cn=ø')
t.type(result, EqualityFilter)
t.equal(result.value, 'ø')
t.equal(result.toString(), '(cn=\\c3\\b8)')
})
t.test('*réseau*', async t => {
const result = parse('cn=*réseau*')
t.type(result, SubstringFilter)
t.equal(result.toString(), '(cn=*r\\c3\\a9seau*)')
t.equal(result.initial, '')
t.equal(result.final, '')
t.strictSame(result.any, ['réseau'])
})
t.end()
})