@toa.io/extensions.exposition 1.0.0-alpha.2 → 1.0.0-alpha.21
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/components/identity.bans/manifest.toa.yaml +15 -6
- package/components/identity.bans/operations/transit.d.ts +14 -0
- package/components/identity.bans/operations/transit.js +11 -0
- package/components/identity.bans/operations/transit.js.map +1 -0
- package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.bans/source/transit.ts +21 -0
- package/components/identity.bans/tsconfig.json +9 -0
- package/components/identity.basic/manifest.toa.yaml +5 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/manifest.toa.yaml +13 -7
- package/components/identity.federation/operations/authenticate.js +4 -4
- package/components/identity.federation/operations/authenticate.js.map +1 -1
- package/components/identity.federation/operations/create.js +4 -4
- package/components/identity.federation/operations/create.js.map +1 -1
- package/components/identity.federation/operations/{assertions-as-values.cjs → lib/assertions-as-values.js} +1 -1
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
- package/components/identity.federation/operations/{jwt.d.cts → lib/jwt.d.ts} +5 -4
- package/components/identity.federation/operations/{jwt.cjs → lib/jwt.js} +35 -11
- package/components/identity.federation/operations/lib/jwt.js.map +1 -0
- package/components/identity.federation/operations/schemas.d.ts +16 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/types.d.ts +1 -1
- package/components/identity.federation/source/authenticate.ts +2 -2
- package/components/identity.federation/source/create.ts +2 -2
- package/components/identity.federation/source/{assertions-as-values.cts → lib/assertions-as-values.ts} +1 -2
- package/components/identity.federation/source/lib/jwt.test.ts +56 -0
- package/components/identity.federation/source/{jwt.cts → lib/jwt.ts} +57 -29
- package/components/identity.federation/source/schemas.ts +16 -0
- package/components/identity.federation/source/types.ts +1 -1
- package/components/identity.federation/tsconfig.json +2 -2
- package/components/identity.roles/manifest.toa.yaml +18 -5
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +21 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +1 -4
- package/components/identity.roles/operations/list.js.map +1 -1
- package/components/identity.roles/operations/principal.d.ts +4 -6
- package/components/identity.roles/operations/principal.js +6 -1
- package/components/identity.roles/operations/principal.js.map +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/source/grant.ts +32 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +12 -3
- package/components/identity.tokens/operations/authenticate.js +5 -2
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/encrypt.js +4 -1
- package/components/identity.tokens/operations/encrypt.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/operations/types.d.ts +1 -2
- package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
- package/components/identity.tokens/source/authenticate.ts +5 -2
- package/components/identity.tokens/source/encrypt.test.ts +22 -1
- package/components/identity.tokens/source/encrypt.ts +4 -1
- package/components/identity.tokens/source/types.ts +1 -2
- package/components/octets.storage/operations/store.js +1 -1
- package/documentation/access.md +27 -16
- package/documentation/cache.md +8 -1
- package/documentation/components.md +55 -23
- package/documentation/identity.md +7 -0
- package/documentation/io.md +56 -0
- package/documentation/octets.md +12 -0
- package/documentation/protocol.md +3 -0
- package/documentation/query.md +50 -5
- package/documentation/require.md +15 -0
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +9 -3
- package/features/access.feature +28 -49
- package/features/annotation.feature +1 -0
- package/features/body.feature +3 -1
- package/features/cache.feature +39 -0
- package/features/cors.feature +2 -2
- package/features/directives.feature +2 -0
- package/features/dynamic.feature +14 -7
- package/features/errors.feature +7 -4
- package/features/etag.feature +97 -0
- package/features/identity.bans.feature +128 -0
- package/features/identity.basic.feature +68 -3
- package/features/identity.federation.feature +78 -5
- package/features/identity.roles.feature +205 -1
- package/features/identity.tokens.feature +98 -0
- package/features/io.feature +196 -0
- package/features/octets.entries.feature +3 -1
- package/features/octets.feature +32 -10
- package/features/octets.meta.feature +4 -3
- package/features/octets.workflows.feature +39 -0
- package/features/queries.feature +9 -1
- package/features/require.feature +64 -0
- package/features/response.feature +7 -1
- package/features/routes.feature +17 -10
- package/features/steps/Database.ts +17 -10
- package/features/steps/Gateway.ts +3 -0
- package/features/steps/IdP.ts +55 -21
- package/features/steps/components/echo/manifest.toa.yaml +5 -0
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/greeter/manifest.toa.yaml +1 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +1 -0
- package/features/steps/components/pots/manifest.toa.yaml +12 -3
- package/features/steps/components/sequences/manifest.toa.yaml +1 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
- package/features/timing.feature +66 -0
- package/features/vary.feature +56 -3
- package/package.json +13 -14
- package/readme.md +7 -6
- package/schemas/annotation.cos.yaml +1 -0
- package/schemas/io/input.cos.yaml +3 -0
- package/schemas/io/message.cos.yaml +5 -0
- package/schemas/io/output.cos.yaml +5 -0
- package/schemas/octets/workflow.cos.yaml +12 -0
- package/schemas/querystring.cos.yaml +1 -0
- package/source/Annotation.ts +1 -0
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +7 -7
- package/source/Directive.ts +19 -46
- package/source/Endpoint.ts +53 -6
- package/source/Factory.ts +17 -7
- package/source/Gateway.ts +40 -51
- package/source/HTTP/Context.ts +67 -0
- package/source/HTTP/Server.test.ts +1 -1
- package/source/HTTP/Server.ts +61 -96
- package/source/HTTP/Timing.ts +40 -0
- package/source/HTTP/exceptions.ts +1 -1
- package/source/HTTP/index.ts +1 -0
- package/source/HTTP/messages.test.ts +27 -8
- package/source/HTTP/messages.ts +32 -48
- package/source/Mapping.ts +7 -8
- package/source/RTD/Context.ts +7 -10
- package/source/RTD/Directives.ts +28 -4
- package/source/RTD/Endpoint.ts +6 -4
- package/source/RTD/Match.ts +2 -7
- package/source/RTD/Method.ts +7 -13
- package/source/RTD/Node.ts +13 -14
- package/source/RTD/Tree.ts +17 -16
- package/source/RTD/factory.ts +3 -6
- package/source/Tenant.ts +0 -8
- package/source/deployment.ts +6 -0
- package/source/directives/auth/Anonymous.ts +3 -2
- package/source/directives/auth/Authorization.ts +17 -14
- package/source/directives/auth/Delegate.ts +35 -0
- package/source/directives/auth/Incept.ts +11 -6
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +27 -17
- package/source/directives/auth/Scheme.ts +2 -2
- package/source/directives/auth/types.ts +1 -1
- package/source/directives/cache/Cache.ts +5 -5
- package/source/directives/cache/Control.ts +48 -22
- package/source/directives/cache/types.ts +1 -1
- package/source/directives/cors/CORS.ts +18 -10
- package/source/directives/dev/Development.ts +4 -4
- package/source/directives/index.ts +6 -4
- package/source/directives/io/Directive.ts +11 -0
- package/source/directives/io/IO.ts +43 -0
- package/source/directives/io/Input.ts +50 -0
- package/source/directives/io/Message.ts +1 -0
- package/source/directives/io/Output.ts +69 -0
- package/source/directives/io/index.ts +3 -0
- package/source/directives/io/schemas.ts +12 -0
- package/source/directives/octets/Context.ts +5 -4
- package/source/directives/octets/Delete.ts +25 -13
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +33 -17
- package/source/directives/octets/List.ts +18 -8
- package/source/directives/octets/Octets.ts +12 -8
- package/source/directives/octets/Permute.ts +16 -9
- package/source/directives/octets/Store.ts +43 -19
- package/source/directives/octets/Workflow.ts +48 -0
- package/source/directives/octets/schemas.test.ts +21 -0
- package/source/directives/octets/schemas.ts +2 -0
- package/source/directives/octets/types.ts +0 -7
- package/source/directives/octets/{workflow → workflows}/Execution.ts +0 -2
- package/source/directives/octets/{workflow → workflows}/Workflow.ts +2 -2
- package/source/directives/require/Directive.ts +5 -0
- package/source/directives/require/Headers.ts +20 -0
- package/source/directives/require/Require.ts +28 -0
- package/source/directives/require/index.ts +3 -0
- package/source/directives/vary/Directive.ts +2 -1
- package/source/directives/vary/Embed.ts +14 -8
- package/source/directives/vary/Vary.ts +8 -6
- package/source/directives/vary/embeddings/Embedding.ts +2 -1
- package/source/directives/vary/embeddings/Header.ts +9 -7
- package/source/directives/vary/embeddings/Language.ts +2 -2
- package/source/directives/vary/embeddings/Parameter.ts +14 -0
- package/source/directives/vary/embeddings/index.ts +3 -3
- package/source/exceptions.ts +22 -11
- package/source/io.ts +2 -2
- package/source/root.ts +5 -0
- package/transpiled/Annotation.d.ts +1 -0
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +8 -21
- package/transpiled/Directive.js +11 -14
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +7 -5
- package/transpiled/Endpoint.js +58 -2
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +8 -2
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +4 -8
- package/transpiled/Gateway.js +23 -33
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +24 -0
- package/transpiled/HTTP/Context.js +47 -0
- package/transpiled/HTTP/Context.js.map +1 -0
- package/transpiled/HTTP/Server.d.ts +8 -7
- package/transpiled/HTTP/Server.js +69 -77
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +10 -0
- package/transpiled/HTTP/Timing.js +29 -0
- package/transpiled/HTTP/Timing.js.map +1 -0
- package/transpiled/HTTP/exceptions.d.ts +1 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/index.d.ts +1 -0
- package/transpiled/HTTP/index.js +1 -0
- package/transpiled/HTTP/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +7 -21
- package/transpiled/HTTP/messages.js +24 -26
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Mapping.js +7 -7
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +7 -6
- package/transpiled/RTD/Directives.d.ts +19 -4
- package/transpiled/RTD/Endpoint.d.ts +6 -4
- package/transpiled/RTD/Match.d.ts +2 -4
- package/transpiled/RTD/Method.d.ts +7 -7
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -6
- package/transpiled/RTD/Node.js +2 -1
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +6 -6
- package/transpiled/RTD/Tree.js +4 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.d.ts +2 -4
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/Tenant.d.ts +0 -1
- package/transpiled/Tenant.js +0 -6
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.js +5 -0
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +3 -4
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Authorization.d.ts +2 -3
- package/transpiled/directives/auth/Authorization.js +10 -8
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.d.ts +8 -0
- package/transpiled/directives/auth/Delegate.js +29 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +1 -1
- package/transpiled/directives/auth/Incept.js +11 -6
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.d.ts +4 -1
- package/transpiled/directives/auth/Role.js +25 -17
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +2 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/cache/Cache.d.ts +3 -3
- package/transpiled/directives/cache/Cache.js +3 -3
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +5 -4
- package/transpiled/directives/cache/Control.js +32 -15
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/types.d.ts +1 -1
- package/transpiled/directives/cors/CORS.d.ts +2 -3
- package/transpiled/directives/cors/CORS.js +17 -10
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.d.ts +3 -3
- package/transpiled/directives/dev/Development.js +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/index.d.ts +2 -2
- package/transpiled/directives/index.js +5 -3
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Directive.d.ts +8 -0
- package/transpiled/directives/io/Directive.js +3 -0
- package/transpiled/directives/io/Directive.js.map +1 -0
- package/transpiled/directives/io/IO.d.ts +9 -0
- package/transpiled/directives/io/IO.js +33 -0
- package/transpiled/directives/io/IO.js.map +1 -0
- package/transpiled/directives/io/Input.d.ts +11 -0
- package/transpiled/directives/io/Input.js +63 -0
- package/transpiled/directives/io/Input.js.map +1 -0
- package/transpiled/directives/io/Message.d.ts +1 -0
- package/transpiled/directives/io/Message.js +3 -0
- package/transpiled/directives/io/Message.js.map +1 -0
- package/transpiled/directives/io/Output.d.ts +13 -0
- package/transpiled/directives/io/Output.js +76 -0
- package/transpiled/directives/io/Output.js.map +1 -0
- package/transpiled/directives/io/index.d.ts +2 -0
- package/transpiled/directives/io/index.js +6 -0
- package/transpiled/directives/io/index.js.map +1 -0
- package/transpiled/directives/io/schemas.d.ts +7 -0
- package/transpiled/directives/io/schemas.js +14 -0
- package/transpiled/directives/io/schemas.js.map +1 -0
- package/transpiled/directives/octets/Context.d.ts +4 -4
- package/transpiled/directives/octets/Context.js +4 -2
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +5 -4
- package/transpiled/directives/octets/Delete.js +24 -12
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.d.ts +8 -0
- package/transpiled/directives/octets/Directive.js +8 -0
- package/transpiled/directives/octets/Directive.js.map +1 -0
- package/transpiled/directives/octets/Fetch.d.ts +4 -3
- package/transpiled/directives/octets/Fetch.js +31 -15
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +4 -3
- package/transpiled/directives/octets/List.js +16 -7
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +4 -4
- package/transpiled/directives/octets/Octets.js +8 -4
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Permute.d.ts +4 -3
- package/transpiled/directives/octets/Permute.js +14 -7
- package/transpiled/directives/octets/Permute.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +6 -4
- package/transpiled/directives/octets/Store.js +28 -13
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +15 -0
- package/transpiled/directives/octets/Workflow.js +59 -0
- package/transpiled/directives/octets/Workflow.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +2 -0
- package/transpiled/directives/octets/schemas.js +2 -1
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +0 -5
- package/transpiled/directives/octets/{workflow → workflows}/Execution.js +0 -1
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
- package/transpiled/directives/octets/{workflow → workflows}/Workflow.d.ts +1 -1
- package/transpiled/directives/octets/{workflow → workflows}/Workflow.js +2 -2
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
- package/transpiled/directives/octets/workflows/index.js.map +1 -0
- package/transpiled/directives/require/Directive.d.ts +4 -0
- package/transpiled/directives/require/Directive.js +3 -0
- package/transpiled/directives/require/Directive.js.map +1 -0
- package/transpiled/directives/require/Headers.d.ts +7 -0
- package/transpiled/directives/require/Headers.js +19 -0
- package/transpiled/directives/require/Headers.js.map +1 -0
- package/transpiled/directives/require/Require.d.ts +9 -0
- package/transpiled/directives/require/Require.js +27 -0
- package/transpiled/directives/require/Require.js.map +1 -0
- package/transpiled/directives/require/index.d.ts +2 -0
- package/transpiled/directives/require/index.js +6 -0
- package/transpiled/directives/require/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +2 -1
- package/transpiled/directives/vary/Embed.d.ts +2 -1
- package/transpiled/directives/vary/Embed.js +8 -6
- package/transpiled/directives/vary/Embed.js.map +1 -1
- package/transpiled/directives/vary/Vary.d.ts +3 -3
- package/transpiled/directives/vary/Vary.js +4 -4
- package/transpiled/directives/vary/Vary.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
- package/transpiled/directives/vary/embeddings/Header.js +9 -7
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Language.js +2 -2
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
- package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
- package/transpiled/directives/vary/embeddings/index.js +5 -3
- package/transpiled/directives/vary/embeddings/index.js.map +1 -1
- package/transpiled/exceptions.d.ts +3 -2
- package/transpiled/exceptions.js +13 -7
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/io.d.ts +2 -2
- package/transpiled/root.js +5 -0
- package/transpiled/root.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/assertions-as-values.cjs.map +0 -1
- package/components/identity.federation/operations/jwt.cjs.map +0 -1
- package/source/HTTP/Server.fixtures.ts +0 -40
- package/transpiled/HTTP/Server.fixtures.d.ts +0 -10
- package/transpiled/HTTP/Server.fixtures.js +0 -31
- package/transpiled/HTTP/Server.fixtures.js.map +0 -1
- package/transpiled/directives/octets/workflow/Execution.js.map +0 -1
- package/transpiled/directives/octets/workflow/Workflow.js.map +0 -1
- package/transpiled/directives/octets/workflow/index.js.map +0 -1
- /package/components/identity.federation/operations/{assertions-as-values.d.cts → lib/assertions-as-values.d.ts} +0 -0
- /package/source/directives/octets/{workflow → workflows}/index.ts +0 -0
- /package/transpiled/directives/octets/{workflow → workflows}/Execution.d.ts +0 -0
- /package/transpiled/directives/octets/{workflow → workflows}/index.d.ts +0 -0
- /package/transpiled/directives/octets/{workflow → workflows}/index.js +0 -0
|
@@ -15,6 +15,7 @@ Feature: Octets storage workflows
|
|
|
15
15
|
- add-baz: octets.tester.baz
|
|
16
16
|
- diversify: octets.tester.diversify
|
|
17
17
|
/*:
|
|
18
|
+
io:output: true
|
|
18
19
|
GET:
|
|
19
20
|
octets:fetch:
|
|
20
21
|
meta: true
|
|
@@ -246,3 +247,41 @@ Feature: Octets storage workflows
|
|
|
246
247
|
concat: hello world
|
|
247
248
|
--cut--
|
|
248
249
|
"""
|
|
250
|
+
|
|
251
|
+
Scenario: Executing a workflow with `octets:workflow`
|
|
252
|
+
Given the `octets.tester` is running
|
|
253
|
+
And the annotation:
|
|
254
|
+
"""yaml
|
|
255
|
+
/:
|
|
256
|
+
auth:anonymous: true
|
|
257
|
+
octets:context: octets
|
|
258
|
+
POST:
|
|
259
|
+
octets:store: ~
|
|
260
|
+
/*:
|
|
261
|
+
DELETE:
|
|
262
|
+
octets:workflow:
|
|
263
|
+
echo: octets.tester.echo
|
|
264
|
+
"""
|
|
265
|
+
When the stream of `lenna.ascii` is received with the following headers:
|
|
266
|
+
"""
|
|
267
|
+
POST / HTTP/1.1
|
|
268
|
+
content-type: application/octet-stream
|
|
269
|
+
"""
|
|
270
|
+
Then the following reply is sent:
|
|
271
|
+
"""
|
|
272
|
+
201 Created
|
|
273
|
+
"""
|
|
274
|
+
When the following request is received:
|
|
275
|
+
"""
|
|
276
|
+
DELETE /10cf16b458f759e0d617f2f3d83599ff HTTP/1.1
|
|
277
|
+
accept: application/yaml
|
|
278
|
+
"""
|
|
279
|
+
Then the following reply is sent:
|
|
280
|
+
"""
|
|
281
|
+
202 Accepted
|
|
282
|
+
content-type: multipart/yaml; boundary=cut
|
|
283
|
+
|
|
284
|
+
--cut
|
|
285
|
+
echo: 10cf16b458f759e0d617f2f3d83599ff
|
|
286
|
+
--cut--
|
|
287
|
+
"""
|
package/features/queries.feature
CHANGED
|
@@ -13,6 +13,7 @@ Feature: Queries
|
|
|
13
13
|
"""yaml
|
|
14
14
|
exposition:
|
|
15
15
|
/pot:
|
|
16
|
+
io:output: true
|
|
16
17
|
GET: observe
|
|
17
18
|
"""
|
|
18
19
|
When the following request is received:
|
|
@@ -35,6 +36,7 @@ Feature: Queries
|
|
|
35
36
|
"""yaml
|
|
36
37
|
exposition:
|
|
37
38
|
/:
|
|
39
|
+
io:output: true
|
|
38
40
|
GET: enumerate
|
|
39
41
|
"""
|
|
40
42
|
When the following request is received:
|
|
@@ -60,6 +62,7 @@ Feature: Queries
|
|
|
60
62
|
"""yaml
|
|
61
63
|
exposition:
|
|
62
64
|
/:
|
|
65
|
+
io:output: true
|
|
63
66
|
GET: enumerate
|
|
64
67
|
"""
|
|
65
68
|
When the following request is received:
|
|
@@ -85,6 +88,7 @@ Feature: Queries
|
|
|
85
88
|
"""yaml
|
|
86
89
|
exposition:
|
|
87
90
|
/:
|
|
91
|
+
io:output: true
|
|
88
92
|
GET: enumerate
|
|
89
93
|
"""
|
|
90
94
|
When the following request is received:
|
|
@@ -110,6 +114,7 @@ Feature: Queries
|
|
|
110
114
|
"""yaml
|
|
111
115
|
exposition:
|
|
112
116
|
/:id:
|
|
117
|
+
io:output: true
|
|
113
118
|
GET: observe
|
|
114
119
|
"""
|
|
115
120
|
When the following request is received:
|
|
@@ -127,11 +132,12 @@ Feature: Queries
|
|
|
127
132
|
volume: 200
|
|
128
133
|
"""
|
|
129
134
|
|
|
130
|
-
Scenario: Request to a route with predefined
|
|
135
|
+
Scenario: Request to a route with predefined criteria
|
|
131
136
|
Given the `pots` is running with the following manifest:
|
|
132
137
|
"""yaml
|
|
133
138
|
exposition:
|
|
134
139
|
/big:
|
|
140
|
+
io:output: true
|
|
135
141
|
GET:
|
|
136
142
|
endpoint: enumerate
|
|
137
143
|
query:
|
|
@@ -160,6 +166,7 @@ Feature: Queries
|
|
|
160
166
|
"""yaml
|
|
161
167
|
exposition:
|
|
162
168
|
/big:
|
|
169
|
+
io:output: true
|
|
163
170
|
GET:
|
|
164
171
|
endpoint: enumerate
|
|
165
172
|
query:
|
|
@@ -186,6 +193,7 @@ Feature: Queries
|
|
|
186
193
|
"""yaml
|
|
187
194
|
exposition:
|
|
188
195
|
/hottest2:
|
|
196
|
+
io:output: true
|
|
189
197
|
GET:
|
|
190
198
|
endpoint: enumerate
|
|
191
199
|
query:
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
Feature: Request requirements
|
|
2
|
+
|
|
3
|
+
Scenario Outline: Require headers
|
|
4
|
+
Given the `pots` is running with the following manifest:
|
|
5
|
+
"""yaml
|
|
6
|
+
exposition:
|
|
7
|
+
/:
|
|
8
|
+
io:output: true
|
|
9
|
+
POST: create
|
|
10
|
+
/one/:id:
|
|
11
|
+
require:header: if-match
|
|
12
|
+
PUT: transit
|
|
13
|
+
/two/:id:
|
|
14
|
+
require:headers: [if-match]
|
|
15
|
+
PUT: transit
|
|
16
|
+
"""
|
|
17
|
+
When the following request is received:
|
|
18
|
+
"""
|
|
19
|
+
POST /pots/ HTTP/1.1
|
|
20
|
+
content-type: application/yaml
|
|
21
|
+
accept: application/yaml
|
|
22
|
+
|
|
23
|
+
title: Hello
|
|
24
|
+
volume: 1.5
|
|
25
|
+
"""
|
|
26
|
+
Then the following reply is sent:
|
|
27
|
+
"""
|
|
28
|
+
201 Created
|
|
29
|
+
etag: ${{ etag }}
|
|
30
|
+
|
|
31
|
+
id: ${{ id }}
|
|
32
|
+
"""
|
|
33
|
+
When the following request is received:
|
|
34
|
+
"""
|
|
35
|
+
PUT /pots/<variant>/${{ id }}/ HTTP/1.1
|
|
36
|
+
content-type: application/yaml
|
|
37
|
+
accept: text/plain
|
|
38
|
+
|
|
39
|
+
title: Hello
|
|
40
|
+
volume: 1.5
|
|
41
|
+
"""
|
|
42
|
+
Then the following reply is sent:
|
|
43
|
+
"""
|
|
44
|
+
400 Bad Request
|
|
45
|
+
|
|
46
|
+
Header required: if-match
|
|
47
|
+
"""
|
|
48
|
+
When the following request is received:
|
|
49
|
+
"""
|
|
50
|
+
PUT /pots/<variant>/${{ id }}/ HTTP/1.1
|
|
51
|
+
content-type: application/yaml
|
|
52
|
+
accept: text/plain
|
|
53
|
+
if-match: ${{ etag }}
|
|
54
|
+
|
|
55
|
+
title: Bye
|
|
56
|
+
"""
|
|
57
|
+
Then the following reply is sent:
|
|
58
|
+
"""
|
|
59
|
+
200 OK
|
|
60
|
+
"""
|
|
61
|
+
Examples:
|
|
62
|
+
| variant |
|
|
63
|
+
| one |
|
|
64
|
+
| two |
|
|
@@ -4,9 +4,11 @@ Feature: Response
|
|
|
4
4
|
Given the annotation:
|
|
5
5
|
"""yaml
|
|
6
6
|
/:
|
|
7
|
+
io:output: true
|
|
7
8
|
GET:
|
|
8
9
|
anonymous: true
|
|
9
|
-
dev:stub:
|
|
10
|
+
dev:stub:
|
|
11
|
+
hello: world
|
|
10
12
|
"""
|
|
11
13
|
When the following request is received:
|
|
12
14
|
"""
|
|
@@ -18,6 +20,8 @@ Feature: Response
|
|
|
18
20
|
200 OK
|
|
19
21
|
content-type: application/json
|
|
20
22
|
vary: accept
|
|
23
|
+
|
|
24
|
+
{"hello":"world"}
|
|
21
25
|
"""
|
|
22
26
|
|
|
23
27
|
Scenario: Error as YAML
|
|
@@ -25,6 +29,7 @@ Feature: Response
|
|
|
25
29
|
"""yaml
|
|
26
30
|
exposition:
|
|
27
31
|
/:
|
|
32
|
+
io:output: true
|
|
28
33
|
GET: error
|
|
29
34
|
"""
|
|
30
35
|
When the following request is received:
|
|
@@ -46,6 +51,7 @@ Feature: Response
|
|
|
46
51
|
"""yaml
|
|
47
52
|
exposition:
|
|
48
53
|
/:
|
|
54
|
+
io:output: true
|
|
49
55
|
GET: error
|
|
50
56
|
"""
|
|
51
57
|
When the following request is received:
|
package/features/routes.feature
CHANGED
|
@@ -6,12 +6,14 @@ Feature: Routes
|
|
|
6
6
|
namespace: basic
|
|
7
7
|
|
|
8
8
|
exposition:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
/:
|
|
10
|
+
io:output: true
|
|
11
|
+
/strict:
|
|
12
|
+
GET:
|
|
13
|
+
endpoint: greet
|
|
14
|
+
/shortcuts:
|
|
15
|
+
/operation:
|
|
16
|
+
GET: greet
|
|
15
17
|
"""
|
|
16
18
|
When the following request is received:
|
|
17
19
|
"""
|
|
@@ -34,6 +36,7 @@ Feature: Routes
|
|
|
34
36
|
"""yaml
|
|
35
37
|
exposition:
|
|
36
38
|
/:
|
|
39
|
+
io:output: true
|
|
37
40
|
GET: greet
|
|
38
41
|
"""
|
|
39
42
|
When the following request is received:
|
|
@@ -52,10 +55,12 @@ Feature: Routes
|
|
|
52
55
|
Given the `greeter` is running with the following manifest:
|
|
53
56
|
"""yaml
|
|
54
57
|
exposition:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
/:
|
|
59
|
+
io:output: true
|
|
60
|
+
/*:
|
|
61
|
+
GET: greet
|
|
62
|
+
/foo/*/bar:
|
|
63
|
+
GET: greet
|
|
59
64
|
"""
|
|
60
65
|
When the following request is received:
|
|
61
66
|
"""
|
|
@@ -94,12 +99,14 @@ Feature: Routes
|
|
|
94
99
|
"""yaml
|
|
95
100
|
exposition:
|
|
96
101
|
/:
|
|
102
|
+
io:output: true
|
|
97
103
|
POST: create
|
|
98
104
|
"""
|
|
99
105
|
And the `users.properties` is running with the following manifest:
|
|
100
106
|
"""yaml
|
|
101
107
|
exposition:
|
|
102
108
|
/:id:
|
|
109
|
+
io:output: true
|
|
103
110
|
GET: observe
|
|
104
111
|
"""
|
|
105
112
|
When the following request is received:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { afterAll, beforeAll, binding, given } from 'cucumber-tsflow'
|
|
2
|
-
import { type DataTable } from '@cucumber/cucumber'
|
|
3
2
|
import { MongoClient } from 'mongodb'
|
|
3
|
+
import type { Collection } from 'mongodb'
|
|
4
|
+
import type { DataTable } from '@cucumber/cucumber'
|
|
4
5
|
|
|
5
6
|
@binding()
|
|
6
7
|
export class Database {
|
|
@@ -8,9 +9,7 @@ export class Database {
|
|
|
8
9
|
|
|
9
10
|
@given('the `{word}` database contains:')
|
|
10
11
|
public async upsert (id: string, table: DataTable): Promise<void> {
|
|
11
|
-
const
|
|
12
|
-
const collection = Database.client.db(namespace).collection(name)
|
|
13
|
-
|
|
12
|
+
const collection = this.collection(id)
|
|
14
13
|
const columns = table.raw()[0]
|
|
15
14
|
const rows = table.rows()
|
|
16
15
|
const documents: Document[] = []
|
|
@@ -22,7 +21,11 @@ export class Database {
|
|
|
22
21
|
const str = rows[r][c]
|
|
23
22
|
const int = parseInt(str)
|
|
24
23
|
|
|
25
|
-
document[columns[c]] = int.toString() === str
|
|
24
|
+
document[columns[c]] = int.toString() === str
|
|
25
|
+
? int
|
|
26
|
+
: str === 'null'
|
|
27
|
+
? null
|
|
28
|
+
: str
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
documents.push(document)
|
|
@@ -36,10 +39,7 @@ export class Database {
|
|
|
36
39
|
|
|
37
40
|
@given('the `{word}` database is empty')
|
|
38
41
|
public async truncate (id: string): Promise<void> {
|
|
39
|
-
|
|
40
|
-
const collection = Database.client.db(namespace).collection(name)
|
|
41
|
-
|
|
42
|
-
await collection.deleteMany({})
|
|
42
|
+
await this.collection(id).deleteMany({})
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
@beforeAll()
|
|
@@ -53,6 +53,13 @@ export class Database {
|
|
|
53
53
|
public static async disconnect (): Promise<void> {
|
|
54
54
|
await this.client.close()
|
|
55
55
|
}
|
|
56
|
+
|
|
57
|
+
private collection (id: string): Collection {
|
|
58
|
+
const [name, namespace = 'default'] = id.split('.').reverse()
|
|
59
|
+
const collection = `${namespace}_${name}`.toLowerCase()
|
|
60
|
+
|
|
61
|
+
return Database.client.db('toa-dev').collection(collection)
|
|
62
|
+
}
|
|
56
63
|
}
|
|
57
64
|
|
|
58
|
-
type Document = Record<string, string | number>
|
|
65
|
+
type Document = Record<string, string | number | null>
|
package/features/steps/IdP.ts
CHANGED
|
@@ -14,7 +14,8 @@ export class IdP {
|
|
|
14
14
|
private static privateKey?: crypto.KeyObject
|
|
15
15
|
private static issuer?: string
|
|
16
16
|
|
|
17
|
-
public constructor (private readonly captures: Captures) {
|
|
17
|
+
public constructor (private readonly captures: Captures) {
|
|
18
|
+
}
|
|
18
19
|
|
|
19
20
|
@afterAll()
|
|
20
21
|
public static async stop (): Promise<void> {
|
|
@@ -29,14 +30,21 @@ export class IdP {
|
|
|
29
30
|
if (IdP.server instanceof http.Server) return
|
|
30
31
|
|
|
31
32
|
// creating the key
|
|
32
|
-
const {
|
|
33
|
+
const {
|
|
34
|
+
publicKey,
|
|
35
|
+
privateKey
|
|
36
|
+
} = await util.promisify(crypto.generateKeyPair)('rsa', {
|
|
33
37
|
modulusLength: 2048
|
|
34
38
|
})
|
|
35
39
|
|
|
36
40
|
IdP.privateKey = privateKey
|
|
37
41
|
|
|
38
42
|
const jwk = JSON.stringify({
|
|
39
|
-
keys: [{
|
|
43
|
+
keys: [{
|
|
44
|
+
use: 'sig',
|
|
45
|
+
alg: 'RS256',
|
|
46
|
+
...publicKey.export({ format: 'jwk' })
|
|
47
|
+
}]
|
|
40
48
|
})
|
|
41
49
|
|
|
42
50
|
const JWK_URL = '/.well-known/jwks'
|
|
@@ -54,24 +62,23 @@ export class IdP {
|
|
|
54
62
|
response.end(jwk)
|
|
55
63
|
break
|
|
56
64
|
|
|
57
|
-
case '/.well-known/openid-configuration':
|
|
58
|
-
{
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
65
|
+
case '/.well-known/openid-configuration': {
|
|
66
|
+
const openIdConfiguration = JSON.stringify({
|
|
67
|
+
issuer: IdP.issuer,
|
|
68
|
+
jwks_uri: IdP.issuer + JWK_URL,
|
|
69
|
+
response_types_supported: ['id_token'],
|
|
70
|
+
subject_types_supported: ['public'],
|
|
71
|
+
id_token_signing_alg_values_supported: ['RS256'],
|
|
72
|
+
scopes_supported: ['openid']
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
response.writeHead(200, {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
'Cache-Control': 'public, max-age=3600',
|
|
78
|
+
'Content-Length': openIdConfiguration.length
|
|
79
|
+
})
|
|
80
|
+
response.end(openIdConfiguration)
|
|
81
|
+
}
|
|
75
82
|
|
|
76
83
|
break
|
|
77
84
|
|
|
@@ -117,4 +124,31 @@ export class IdP {
|
|
|
117
124
|
|
|
118
125
|
this.captures.set(`${user}.id_token`, idToken)
|
|
119
126
|
}
|
|
127
|
+
|
|
128
|
+
@given('the IDP {word} token for {word} is issued with following secret:')
|
|
129
|
+
public async issueSymmetricToken (alg: string, user: string, secret: string): Promise<void> {
|
|
130
|
+
const jwt = [
|
|
131
|
+
{
|
|
132
|
+
typ: 'JWT',
|
|
133
|
+
alg
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
iss: IdP.issuer,
|
|
137
|
+
sub: `${user}-mock-id`,
|
|
138
|
+
aud: 'test',
|
|
139
|
+
iat: Math.floor(Date.now() / 1000),
|
|
140
|
+
exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
.map((v) => Buffer.from(JSON.stringify(v)).toString('base64url'))
|
|
144
|
+
.join('.')
|
|
145
|
+
|
|
146
|
+
const signature = crypto.createHmac(alg.replace(/^HS(\d{3})$/, 'sha$1'), secret)
|
|
147
|
+
.update(jwt)
|
|
148
|
+
.digest('base64url')
|
|
149
|
+
|
|
150
|
+
const idToken = `${jwt}.${signature}`
|
|
151
|
+
|
|
152
|
+
this.captures.set(`${user}.id_token`, idToken)
|
|
153
|
+
}
|
|
120
154
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
name: pots
|
|
2
|
+
version: 0.0.0
|
|
2
3
|
|
|
3
4
|
entity:
|
|
4
5
|
schema:
|
|
@@ -7,11 +8,19 @@ entity:
|
|
|
7
8
|
temperature?: number
|
|
8
9
|
|
|
9
10
|
operations:
|
|
10
|
-
|
|
11
|
+
create:
|
|
11
12
|
query: false
|
|
13
|
+
forward: transit
|
|
14
|
+
input:
|
|
15
|
+
title*: .
|
|
16
|
+
volume*: .
|
|
17
|
+
temperature: .
|
|
18
|
+
transit:
|
|
19
|
+
concurrency: retry
|
|
12
20
|
input:
|
|
13
|
-
title
|
|
14
|
-
volume
|
|
21
|
+
title: .
|
|
22
|
+
volume: .
|
|
23
|
+
temperature: .
|
|
15
24
|
observe:
|
|
16
25
|
output:
|
|
17
26
|
id: string
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Feature: Server timing
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given the `pots` is running with the following manifest:
|
|
5
|
+
"""yaml
|
|
6
|
+
exposition:
|
|
7
|
+
/:
|
|
8
|
+
POST: create
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
Scenario: Server timing is not available by default
|
|
12
|
+
When the following request is received:
|
|
13
|
+
"""
|
|
14
|
+
POST /pots/ HTTP/1.1
|
|
15
|
+
content-type: application/yaml
|
|
16
|
+
|
|
17
|
+
title: Hello
|
|
18
|
+
volume: 1.5
|
|
19
|
+
"""
|
|
20
|
+
Then the reply does not contain:
|
|
21
|
+
"""
|
|
22
|
+
server-timing:
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
Scenario: Server timing is sent when debug is enabled
|
|
26
|
+
Given the annotation:
|
|
27
|
+
"""
|
|
28
|
+
trace: true
|
|
29
|
+
"""
|
|
30
|
+
When the following request is received:
|
|
31
|
+
"""
|
|
32
|
+
POST /pots/ HTTP/1.1
|
|
33
|
+
content-type: application/yaml
|
|
34
|
+
|
|
35
|
+
title: Hello
|
|
36
|
+
volume: 1.5
|
|
37
|
+
"""
|
|
38
|
+
# to debug, break it and look at the console
|
|
39
|
+
Then the following reply is sent:
|
|
40
|
+
"""
|
|
41
|
+
201 Created
|
|
42
|
+
server-timing:
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
Scenario: Octets timing
|
|
46
|
+
Given the annotation:
|
|
47
|
+
"""yaml
|
|
48
|
+
trace: true
|
|
49
|
+
/:
|
|
50
|
+
io:output: true
|
|
51
|
+
auth:anonymous: true
|
|
52
|
+
octets:context: octets
|
|
53
|
+
POST:
|
|
54
|
+
octets:store: ~
|
|
55
|
+
"""
|
|
56
|
+
When the stream of `lenna.png` is received with the following headers:
|
|
57
|
+
"""
|
|
58
|
+
POST / HTTP/1.1
|
|
59
|
+
content-type: application/octet-stream
|
|
60
|
+
"""
|
|
61
|
+
# to debug, break it and look at the console
|
|
62
|
+
Then the following reply is sent:
|
|
63
|
+
"""
|
|
64
|
+
201 Created
|
|
65
|
+
server-timing:
|
|
66
|
+
"""
|