@thymian/plugin-http-tester 0.1.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/dist/create-context.d.ts +4 -0
- package/dist/create-context.d.ts.map +1 -0
- package/dist/create-context.js +25 -0
- package/dist/create-context.js.map +1 -0
- package/dist/http-test-api-context.d.ts +39 -0
- package/dist/http-test-api-context.d.ts.map +1 -0
- package/dist/http-test-api-context.js +257 -0
- package/dist/http-test-api-context.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/visitors/http-filter-expression-to-filter.d.ts +4 -0
- package/dist/visitors/http-filter-expression-to-filter.d.ts.map +1 -0
- package/dist/visitors/http-filter-expression-to-filter.js +105 -0
- package/dist/visitors/http-filter-expression-to-filter.js.map +1 -0
- package/dist/visitors/http-filter-to-static-by-fn.d.ts +4 -0
- package/dist/visitors/http-filter-to-static-by-fn.d.ts.map +1 -0
- package/dist/visitors/http-filter-to-static-by-fn.js +113 -0
- package/dist/visitors/http-filter-to-static-by-fn.js.map +1 -0
- package/dist/visitors/http-filter-to-transaction-validation-fn.d.ts +4 -0
- package/dist/visitors/http-filter-to-transaction-validation-fn.d.ts.map +1 -0
- package/dist/visitors/http-filter-to-transaction-validation-fn.js +126 -0
- package/dist/visitors/http-filter-to-transaction-validation-fn.js.map +1 -0
- package/package.json +32 -0
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
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 type HttpTesterPluginOptions = Record<string, never>;
|
|
5
|
+
export declare function createHttpTesterPlugin(pluginName?: string): ThymianPlugin<HttpTesterPluginOptions>;
|
|
6
|
+
export declare const httpTesterPlugin: ThymianPlugin<HttpTesterPluginOptions>;
|
|
7
|
+
export default httpTesterPlugin;
|
|
8
|
+
//# 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,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE5D,wBAAgB,sBAAsB,CACpC,UAAU,SAAgC,GACzC,aAAa,CAAC,uBAAuB,CAAC,CA2ExC;AAED,eAAO,MAAM,gBAAgB,wCAA2B,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;AAIhE,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,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thymian/plugin-http-tester",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "AGPL-3.0-only",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"exports": {
|
|
13
|
+
"./package.json": "./package.json",
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"!**/*.tsbuildinfo"
|
|
23
|
+
],
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@thymian/core": "0.1.0",
|
|
26
|
+
"rxjs": "^7.8.2",
|
|
27
|
+
"tslib": "^2.3.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@thymian/core-testing": "0.1.0"
|
|
31
|
+
}
|
|
32
|
+
}
|