@geekmidas/constructs 0.0.1 → 0.0.3
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/{AWSLambdaFunction-CpHFE2m6.d.mts → AWSLambdaFunction-CANc3Qo2.d.mts} +3 -3
- package/dist/{AWSLambdaFunction-qA5LqPsv.cjs → AWSLambdaFunction-DW9qrBNR.cjs} +2 -2
- package/dist/{AWSLambdaFunction-qA5LqPsv.cjs.map → AWSLambdaFunction-DW9qrBNR.cjs.map} +1 -1
- package/dist/{AWSLambdaFunction-DWIZYsCy.mjs → AWSLambdaFunction-nic3vzt3.mjs} +2 -2
- package/dist/{AWSLambdaFunction-DWIZYsCy.mjs.map → AWSLambdaFunction-nic3vzt3.mjs.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs → AWSLambdaSubscriberAdaptor-BhqrpTVc.mjs} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs.map → AWSLambdaSubscriberAdaptor-BhqrpTVc.mjs.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-C1wQuucQ.d.mts → AWSLambdaSubscriberAdaptor-C6JYIZxn.d.mts} +2 -2
- package/dist/{AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs → AWSLambdaSubscriberAdaptor-ZuQAhW9_.cjs} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs.map → AWSLambdaSubscriberAdaptor-ZuQAhW9_.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-BoBh7vvD.d.mts → AmazonApiGatewayEndpointAdaptor-DNZLntHj.d.mts} +3 -3
- package/dist/{AmazonApiGatewayEndpointAdaptor-i74DEUbc.cjs → AmazonApiGatewayEndpointAdaptor-D_Q_NTMT.cjs} +3 -3
- package/dist/{AmazonApiGatewayEndpointAdaptor-i74DEUbc.cjs.map → AmazonApiGatewayEndpointAdaptor-D_Q_NTMT.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-Cx1oqcqh.mjs → AmazonApiGatewayEndpointAdaptor-QzIAnWzS.mjs} +3 -3
- package/dist/{AmazonApiGatewayEndpointAdaptor-Cx1oqcqh.mjs.map → AmazonApiGatewayEndpointAdaptor-QzIAnWzS.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-CLmBDYsl.mjs → AmazonApiGatewayV1EndpointAdaptor-BF5bGWV1.mjs} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-CLmBDYsl.mjs.map → AmazonApiGatewayV1EndpointAdaptor-BF5bGWV1.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-GkMAUPL5.cjs → AmazonApiGatewayV1EndpointAdaptor-Bh4tckwd.cjs} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-GkMAUPL5.cjs.map → AmazonApiGatewayV1EndpointAdaptor-Bh4tckwd.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-EhMd1YqV.d.mts → AmazonApiGatewayV1EndpointAdaptor-DbJa4cpU.d.mts} +4 -4
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-3RqegmJC.mjs → AmazonApiGatewayV2EndpointAdaptor-BOaOkLXF.mjs} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-3RqegmJC.mjs.map → AmazonApiGatewayV2EndpointAdaptor-BOaOkLXF.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-zfd1gqXA.d.mts → AmazonApiGatewayV2EndpointAdaptor-BlKn-KJ6.d.mts} +4 -4
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-YlFoFSS9.cjs → AmazonApiGatewayV2EndpointAdaptor-L4Ywv3Pk.cjs} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-YlFoFSS9.cjs.map → AmazonApiGatewayV2EndpointAdaptor-L4Ywv3Pk.cjs.map} +1 -1
- package/dist/{BaseFunctionBuilder-BFPVGnKi.d.mts → BaseFunctionBuilder-Dda7AiID.d.mts} +2 -2
- package/dist/{Construct-DIguIyw4.d.mts → Construct-DdyYENBD.d.mts} +1 -1
- package/dist/Construct.d.mts +1 -1
- package/dist/{Cron-Bgs6EQOb.mjs → Cron-BgJo6EW6.mjs} +1 -1
- package/dist/{Cron-Bgs6EQOb.mjs.map → Cron-BgJo6EW6.mjs.map} +1 -1
- package/dist/{Cron-ztnK6zgU.d.cts → Cron-BxMXmn4t.d.cts} +1 -1
- package/dist/{Cron-DQiCj3ef.cjs → Cron-JYYGj5ik.cjs} +1 -1
- package/dist/{Cron-DQiCj3ef.cjs.map → Cron-JYYGj5ik.cjs.map} +1 -1
- package/dist/{Cron-FpAw03k6.d.mts → Cron-NDBlJhb3.d.mts} +2 -2
- package/dist/{CronBuilder-DIBqJkh_.cjs → CronBuilder-BDDS21OP.cjs} +2 -2
- package/dist/{CronBuilder-DIBqJkh_.cjs.map → CronBuilder-BDDS21OP.cjs.map} +1 -1
- package/dist/{CronBuilder-Cje9K8lZ.d.cts → CronBuilder-C6K5AbIO.d.cts} +2 -2
- package/dist/{CronBuilder-DecAvvcn.mjs → CronBuilder-DVuhB_kA.mjs} +2 -2
- package/dist/{CronBuilder-DecAvvcn.mjs.map → CronBuilder-DVuhB_kA.mjs.map} +1 -1
- package/dist/{CronBuilder-B2clNQSP.d.mts → CronBuilder-s5x8V8hH.d.mts} +4 -4
- package/dist/{Endpoint-BaHC9y4Z.cjs → Endpoint-D1nnEsBU.cjs} +1 -1
- package/dist/{Endpoint-BaHC9y4Z.cjs.map → Endpoint-D1nnEsBU.cjs.map} +1 -1
- package/dist/{Endpoint-ierdM62O.mjs → Endpoint-DNlmybXV.mjs} +1 -1
- package/dist/{Endpoint-ierdM62O.mjs.map → Endpoint-DNlmybXV.mjs.map} +1 -1
- package/dist/{Endpoint-DCn53Vd8.d.mts → Endpoint-DYUjJdEs.d.mts} +3 -3
- package/dist/{EndpointBuilder-CP9RGwZH.d.cts → EndpointBuilder-1fw103D6.d.cts} +1 -1
- package/dist/{EndpointBuilder-Bfnb2oJr.d.mts → EndpointBuilder-B2iScUND.d.mts} +4 -4
- package/dist/{EndpointBuilder-BHFSpbPR.cjs → EndpointBuilder-BhRd626m.cjs} +2 -2
- package/dist/{EndpointBuilder-BHFSpbPR.cjs.map → EndpointBuilder-BhRd626m.cjs.map} +1 -1
- package/dist/{EndpointBuilder-BLUsoK3l.mjs → EndpointBuilder-CpjIMYb0.mjs} +2 -2
- package/dist/{EndpointBuilder-BLUsoK3l.mjs.map → EndpointBuilder-CpjIMYb0.mjs.map} +1 -1
- package/dist/{EndpointFactory-CXX4E6Gx.cjs → EndpointFactory-ChmVHWim.cjs} +2 -2
- package/dist/{EndpointFactory-CXX4E6Gx.cjs.map → EndpointFactory-ChmVHWim.cjs.map} +1 -1
- package/dist/{EndpointFactory-D2zgWbXZ.d.cts → EndpointFactory-D576BhaH.d.cts} +2 -2
- package/dist/{EndpointFactory-BYdDVCNj.mjs → EndpointFactory-DLpEbLzL.mjs} +2 -2
- package/dist/{EndpointFactory-BYdDVCNj.mjs.map → EndpointFactory-DLpEbLzL.mjs.map} +1 -1
- package/dist/{EndpointFactory-CNtMXgIh.d.mts → EndpointFactory-DZQpM-9K.d.mts} +3 -3
- package/dist/{Function-BsBxc2wA.d.mts → Function-C98H68DW.d.mts} +2 -2
- package/dist/{FunctionBuilder-C-PfPN3r.d.mts → FunctionBuilder-DBwR7jg7.d.mts} +4 -4
- package/dist/{FunctionExecutionWrapper-DvglBBjE.d.mts → FunctionExecutionWrapper-B0V7V8YS.d.mts} +2 -2
- package/dist/{FunctionExecutionWrapper-XGrSAAPD.mjs → FunctionExecutionWrapper-CPzSbfaI.mjs} +1 -1
- package/dist/{FunctionExecutionWrapper-XGrSAAPD.mjs.map → FunctionExecutionWrapper-CPzSbfaI.mjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-CElXEjPe.cjs → FunctionExecutionWrapper-UzfHDM2R.cjs} +1 -1
- package/dist/{FunctionExecutionWrapper-CElXEjPe.cjs.map → FunctionExecutionWrapper-UzfHDM2R.cjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-B0IO1zj2.d.mts → HonoEndpointAdaptor-01cH100U.d.mts} +5 -5
- package/dist/{HonoEndpointAdaptor-B4snrp7v.cjs → HonoEndpointAdaptor-6LERutxi.cjs} +4 -4
- package/dist/{HonoEndpointAdaptor-B4snrp7v.cjs.map → HonoEndpointAdaptor-6LERutxi.cjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-D-M4-6Tf.mjs → HonoEndpointAdaptor-fs2928iO.mjs} +4 -4
- package/dist/{HonoEndpointAdaptor-D-M4-6Tf.mjs.map → HonoEndpointAdaptor-fs2928iO.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-B6lW9Q1k.d.cts → HonoEndpointAdaptor-ua6mp3gt.d.cts} +3 -3
- package/dist/{Subscriber-BwuCaC9G.mjs → Subscriber-BTwKnz3c.mjs} +1 -1
- package/dist/{Subscriber-BwuCaC9G.mjs.map → Subscriber-BTwKnz3c.mjs.map} +1 -1
- package/dist/{Subscriber-THGsj7Iy.d.mts → Subscriber-BxH6n8zQ.d.mts} +2 -2
- package/dist/{Subscriber-iMRFG7ba.cjs → Subscriber-G7EUI3yc.cjs} +1 -1
- package/dist/{Subscriber-iMRFG7ba.cjs.map → Subscriber-G7EUI3yc.cjs.map} +1 -1
- package/dist/{SubscriberBuilder-CiPxgnKT.d.mts → SubscriberBuilder-BpSDPzBz.d.mts} +2 -2
- package/dist/{SubscriberBuilder-Dhz0C_t-.mjs → SubscriberBuilder-C1me_972.mjs} +2 -2
- package/dist/{SubscriberBuilder-Dhz0C_t-.mjs.map → SubscriberBuilder-C1me_972.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-wthr-FL9.cjs → SubscriberBuilder-C6iZvuDe.cjs} +2 -2
- package/dist/{SubscriberBuilder-wthr-FL9.cjs.map → SubscriberBuilder-C6iZvuDe.cjs.map} +1 -1
- package/dist/{SubscriberBuilder-DuIgxuzc.d.cts → SubscriberBuilder-DgljKtYu.d.cts} +1 -1
- package/dist/TestEndpointAdaptor-B4SvJvK-.cjs +54 -0
- package/dist/TestEndpointAdaptor-B4SvJvK-.cjs.map +1 -0
- package/dist/TestEndpointAdaptor-CHcgyI3V.d.cts +24 -0
- package/dist/TestEndpointAdaptor-CelYsQi0.mjs +48 -0
- package/dist/TestEndpointAdaptor-CelYsQi0.mjs.map +1 -0
- package/dist/TestEndpointAdaptor-Da0ooGt2.d.mts +24 -0
- package/dist/adaptors/aws.cjs +8 -8
- package/dist/adaptors/aws.d.cts +1 -1
- package/dist/adaptors/aws.d.mts +14 -14
- package/dist/adaptors/aws.mjs +8 -8
- package/dist/adaptors/hono.cjs +4 -4
- package/dist/adaptors/hono.d.cts +2 -2
- package/dist/adaptors/hono.d.mts +8 -8
- package/dist/adaptors/hono.mjs +4 -4
- package/dist/adaptors/testing.cjs +10 -0
- package/dist/adaptors/testing.d.cts +9 -0
- package/dist/adaptors/testing.d.mts +9 -0
- package/dist/adaptors/testing.mjs +10 -0
- package/dist/crons/Cron.cjs +1 -1
- package/dist/crons/Cron.d.cts +2 -2
- package/dist/crons/Cron.d.mts +6 -6
- package/dist/crons/Cron.mjs +1 -1
- package/dist/crons/CronBuilder.cjs +2 -2
- package/dist/crons/CronBuilder.d.cts +3 -3
- package/dist/crons/CronBuilder.d.mts +7 -7
- package/dist/crons/CronBuilder.mjs +2 -2
- package/dist/crons/index.cjs +2 -2
- package/dist/crons/index.d.cts +7 -7
- package/dist/crons/index.d.mts +11 -11
- package/dist/crons/index.mjs +2 -2
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +2 -2
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +8 -8
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +2 -2
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +9 -9
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +9 -9
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +4 -4
- package/dist/endpoints/Endpoint.cjs +1 -1
- package/dist/endpoints/Endpoint.d.cts +1 -1
- package/dist/endpoints/Endpoint.d.mts +7 -7
- package/dist/endpoints/Endpoint.mjs +1 -1
- package/dist/endpoints/EndpointBuilder.cjs +2 -2
- package/dist/endpoints/EndpointBuilder.d.cts +2 -2
- package/dist/endpoints/EndpointBuilder.d.mts +8 -8
- package/dist/endpoints/EndpointBuilder.mjs +2 -2
- package/dist/endpoints/EndpointFactory.cjs +3 -3
- package/dist/endpoints/EndpointFactory.d.cts +3 -3
- package/dist/endpoints/EndpointFactory.d.mts +9 -9
- package/dist/endpoints/EndpointFactory.mjs +3 -3
- package/dist/endpoints/HonoEndpointAdaptor.cjs +4 -4
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +8 -8
- package/dist/endpoints/HonoEndpointAdaptor.mjs +4 -4
- package/dist/endpoints/TestEndpointAdaptor.cjs +4 -48
- package/dist/endpoints/TestEndpointAdaptor.d.cts +5 -25
- package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -29
- package/dist/endpoints/TestEndpointAdaptor.mjs +4 -47
- package/dist/endpoints/helpers.cjs +2 -2
- package/dist/endpoints/helpers.d.cts +1 -1
- package/dist/endpoints/helpers.d.mts +7 -7
- package/dist/endpoints/helpers.mjs +2 -2
- package/dist/endpoints/index.cjs +3 -3
- package/dist/endpoints/index.d.cts +5 -5
- package/dist/endpoints/index.d.mts +11 -11
- package/dist/endpoints/index.mjs +3 -3
- package/dist/endpoints/parseHonoQuery.cjs +1 -1
- package/dist/endpoints/parseHonoQuery.mjs +1 -1
- package/dist/endpoints/parseQueryParams.cjs +1 -1
- package/dist/endpoints/parseQueryParams.mjs +1 -1
- package/dist/functions/AWSLambdaFunction.cjs +2 -2
- package/dist/functions/AWSLambdaFunction.d.mts +4 -4
- package/dist/functions/AWSLambdaFunction.mjs +2 -2
- package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
- package/dist/functions/Function.d.mts +2 -2
- package/dist/functions/FunctionBuilder.d.mts +4 -4
- package/dist/functions/FunctionExecutionWrapper.cjs +1 -1
- package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
- package/dist/functions/FunctionExecutionWrapper.mjs +1 -1
- package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
- package/dist/functions/index.d.cts +1 -1
- package/dist/functions/index.d.mts +5 -5
- package/dist/{helpers-DbpO95aE.mjs → helpers-CP7A0U_s.mjs} +2 -2
- package/dist/{helpers-DbpO95aE.mjs.map → helpers-CP7A0U_s.mjs.map} +1 -1
- package/dist/{helpers-BeGM4pP_.cjs → helpers-CjvCSIF5.cjs} +2 -2
- package/dist/{helpers-BeGM4pP_.cjs.map → helpers-CjvCSIF5.cjs.map} +1 -1
- package/dist/index-BXTN4mwI.d.mts +9 -0
- package/dist/index-zOH9f4sh.d.cts +9 -0
- package/dist/index.d.mts +2 -2
- package/dist/{parseHonoQuery-DopC24vB.cjs → parseHonoQuery-BiPp8bEJ.cjs} +1 -1
- package/dist/{parseHonoQuery-DopC24vB.cjs.map → parseHonoQuery-BiPp8bEJ.cjs.map} +1 -1
- package/dist/{parseHonoQuery-znDKBhdE.mjs → parseHonoQuery-yWRoKFFl.mjs} +1 -1
- package/dist/{parseHonoQuery-znDKBhdE.mjs.map → parseHonoQuery-yWRoKFFl.mjs.map} +1 -1
- package/dist/{parseQueryParams-BzPop4I1.cjs → parseQueryParams-C2EjouGt.cjs} +1 -1
- package/dist/{parseQueryParams-BzPop4I1.cjs.map → parseQueryParams-C2EjouGt.cjs.map} +1 -1
- package/dist/{parseQueryParams-BJaRh3OB.mjs → parseQueryParams-DSk9xl09.mjs} +1 -1
- package/dist/{parseQueryParams-BJaRh3OB.mjs.map → parseQueryParams-DSk9xl09.mjs.map} +1 -1
- package/dist/publisher.d.mts +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
- package/dist/subscribers/Subscriber.cjs +1 -1
- package/dist/subscribers/Subscriber.d.mts +2 -2
- package/dist/subscribers/Subscriber.mjs +1 -1
- package/dist/subscribers/SubscriberBuilder.cjs +2 -2
- package/dist/subscribers/SubscriberBuilder.d.cts +1 -1
- package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
- package/dist/subscribers/SubscriberBuilder.mjs +2 -2
- package/dist/subscribers/index.cjs +2 -2
- package/dist/subscribers/index.d.cts +3 -3
- package/dist/subscribers/index.d.mts +5 -5
- package/dist/subscribers/index.mjs +2 -2
- package/dist/{types-DBKNYvsW.d.mts → types-CVq20-fE.d.mts} +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +10 -5
- package/src/adaptors/testing.ts +1 -0
- package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +62 -13
- package/src/endpoints/Endpoint.ts +243 -19
- package/src/endpoints/HonoEndpointAdaptor.ts +52 -16
- package/src/endpoints/TestEndpointAdaptor.ts +45 -12
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +240 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.spec.ts +177 -200
- package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +120 -0
- package/src/endpoints/__tests__/Endpoint.spec.ts +12 -0
- package/src/endpoints/__tests__/ResponseBuilder.spec.ts +235 -0
- package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +348 -0
- package/dist/endpoints/TestEndpointAdaptor.cjs.map +0 -1
- package/dist/endpoints/TestEndpointAdaptor.mjs.map +0 -1
- package/dist/index-CuGR4L7O.d.mts +0 -9
- package/dist/index-Fg3N3EKD.d.cts +0 -9
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { ResponseBuilder, SuccessStatus } from '../Endpoint';
|
|
3
|
+
|
|
4
|
+
describe('ResponseBuilder', () => {
|
|
5
|
+
describe('header', () => {
|
|
6
|
+
it('should set a single header', () => {
|
|
7
|
+
const builder = new ResponseBuilder();
|
|
8
|
+
builder.header('X-Custom-Header', 'custom-value');
|
|
9
|
+
|
|
10
|
+
const metadata = builder.getMetadata();
|
|
11
|
+
expect(metadata.headers).toEqual({
|
|
12
|
+
'X-Custom-Header': 'custom-value',
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should set multiple headers', () => {
|
|
17
|
+
const builder = new ResponseBuilder();
|
|
18
|
+
builder
|
|
19
|
+
.header('X-Header-1', 'value1')
|
|
20
|
+
.header('X-Header-2', 'value2')
|
|
21
|
+
.header('Content-Type', 'application/json');
|
|
22
|
+
|
|
23
|
+
const metadata = builder.getMetadata();
|
|
24
|
+
expect(metadata.headers).toEqual({
|
|
25
|
+
'X-Header-1': 'value1',
|
|
26
|
+
'X-Header-2': 'value2',
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('should allow method chaining', () => {
|
|
32
|
+
const builder = new ResponseBuilder();
|
|
33
|
+
const result = builder.header('X-Test', 'value');
|
|
34
|
+
|
|
35
|
+
expect(result).toBe(builder);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('cookie', () => {
|
|
40
|
+
it('should set a simple cookie', () => {
|
|
41
|
+
const builder = new ResponseBuilder();
|
|
42
|
+
builder.cookie('session', 'abc123');
|
|
43
|
+
|
|
44
|
+
const metadata = builder.getMetadata();
|
|
45
|
+
expect(metadata.cookies?.has('session')).toBe(true);
|
|
46
|
+
expect(metadata.cookies?.get('session')).toEqual({
|
|
47
|
+
value: 'abc123',
|
|
48
|
+
options: undefined,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('should set cookie with options', () => {
|
|
53
|
+
const builder = new ResponseBuilder();
|
|
54
|
+
builder.cookie('session', 'abc123', {
|
|
55
|
+
httpOnly: true,
|
|
56
|
+
secure: true,
|
|
57
|
+
sameSite: 'strict',
|
|
58
|
+
maxAge: 3600,
|
|
59
|
+
path: '/',
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const metadata = builder.getMetadata();
|
|
63
|
+
const cookie = metadata.cookies?.get('session');
|
|
64
|
+
expect(cookie).toEqual({
|
|
65
|
+
value: 'abc123',
|
|
66
|
+
options: {
|
|
67
|
+
httpOnly: true,
|
|
68
|
+
secure: true,
|
|
69
|
+
sameSite: 'strict',
|
|
70
|
+
maxAge: 3600,
|
|
71
|
+
path: '/',
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('should set multiple cookies', () => {
|
|
77
|
+
const builder = new ResponseBuilder();
|
|
78
|
+
builder
|
|
79
|
+
.cookie('session', 'abc123')
|
|
80
|
+
.cookie('theme', 'dark')
|
|
81
|
+
.cookie('lang', 'en');
|
|
82
|
+
|
|
83
|
+
const metadata = builder.getMetadata();
|
|
84
|
+
expect(metadata.cookies?.size).toBe(3);
|
|
85
|
+
expect(metadata.cookies?.get('session')?.value).toBe('abc123');
|
|
86
|
+
expect(metadata.cookies?.get('theme')?.value).toBe('dark');
|
|
87
|
+
expect(metadata.cookies?.get('lang')?.value).toBe('en');
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should allow method chaining', () => {
|
|
91
|
+
const builder = new ResponseBuilder();
|
|
92
|
+
const result = builder.cookie('test', 'value');
|
|
93
|
+
|
|
94
|
+
expect(result).toBe(builder);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe('deleteCookie', () => {
|
|
99
|
+
it('should set cookie with empty value and maxAge 0', () => {
|
|
100
|
+
const builder = new ResponseBuilder();
|
|
101
|
+
builder.deleteCookie('session');
|
|
102
|
+
|
|
103
|
+
const metadata = builder.getMetadata();
|
|
104
|
+
const cookie = metadata.cookies?.get('session');
|
|
105
|
+
expect(cookie?.value).toBe('');
|
|
106
|
+
expect(cookie?.options?.maxAge).toBe(0);
|
|
107
|
+
expect(cookie?.options?.expires?.getTime()).toBe(0);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('should preserve domain and path options', () => {
|
|
111
|
+
const builder = new ResponseBuilder();
|
|
112
|
+
builder.deleteCookie('session', {
|
|
113
|
+
domain: '.example.com',
|
|
114
|
+
path: '/app',
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const metadata = builder.getMetadata();
|
|
118
|
+
const cookie = metadata.cookies?.get('session');
|
|
119
|
+
expect(cookie?.options).toMatchObject({
|
|
120
|
+
domain: '.example.com',
|
|
121
|
+
path: '/app',
|
|
122
|
+
maxAge: 0,
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should allow method chaining', () => {
|
|
127
|
+
const builder = new ResponseBuilder();
|
|
128
|
+
const result = builder.deleteCookie('test');
|
|
129
|
+
|
|
130
|
+
expect(result).toBe(builder);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe('status', () => {
|
|
135
|
+
it('should set status code', () => {
|
|
136
|
+
const builder = new ResponseBuilder();
|
|
137
|
+
builder.status(SuccessStatus.Created);
|
|
138
|
+
|
|
139
|
+
const metadata = builder.getMetadata();
|
|
140
|
+
expect(metadata.status).toBe(201);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('should allow method chaining', () => {
|
|
144
|
+
const builder = new ResponseBuilder();
|
|
145
|
+
const result = builder.status(SuccessStatus.OK);
|
|
146
|
+
|
|
147
|
+
expect(result).toBe(builder);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
describe('send', () => {
|
|
152
|
+
it('should return data with metadata', () => {
|
|
153
|
+
const builder = new ResponseBuilder();
|
|
154
|
+
builder.header('X-Test', 'value').status(SuccessStatus.Created);
|
|
155
|
+
|
|
156
|
+
const result = builder.send({ id: '123', name: 'Test' });
|
|
157
|
+
|
|
158
|
+
expect(result).toEqual({
|
|
159
|
+
data: { id: '123', name: 'Test' },
|
|
160
|
+
metadata: {
|
|
161
|
+
headers: { 'X-Test': 'value' },
|
|
162
|
+
cookies: new Map(),
|
|
163
|
+
status: SuccessStatus.Created,
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('should work with complex data', () => {
|
|
169
|
+
const builder = new ResponseBuilder();
|
|
170
|
+
const complexData = {
|
|
171
|
+
user: { id: '1', name: 'John' },
|
|
172
|
+
posts: [{ id: '1', title: 'Post' }],
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const result = builder.send(complexData);
|
|
176
|
+
|
|
177
|
+
expect(result.data).toEqual(complexData);
|
|
178
|
+
expect(result.metadata).toBeDefined();
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
describe('fluent API', () => {
|
|
183
|
+
it('should support full fluent chain', () => {
|
|
184
|
+
const builder = new ResponseBuilder();
|
|
185
|
+
|
|
186
|
+
const result = builder
|
|
187
|
+
.status(SuccessStatus.Created)
|
|
188
|
+
.header('Location', '/users/123')
|
|
189
|
+
.header('X-User-Id', '123')
|
|
190
|
+
.cookie('session', 'abc123', { httpOnly: true })
|
|
191
|
+
.cookie('preferences', 'dark-mode')
|
|
192
|
+
.send({ id: '123', name: 'John' });
|
|
193
|
+
|
|
194
|
+
expect(result).toEqual({
|
|
195
|
+
data: { id: '123', name: 'John' },
|
|
196
|
+
metadata: {
|
|
197
|
+
status: 201,
|
|
198
|
+
headers: {
|
|
199
|
+
Location: '/users/123',
|
|
200
|
+
'X-User-Id': '123',
|
|
201
|
+
},
|
|
202
|
+
cookies: new Map([
|
|
203
|
+
['session', { value: 'abc123', options: { httpOnly: true } }],
|
|
204
|
+
['preferences', { value: 'dark-mode', options: undefined }],
|
|
205
|
+
]),
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe('getMetadata', () => {
|
|
212
|
+
it('should return current metadata', () => {
|
|
213
|
+
const builder = new ResponseBuilder();
|
|
214
|
+
builder.header('X-Test', 'value').cookie('test', 'cookie-value');
|
|
215
|
+
|
|
216
|
+
const metadata = builder.getMetadata();
|
|
217
|
+
|
|
218
|
+
expect(metadata).toEqual({
|
|
219
|
+
headers: { 'X-Test': 'value' },
|
|
220
|
+
cookies: new Map([
|
|
221
|
+
['test', { value: 'cookie-value', options: undefined }],
|
|
222
|
+
]),
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it('should return empty objects for unused features', () => {
|
|
227
|
+
const builder = new ResponseBuilder();
|
|
228
|
+
const metadata = builder.getMetadata();
|
|
229
|
+
|
|
230
|
+
expect(metadata.headers).toEqual({});
|
|
231
|
+
expect(metadata.cookies?.size).toBe(0);
|
|
232
|
+
expect(metadata.status).toBeUndefined();
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
});
|
|
@@ -2,6 +2,7 @@ import { UnprocessableEntityError } from '@geekmidas/errors';
|
|
|
2
2
|
import { ConsoleLogger } from '@geekmidas/logger/console';
|
|
3
3
|
import { describe, expect, it, vi } from 'vitest';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
+
import { SuccessStatus } from '../Endpoint';
|
|
5
6
|
import { e } from '../EndpointFactory';
|
|
6
7
|
import { TestEndpointAdaptor } from '../TestEndpointAdaptor';
|
|
7
8
|
|
|
@@ -191,6 +192,7 @@ describe('TestEndpointAdaptor', () => {
|
|
|
191
192
|
logger: expect.any(ConsoleLogger),
|
|
192
193
|
services: mockServices,
|
|
193
194
|
header: expect.any(Function),
|
|
195
|
+
cookie: expect.any(Function),
|
|
194
196
|
});
|
|
195
197
|
});
|
|
196
198
|
|
|
@@ -232,5 +234,351 @@ describe('TestEndpointAdaptor', () => {
|
|
|
232
234
|
contentType: 'application/json',
|
|
233
235
|
});
|
|
234
236
|
});
|
|
237
|
+
|
|
238
|
+
it('should read cookies from request', async () => {
|
|
239
|
+
const endpoint = e
|
|
240
|
+
.get('/cookies')
|
|
241
|
+
.output(
|
|
242
|
+
z.object({
|
|
243
|
+
session: z.string().optional(),
|
|
244
|
+
theme: z.string().optional(),
|
|
245
|
+
}),
|
|
246
|
+
)
|
|
247
|
+
.handle(async ({ cookie }) => ({
|
|
248
|
+
session: cookie('session'),
|
|
249
|
+
theme: cookie('theme'),
|
|
250
|
+
}));
|
|
251
|
+
|
|
252
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
253
|
+
|
|
254
|
+
const result = await adapter.request({
|
|
255
|
+
services: mockServices,
|
|
256
|
+
headers: {
|
|
257
|
+
host: 'example.com',
|
|
258
|
+
cookie: 'session=abc123; theme=dark',
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
expect(result).toEqual({
|
|
263
|
+
session: 'abc123',
|
|
264
|
+
theme: 'dark',
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('should handle missing cookies gracefully', async () => {
|
|
269
|
+
const endpoint = e
|
|
270
|
+
.get('/cookies-optional')
|
|
271
|
+
.output(
|
|
272
|
+
z.object({
|
|
273
|
+
session: z.string().optional(),
|
|
274
|
+
}),
|
|
275
|
+
)
|
|
276
|
+
.handle(async ({ cookie }) => ({
|
|
277
|
+
session: cookie('session') || 'default',
|
|
278
|
+
}));
|
|
279
|
+
|
|
280
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
281
|
+
|
|
282
|
+
const result = await adapter.request({
|
|
283
|
+
services: mockServices,
|
|
284
|
+
headers: {
|
|
285
|
+
host: 'example.com',
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
expect(result).toEqual({
|
|
290
|
+
session: 'default',
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('should handle URL encoded cookie values', async () => {
|
|
295
|
+
const endpoint = e
|
|
296
|
+
.get('/cookies-encoded')
|
|
297
|
+
.output(z.object({ user: z.string() }))
|
|
298
|
+
.handle(async ({ cookie }) => ({
|
|
299
|
+
user: cookie('user') || 'unknown',
|
|
300
|
+
}));
|
|
301
|
+
|
|
302
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
303
|
+
|
|
304
|
+
const result = await adapter.request({
|
|
305
|
+
services: mockServices,
|
|
306
|
+
headers: {
|
|
307
|
+
host: 'example.com',
|
|
308
|
+
cookie: 'user=John%20Doe',
|
|
309
|
+
},
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
expect(result).toEqual({
|
|
313
|
+
user: 'John Doe',
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
it('should use cookies in session extraction', async () => {
|
|
318
|
+
const endpoint = e
|
|
319
|
+
.get('/profile')
|
|
320
|
+
.output(z.object({ userId: z.string() }))
|
|
321
|
+
.handle(async ({ session }) => ({
|
|
322
|
+
userId: (session as any).userId,
|
|
323
|
+
}));
|
|
324
|
+
|
|
325
|
+
// Mock getSession that uses cookies
|
|
326
|
+
endpoint.getSession = vi.fn().mockImplementation(({ cookie }) => {
|
|
327
|
+
const sessionId = cookie('session');
|
|
328
|
+
if (sessionId === 'valid-session') {
|
|
329
|
+
return { userId: 'user-123' };
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
335
|
+
|
|
336
|
+
const result = await adapter.request({
|
|
337
|
+
services: mockServices,
|
|
338
|
+
headers: {
|
|
339
|
+
host: 'example.com',
|
|
340
|
+
cookie: 'session=valid-session',
|
|
341
|
+
},
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
expect(result).toEqual({ userId: 'user-123' });
|
|
345
|
+
expect(endpoint.getSession).toHaveBeenCalledWith({
|
|
346
|
+
logger: expect.any(ConsoleLogger),
|
|
347
|
+
services: mockServices,
|
|
348
|
+
header: expect.any(Function),
|
|
349
|
+
cookie: expect.any(Function),
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('should handle multiple cookies with same name (uses last)', async () => {
|
|
354
|
+
const endpoint = e
|
|
355
|
+
.get('/duplicate-cookies')
|
|
356
|
+
.output(z.object({ value: z.string() }))
|
|
357
|
+
.handle(async ({ cookie }) => ({
|
|
358
|
+
value: cookie('test') || 'none',
|
|
359
|
+
}));
|
|
360
|
+
|
|
361
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
362
|
+
|
|
363
|
+
const result = await adapter.request({
|
|
364
|
+
services: mockServices,
|
|
365
|
+
headers: {
|
|
366
|
+
host: 'example.com',
|
|
367
|
+
cookie: 'test=first; test=second',
|
|
368
|
+
},
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
// When duplicates exist, Map uses the last occurrence
|
|
372
|
+
expect(result).toEqual({
|
|
373
|
+
value: 'second',
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
describe('response handling', () => {
|
|
379
|
+
it('should set response cookies', async () => {
|
|
380
|
+
const endpoint = e
|
|
381
|
+
.post('/auth/login')
|
|
382
|
+
.body(z.object({ email: z.string(), password: z.string() }))
|
|
383
|
+
.output(z.object({ id: z.string(), email: z.string() }))
|
|
384
|
+
.handle(async ({ body }, response) => {
|
|
385
|
+
return response
|
|
386
|
+
.cookie('session', 'abc123', {
|
|
387
|
+
httpOnly: true,
|
|
388
|
+
secure: true,
|
|
389
|
+
sameSite: 'strict',
|
|
390
|
+
maxAge: 3600,
|
|
391
|
+
})
|
|
392
|
+
.send({ id: 'user-1', email: body.email });
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
396
|
+
const result = await adapter.request({
|
|
397
|
+
body: { email: 'test@example.com', password: 'pass123' },
|
|
398
|
+
services: mockServices,
|
|
399
|
+
headers: { host: 'example.com' },
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
expect(result).toHaveProperty('data');
|
|
403
|
+
expect(result).toHaveProperty('metadata');
|
|
404
|
+
expect((result as any).data).toEqual({
|
|
405
|
+
id: 'user-1',
|
|
406
|
+
email: 'test@example.com',
|
|
407
|
+
});
|
|
408
|
+
expect((result as any).metadata.cookies?.has('session')).toBe(true);
|
|
409
|
+
expect((result as any).metadata.cookies?.get('session')).toEqual({
|
|
410
|
+
value: 'abc123',
|
|
411
|
+
options: {
|
|
412
|
+
httpOnly: true,
|
|
413
|
+
secure: true,
|
|
414
|
+
sameSite: 'strict',
|
|
415
|
+
maxAge: 3600,
|
|
416
|
+
},
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
it('should set custom response headers', async () => {
|
|
421
|
+
const endpoint = e
|
|
422
|
+
.post('/users')
|
|
423
|
+
.body(z.object({ name: z.string() }))
|
|
424
|
+
.output(z.object({ id: z.string(), name: z.string() }))
|
|
425
|
+
.handle(async ({ body }, response) => {
|
|
426
|
+
const user = { id: 'user-123', name: body.name };
|
|
427
|
+
return response
|
|
428
|
+
.header('Location', `/users/${user.id}`)
|
|
429
|
+
.header('X-User-Id', user.id)
|
|
430
|
+
.send(user);
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
434
|
+
const result = await adapter.request({
|
|
435
|
+
body: { name: 'John Doe' },
|
|
436
|
+
services: mockServices,
|
|
437
|
+
headers: { host: 'example.com' },
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
expect((result as any).data).toEqual({
|
|
441
|
+
id: 'user-123',
|
|
442
|
+
name: 'John Doe',
|
|
443
|
+
});
|
|
444
|
+
expect((result as any).metadata.headers).toEqual({
|
|
445
|
+
Location: '/users/user-123',
|
|
446
|
+
'X-User-Id': 'user-123',
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
it('should set custom status code', async () => {
|
|
451
|
+
const endpoint = e
|
|
452
|
+
.post('/resources')
|
|
453
|
+
.body(z.object({ name: z.string() }))
|
|
454
|
+
.output(z.object({ id: z.string() }))
|
|
455
|
+
.handle(async (ctx, response) => {
|
|
456
|
+
return response.status(SuccessStatus.Created).send({ id: '123' });
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
460
|
+
const result = await adapter.request({
|
|
461
|
+
body: { name: 'Resource' },
|
|
462
|
+
services: mockServices,
|
|
463
|
+
headers: { host: 'example.com' },
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
expect((result as any).metadata.status).toBe(201);
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
it('should delete cookies', async () => {
|
|
470
|
+
const endpoint = e
|
|
471
|
+
.post('/auth/logout')
|
|
472
|
+
.output(z.object({ success: z.boolean() }))
|
|
473
|
+
.handle(async (ctx, response) => {
|
|
474
|
+
return response
|
|
475
|
+
.deleteCookie('session', { path: '/' })
|
|
476
|
+
.send({ success: true });
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
480
|
+
const result = await adapter.request({
|
|
481
|
+
services: mockServices,
|
|
482
|
+
headers: { host: 'example.com' },
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
expect((result as any).data.success).toBe(true);
|
|
486
|
+
const sessionCookie = (result as any).metadata.cookies?.get('session');
|
|
487
|
+
expect(sessionCookie?.value).toBe('');
|
|
488
|
+
expect(sessionCookie?.options?.maxAge).toBe(0);
|
|
489
|
+
expect(sessionCookie?.options?.path).toBe('/');
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
it('should combine cookies, headers, and status', async () => {
|
|
493
|
+
const endpoint = e
|
|
494
|
+
.post('/complete')
|
|
495
|
+
.body(z.object({ data: z.string() }))
|
|
496
|
+
.output(z.object({ id: z.string(), result: z.string() }))
|
|
497
|
+
.handle(async ({ body }, response) => {
|
|
498
|
+
return response
|
|
499
|
+
.status(SuccessStatus.Created)
|
|
500
|
+
.header('Location', '/complete/123')
|
|
501
|
+
.header('X-Request-Id', 'req-456')
|
|
502
|
+
.cookie('tracking', 'track-789')
|
|
503
|
+
.cookie('preference', 'dark', { maxAge: 86400 })
|
|
504
|
+
.send({ id: '123', result: body.data });
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
508
|
+
const result = await adapter.request({
|
|
509
|
+
body: { data: 'test' },
|
|
510
|
+
services: mockServices,
|
|
511
|
+
headers: { host: 'example.com' },
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
expect((result as any).data).toEqual({
|
|
515
|
+
id: '123',
|
|
516
|
+
result: 'test',
|
|
517
|
+
});
|
|
518
|
+
expect((result as any).metadata.status).toBe(201);
|
|
519
|
+
expect((result as any).metadata.headers).toEqual({
|
|
520
|
+
Location: '/complete/123',
|
|
521
|
+
'X-Request-Id': 'req-456',
|
|
522
|
+
});
|
|
523
|
+
expect((result as any).metadata.cookies?.size).toBe(2);
|
|
524
|
+
expect((result as any).metadata.cookies?.get('tracking')?.value).toBe(
|
|
525
|
+
'track-789',
|
|
526
|
+
);
|
|
527
|
+
expect((result as any).metadata.cookies?.get('preference')).toEqual({
|
|
528
|
+
value: 'dark',
|
|
529
|
+
options: { maxAge: 86400 },
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
it('should return simple response without metadata when not using response builder', async () => {
|
|
534
|
+
const endpoint = e
|
|
535
|
+
.get('/simple')
|
|
536
|
+
.output(z.object({ message: z.string() }))
|
|
537
|
+
.handle(async () => {
|
|
538
|
+
// Not using response builder, just returning data
|
|
539
|
+
return { message: 'Hello' };
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
543
|
+
const result = await adapter.request({
|
|
544
|
+
services: mockServices,
|
|
545
|
+
headers: { host: 'example.com' },
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
// Should return just the data, not wrapped in metadata
|
|
549
|
+
expect(result).toEqual({ message: 'Hello' });
|
|
550
|
+
expect(result).not.toHaveProperty('metadata');
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
it('should combine request cookies and response cookies', async () => {
|
|
554
|
+
const endpoint = e
|
|
555
|
+
.get('/preferences')
|
|
556
|
+
.output(z.object({ theme: z.string(), updated: z.boolean() }))
|
|
557
|
+
.handle(async ({ cookie }, response) => {
|
|
558
|
+
const currentTheme = cookie('theme') || 'light';
|
|
559
|
+
const newTheme = currentTheme === 'light' ? 'dark' : 'light';
|
|
560
|
+
|
|
561
|
+
return response
|
|
562
|
+
.cookie('theme', newTheme, { maxAge: 86400 })
|
|
563
|
+
.send({ theme: newTheme, updated: true });
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
const adapter = new TestEndpointAdaptor(endpoint);
|
|
567
|
+
const result = await adapter.request({
|
|
568
|
+
services: mockServices,
|
|
569
|
+
headers: {
|
|
570
|
+
host: 'example.com',
|
|
571
|
+
cookie: 'theme=light',
|
|
572
|
+
},
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
expect((result as any).data).toEqual({
|
|
576
|
+
theme: 'dark',
|
|
577
|
+
updated: true,
|
|
578
|
+
});
|
|
579
|
+
expect((result as any).metadata.cookies?.get('theme')?.value).toBe(
|
|
580
|
+
'dark',
|
|
581
|
+
);
|
|
582
|
+
});
|
|
235
583
|
});
|
|
236
584
|
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TestEndpointAdaptor.cjs","names":["endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >","EnvironmentParser","serviceDiscovery: ServiceDiscovery<\n any,\n any\n >","ctx: TestRequestAdaptor<\n TInput,\n TServices,\n TEventPublisher,\n TEventPublisherServiceName\n >"],"sources":["../../src/endpoints/TestEndpointAdaptor.ts"],"sourcesContent":["import { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod } from '../types';\nimport { Endpoint, type EndpointSchemas } from './Endpoint';\n\nexport class TestEndpointAdaptor<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> {\n static getDefaultServiceDiscover<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n >(\n endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ) {\n return ServiceDiscovery.getInstance(\n endpoint.logger,\n new EnvironmentParser({}),\n );\n }\n constructor(\n private readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n private serviceDiscovery: ServiceDiscovery<\n any,\n any\n > = TestEndpointAdaptor.getDefaultServiceDiscover(endpoint),\n ) {}\n\n async request(\n ctx: TestRequestAdaptor<\n TInput,\n TServices,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ): Promise<InferStandardSchema<TOutSchema>> {\n const body = await this.endpoint.parseInput((ctx as any).body, 'body');\n const query = await this.endpoint.parseInput((ctx as any).query, 'query');\n const params = await this.endpoint.parseInput(\n (ctx as any).params,\n 'params',\n );\n\n const header = Endpoint.createHeaders(ctx.headers);\n const logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: ctx.headers.host,\n method: this.endpoint.method,\n }) as TLogger;\n const session = await this.endpoint.getSession({\n logger,\n services: ctx.services,\n header,\n });\n\n const response = await this.endpoint.handler({\n body,\n query,\n params,\n session,\n services: ctx.services,\n logger,\n header,\n } as any);\n\n const output = await this.endpoint.parseOutput(response);\n ctx.publisher && (await this.serviceDiscovery.register([ctx.publisher]));\n\n await publishConstructEvents(this.endpoint, output, this.serviceDiscovery);\n\n return output;\n }\n}\n\nexport type TestRequestAdaptor<\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> = {\n services: ServiceRecord<TServices>;\n headers: Record<string, string>;\n publisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n} & InferComposableStandardSchema<TInput>;\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAa,sBAAb,MAAa,oBAUX;CACA,OAAO,0BAWLA,UAWA;AACA,SAAO,sCAAiB,YACtB,SAAS,QACT,IAAIC,qCAAkB,CAAE,GACzB;CACF;CACD,YACmBD,UAWTE,mBAGJ,oBAAoB,0BAA0B,SAAS,EAC3D;EAfiB;EAWT;CAIN;CAEJ,MAAM,QACJC,KAM0C;EAC1C,MAAM,OAAO,MAAM,KAAK,SAAS,WAAY,IAAY,MAAM,OAAO;EACtE,MAAM,QAAQ,MAAM,KAAK,SAAS,WAAY,IAAY,OAAO,QAAQ;EACzE,MAAM,SAAS,MAAM,KAAK,SAAS,WAChC,IAAY,QACb,SACD;EAED,MAAM,SAAS,0BAAS,cAAc,IAAI,QAAQ;EAClD,MAAM,SAAS,KAAK,SAAS,OAAO,MAAM;GACxC,OAAO,KAAK,SAAS;GACrB,MAAM,IAAI,QAAQ;GAClB,QAAQ,KAAK,SAAS;EACvB,EAAC;EACF,MAAM,UAAU,MAAM,KAAK,SAAS,WAAW;GAC7C;GACA,UAAU,IAAI;GACd;EACD,EAAC;EAEF,MAAM,WAAW,MAAM,KAAK,SAAS,QAAQ;GAC3C;GACA;GACA;GACA;GACA,UAAU,IAAI;GACd;GACA;EACD,EAAQ;EAET,MAAM,SAAS,MAAM,KAAK,SAAS,YAAY,SAAS;AACxD,MAAI,aAAc,MAAM,KAAK,iBAAiB,SAAS,CAAC,IAAI,SAAU,EAAC;AAEvE,QAAM,yCAAuB,KAAK,UAAU,QAAQ,KAAK,iBAAiB;AAE1E,SAAO;CACR;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TestEndpointAdaptor.mjs","names":["endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >","serviceDiscovery: ServiceDiscovery<\n any,\n any\n >","ctx: TestRequestAdaptor<\n TInput,\n TServices,\n TEventPublisher,\n TEventPublisherServiceName\n >"],"sources":["../../src/endpoints/TestEndpointAdaptor.ts"],"sourcesContent":["import { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod } from '../types';\nimport { Endpoint, type EndpointSchemas } from './Endpoint';\n\nexport class TestEndpointAdaptor<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> {\n static getDefaultServiceDiscover<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n >(\n endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ) {\n return ServiceDiscovery.getInstance(\n endpoint.logger,\n new EnvironmentParser({}),\n );\n }\n constructor(\n private readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n private serviceDiscovery: ServiceDiscovery<\n any,\n any\n > = TestEndpointAdaptor.getDefaultServiceDiscover(endpoint),\n ) {}\n\n async request(\n ctx: TestRequestAdaptor<\n TInput,\n TServices,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ): Promise<InferStandardSchema<TOutSchema>> {\n const body = await this.endpoint.parseInput((ctx as any).body, 'body');\n const query = await this.endpoint.parseInput((ctx as any).query, 'query');\n const params = await this.endpoint.parseInput(\n (ctx as any).params,\n 'params',\n );\n\n const header = Endpoint.createHeaders(ctx.headers);\n const logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: ctx.headers.host,\n method: this.endpoint.method,\n }) as TLogger;\n const session = await this.endpoint.getSession({\n logger,\n services: ctx.services,\n header,\n });\n\n const response = await this.endpoint.handler({\n body,\n query,\n params,\n session,\n services: ctx.services,\n logger,\n header,\n } as any);\n\n const output = await this.endpoint.parseOutput(response);\n ctx.publisher && (await this.serviceDiscovery.register([ctx.publisher]));\n\n await publishConstructEvents(this.endpoint, output, this.serviceDiscovery);\n\n return output;\n }\n}\n\nexport type TestRequestAdaptor<\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> = {\n services: ServiceRecord<TServices>;\n headers: Record<string, string>;\n publisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n} & InferComposableStandardSchema<TInput>;\n"],"mappings":";;;;;;;;;;;AAiBA,IAAa,sBAAb,MAAa,oBAUX;CACA,OAAO,0BAWLA,UAWA;AACA,SAAO,iBAAiB,YACtB,SAAS,QACT,IAAI,kBAAkB,CAAE,GACzB;CACF;CACD,YACmBA,UAWTC,mBAGJ,oBAAoB,0BAA0B,SAAS,EAC3D;EAfiB;EAWT;CAIN;CAEJ,MAAM,QACJC,KAM0C;EAC1C,MAAM,OAAO,MAAM,KAAK,SAAS,WAAY,IAAY,MAAM,OAAO;EACtE,MAAM,QAAQ,MAAM,KAAK,SAAS,WAAY,IAAY,OAAO,QAAQ;EACzE,MAAM,SAAS,MAAM,KAAK,SAAS,WAChC,IAAY,QACb,SACD;EAED,MAAM,SAAS,SAAS,cAAc,IAAI,QAAQ;EAClD,MAAM,SAAS,KAAK,SAAS,OAAO,MAAM;GACxC,OAAO,KAAK,SAAS;GACrB,MAAM,IAAI,QAAQ;GAClB,QAAQ,KAAK,SAAS;EACvB,EAAC;EACF,MAAM,UAAU,MAAM,KAAK,SAAS,WAAW;GAC7C;GACA,UAAU,IAAI;GACd;EACD,EAAC;EAEF,MAAM,WAAW,MAAM,KAAK,SAAS,QAAQ;GAC3C;GACA;GACA;GACA;GACA,UAAU,IAAI;GACd;GACA;EACD,EAAQ;EAET,MAAM,SAAS,MAAM,KAAK,SAAS,YAAY,SAAS;AACxD,MAAI,aAAc,MAAM,KAAK,iBAAiB,SAAS,CAAC,IAAI,SAAU,EAAC;AAEvE,QAAM,uBAAuB,KAAK,UAAU,QAAQ,KAAK,iBAAiB;AAE1E,SAAO;CACR;AACF"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { FunctionBuilder } from "./FunctionBuilder-C-PfPN3r.mjs";
|
|
2
|
-
import * as _geekmidas_logger8 from "@geekmidas/logger";
|
|
3
|
-
import * as _geekmidas_schema7 from "@geekmidas/schema";
|
|
4
|
-
|
|
5
|
-
//#region src/functions/index.d.ts
|
|
6
|
-
declare const f: FunctionBuilder<_geekmidas_schema7.ComposableStandardSchema, undefined, [], _geekmidas_logger8.Logger, undefined, string>;
|
|
7
|
-
//#endregion
|
|
8
|
-
export { f };
|
|
9
|
-
//# sourceMappingURL=index-CuGR4L7O.d.mts.map
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { FunctionBuilder } from "./FunctionBuilder-BS1KgxA_.cjs";
|
|
2
|
-
import * as _geekmidas_logger7 from "@geekmidas/logger";
|
|
3
|
-
import * as _geekmidas_schema6 from "@geekmidas/schema";
|
|
4
|
-
|
|
5
|
-
//#region src/functions/index.d.ts
|
|
6
|
-
declare const f: FunctionBuilder<_geekmidas_schema6.ComposableStandardSchema, undefined, [], _geekmidas_logger7.Logger, undefined, string>;
|
|
7
|
-
//#endregion
|
|
8
|
-
export { f };
|
|
9
|
-
//# sourceMappingURL=index-Fg3N3EKD.d.cts.map
|