@thymian/plugin-http-tester 0.0.0-PLACEHOLDER

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/README.md ADDED
@@ -0,0 +1,59 @@
1
+ <!-- HEADER:START - Do not remove or modify this section -->
2
+ <div align="center">
3
+ <img src="https://raw.githubusercontent.com/thymianofficial/thymian/main/astro-docs/src/assets/logo.svg" alt="Thymian Logo" width="200"/>
4
+
5
+ # Thymian
6
+
7
+ **Add resilience and HTTP conformance to your API development workflow**
8
+
9
+ [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL%203.0-green.svg)](https://github.com/thymianofficial/thymian/blob/main/LICENSE)
10
+ [![CI](https://github.com/thymianofficial/thymian/actions/workflows/ci.yaml/badge.svg)](https://github.com/thymianofficial/thymian/actions/workflows/ci.yaml)
11
+ [![Documentation](https://img.shields.io/badge/docs-thymian.dev-green.svg)](https://thymian.dev)
12
+ [![Discord](https://img.shields.io/discord/1440702693768429791?logo=discord&label=Discord&color=5865F2)](https://discord.gg/TRSwCxbz9f)
13
+ [![Reddit](https://img.shields.io/badge/Reddit-ThymianOfficial-FF4500?logo=reddit)](https://www.reddit.com/r/ThymianOfficial/)
14
+ [![Twitter](https://img.shields.io/badge/Twitter-@thymiandev-1DA1F2?logo=x)](https://x.com/thymiandev)
15
+
16
+ </div>
17
+ <!-- HEADER:END -->
18
+
19
+ ## @thymian/plugin-http-tester
20
+
21
+ Executes live HTTP conformance tests against a running API endpoint. Powers `thymian test` by constructing requests from the API specification, dispatching them to the target URL, and evaluating the responses against the loaded rules.
22
+
23
+ ## Installation
24
+
25
+ ```bash
26
+ npm install @thymian/plugin-http-tester
27
+ ```
28
+
29
+ > **Getting started with Thymian?** See the [main Thymian package](https://www.npmjs.com/package/thymian) for quick installation and first-run instructions.
30
+
31
+ <!-- FOOTER:START - Do not remove or modify this section -->
32
+
33
+ ## 📚 Documentation
34
+
35
+ - **[Getting Started](https://thymian.dev/introduction/getting-started)** - Set up Thymian in minutes
36
+ - **[Documentation](https://thymian.dev)** - Comprehensive guides and API reference
37
+ - **[CLI Reference](https://thymian.dev/references/cli)** - Complete CLI command documentation
38
+ - **[HTTP Rules](https://thymian.dev/guides/http-rules/how-to-use-rules)** - Learn about HTTP conformance validation
39
+
40
+ ## 🏢 Enterprise Support
41
+
42
+ Get professional consulting and dedicated support from the creators of Thymian. We offer:
43
+
44
+ - API design and governance strategies
45
+ - HTTP standards compliance auditing
46
+ - Custom plugin development
47
+ - Custom rule development
48
+ - Team training and workshops
49
+
50
+ **[Learn more about Enterprise Support](https://thymian.dev/enterprise)** | **Email: [support@thymian.dev](mailto:support@thymian.dev)**
51
+
52
+ ---
53
+
54
+ <div align="center">
55
+
56
+ **Shipped with 🌱 by [qupaya](https://qupaya.com)**
57
+
58
+ </div>
59
+ <!-- FOOTER:END -->
@@ -0,0 +1,4 @@
1
+ import { type Logger, ThymianEmitter, ThymianFormat } from '@thymian/core';
2
+ import { type HttpTestContextLocals } from '@thymian/core';
3
+ export declare function createContext<Locals extends HttpTestContextLocals>(format: ThymianFormat, logger: Logger, emitter: ThymianEmitter, origin?: string, locals?: Locals): import("@thymian/core").HttpTestContext<Locals>;
4
+ //# sourceMappingURL=create-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-context.d.ts","sourceRoot":"","sources":["../src/create-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACX,cAAc,EACd,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAEvB,wBAAgB,aAAa,CAAC,MAAM,SAAS,qBAAqB,EAChE,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,GAAE,MAAqB,mDAgC9B"}
@@ -0,0 +1,25 @@
1
+ import { ThymianEmitter, ThymianFormat, } from '@thymian/core';
2
+ import { createHttpTestContext, createHttpTestHookRunnerFromThymianEmitter, } from '@thymian/core';
3
+ export function createContext(format, logger, emitter, origin, locals = {}) {
4
+ return createHttpTestContext({
5
+ format,
6
+ logger,
7
+ locals,
8
+ sampleRequest: async function (transaction) {
9
+ return await emitter.emitAction('core.request.sample', { transaction }, { strategy: 'first' });
10
+ },
11
+ runRequest: async function (req) {
12
+ const finalOrigin = origin ?? req.origin;
13
+ return await emitter.emitAction('core.request.dispatch', {
14
+ request: {
15
+ ...req,
16
+ origin: finalOrigin,
17
+ },
18
+ }, {
19
+ strategy: 'first',
20
+ });
21
+ },
22
+ runHook: createHttpTestHookRunnerFromThymianEmitter(emitter),
23
+ });
24
+ }
25
+ //# sourceMappingURL=create-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-context.js","sourceRoot":"","sources":["../src/create-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,cAAc,EACd,aAAa,GAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,0CAA0C,GAE3C,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,MAAc,EACd,OAAuB,EACvB,MAAe,EACf,SAAiB,EAAY;IAE7B,OAAO,qBAAqB,CAAC;QAC3B,MAAM;QACN,MAAM;QACN,MAAM;QACN,aAAa,EAAE,KAAK,WAClB,WAAmC;YAEnC,OAAO,MAAM,OAAO,CAAC,UAAU,CAC7B,qBAAqB,EACrB,EAAE,WAAW,EAAE,EACf,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;QACJ,CAAC;QACD,UAAU,EAAE,KAAK,WAAW,GAAgB;YAC1C,MAAM,WAAW,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;YACzC,OAAO,MAAM,OAAO,CAAC,UAAU,CAC7B,uBAAuB,EACvB;gBACE,OAAO,EAAE;oBACP,GAAG,GAAG;oBACN,MAAM,EAAE,WAAW;iBACpB;aACF,EACD;gBACE,QAAQ,EAAE,OAAO;aAClB,CACF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,0CAA0C,CAAC,OAAO,CAAC;KAC7D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type CommonHttpRequest, type CommonHttpResponse, type HttpFilterExpression, type HttpRequest, type HttpResponse, type ReportFn, type RuleFnResult, type RuleViolation, type RuleViolationLocation, type TestContext, ThymianFormat, type ValidationFn } from '@thymian/core';
2
+ import { type HttpTestContext, type HttpTestContextLocals, type HttpTestPipeline, type HttpTestResult } from '@thymian/core';
3
+ export declare class HttpTestApiContext<Locals extends HttpTestContextLocals = HttpTestContextLocals> implements TestContext {
4
+ private readonly name;
5
+ private readonly skippedOrigins;
6
+ private readonly pluginSource;
7
+ readonly format: ThymianFormat;
8
+ readonly report: ReportFn;
9
+ private readonly violations;
10
+ private readonly ctx;
11
+ constructor(name: string, ctx: HttpTestContext<Locals>, report?: ReportFn, skippedOrigins?: string[], pluginSource?: string);
12
+ reportViolation(violation: RuleViolation): void;
13
+ validateGroupedCommonHttpTransactions(filterExpr: HttpFilterExpression, groupByExpression: HttpFilterExpression, validationFn: ValidationFn<[
14
+ string,
15
+ [
16
+ CommonHttpRequest,
17
+ CommonHttpResponse,
18
+ RuleViolationLocation
19
+ ][]
20
+ ], RuleViolation | undefined>): Promise<RuleFnResult>;
21
+ validateCommonHttpTransactions(filterExpr: HttpFilterExpression, validate?: ValidationFn<[
22
+ CommonHttpRequest,
23
+ CommonHttpResponse,
24
+ RuleViolationLocation
25
+ ]> | HttpFilterExpression): Promise<RuleFnResult>;
26
+ private reportSkippedAndFailedTestCases;
27
+ httpTest(pipeline: HttpTestPipeline<Locals>): Promise<RuleFnResult>;
28
+ runHttpTest(pipeline: HttpTestPipeline<Locals>): Promise<HttpTestResult>;
29
+ validateHttpTransactions(filterExpr: HttpFilterExpression, validation?: ValidationFn<[
30
+ HttpRequest,
31
+ HttpResponse,
32
+ {
33
+ elementType: 'node' | 'edge';
34
+ elementId: string;
35
+ pointer?: string;
36
+ }
37
+ ]> | HttpFilterExpression): Promise<RuleFnResult>;
38
+ }
39
+ //# sourceMappingURL=http-test-api-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-test-api-context.d.ts","sourceRoot":"","sources":["../src/http-test-api-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAEvB,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAEhB,KAAK,YAAY,EAEjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAEhB,aAAa,EAIb,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAOL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAIpB,MAAM,eAAe,CAAC;AAevB,qBAAa,kBAAkB,CAC7B,MAAM,SAAS,qBAAqB,GAAG,qBAAqB,CAC5D,YAAW,WAAW;IAOpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAGrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAV/B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0B;gBAG3B,IAAI,EAAE,MAAM,EAC7B,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,EAC5B,MAAM,GAAE,QAA0B,EACjB,cAAc,GAAE,MAAM,EAAO,EAC7B,YAAY,SAAgC;IAuB/D,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAIzC,qCAAqC,CACzC,UAAU,EAAE,oBAAoB,EAChC,iBAAiB,EAAE,oBAAoB,EACvC,YAAY,EAAE,YAAY,CACxB;QACE,MAAM;QACN;YAAC,iBAAiB;YAAE,kBAAkB;YAAE,qBAAqB;SAAC,EAAE;KACjE,EACD,aAAa,GAAG,SAAS,CAC1B,GACA,OAAO,CAAC,YAAY,CAAC;IA2DlB,8BAA8B,CAClC,UAAU,EAAE,oBAAoB,EAChC,QAAQ,GACJ,YAAY,CACV;QAAC,iBAAiB;QAAE,kBAAkB;QAAE,qBAAqB;KAAC,CAC/D,GACD,oBAAiC,GACpC,OAAO,CAAC,YAAY,CAAC;IA0ExB,OAAO,CAAC,+BAA+B;IAoGjC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAUnE,WAAW,CACf,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,cAAc,CAAC;IAMpB,wBAAwB,CAC5B,UAAU,EAAE,oBAAoB,EAChC,UAAU,GACN,YAAY,CACV;QACE,WAAW;QACX,YAAY;QACZ;YACE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;YAC7B,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB;KACF,CACF,GACD,oBAAiC,GACpC,OAAO,CAAC,YAAY,CAAC;CA8DzB"}
@@ -0,0 +1,257 @@
1
+ import { createRegExpFromOriginWildcard, httpRequestToCommonHttpRequest, httpResponseToCommonHttpResponse, ThymianBaseError, ThymianFormat, thymianRequestToOrigin, } from '@thymian/core';
2
+ import { generateRequests, httpTest, mapToGroupedTestCase, runRequests, singleTestCase, } from '@thymian/core';
3
+ import { filter, groupBy } from 'rxjs';
4
+ import { httpFilterExpressionToFilter } from './visitors/http-filter-expression-to-filter.js';
5
+ import { httpFilterToGroupByFn } from './visitors/http-filter-to-static-by-fn.js';
6
+ import { httpFilterToTransactionValidationFn } from './visitors/http-filter-to-transaction-validation-fn.js';
7
+ function hasSource(transaction) {
8
+ return 'source' in transaction;
9
+ }
10
+ export class HttpTestApiContext {
11
+ name;
12
+ skippedOrigins;
13
+ pluginSource;
14
+ format;
15
+ report;
16
+ violations = [];
17
+ ctx;
18
+ constructor(name, ctx, report = () => undefined, skippedOrigins = [], pluginSource = '@thymian/plugin-http-tester') {
19
+ this.name = name;
20
+ this.skippedOrigins = skippedOrigins;
21
+ this.pluginSource = pluginSource;
22
+ this.report = report;
23
+ if (skippedOrigins.length === 0) {
24
+ this.format = ctx.format;
25
+ }
26
+ else {
27
+ const regExps = skippedOrigins.map(createRegExpFromOriginWildcard);
28
+ this.format = ctx.format.filter(({ thymianReq }) => !regExps.some((regExp) => regExp.test(thymianRequestToOrigin(thymianReq))));
29
+ }
30
+ this.ctx = {
31
+ ...ctx,
32
+ format: this.format,
33
+ };
34
+ }
35
+ reportViolation(violation) {
36
+ this.violations.push(violation);
37
+ }
38
+ async validateGroupedCommonHttpTransactions(filterExpr, groupByExpression, validationFn) {
39
+ const filterFn = httpFilterExpressionToFilter(filterExpr);
40
+ const groupByFn = httpFilterToGroupByFn(groupByExpression);
41
+ const test = httpTest(this.name, (test) => test.pipe(filter(({ current, ctx }) => filterFn(current, ctx.format)), groupBy(({ current, ctx }) => groupByFn(current, ctx.format)), mapToGroupedTestCase(), generateRequests(), runRequests()));
42
+ const testResult = await test(this.ctx);
43
+ this.reportSkippedAndFailedTestCases(testResult);
44
+ return testResult.cases
45
+ .filter((testCase) => testCase.status === 'passed')
46
+ .reduce((violations, value) => {
47
+ const testCase = value;
48
+ const { source, transactions } = testCase.steps[0];
49
+ const transactionsToValidate = transactions
50
+ .filter(hasSource)
51
+ .map((transaction) => [
52
+ httpRequestToCommonHttpRequest(
53
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
54
+ transaction.request, transaction.source.thymianReqId),
55
+ httpResponseToCommonHttpResponse(
56
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
57
+ transaction.response, transaction.source.thymianResId),
58
+ {
59
+ elementId: transaction.source.transactionId,
60
+ elementType: 'edge',
61
+ },
62
+ ]);
63
+ const validationResult = validationFn(source.key, transactionsToValidate);
64
+ if (validationResult) {
65
+ violations.push(validationResult);
66
+ }
67
+ return violations;
68
+ }, [])
69
+ .concat(this.violations);
70
+ }
71
+ async validateCommonHttpTransactions(filterExpr, validate = filterExpr) {
72
+ const test = httpTest(this.name, singleTestCase().forTransactionsWith(filterExpr).run().done());
73
+ const testResult = await test(this.ctx);
74
+ this.reportSkippedAndFailedTestCases(testResult);
75
+ return testResult.cases
76
+ .filter((testCase) => testCase.status === 'passed')
77
+ .flatMap((testCase) => testCase.steps.flatMap((step) => {
78
+ const violations = [];
79
+ for (const transaction of step.transactions) {
80
+ const { request, response, source } = transaction;
81
+ if (!request || !response || !source) {
82
+ throw new Error('Invalid HTTP test case transaction.');
83
+ }
84
+ if (typeof validate === 'function') {
85
+ const validationResult = validate(httpRequestToCommonHttpRequest(request, source.thymianReqId), httpResponseToCommonHttpResponse(response, source.thymianResId), {
86
+ elementType: 'edge',
87
+ elementId: source.transactionId,
88
+ });
89
+ if (typeof validationResult === 'boolean' && validationResult) {
90
+ violations.push({
91
+ location: {
92
+ elementType: 'edge',
93
+ elementId: source.transactionId,
94
+ pointer: '',
95
+ },
96
+ });
97
+ }
98
+ if (validationResult && typeof validationResult === 'object') {
99
+ violations.push({
100
+ location: {
101
+ elementType: 'edge',
102
+ elementId: source.transactionId,
103
+ pointer: '',
104
+ },
105
+ ...validationResult,
106
+ });
107
+ }
108
+ }
109
+ else {
110
+ const validateFn = httpFilterToTransactionValidationFn(validate);
111
+ const validationResult = validateFn(request, response);
112
+ if (typeof validationResult === 'boolean' && validationResult) {
113
+ violations.push({
114
+ location: {
115
+ elementType: 'edge',
116
+ elementId: source.transactionId,
117
+ pointer: '',
118
+ },
119
+ });
120
+ }
121
+ }
122
+ }
123
+ return violations;
124
+ }))
125
+ .concat(this.violations);
126
+ }
127
+ reportSkippedAndFailedTestCases(testResult) {
128
+ const skippedItems = [];
129
+ const failedItems = [];
130
+ testResult.cases.forEach((testCase) => {
131
+ if (testCase.status === 'skipped') {
132
+ this.ctx.logger.debug(`HTTP test case "${testCase.name}" from test "${this.name}" is skipped.`);
133
+ skippedItems.push({
134
+ name: testCase.name,
135
+ reason: testCase.reason ??
136
+ testCase.results
137
+ .filter((tc) => tc.type !== 'info' && tc.type !== 'assertion-success')
138
+ .map((tc) => tc.message)
139
+ .join('\n'),
140
+ });
141
+ }
142
+ else if (testCase.status === 'failed') {
143
+ this.ctx.logger.debug(`HTTP test case "${testCase.name}" from test "${this.name}" failed.`);
144
+ const assertionFailure = testCase.results.find((r) => r.type === 'assertion-failure' && !!r.transaction);
145
+ if (assertionFailure && assertionFailure.transaction) {
146
+ this.reportViolation({
147
+ location: {
148
+ elementType: 'edge',
149
+ elementId: assertionFailure.transaction.transactionId,
150
+ },
151
+ });
152
+ }
153
+ else {
154
+ failedItems.push({
155
+ name: testCase.name,
156
+ reason: testCase.reason ??
157
+ testCase.results
158
+ .filter((tc) => tc.type !== 'info' && tc.type !== 'assertion-success')
159
+ .map((tc) => tc.message)
160
+ .join('\n'),
161
+ });
162
+ }
163
+ }
164
+ });
165
+ if (skippedItems.length === 0 && failedItems.length === 0) {
166
+ return;
167
+ }
168
+ const sections = [];
169
+ if (skippedItems.length > 0) {
170
+ sections.push({
171
+ heading: 'Skipped test cases',
172
+ items: skippedItems.map((item) => ({
173
+ severity: 'info',
174
+ message: item.name,
175
+ details: item.reason,
176
+ })),
177
+ });
178
+ }
179
+ if (failedItems.length > 0) {
180
+ sections.push({
181
+ heading: 'Failed test cases',
182
+ items: failedItems.map((item) => ({
183
+ severity: 'warn',
184
+ message: item.name,
185
+ details: item.reason,
186
+ })),
187
+ });
188
+ }
189
+ const parts = [];
190
+ if (skippedItems.length > 0) {
191
+ parts.push(`${skippedItems.length} test case${skippedItems.length === 1 ? '' : 's'} skipped`);
192
+ }
193
+ if (failedItems.length > 0) {
194
+ parts.push(`${failedItems.length} test case${failedItems.length === 1 ? '' : 's'} failed`);
195
+ }
196
+ this.report({
197
+ source: this.pluginSource,
198
+ message: `[${this.name}] ${parts.join(' and ')}`,
199
+ sections,
200
+ });
201
+ }
202
+ async httpTest(pipeline) {
203
+ const testFn = httpTest(this.name, pipeline);
204
+ const testResult = await testFn(this.ctx);
205
+ this.reportSkippedAndFailedTestCases(testResult);
206
+ return this.violations;
207
+ }
208
+ async runHttpTest(pipeline) {
209
+ const testFn = httpTest(this.name, pipeline);
210
+ return testFn(this.ctx);
211
+ }
212
+ async validateHttpTransactions(filterExpr, validation = filterExpr) {
213
+ const validationFn = typeof validation === 'function'
214
+ ? validation
215
+ : httpFilterToTransactionValidationFn(validation);
216
+ const test = httpTest(this.name, singleTestCase().forTransactionsWith(filterExpr).run().done());
217
+ const testResult = await test(this.ctx);
218
+ this.reportSkippedAndFailedTestCases(testResult);
219
+ return testResult.cases
220
+ .filter((testCase) => testCase.status === 'passed')
221
+ .flatMap((testCase) => testCase.steps.flatMap((step) => {
222
+ const violations = [];
223
+ for (const transaction of step.transactions) {
224
+ const { request, response, source } = transaction;
225
+ if (!request || !response || !source) {
226
+ throw new ThymianBaseError('Invalid HTTP test case transaction: missing request, response, or source.');
227
+ }
228
+ const validationResult = validationFn(request, response, {
229
+ elementType: 'edge',
230
+ elementId: source.transactionId,
231
+ });
232
+ if (typeof validationResult === 'boolean' && validationResult) {
233
+ violations.push({
234
+ location: {
235
+ elementType: 'edge',
236
+ elementId: source.transactionId,
237
+ pointer: '',
238
+ },
239
+ });
240
+ }
241
+ if (validationResult && typeof validationResult === 'object') {
242
+ violations.push({
243
+ location: {
244
+ elementType: 'edge',
245
+ elementId: source.transactionId,
246
+ pointer: '',
247
+ },
248
+ ...validationResult,
249
+ });
250
+ }
251
+ }
252
+ return violations;
253
+ }))
254
+ .concat(this.violations);
255
+ }
256
+ }
257
+ //# sourceMappingURL=http-test-api-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-test-api-context.js","sourceRoot":"","sources":["../src/http-test-api-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type ThymianPlugin } from '@thymian/core';
2
+ export { createContext } from './create-context.js';
3
+ export { HttpTestApiContext } from './http-test-api-context.js';
4
+ export declare function createHttpTesterPlugin(pluginName?: string): ThymianPlugin;
5
+ export declare const httpTesterPlugin: ThymianPlugin;
6
+ export default httpTesterPlugin;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,aAAa,EAEnB,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,wBAAgB,sBAAsB,CACpC,UAAU,SAAgC,GACzC,aAAa,CA2Ef;AAED,eAAO,MAAM,gBAAgB,eAA2B,CAAC;AAEzD,eAAe,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ import { runRules, ThymianBaseError, ThymianFormat, } from '@thymian/core';
2
+ import { createContext } from './create-context.js';
3
+ import { HttpTestApiContext } from './http-test-api-context.js';
4
+ export { createContext } from './create-context.js';
5
+ export { HttpTestApiContext } from './http-test-api-context.js';
6
+ export function createHttpTesterPlugin(pluginName = '@thymian/plugin-http-tester') {
7
+ return {
8
+ name: pluginName,
9
+ version: '0.x',
10
+ actions: {
11
+ listensOn: ['core.test'],
12
+ },
13
+ async plugin(emitter, logger) {
14
+ emitter.onAction('core.test', async ({ format, rules = [], rulesConfig = {}, targetUrl }, ctx) => {
15
+ const thymianFormat = ThymianFormat.import(format);
16
+ const reportFn = (report) => emitter.emit('core.report', report);
17
+ let normalizedOrigin;
18
+ if (targetUrl != null) {
19
+ try {
20
+ const url = new URL(targetUrl);
21
+ normalizedOrigin = url.origin;
22
+ }
23
+ catch (error) {
24
+ throw new ThymianBaseError(`Invalid value for --target-url / config key "targetUrl" ("${targetUrl}"): ${error.message}`, {
25
+ suggestions: [
26
+ 'Provide a valid URL including the protocol (e.g., "http://localhost:3000").',
27
+ ],
28
+ });
29
+ }
30
+ }
31
+ const context = createContext(thymianFormat, logger, emitter, normalizedOrigin);
32
+ const adapter = {
33
+ errorName: 'TestLinterError',
34
+ mode: 'test',
35
+ getRuleFn: (rule) => rule.testRule,
36
+ createContext: (rule, options) => new HttpTestApiContext(rule.meta.name, context, reportFn, (options ?? {}).skipOrigins, pluginName),
37
+ };
38
+ const { violations, statistics } = await runRules(logger, rules, thymianFormat, rulesConfig, adapter);
39
+ ctx.reply({
40
+ source: pluginName,
41
+ status: violations.length === 0 ? 'success' : 'failed',
42
+ violations,
43
+ statistics,
44
+ });
45
+ });
46
+ },
47
+ };
48
+ }
49
+ export const httpTesterPlugin = createHttpTesterPlugin();
50
+ export default httpTesterPlugin;
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EAER,gBAAgB,EAChB,aAAa,GAGd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,UAAU,sBAAsB,CACpC,UAAU,GAAG,6BAA6B;IAE1C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,SAAS,EAAE,CAAC,WAAW,CAAC;SACzB;QACD,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM;YAC1B,OAAO,CAAC,QAAQ,CACd,WAAW,EACX,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE;gBACjE,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM,QAAQ,GAAG,CAAC,MAAqB,EAAE,EAAE,CACzC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBAEtC,IAAI,gBAAoC,CAAC;gBAEzC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;wBAC/B,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC;oBAChC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,IAAI,gBAAgB,CACxB,6DAA6D,SAAS,OAAQ,KAAe,CAAC,OAAO,EAAE,EACvG;4BACE,WAAW,EAAE;gCACX,6EAA6E;6BAC9E;yBACF,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,MAAM,OAAO,GAAG,aAAa,CAC3B,aAAa,EACb,MAAM,EACN,OAAO,EACP,gBAAgB,CACjB,CAAC;gBAEF,MAAM,OAAO,GAA0C;oBACrD,SAAS,EAAE,iBAAiB;oBAC5B,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ;oBACxC,aAAa,EAAE,CACb,IAAU,EACV,OAA4C,EAC5C,EAAE,CACF,IAAI,kBAAkB,CACpB,IAAI,CAAC,IAAI,CAAC,IAAI,EACd,OAAO,EACP,QAAQ,EACR,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAC3B,UAAU,CACX;iBACJ,CAAC;gBAEF,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAC/C,MAAM,EACN,KAAK,EACL,aAAa,EACb,WAAW,EACX,OAAO,CACR,CAAC;gBAEF,GAAG,CAAC,KAAK,CAAC;oBACR,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;oBACtD,UAAU;oBACV,UAAU;iBACX,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;AAEzD,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type HttpFilterExpression, type ThymianFormat, type ThymianHttpTransaction } from '@thymian/core';
2
+ export type StaticFilter = (thymianTransaction: ThymianHttpTransaction, format: ThymianFormat) => boolean;
3
+ export declare function httpFilterExpressionToFilter(expression: HttpFilterExpression): StaticFilter;
4
+ //# sourceMappingURL=http-filter-expression-to-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-expression-to-filter.d.ts","sourceRoot":"","sources":["../../src/visitors/http-filter-expression-to-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAG5B,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,YAAY,GAAG,CACzB,kBAAkB,EAAE,sBAAsB,EAC1C,MAAM,EAAE,aAAa,KAClB,OAAO,CAAC;AAqIb,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,oBAAoB,GAC/B,YAAY,CAEd"}
@@ -0,0 +1,105 @@
1
+ import { createFilterVisitor, createRegExpFromOriginWildcard, equalsIgnoreCase, thymianRequestToOrigin, visitHttpFilter, } from '@thymian/core';
2
+ const visitor = createFilterVisitor({
3
+ visitMethod({ method }) {
4
+ if (typeof method === 'undefined') {
5
+ return () => false;
6
+ }
7
+ return (transaction) => transaction.thymianReq.method.toLowerCase() === method.toLowerCase();
8
+ },
9
+ visitRequestHeader({ header }) {
10
+ if (typeof header === 'undefined') {
11
+ return () => false;
12
+ }
13
+ return (transaction) => {
14
+ return equalsIgnoreCase(header, ...Object.keys(transaction.thymianReq.headers));
15
+ };
16
+ },
17
+ visitQueryParam({ param }) {
18
+ if (typeof param === 'undefined') {
19
+ return () => false;
20
+ }
21
+ return (transaction) => {
22
+ return equalsIgnoreCase(param, ...Object.keys(transaction.thymianReq.queryParameters));
23
+ };
24
+ },
25
+ visitPath({ path }) {
26
+ if (typeof path === 'undefined') {
27
+ return () => false;
28
+ }
29
+ return (transaction) => transaction.thymianReq.path === path;
30
+ },
31
+ visitHasResponse({ filter }) {
32
+ const nestedFilter = httpFilterExpressionToFilter(filter);
33
+ return (transaction, format) => format
34
+ .getHttpResponsesOf(transaction.thymianReqId)
35
+ .some(([, , transactionId]) => {
36
+ const responseTransaction = format.getThymianHttpTransactionById(transactionId);
37
+ if (!responseTransaction) {
38
+ throw new Error('Cannot find transaction.');
39
+ }
40
+ return nestedFilter(responseTransaction, format);
41
+ });
42
+ },
43
+ visitIsAuthorized({ isAuthorized }) {
44
+ return (transaction, format) => format.requestIsSecured(transaction.thymianReqId) === isAuthorized;
45
+ },
46
+ visitOrigin({ origin }) {
47
+ return (transaction) => {
48
+ const req = transaction.thymianReq;
49
+ return `${req.protocol}://${req.host}:${req.port}` === origin;
50
+ };
51
+ },
52
+ visitHasBody({ hasBody }) {
53
+ return (transaction) => transaction.thymianReq.bodyRequired === hasBody;
54
+ },
55
+ visitPort({ port }) {
56
+ return (transaction) => transaction.thymianReq.port === port;
57
+ },
58
+ visitRequestMediaType({ mediaType }) {
59
+ return (transaction) => transaction.thymianReq.mediaType === mediaType;
60
+ },
61
+ visitUrl({ url }) {
62
+ return (transaction) => {
63
+ const req = transaction.thymianReq;
64
+ return (`${req.protocol}://${req.host}:${req.port}${req.path.startsWith('/') ? req.path : '/' + req.path}` === url);
65
+ };
66
+ },
67
+ visitProtocol({ protocol }) {
68
+ return (transaction) => transaction.thymianReq.protocol === protocol;
69
+ },
70
+ visitStatusCode({ code }) {
71
+ return (transaction) => transaction.thymianRes.statusCode === code;
72
+ },
73
+ visitHasResponseBody({ hasBody }) {
74
+ return (transaction) => !!transaction.thymianRes.schema === hasBody;
75
+ },
76
+ visitResponseHeader({ header }) {
77
+ if (typeof header === 'undefined') {
78
+ return () => false;
79
+ }
80
+ return (transaction) => equalsIgnoreCase(header, ...Object.keys(transaction.thymianRes.headers));
81
+ },
82
+ visitStatusCodeRange({ start, end }) {
83
+ return (transaction) => {
84
+ const statusCode = transaction.thymianRes.statusCode;
85
+ return (Number.isInteger(statusCode) && statusCode >= start && statusCode <= end);
86
+ };
87
+ },
88
+ visitResponseMediaType({ mediaType }) {
89
+ return (transaction) => transaction.thymianRes.mediaType === mediaType;
90
+ },
91
+ visitResponseTrailer() {
92
+ throw new Error('Response trailers are not currently supported.');
93
+ },
94
+ visitMatchesOrigin({ origin }) {
95
+ if (typeof origin !== 'string') {
96
+ return () => false;
97
+ }
98
+ const regExp = createRegExpFromOriginWildcard(origin);
99
+ return (transaction) => regExp.test(thymianRequestToOrigin(transaction.thymianReq));
100
+ },
101
+ });
102
+ export function httpFilterExpressionToFilter(expression) {
103
+ return visitHttpFilter(expression, visitor);
104
+ }
105
+ //# sourceMappingURL=http-filter-expression-to-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-expression-to-filter.js","sourceRoot":"","sources":["../../src/visitors/http-filter-expression-to-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type HttpFilterExpression, ThymianFormat, type ThymianHttpTransaction } from '@thymian/core';
2
+ export type GroupByFn = (transaction: ThymianHttpTransaction, format: ThymianFormat) => string;
3
+ export declare function httpFilterToGroupByFn(expression: HttpFilterExpression): GroupByFn;
4
+ //# sourceMappingURL=http-filter-to-static-by-fn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-to-static-by-fn.d.ts","sourceRoot":"","sources":["../../src/visitors/http-filter-to-static-by-fn.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAIzB,aAAa,EACb,KAAK,sBAAsB,EAE5B,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,SAAS,GAAG,CACtB,WAAW,EAAE,sBAAsB,EACnC,MAAM,EAAE,aAAa,KAClB,MAAM,CAAC;AAmIZ,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,oBAAoB,GAC/B,SAAS,CAEX"}
@@ -0,0 +1,113 @@
1
+ import { equalsIgnoreCase, ThymianBaseError, ThymianFormat, visitHttpFilter, } from '@thymian/core';
2
+ const visitor = {
3
+ visitOrigin() {
4
+ return (transaction) => {
5
+ const req = transaction.thymianReq;
6
+ return `${req.protocol}://${req.host}:${req.port}`;
7
+ };
8
+ },
9
+ visitUrl() {
10
+ return (transaction) => {
11
+ const req = transaction.thymianReq;
12
+ return `${req.protocol}://${req.host}:${req.port}${req.path.startsWith('/') ? req.path : '/' + req.path}`;
13
+ };
14
+ },
15
+ visitPort() {
16
+ return (transaction) => String(transaction.thymianReq.port);
17
+ },
18
+ visitRequestMediaType() {
19
+ return (transaction) => transaction.thymianReq.mediaType;
20
+ },
21
+ visitResponseMediaType() {
22
+ return (transaction) => transaction.thymianRes.mediaType;
23
+ },
24
+ visitQueryParam({ param }) {
25
+ return (transaction) => {
26
+ if (!param) {
27
+ return '';
28
+ }
29
+ const keys = Object.keys(transaction.thymianReq.queryParameters);
30
+ const found = keys.find((k) => equalsIgnoreCase(k, param));
31
+ return found ? String(transaction.thymianReq.queryParameters[found]) : '';
32
+ };
33
+ },
34
+ visitIsAuthorized() {
35
+ return (transaction, format) => String(format.requestIsSecured(transaction.thymianReqId));
36
+ },
37
+ visitMethod() {
38
+ return (transaction) => transaction.thymianReq.method.toUpperCase();
39
+ },
40
+ visitRequestHeader({ header }) {
41
+ return (transaction) => {
42
+ if (!header) {
43
+ return '';
44
+ }
45
+ const keys = Object.keys(transaction.thymianReq.headers);
46
+ const found = keys.find((k) => equalsIgnoreCase(k, header));
47
+ return found ? String(transaction.thymianReq.headers[found]) : '';
48
+ };
49
+ },
50
+ visitPath() {
51
+ return (transaction) => transaction.thymianReq.path;
52
+ },
53
+ visitStatusCode() {
54
+ return (transaction) => String(transaction.thymianRes.statusCode);
55
+ },
56
+ visitResponseHeader({ header }) {
57
+ return (transaction) => {
58
+ if (!header) {
59
+ return '';
60
+ }
61
+ const keys = Object.keys(transaction.thymianRes.headers);
62
+ const found = keys.find((k) => equalsIgnoreCase(k, header));
63
+ return found ? String(transaction.thymianRes.headers[found]) : '';
64
+ };
65
+ },
66
+ visitHasResponse() {
67
+ throw new ThymianBaseError(`Unsupported group by expression "hasResponse" for grouping common HTTP transactions.`, {
68
+ name: 'UnsupportedGroupByExpression',
69
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
70
+ suggestions: ['Use another expression type.'],
71
+ });
72
+ },
73
+ visitHasBody() {
74
+ throw new ThymianBaseError(`Unsupported group by expression "hasBody" for grouping common HTTP transactions.`, {
75
+ name: 'UnsupportedGroupByExpression',
76
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
77
+ suggestions: ['Use another expression type.'],
78
+ });
79
+ },
80
+ visitHasResponseBody() {
81
+ throw new ThymianBaseError(`Unsupported group by expression "hasResponseBody" for grouping common HTTP transactions.`, {
82
+ name: 'UnsupportedGroupByExpression',
83
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
84
+ suggestions: ['Use another expression type.'],
85
+ });
86
+ },
87
+ visitStatusCodeRange() {
88
+ throw new ThymianBaseError(`Unsupported group by expression "statusCodeRange" for grouping common HTTP transactions.`, {
89
+ name: 'UnsupportedGroupByExpression',
90
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
91
+ suggestions: ['Use another expression type.'],
92
+ });
93
+ },
94
+ visitProtocol() {
95
+ return (transaction) => transaction.thymianReq.protocol;
96
+ },
97
+ visitResponseTrailer() {
98
+ throw new ThymianBaseError(`Unsupported group by expression "responseTrailer" for grouping common HTTP transactions.`, {
99
+ name: 'UnsupportedGroupByExpression',
100
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
101
+ suggestions: ['Use another expression type.'],
102
+ });
103
+ },
104
+ visitAnd(expr) {
105
+ return (transaction, format) => expr.filters
106
+ .map((filter) => httpFilterToGroupByFn(filter)(transaction, format))
107
+ .join(' ');
108
+ },
109
+ };
110
+ export function httpFilterToGroupByFn(expression) {
111
+ return visitHttpFilter(expression, visitor);
112
+ }
113
+ //# sourceMappingURL=http-filter-to-static-by-fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-to-static-by-fn.js","sourceRoot":"","sources":["../../src/visitors/http-filter-to-static-by-fn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ValidationFn } from '@thymian/core';
2
+ import { type HttpFilterExpression, type HttpRequest, type HttpResponse } from '@thymian/core';
3
+ export declare function httpFilterToTransactionValidationFn(filterExpression: HttpFilterExpression): ValidationFn<[HttpRequest, HttpResponse]>;
4
+ //# sourceMappingURL=http-filter-to-transaction-validation-fn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-to-transaction-validation-fn.d.ts","sourceRoot":"","sources":["../../src/visitors/http-filter-to-transaction-validation-fn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAKL,KAAK,oBAAoB,EAEzB,KAAK,WAAW,EAChB,KAAK,YAAY,EAIlB,MAAM,eAAe,CAAC;AAEvB,wBAAgB,mCAAmC,CACjD,gBAAgB,EAAE,oBAAoB,GACrC,YAAY,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAK3C"}
@@ -0,0 +1,126 @@
1
+ import { createFilterVisitor, createRegExpFromOriginWildcard, equalsIgnoreCase, getContentType, queryParamsFromRequest, thymianRequestToOrigin, visitHttpFilter, } from '@thymian/core';
2
+ export function httpFilterToTransactionValidationFn(filterExpression) {
3
+ return visitHttpFilter(filterExpression, createTransactionValidationVisitor());
4
+ }
5
+ function createTransactionValidationVisitor() {
6
+ return createFilterVisitor({
7
+ visitMethod(expr) {
8
+ if (typeof expr.method === 'undefined') {
9
+ return () => false;
10
+ }
11
+ return (req) => req.method === expr.method;
12
+ },
13
+ visitRequestHeader(expr) {
14
+ return (req) => {
15
+ if (!req.headers || !expr.header) {
16
+ return false;
17
+ }
18
+ const headerValue = req.headers[expr.header];
19
+ if (typeof expr.value === 'undefined') {
20
+ return headerValue !== undefined;
21
+ }
22
+ return headerValue === expr.value;
23
+ };
24
+ },
25
+ visitQueryParam({ param, value }) {
26
+ if (typeof param === 'undefined') {
27
+ return () => false;
28
+ }
29
+ return (req) => {
30
+ const queryParams = queryParamsFromRequest(req);
31
+ const paramValue = queryParams[param];
32
+ if (typeof value === 'undefined') {
33
+ return paramValue !== undefined;
34
+ }
35
+ return paramValue === value;
36
+ };
37
+ },
38
+ visitPath(expr) {
39
+ return (req) => req.path === expr.path;
40
+ },
41
+ visitHasResponse(expr) {
42
+ return (req, res) => {
43
+ const fn = httpFilterToTransactionValidationFn(expr.filter);
44
+ return !!fn(req, res);
45
+ };
46
+ },
47
+ visitOrigin(expr) {
48
+ return (req) => {
49
+ return req.origin === expr.origin;
50
+ };
51
+ },
52
+ visitHasBody(expr) {
53
+ return (req) => {
54
+ const hasBody = req.body !== undefined && req.body !== null;
55
+ return hasBody === (expr.hasBody ?? true);
56
+ };
57
+ },
58
+ visitPort(expr) {
59
+ return (req) => new URL(req.path, req.origin).port === expr.port?.toString();
60
+ },
61
+ visitRequestMediaType(expr) {
62
+ return (req) => {
63
+ const contentType = getContentType(req.headers);
64
+ return equalsIgnoreCase(contentType, expr.mediaType ?? '');
65
+ };
66
+ },
67
+ visitUrl(expr) {
68
+ return (req) => {
69
+ const url = new URL(req.path, req.origin).toString();
70
+ return url === expr.url;
71
+ };
72
+ },
73
+ visitStatusCode(expr) {
74
+ return (_req, res) => res.statusCode === expr.code;
75
+ },
76
+ visitHasResponseBody(expr) {
77
+ return (_req, res) => {
78
+ const hasBody = res.body !== undefined && res.body !== null;
79
+ return hasBody === (expr.hasBody ?? true);
80
+ };
81
+ },
82
+ visitResponseHeader({ header, value }) {
83
+ if (typeof header === 'undefined') {
84
+ return () => false;
85
+ }
86
+ return (_req, res) => {
87
+ const headerValue = res.headers[header];
88
+ if (typeof value === 'undefined') {
89
+ return headerValue !== undefined;
90
+ }
91
+ return headerValue === value;
92
+ };
93
+ },
94
+ visitStatusCodeRange(expr) {
95
+ return (_req, res) => Number.isInteger(res.statusCode) &&
96
+ res.statusCode >= expr.start &&
97
+ res.statusCode <= expr.end;
98
+ },
99
+ visitResponseMediaType({ mediaType }) {
100
+ return (_req, res) => {
101
+ const contentType = res.headers['content-type'];
102
+ return contentType?.includes(mediaType ?? '') ?? false;
103
+ };
104
+ },
105
+ visitResponseTrailer({ trailer, value }) {
106
+ if (typeof trailer === 'undefined') {
107
+ return () => false;
108
+ }
109
+ return (_req, res) => {
110
+ const trailerValue = res.trailers?.[trailer];
111
+ if (typeof value === 'undefined') {
112
+ return trailerValue !== undefined;
113
+ }
114
+ return trailerValue === value;
115
+ };
116
+ },
117
+ visitMatchesOrigin({ origin }) {
118
+ if (typeof origin !== 'string') {
119
+ return () => false;
120
+ }
121
+ const regExp = createRegExpFromOriginWildcard(origin);
122
+ return (transaction) => regExp.test(thymianRequestToOrigin(transaction.thymianReq));
123
+ },
124
+ });
125
+ }
126
+ //# sourceMappingURL=http-filter-to-transaction-validation-fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-to-transaction-validation-fn.js","sourceRoot":"","sources":["../../src/visitors/http-filter-to-transaction-validation-fn.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@thymian/plugin-http-tester",
3
+ "version": "0.0.0-PLACEHOLDER",
4
+ "description": "Thymian plugin for runtime HTTP conformance testing against live API endpoints",
5
+ "license": "AGPL-3.0-only",
6
+ "bugs": {
7
+ "url": "https://github.com/thymianofficial/thymian/issues"
8
+ },
9
+ "homepage": "https://thymian.dev",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/thymianofficial/thymian.git",
13
+ "directory": "packages/plugin-http-tester"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "keywords": [
19
+ "thymian",
20
+ "api-testing",
21
+ "conformance-testing",
22
+ "http-testing",
23
+ "rfc-9110",
24
+ "rest-api",
25
+ "validator"
26
+ ],
27
+ "main": "./dist/index.js",
28
+ "module": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "type": "module",
31
+ "exports": {
32
+ "./package.json": "./package.json",
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.js",
36
+ "default": "./dist/index.js"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "!**/*.tsbuildinfo"
42
+ ],
43
+ "dependencies": {
44
+ "@thymian/core": "0.0.0-PLACEHOLDER",
45
+ "rxjs": "^7.8.2",
46
+ "tslib": "^2.3.0"
47
+ },
48
+ "devDependencies": {
49
+ "@thymian/core-testing": "0.0.0-PLACEHOLDER"
50
+ }
51
+ }