Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b4f1516

Browse files
committed
Add "hand rolled" ConformanceApi plugin.
Codegen is incoming!
1 parent c11db89 commit b4f1516

File tree

4 files changed

+677
-4
lines changed

4 files changed

+677
-4
lines changed

conformance/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"scripts": {
66
"build": "tsc",
77
"test": "npm run --silent build && mocha dist/ts/test/conformanceApiTests.js",
8-
"start:fastify": "npm run --silent build && fastify start -p 4117 -w -l info -P dist/ts/src/fastify/app.js && mocha dist/ts/test/conformanceApiTests.js"
8+
"fastify": "npm run --silent build && fastify start -p 4117 -w -l info -P dist/ts/src/fastify/app.js"
99
},
1010
"repository": {
1111
"type": "git",
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { IServiceError, IServiceResult } from "facility-core";
2+
import { IConformanceApi, IGetApiInfoRequest, IGetApiInfoResponse, IGetWidgetsRequest, IGetWidgetsResponse, ICreateWidgetRequest, ICreateWidgetResponse, IGetWidgetRequest, IGetWidgetResponse, IDeleteWidgetRequest, IDeleteWidgetResponse, IGetWidgetBatchRequest, IGetWidgetBatchResponse, IMirrorFieldsRequest, IMirrorFieldsResponse, ICheckQueryRequest, ICheckQueryResponse, ICheckPathRequest, ICheckPathResponse, IMirrorHeadersRequest, IMirrorHeadersResponse, IMixedRequest, IMixedResponse, IRequiredRequest, IRequiredResponse, IMirrorBytesRequest, IMirrorBytesResponse, IMirrorTextRequest, IMirrorTextResponse, IBodyTypesRequest, IBodyTypesResponse } from "./conformanceApiTypes";
3+
4+
export type ConformanceApiTest = {
5+
test: string;
6+
method: string;
7+
request: unknown;
8+
response?: unknown;
9+
error?: IServiceError;
10+
};
11+
12+
export class ConformanceApiService implements IConformanceApi {
13+
constructor(tests: ConformanceApiTest[]) {
14+
this._tests = tests;
15+
}
16+
17+
getApiInfo(request: IGetApiInfoRequest, context?: unknown): Promise<IServiceResult<IGetApiInfoResponse>> {
18+
return this.execute("getApiInfo", request);
19+
}
20+
21+
getWidgets(request: IGetWidgetsRequest, context?: unknown): Promise<IServiceResult<IGetWidgetsResponse>> {
22+
return this.execute("getWidgets", request);
23+
}
24+
25+
createWidget(request: ICreateWidgetRequest, context?: unknown): Promise<IServiceResult<ICreateWidgetResponse>> {
26+
return this.execute("createWidget", request);
27+
}
28+
29+
getWidget(request: IGetWidgetRequest, context?: unknown): Promise<IServiceResult<IGetWidgetResponse>> {
30+
return this.execute("getWidget", request);
31+
}
32+
33+
deleteWidget(request: IDeleteWidgetRequest, context?: unknown): Promise<IServiceResult<IDeleteWidgetResponse>> {
34+
return this.execute("deleteWidget", request);
35+
}
36+
37+
getWidgetBatch(request: IGetWidgetBatchRequest, context?: unknown): Promise<IServiceResult<IGetWidgetBatchResponse>> {
38+
return this.execute("getWidgetBatch", request);
39+
}
40+
41+
mirrorFields(request: IMirrorFieldsRequest, context?: unknown): Promise<IServiceResult<IMirrorFieldsResponse>> {
42+
return this.execute("mirrorFields", request);
43+
}
44+
45+
checkQuery(request: ICheckQueryRequest, context?: unknown): Promise<IServiceResult<ICheckQueryResponse>> {
46+
return this.execute("checkQuery", request);
47+
}
48+
49+
checkPath(request: ICheckPathRequest, context?: unknown): Promise<IServiceResult<ICheckPathResponse>> {
50+
return this.execute("checkPath", request);
51+
}
52+
53+
mirrorHeaders(request: IMirrorHeadersRequest, context?: unknown): Promise<IServiceResult<IMirrorHeadersResponse>> {
54+
return this.execute("mirrorHeaders", request);
55+
}
56+
57+
mixed(request: IMixedRequest, context?: unknown): Promise<IServiceResult<IMixedResponse>> {
58+
return this.execute("mixed", request);
59+
}
60+
61+
required(request: IRequiredRequest, context?: unknown): Promise<IServiceResult<IRequiredResponse>> {
62+
return this.execute("required", request);
63+
}
64+
65+
mirrorBytes(request: IMirrorBytesRequest, context?: unknown): Promise<IServiceResult<IMirrorBytesResponse>> {
66+
return this.execute("mirrorBytes", request);
67+
}
68+
69+
mirrorText(request: IMirrorTextRequest, context?: unknown): Promise<IServiceResult<IMirrorTextResponse>> {
70+
return this.execute("mirrorText", request);
71+
}
72+
73+
bodyTypes(request: IBodyTypesRequest, context?: unknown): Promise<IServiceResult<IBodyTypesResponse>> {
74+
return this.execute("bodyTypes", request);
75+
}
76+
77+
private async execute<TRequest, TResponse>(methodName: string, request: TRequest): Promise<IServiceResult<TResponse>> {
78+
const testsWithMethodName = this._tests.filter((x) => x.method === methodName);
79+
80+
if (testsWithMethodName.length === 0) {
81+
return this.failure({
82+
code: "InvalidRequest",
83+
message: `No tests found for method ${methodName}.`,
84+
});
85+
}
86+
87+
const testsWithMatchingRequest = testsWithMethodName.filter((x) => {
88+
return JSON.stringify(x.request) === JSON.stringify(request);
89+
});
90+
91+
if (testsWithMatchingRequest.length !== 1) {
92+
return this.failure({
93+
code: "InvalidRequest",
94+
message: `${testsWithMatchingRequest.length} of ${testsWithMethodName.length} tests for method ${methodName} matched request:`,
95+
});
96+
}
97+
98+
var testInfo = testsWithMatchingRequest[0];
99+
return testInfo.error ? this.failure(testInfo.error) : this.success(testInfo.response as TResponse);
100+
}
101+
102+
private success<T>(result: T): IServiceResult<T> { return { value: result }; }
103+
104+
private failure<T>(error: IServiceError): IServiceResult<T> { return { error}; }
105+
106+
private readonly _tests: readonly ConformanceApiTest[];
107+
108+
}

conformance/ts/src/fastify/app.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1+
import fs from "fs";
2+
import path from "path";
13
import { FastifyPluginAsync } from "fastify";
4+
import { ConformanceApiService } from "../conformanceApiService.js";
5+
import { handRolledPlugin } from "./handRolledPlugin.js";
6+
import conformanceTestsJson from '../../../ConformanceTests.json';
27

38
export type AppOptions = {};
49
const options: AppOptions = {};
510

611
const app: FastifyPluginAsync<AppOptions> = async (fastify, opts): Promise<void> => {
7-
fastify.get('/', () => {
8-
return { hello: 'world' };
9-
});
12+
fastify.register(handRolledPlugin, { api: new ConformanceApiService(conformanceTestsJson.tests) });
1013
};
1114

1215
export default app;

0 commit comments

Comments
 (0)