@api-client/core 0.14.9 → 0.15.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.
- package/RELEASE.md +163 -0
- package/RELEASE_SETUP.md +235 -0
- package/build/src/events/authorization/AuthorizationEvents.d.ts +1 -1
- package/build/src/events/authorization/AuthorizationEvents.d.ts.map +1 -1
- package/build/src/events/authorization/AuthorizationEvents.js +1 -1
- package/build/src/events/authorization/AuthorizationEvents.js.map +1 -1
- package/build/src/events/cookies/CookieEvents.d.ts +1 -1
- package/build/src/events/cookies/CookieEvents.d.ts.map +1 -1
- package/build/src/events/cookies/CookieEvents.js +1 -1
- package/build/src/events/cookies/CookieEvents.js.map +1 -1
- package/build/src/modeling/DataDomain.d.ts +45 -3
- package/build/src/modeling/DataDomain.d.ts.map +1 -1
- package/build/src/modeling/DataDomain.js +81 -3
- package/build/src/modeling/DataDomain.js.map +1 -1
- package/build/src/modeling/DomainElement.d.ts +7 -0
- package/build/src/modeling/DomainElement.d.ts.map +1 -1
- package/build/src/modeling/DomainElement.js +14 -0
- package/build/src/modeling/DomainElement.js.map +1 -1
- package/build/src/modeling/DomainImpactAnalysis.d.ts +22 -119
- package/build/src/modeling/DomainImpactAnalysis.d.ts.map +1 -1
- package/build/src/modeling/DomainImpactAnalysis.js +49 -155
- package/build/src/modeling/DomainImpactAnalysis.js.map +1 -1
- package/build/src/modeling/DomainValidation.d.ts +8 -0
- package/build/src/modeling/DomainValidation.d.ts.map +1 -0
- package/build/src/modeling/DomainValidation.js +99 -0
- package/build/src/modeling/DomainValidation.js.map +1 -0
- package/build/src/modeling/types.d.ts +70 -0
- package/build/src/modeling/types.d.ts.map +1 -1
- package/build/src/modeling/types.js.map +1 -1
- package/build/src/modeling/validation/entity_validation.js +1 -1
- package/build/src/modeling/validation/entity_validation.js.map +1 -1
- package/build/src/modeling/validation/rules.d.ts +2 -3
- package/build/src/modeling/validation/rules.d.ts.map +1 -1
- package/build/src/modeling/validation/rules.js.map +1 -1
- package/build/src/modeling/validation/semantic_validation.d.ts +31 -0
- package/build/src/modeling/validation/semantic_validation.d.ts.map +1 -0
- package/build/src/modeling/validation/semantic_validation.js +126 -0
- package/build/src/modeling/validation/semantic_validation.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/data/models/example-generator-api.json +12 -12
- package/noop.ts +3 -0
- package/package.json +9 -4
- package/src/events/authorization/AuthorizationEvents.ts +1 -1
- package/src/events/cookies/CookieEvents.ts +1 -1
- package/src/modeling/DataDomain.ts +84 -3
- package/src/modeling/DomainElement.ts +16 -0
- package/src/modeling/DomainImpactAnalysis.ts +54 -239
- package/src/modeling/DomainValidation.ts +105 -0
- package/src/modeling/types.ts +86 -0
- package/src/modeling/validation/entity_validation.ts +1 -1
- package/src/modeling/validation/rules.ts +2 -4
- package/src/modeling/validation/semantic_validation.ts +145 -0
- package/tests/unit/events/EventsTestHelpers.ts +16 -0
- package/tests/unit/events/amf.spec.ts +151 -0
- package/tests/unit/events/authorization.spec.ts +150 -0
- package/tests/unit/events/cookie.spec.ts +274 -0
- package/tests/unit/events/encryption.spec.ts +108 -0
- package/tests/unit/events/events_polyfills.ts +77 -0
- package/tests/unit/events/process.spec.ts +120 -0
- package/tests/unit/events/reporting.spec.ts +82 -0
- package/tests/unit/events/telemetry.spec.ts +224 -0
- package/tests/unit/events/transport.spec.ts +139 -0
- package/tests/unit/modeling/data_domain_foreign.spec.ts +244 -0
- package/tests/unit/modeling/domain_impact_analysis.spec.ts +0 -110
- package/tests/unit/modeling/domain_validation.spec.ts +94 -0
- package/tests/unit/modeling/validation/semantic_validation.spec.ts +91 -0
- package/tests/unit/models/environment.spec.ts +574 -0
- package/tests/unit/models/error_response.spec.ts +183 -0
- package/tests/unit/models/headers_array.spec.ts +86 -0
- package/tests/unit/models/http-actions/assertion/equal_assertion.spec.ts +103 -0
- package/tests/unit/models/http-actions/assertion/greater_than_assertion.spec.ts +91 -0
- package/tests/unit/models/http-actions/assertion/includes_assertion.spec.ts +71 -0
- package/tests/unit/models/http-actions/assertion/less_than_assertion.spec.ts +91 -0
- package/tests/unit/models/http-actions/assertion/matches_assertion.spec.ts +71 -0
- package/tests/unit/models/http-actions/assertion/matches_schema_assertion.spec.ts +117 -0
- package/tests/unit/models/http-actions/assertion/not_equal_assertion.spec.ts +103 -0
- package/tests/unit/models/http-actions/assertion/not_includes_assertion.spec.ts +71 -0
- package/tests/unit/models/http-actions/assertion/not_ok_assertion.spec.ts +47 -0
- package/tests/unit/models/http-actions/assertion/not_to_be_assertion.spec.ts +72 -0
- package/tests/unit/models/http-actions/assertion/ok_assertion.spec.ts +44 -0
- package/tests/unit/models/http-actions/assertion/to_be_assertion.spec.ts +71 -0
- package/tests/unit/models/http-actions/transformation/as_lower_case_step.spec.ts +47 -0
- package/tests/unit/models/http-actions/transformation/as_number_step.spec.ts +47 -0
- package/tests/unit/models/http-actions/transformation/as_upper_case_step.spec.ts +47 -0
- package/tests/unit/models/http-actions/transformation/round_step.spec.ts +69 -0
- package/tests/unit/models/http-actions/transformation/substring_step.spec.ts +85 -0
- package/tests/unit/models/http-actions/transformation/trim_step.spec.ts +44 -0
- package/tests/unit/models/http_cookie.spec.ts +516 -0
- package/tests/unit/models/http_history.spec.ts +443 -0
- package/tests/unit/models/project_folder.spec.ts +926 -0
- package/tests/unit/models/project_item.spec.ts +137 -0
- package/tests/unit/models/project_request.spec.ts +1047 -0
- package/tests/unit/models/project_schema.spec.ts +236 -0
- package/tests/unit/models/property.spec.ts +625 -0
- package/tests/unit/models/provider.spec.ts +102 -0
- package/tests/unit/models/request.spec.ts +1206 -0
- package/tests/unit/models/request_log.spec.ts +308 -0
- package/tests/unit/models/request_time.spec.ts +138 -0
- package/tests/unit/models/response_redirect.spec.ts +303 -0
- package/tests/unit/models/sent_request.spec.ts +206 -0
- package/tests/unit/models/server.spec.ts +195 -0
- package/tests/unit/models/thing.spec.ts +154 -0
- package/build/oauth-popup.html +0 -33
- /package/tests/unit/models/{Certificate.spec.ts → certificate.spec.ts} +0 -0
- /package/tests/unit/models/{HostRule.spec.ts → host_rule.spec.ts} +0 -0
- /package/tests/unit/models/{HttpProject.spec.ts → http_project.spec.ts} +0 -0
- /package/tests/unit/models/{HttpRequest.spec.ts → http_request.spec.ts} +0 -0
- /package/tests/unit/models/{HttpResponse.spec.ts → http_response.spec.ts} +0 -0
- /package/tests/unit/models/{License.spec.ts → license.spec.ts} +0 -0
- /package/tests/unit/models/{Response.spec.ts → response.spec.ts} +0 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { test } from '@japa/runner'
|
|
2
|
+
import sinon from 'sinon'
|
|
3
|
+
import { EventTypes } from '../../../src/events/EventTypes.js'
|
|
4
|
+
import { Events } from '../../../src/events/Events.js'
|
|
5
|
+
import { IHttpCookie } from '../../../src/models/HttpCookie.js'
|
|
6
|
+
import { ContextUpdateEvent, ContextUpdateEventDetail, ContextChangeRecord } from '../../../src/events/BaseEvents.js'
|
|
7
|
+
import { ensureUnique } from './EventsTestHelpers.js'
|
|
8
|
+
import './events_polyfills.js'
|
|
9
|
+
|
|
10
|
+
test.group('Events > Cookie > EventTypes.Cookie', () => {
|
|
11
|
+
test('has the namespace', ({ assert }) => {
|
|
12
|
+
assert.typeOf(EventTypes.Cookie, 'object')
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
test('has "{prop}" property')
|
|
16
|
+
.with([
|
|
17
|
+
['listAll', 'sessioncookielistall'],
|
|
18
|
+
['listDomain', 'sessioncookielistdomain'],
|
|
19
|
+
['listUrl', 'sessioncookielisturl'],
|
|
20
|
+
['delete', 'sessioncookiedelete'],
|
|
21
|
+
['deleteUrl', 'sessioncookiedeleteurl'],
|
|
22
|
+
['update', 'sessioncookieupdate'],
|
|
23
|
+
['updateBulk', 'sessioncookieupdatebulk'],
|
|
24
|
+
])
|
|
25
|
+
.run(({ assert }, [prop, value]) => {
|
|
26
|
+
// @ts-expect-error Used in testing
|
|
27
|
+
assert.equal(EventTypes.Cookie[prop], value)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('has State namespace', ({ assert }) => {
|
|
31
|
+
assert.typeOf(EventTypes.Cookie.State, 'object')
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
test('has frozen State namespace', ({ assert }) => {
|
|
35
|
+
assert.throws(() => {
|
|
36
|
+
// @ts-expect-error Used in testing
|
|
37
|
+
EventTypes.Cookie.State = { read: '' }
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('has "{prop}" property for State')
|
|
42
|
+
.with([
|
|
43
|
+
['update', 'sessioncookiestateupdate'],
|
|
44
|
+
['delete', 'sessioncookiestatedelete'],
|
|
45
|
+
])
|
|
46
|
+
.run(({ assert }, [prop, value]) => {
|
|
47
|
+
// @ts-expect-error Used in testing
|
|
48
|
+
assert.equal(EventTypes.Cookie.State[prop], value)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('has unique events for the namespace', () => {
|
|
52
|
+
ensureUnique('EventTypes.Cookie', EventTypes.Cookie)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
test('has unique events for State namespace', () => {
|
|
56
|
+
ensureUnique('EventTypes.Cookie.State', EventTypes.Cookie.State)
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
test.group('Events > Cookie > Events.Cookie > listAll()', () => {
|
|
61
|
+
test('dispatches the event', async ({ assert }) => {
|
|
62
|
+
const spy = sinon.spy()
|
|
63
|
+
globalThis.addEventListener(EventTypes.Cookie.listAll, spy)
|
|
64
|
+
// In Node.js, document.body is not available.
|
|
65
|
+
// Assuming Events.Cookie.listAll dispatches globally or handles a null/undefined target.
|
|
66
|
+
Events.Cookie.listAll()
|
|
67
|
+
globalThis.removeEventListener(EventTypes.Cookie.listAll, spy)
|
|
68
|
+
assert.isTrue(spy.calledOnce)
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
test.group('Events > Cookie > Events.Cookie > listDomain()', () => {
|
|
73
|
+
const domain = 'dot.com'
|
|
74
|
+
|
|
75
|
+
test('dispatches the event', async ({ assert }) => {
|
|
76
|
+
const spy = sinon.spy()
|
|
77
|
+
globalThis.addEventListener(EventTypes.Cookie.listDomain, spy)
|
|
78
|
+
Events.Cookie.listDomain(domain)
|
|
79
|
+
globalThis.removeEventListener(EventTypes.Cookie.listDomain, spy)
|
|
80
|
+
assert.isTrue(spy.calledOnce)
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
test('has the domain property', async ({ assert }) => {
|
|
84
|
+
const spy = sinon.spy()
|
|
85
|
+
globalThis.addEventListener(EventTypes.Cookie.listDomain, spy)
|
|
86
|
+
Events.Cookie.listDomain(domain)
|
|
87
|
+
globalThis.removeEventListener(EventTypes.Cookie.listDomain, spy)
|
|
88
|
+
const e = spy.args[0][0] as CustomEvent
|
|
89
|
+
assert.deepEqual(e.detail.domain, domain)
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
test.group('Events > Cookie > Events.Cookie > listUrl()', () => {
|
|
94
|
+
const url = 'https://dot.com/path'
|
|
95
|
+
|
|
96
|
+
test('dispatches the event', async ({ assert }) => {
|
|
97
|
+
const spy = sinon.spy()
|
|
98
|
+
globalThis.addEventListener(EventTypes.Cookie.listUrl, spy)
|
|
99
|
+
Events.Cookie.listUrl(url)
|
|
100
|
+
globalThis.removeEventListener(EventTypes.Cookie.listUrl, spy)
|
|
101
|
+
assert.isTrue(spy.calledOnce)
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
test('has the url property', async ({ assert }) => {
|
|
105
|
+
const spy = sinon.spy()
|
|
106
|
+
globalThis.addEventListener(EventTypes.Cookie.listUrl, spy)
|
|
107
|
+
Events.Cookie.listUrl(url)
|
|
108
|
+
globalThis.removeEventListener(EventTypes.Cookie.listUrl, spy)
|
|
109
|
+
const e = spy.args[0][0] as CustomEvent
|
|
110
|
+
assert.deepEqual(e.detail.url, url)
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
test.group('Events > Cookie > Events.Cookie > delete()', () => {
|
|
115
|
+
const cookie: IHttpCookie = {
|
|
116
|
+
name: 'a',
|
|
117
|
+
value: 'b',
|
|
118
|
+
sameSite: 'no_restriction',
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
test('dispatches the event', async ({ assert }) => {
|
|
122
|
+
const spy = sinon.spy()
|
|
123
|
+
globalThis.addEventListener(EventTypes.Cookie.delete, spy)
|
|
124
|
+
Events.Cookie.delete([cookie])
|
|
125
|
+
globalThis.removeEventListener(EventTypes.Cookie.delete, spy)
|
|
126
|
+
assert.isTrue(spy.calledOnce)
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
test('has the cookies property', async ({ assert }) => {
|
|
130
|
+
const spy = sinon.spy()
|
|
131
|
+
globalThis.addEventListener(EventTypes.Cookie.delete, spy)
|
|
132
|
+
Events.Cookie.delete([cookie])
|
|
133
|
+
globalThis.removeEventListener(EventTypes.Cookie.delete, spy)
|
|
134
|
+
const e = spy.args[0][0] as CustomEvent
|
|
135
|
+
assert.deepEqual(e.detail.cookies, [cookie])
|
|
136
|
+
})
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
test.group('Events > Cookie > Events.Cookie > deleteUrl()', () => {
|
|
140
|
+
const url = 'https://dot.com/path'
|
|
141
|
+
|
|
142
|
+
test('dispatches the event', async ({ assert }) => {
|
|
143
|
+
const spy = sinon.spy()
|
|
144
|
+
globalThis.addEventListener(EventTypes.Cookie.deleteUrl, spy)
|
|
145
|
+
Events.Cookie.deleteUrl(url)
|
|
146
|
+
globalThis.removeEventListener(EventTypes.Cookie.deleteUrl, spy)
|
|
147
|
+
assert.isTrue(spy.calledOnce)
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
test('has the url property', async ({ assert }) => {
|
|
151
|
+
const spy = sinon.spy()
|
|
152
|
+
globalThis.addEventListener(EventTypes.Cookie.deleteUrl, spy)
|
|
153
|
+
Events.Cookie.deleteUrl(url)
|
|
154
|
+
globalThis.removeEventListener(EventTypes.Cookie.deleteUrl, spy)
|
|
155
|
+
const e = spy.args[0][0] as CustomEvent
|
|
156
|
+
assert.deepEqual(e.detail.url, url)
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
test('has the optional name property', async ({ assert }) => {
|
|
160
|
+
const name = 'test name'
|
|
161
|
+
const spy = sinon.spy()
|
|
162
|
+
globalThis.addEventListener(EventTypes.Cookie.deleteUrl, spy)
|
|
163
|
+
Events.Cookie.deleteUrl(url, name)
|
|
164
|
+
globalThis.removeEventListener(EventTypes.Cookie.deleteUrl, spy)
|
|
165
|
+
const e = spy.args[0][0] as CustomEvent
|
|
166
|
+
assert.deepEqual(e.detail.name, name)
|
|
167
|
+
})
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
test.group('Events > Cookie > Events.Cookie > update()', () => {
|
|
171
|
+
const cookie: IHttpCookie = {
|
|
172
|
+
name: 'a',
|
|
173
|
+
value: 'b',
|
|
174
|
+
sameSite: 'no_restriction',
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
test('dispatches the event', async ({ assert }) => {
|
|
178
|
+
const spy = sinon.spy()
|
|
179
|
+
globalThis.addEventListener(EventTypes.Cookie.update, spy)
|
|
180
|
+
Events.Cookie.update(cookie)
|
|
181
|
+
globalThis.removeEventListener(EventTypes.Cookie.update, spy)
|
|
182
|
+
assert.isTrue(spy.calledOnce)
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
test('has the detail property', async ({ assert }) => {
|
|
186
|
+
const spy = sinon.spy()
|
|
187
|
+
globalThis.addEventListener(EventTypes.Cookie.update, spy)
|
|
188
|
+
Events.Cookie.update(cookie)
|
|
189
|
+
globalThis.removeEventListener(EventTypes.Cookie.update, spy)
|
|
190
|
+
const e = spy.args[0][0] as ContextUpdateEvent<IHttpCookie>
|
|
191
|
+
const detail = e.detail as ContextUpdateEventDetail<IHttpCookie>
|
|
192
|
+
assert.deepEqual(detail.item, cookie)
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
test.group('Events > Cookie > Events.Cookie > updateBulk()', () => {
|
|
197
|
+
const cookie: IHttpCookie = {
|
|
198
|
+
name: 'a',
|
|
199
|
+
value: 'b',
|
|
200
|
+
sameSite: 'no_restriction',
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
test('dispatches the event', async ({ assert }) => {
|
|
204
|
+
const spy = sinon.spy()
|
|
205
|
+
globalThis.addEventListener(EventTypes.Cookie.updateBulk, spy)
|
|
206
|
+
Events.Cookie.updateBulk([cookie])
|
|
207
|
+
globalThis.removeEventListener(EventTypes.Cookie.updateBulk, spy)
|
|
208
|
+
assert.isTrue(spy.calledOnce)
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
test('has the cookies property', async ({ assert }) => {
|
|
212
|
+
const spy = sinon.spy()
|
|
213
|
+
globalThis.addEventListener(EventTypes.Cookie.updateBulk, spy)
|
|
214
|
+
Events.Cookie.updateBulk([cookie])
|
|
215
|
+
globalThis.removeEventListener(EventTypes.Cookie.updateBulk, spy)
|
|
216
|
+
const e = spy.args[0][0] as CustomEvent
|
|
217
|
+
assert.deepEqual(e.detail.cookies, [cookie])
|
|
218
|
+
})
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
test.group('Events > Cookie > Events.Cookie > State.delete()', () => {
|
|
222
|
+
const cookie: IHttpCookie = {
|
|
223
|
+
name: 'a',
|
|
224
|
+
value: 'b',
|
|
225
|
+
sameSite: 'no_restriction',
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
test('dispatches the event', async ({ assert }) => {
|
|
229
|
+
const spy = sinon.spy()
|
|
230
|
+
globalThis.addEventListener(EventTypes.Cookie.State.delete, spy)
|
|
231
|
+
Events.Cookie.State.delete(cookie)
|
|
232
|
+
globalThis.removeEventListener(EventTypes.Cookie.State.delete, spy)
|
|
233
|
+
assert.isTrue(spy.calledOnce)
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
test('has the cookie property', async ({ assert }) => {
|
|
237
|
+
const spy = sinon.spy()
|
|
238
|
+
globalThis.addEventListener(EventTypes.Cookie.State.delete, spy)
|
|
239
|
+
Events.Cookie.State.delete(cookie)
|
|
240
|
+
globalThis.removeEventListener(EventTypes.Cookie.State.delete, spy)
|
|
241
|
+
const e = spy.args[0][0] as CustomEvent
|
|
242
|
+
assert.deepEqual(e.detail.cookie, cookie)
|
|
243
|
+
})
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
test.group('Events > Cookie > Events.Cookie > State.update()', () => {
|
|
247
|
+
const cookie: IHttpCookie = {
|
|
248
|
+
name: 'a',
|
|
249
|
+
value: 'b',
|
|
250
|
+
sameSite: 'no_restriction',
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const record: ContextChangeRecord<IHttpCookie> = {
|
|
254
|
+
item: cookie,
|
|
255
|
+
key: 'null',
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
test('dispatches the event', async ({ assert }) => {
|
|
259
|
+
const spy = sinon.spy()
|
|
260
|
+
globalThis.addEventListener(EventTypes.Cookie.State.update, spy)
|
|
261
|
+
Events.Cookie.State.update(record)
|
|
262
|
+
globalThis.removeEventListener(EventTypes.Cookie.State.update, spy)
|
|
263
|
+
assert.isTrue(spy.calledOnce)
|
|
264
|
+
})
|
|
265
|
+
|
|
266
|
+
test('has the change record', async ({ assert }) => {
|
|
267
|
+
const spy = sinon.spy()
|
|
268
|
+
globalThis.addEventListener(EventTypes.Cookie.State.update, spy)
|
|
269
|
+
Events.Cookie.State.update(record)
|
|
270
|
+
globalThis.removeEventListener(EventTypes.Cookie.State.update, spy)
|
|
271
|
+
const e = spy.args[0][0] as CustomEvent
|
|
272
|
+
assert.deepEqual(e.detail, record)
|
|
273
|
+
})
|
|
274
|
+
})
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { test } from '@japa/runner'
|
|
2
|
+
import sinon from 'sinon'
|
|
3
|
+
import { EventTypes } from '../../../src/events/EventTypes.js'
|
|
4
|
+
import { Events } from '../../../src/events/Events.js'
|
|
5
|
+
import { ensureUnique } from './EventsTestHelpers.js'
|
|
6
|
+
import './events_polyfills.js'
|
|
7
|
+
|
|
8
|
+
test.group('Events > Encryption > EventTypes.Encryption', () => {
|
|
9
|
+
test('has the namespace', ({ assert }) => {
|
|
10
|
+
assert.typeOf(EventTypes.Encryption, 'object')
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test('has "{prop}" property')
|
|
14
|
+
.with([
|
|
15
|
+
{ prop: 'encrypt', value: 'encryptionencrypt' },
|
|
16
|
+
{ prop: 'decrypt', value: 'encryptiondecrypt' },
|
|
17
|
+
])
|
|
18
|
+
.run(({ assert }, { prop, value }) => {
|
|
19
|
+
// @ts-expect-error Used in testing
|
|
20
|
+
assert.equal(EventTypes.Encryption[prop], value)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('has unique events for the namespace', () => {
|
|
24
|
+
ensureUnique('EventTypes.Encryption', EventTypes.Encryption)
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
test.group('Events > Encryption > Events.Encryption > encrypt()', () => {
|
|
29
|
+
const data = 'export data'
|
|
30
|
+
const passphrase = 'passphrase data'
|
|
31
|
+
const method = 'aes'
|
|
32
|
+
|
|
33
|
+
test('dispatches the event', async ({ assert }) => {
|
|
34
|
+
const spy = sinon.spy()
|
|
35
|
+
globalThis.addEventListener(EventTypes.Encryption.encrypt, spy)
|
|
36
|
+
await Events.Encryption.encrypt(data, passphrase, method)
|
|
37
|
+
globalThis.removeEventListener(EventTypes.Encryption.encrypt, spy)
|
|
38
|
+
assert.isTrue(spy.calledOnce)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('has the data on the event', async ({ assert }) => {
|
|
42
|
+
const spy = sinon.spy()
|
|
43
|
+
globalThis.addEventListener(EventTypes.Encryption.encrypt, spy)
|
|
44
|
+
await Events.Encryption.encrypt(data, passphrase, method)
|
|
45
|
+
globalThis.removeEventListener(EventTypes.Encryption.encrypt, spy)
|
|
46
|
+
const e = spy.args[0][0] as CustomEvent
|
|
47
|
+
assert.equal(e.detail.data, data)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
test('has the passphrase on the event', async ({ assert }) => {
|
|
51
|
+
const spy = sinon.spy()
|
|
52
|
+
globalThis.addEventListener(EventTypes.Encryption.encrypt, spy)
|
|
53
|
+
await Events.Encryption.encrypt(data, passphrase, method)
|
|
54
|
+
globalThis.removeEventListener(EventTypes.Encryption.encrypt, spy)
|
|
55
|
+
const e = spy.args[0][0] as CustomEvent
|
|
56
|
+
assert.equal(e.detail.passphrase, passphrase)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
test('has the method on the event', async ({ assert }) => {
|
|
60
|
+
const spy = sinon.spy()
|
|
61
|
+
globalThis.addEventListener(EventTypes.Encryption.encrypt, spy)
|
|
62
|
+
await Events.Encryption.encrypt(data, passphrase, method)
|
|
63
|
+
globalThis.removeEventListener(EventTypes.Encryption.encrypt, spy)
|
|
64
|
+
const e = spy.args[0][0] as CustomEvent
|
|
65
|
+
assert.equal(e.detail.method, method)
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test.group('Events > Encryption > Events.Encryption > decrypt()', () => {
|
|
70
|
+
const data = 'export data'
|
|
71
|
+
const passphrase = 'passphrase data'
|
|
72
|
+
const method = 'aes'
|
|
73
|
+
|
|
74
|
+
test('dispatches the event', async ({ assert }) => {
|
|
75
|
+
const spy = sinon.spy()
|
|
76
|
+
globalThis.addEventListener(EventTypes.Encryption.decrypt, spy)
|
|
77
|
+
await Events.Encryption.decrypt(data, passphrase, method)
|
|
78
|
+
globalThis.removeEventListener(EventTypes.Encryption.decrypt, spy)
|
|
79
|
+
assert.isTrue(spy.calledOnce)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
test('has the data on the event', async ({ assert }) => {
|
|
83
|
+
const spy = sinon.spy()
|
|
84
|
+
globalThis.addEventListener(EventTypes.Encryption.decrypt, spy)
|
|
85
|
+
await Events.Encryption.decrypt(data, passphrase, method)
|
|
86
|
+
globalThis.removeEventListener(EventTypes.Encryption.decrypt, spy)
|
|
87
|
+
const e = spy.args[0][0] as CustomEvent
|
|
88
|
+
assert.equal(e.detail.data, data)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
test('has the passphrase on the event', async ({ assert }) => {
|
|
92
|
+
const spy = sinon.spy()
|
|
93
|
+
globalThis.addEventListener(EventTypes.Encryption.decrypt, spy)
|
|
94
|
+
await Events.Encryption.decrypt(data, passphrase, method)
|
|
95
|
+
globalThis.removeEventListener(EventTypes.Encryption.decrypt, spy)
|
|
96
|
+
const e = spy.args[0][0] as CustomEvent
|
|
97
|
+
assert.equal(e.detail.passphrase, passphrase)
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
test('has the method on the event', async ({ assert }) => {
|
|
101
|
+
const spy = sinon.spy()
|
|
102
|
+
globalThis.addEventListener(EventTypes.Encryption.decrypt, spy)
|
|
103
|
+
await Events.Encryption.decrypt(data, passphrase, method)
|
|
104
|
+
globalThis.removeEventListener(EventTypes.Encryption.decrypt, spy)
|
|
105
|
+
const e = spy.args[0][0] as CustomEvent
|
|
106
|
+
assert.equal(e.detail.method, method)
|
|
107
|
+
})
|
|
108
|
+
})
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
// Originally these tests were written for a browser environment.
|
|
3
|
+
// They are now adapted to run in a Node.js environment with polyfills for browser APIs.
|
|
4
|
+
|
|
5
|
+
// @ts-expect-error This is for testing.
|
|
6
|
+
globalThis.window = globalThis
|
|
7
|
+
|
|
8
|
+
// Polyfill for DOM EventTarget APIs in Node.js environment for testing
|
|
9
|
+
if (typeof globalThis.Event === 'undefined') {
|
|
10
|
+
class EventPolyfill {
|
|
11
|
+
type: string
|
|
12
|
+
bubbles: boolean
|
|
13
|
+
cancelable: boolean
|
|
14
|
+
composed: boolean
|
|
15
|
+
defaultPrevented = false
|
|
16
|
+
readonly timeStamp: number = Date.now()
|
|
17
|
+
// Stub other properties/methods as needed by the code under test
|
|
18
|
+
target: any | null = null // Using 'any' for simplicity in polyfill
|
|
19
|
+
currentTarget: any | null = null
|
|
20
|
+
|
|
21
|
+
constructor(type: string, eventInitDict?: EventInit) {
|
|
22
|
+
this.type = type
|
|
23
|
+
this.bubbles = eventInitDict?.bubbles ?? false
|
|
24
|
+
this.cancelable = eventInitDict?.cancelable ?? false
|
|
25
|
+
this.composed = eventInitDict?.composed ?? false
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
preventDefault(): void {
|
|
29
|
+
if (this.cancelable) {
|
|
30
|
+
this.defaultPrevented = true
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
stopPropagation(): void {
|
|
35
|
+
/* Stub */
|
|
36
|
+
}
|
|
37
|
+
stopImmediatePropagation(): void {
|
|
38
|
+
/* Stub */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
;(globalThis as any).Event = EventPolyfill
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (typeof globalThis.CustomEvent === 'undefined') {
|
|
45
|
+
class CustomEventPolyfill<T = any> extends (globalThis as any).Event {
|
|
46
|
+
detail: T
|
|
47
|
+
|
|
48
|
+
constructor(type: string, eventInitDict?: CustomEventInit<T>) {
|
|
49
|
+
super(type, eventInitDict)
|
|
50
|
+
this.detail = eventInitDict?.detail ?? (null as T)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
;(globalThis as any).CustomEvent = CustomEventPolyfill
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (typeof globalThis.addEventListener !== 'function') {
|
|
57
|
+
const eventListeners = new Map<string, Set<EventListenerOrEventListenerObject>>()
|
|
58
|
+
|
|
59
|
+
globalThis.addEventListener = (type: string, listener: EventListenerOrEventListenerObject): void => {
|
|
60
|
+
if (!eventListeners.has(type)) {
|
|
61
|
+
eventListeners.set(type, new Set())
|
|
62
|
+
}
|
|
63
|
+
eventListeners.get(type)!.add(listener)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
globalThis.removeEventListener = (type: string, listener: EventListenerOrEventListenerObject): void => {
|
|
67
|
+
eventListeners.get(type)?.delete(listener)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
globalThis.dispatchEvent = (event: Event): boolean => {
|
|
71
|
+
eventListeners.get(event.type)?.forEach((handler) => {
|
|
72
|
+
if (typeof handler === 'function') handler.call(globalThis, event)
|
|
73
|
+
else handler.handleEvent.call(globalThis, event)
|
|
74
|
+
})
|
|
75
|
+
return !event.defaultPrevented
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { test } from '@japa/runner'
|
|
2
|
+
import sinon from 'sinon'
|
|
3
|
+
import { EventTypes } from '../../../src/events/EventTypes.js'
|
|
4
|
+
import { Events } from '../../../src/events/Events.js'
|
|
5
|
+
import { ensureUnique } from './EventsTestHelpers.js'
|
|
6
|
+
import './events_polyfills.js'
|
|
7
|
+
|
|
8
|
+
test.group('Events > Process > EventTypes.Process', () => {
|
|
9
|
+
test('has the namespace', ({ assert }) => {
|
|
10
|
+
assert.typeOf(EventTypes.Process, 'object')
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test('has "{prop}" property')
|
|
14
|
+
.with([
|
|
15
|
+
{ prop: 'loadingStart', value: 'processloadingstart' },
|
|
16
|
+
{ prop: 'loadingStop', value: 'processloadingstop' },
|
|
17
|
+
{ prop: 'loadingError', value: 'processloadingerror' },
|
|
18
|
+
])
|
|
19
|
+
.run(({ assert }, { prop, value }) => {
|
|
20
|
+
// @ts-expect-error Used in testing
|
|
21
|
+
assert.equal(EventTypes.Process[prop], value)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test('has unique events for the namespace', () => {
|
|
25
|
+
ensureUnique('EventTypes.Process', EventTypes.Process)
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test.group('Events > Process > Events.Process > loadingStart()', () => {
|
|
30
|
+
const pid = 'process-id-1'
|
|
31
|
+
const message = 'test-message'
|
|
32
|
+
|
|
33
|
+
test('dispatches the event', ({ assert }) => {
|
|
34
|
+
const spy = sinon.spy()
|
|
35
|
+
globalThis.addEventListener(EventTypes.Process.loadingStart, spy)
|
|
36
|
+
Events.Process.loadingStart(pid, message)
|
|
37
|
+
globalThis.removeEventListener(EventTypes.Process.loadingStart, spy)
|
|
38
|
+
assert.isTrue(spy.calledOnce)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('has the pid on the event', ({ assert }) => {
|
|
42
|
+
const spy = sinon.spy()
|
|
43
|
+
globalThis.addEventListener(EventTypes.Process.loadingStart, spy)
|
|
44
|
+
Events.Process.loadingStart(pid, message)
|
|
45
|
+
globalThis.removeEventListener(EventTypes.Process.loadingStart, spy)
|
|
46
|
+
const e = spy.args[0][0] as CustomEvent
|
|
47
|
+
assert.equal(e.detail.pid, pid)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
test('has the message on the event', ({ assert }) => {
|
|
51
|
+
const spy = sinon.spy()
|
|
52
|
+
globalThis.addEventListener(EventTypes.Process.loadingStart, spy)
|
|
53
|
+
Events.Process.loadingStart(pid, message)
|
|
54
|
+
globalThis.removeEventListener(EventTypes.Process.loadingStart, spy)
|
|
55
|
+
const e = spy.args[0][0] as CustomEvent
|
|
56
|
+
assert.equal(e.detail.message, message)
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
test.group('Events > Process > Events.Process > loadingStop()', () => {
|
|
61
|
+
const pid = 'process-id-1'
|
|
62
|
+
|
|
63
|
+
test('dispatches the event', ({ assert }) => {
|
|
64
|
+
const spy = sinon.spy()
|
|
65
|
+
globalThis.addEventListener(EventTypes.Process.loadingStop, spy)
|
|
66
|
+
Events.Process.loadingStop(pid)
|
|
67
|
+
globalThis.removeEventListener(EventTypes.Process.loadingStop, spy)
|
|
68
|
+
assert.isTrue(spy.calledOnce)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
test('has the pid on the event', ({ assert }) => {
|
|
72
|
+
const spy = sinon.spy()
|
|
73
|
+
globalThis.addEventListener(EventTypes.Process.loadingStop, spy)
|
|
74
|
+
Events.Process.loadingStop(pid)
|
|
75
|
+
globalThis.removeEventListener(EventTypes.Process.loadingStop, spy)
|
|
76
|
+
const e = spy.args[0][0] as CustomEvent
|
|
77
|
+
assert.equal(e.detail.pid, pid)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
test.group('Events > Process > Events.Process > loadingError()', () => {
|
|
82
|
+
const pid = 'process-id-1'
|
|
83
|
+
const message = 'test-message'
|
|
84
|
+
const error = new Error('test-message')
|
|
85
|
+
|
|
86
|
+
test('dispatches the event', ({ assert }) => {
|
|
87
|
+
const spy = sinon.spy()
|
|
88
|
+
globalThis.addEventListener(EventTypes.Process.loadingError, spy)
|
|
89
|
+
Events.Process.loadingError(pid, message)
|
|
90
|
+
globalThis.removeEventListener(EventTypes.Process.loadingError, spy)
|
|
91
|
+
assert.isTrue(spy.calledOnce)
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
test('has the pid on the event', ({ assert }) => {
|
|
95
|
+
const spy = sinon.spy()
|
|
96
|
+
globalThis.addEventListener(EventTypes.Process.loadingError, spy)
|
|
97
|
+
Events.Process.loadingError(pid, message)
|
|
98
|
+
globalThis.removeEventListener(EventTypes.Process.loadingError, spy)
|
|
99
|
+
const e = spy.args[0][0] as CustomEvent
|
|
100
|
+
assert.equal(e.detail.pid, pid)
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
test('has the message on the event', ({ assert }) => {
|
|
104
|
+
const spy = sinon.spy()
|
|
105
|
+
globalThis.addEventListener(EventTypes.Process.loadingError, spy)
|
|
106
|
+
Events.Process.loadingError(pid, message)
|
|
107
|
+
globalThis.removeEventListener(EventTypes.Process.loadingError, spy)
|
|
108
|
+
const e = spy.args[0][0] as CustomEvent
|
|
109
|
+
assert.equal(e.detail.message, message)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
test('has the optional error on the event', ({ assert }) => {
|
|
113
|
+
const spy = sinon.spy()
|
|
114
|
+
globalThis.addEventListener(EventTypes.Process.loadingError, spy)
|
|
115
|
+
Events.Process.loadingError(pid, message, error)
|
|
116
|
+
globalThis.removeEventListener(EventTypes.Process.loadingError, spy)
|
|
117
|
+
const e = spy.args[0][0] as CustomEvent
|
|
118
|
+
assert.deepEqual(e.detail.error, error)
|
|
119
|
+
})
|
|
120
|
+
})
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { test } from '@japa/runner'
|
|
2
|
+
import sinon from 'sinon'
|
|
3
|
+
import { EventTypes } from '../../../src/events/EventTypes.js'
|
|
4
|
+
import { Events } from '../../../src/events/Events.js'
|
|
5
|
+
import { ensureUnique } from './EventsTestHelpers.js'
|
|
6
|
+
import './events_polyfills.js'
|
|
7
|
+
|
|
8
|
+
test.group('Events > Reporting > EventTypes.Reporting', () => {
|
|
9
|
+
test('has the namespace', ({ assert }) => {
|
|
10
|
+
assert.typeOf(EventTypes.Reporting, 'object')
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test('has "{prop}" property')
|
|
14
|
+
.with([{ prop: 'error', value: 'reporterror' }])
|
|
15
|
+
.run(({ assert }, { prop, value }) => {
|
|
16
|
+
// @ts-expect-error Used in testing
|
|
17
|
+
assert.equal(EventTypes.Reporting[prop], value)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
test('has unique events for the namespace', () => {
|
|
21
|
+
ensureUnique('EventTypes.Reporting', EventTypes.Reporting)
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test.group('Events > Reporting > Events.Reporting > error()', () => {
|
|
26
|
+
const err = new Error('Test Error')
|
|
27
|
+
const desc = 'test error description'
|
|
28
|
+
const cmp = 'test-component'
|
|
29
|
+
|
|
30
|
+
test('dispatches the event', ({ assert }) => {
|
|
31
|
+
const spy = sinon.spy()
|
|
32
|
+
globalThis.addEventListener(EventTypes.Reporting.error, spy)
|
|
33
|
+
Events.Reporting.error(desc)
|
|
34
|
+
globalThis.removeEventListener(EventTypes.Reporting.error, spy)
|
|
35
|
+
assert.isTrue(spy.calledOnce)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('has the description on the event', ({ assert }) => {
|
|
39
|
+
const spy = sinon.spy()
|
|
40
|
+
globalThis.addEventListener(EventTypes.Reporting.error, spy)
|
|
41
|
+
Events.Reporting.error(desc)
|
|
42
|
+
globalThis.removeEventListener(EventTypes.Reporting.error, spy)
|
|
43
|
+
const e = spy.args[0][0] as CustomEvent
|
|
44
|
+
assert.equal(e.detail.description, desc)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
test('has the error on the event when provided', ({ assert }) => {
|
|
48
|
+
const spy = sinon.spy()
|
|
49
|
+
globalThis.addEventListener(EventTypes.Reporting.error, spy)
|
|
50
|
+
Events.Reporting.error(desc, err)
|
|
51
|
+
globalThis.removeEventListener(EventTypes.Reporting.error, spy)
|
|
52
|
+
const e = spy.args[0][0] as CustomEvent
|
|
53
|
+
assert.deepEqual(e.detail.error, err)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test('error property is undefined when not provided', ({ assert }) => {
|
|
57
|
+
const spy = sinon.spy()
|
|
58
|
+
globalThis.addEventListener(EventTypes.Reporting.error, spy)
|
|
59
|
+
Events.Reporting.error(desc)
|
|
60
|
+
globalThis.removeEventListener(EventTypes.Reporting.error, spy)
|
|
61
|
+
const e = spy.args[0][0] as CustomEvent
|
|
62
|
+
assert.isUndefined(e.detail.error)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
test('has the component on the event when provided', ({ assert }) => {
|
|
66
|
+
const spy = sinon.spy()
|
|
67
|
+
globalThis.addEventListener(EventTypes.Reporting.error, spy)
|
|
68
|
+
Events.Reporting.error(desc, err, cmp)
|
|
69
|
+
globalThis.removeEventListener(EventTypes.Reporting.error, spy)
|
|
70
|
+
const e = spy.args[0][0] as CustomEvent
|
|
71
|
+
assert.equal(e.detail.component, cmp)
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
test('component property is undefined when not provided', ({ assert }) => {
|
|
75
|
+
const spy = sinon.spy()
|
|
76
|
+
globalThis.addEventListener(EventTypes.Reporting.error, spy)
|
|
77
|
+
Events.Reporting.error(desc, err) // No component here
|
|
78
|
+
globalThis.removeEventListener(EventTypes.Reporting.error, spy)
|
|
79
|
+
const e = spy.args[0][0] as CustomEvent
|
|
80
|
+
assert.isUndefined(e.detail.component)
|
|
81
|
+
})
|
|
82
|
+
})
|