diff --git a/.changeset/small-cycles-drive.md b/.changeset/small-cycles-drive.md new file mode 100644 index 0000000000..052507e37a --- /dev/null +++ b/.changeset/small-cycles-drive.md @@ -0,0 +1,5 @@ +--- +"@neo4j/graphql": patch +--- + +Fix non-array validate argument on authorization directive #4534 diff --git a/packages/graphql/src/schema-model/generate-model.test.ts b/packages/graphql/src/schema-model/generate-model.test.ts index fd8e652f3c..956334d9bd 100644 --- a/packages/graphql/src/schema-model/generate-model.test.ts +++ b/packages/graphql/src/schema-model/generate-model.test.ts @@ -129,7 +129,7 @@ describe("ConcreteEntity generation", () => { }, }, ]); - expect(authAnnotation?.validate).toBeUndefined(); + expect(authAnnotation?.validate).toEqual([]); }); test("authorization annotation is correct on User entity", () => { diff --git a/packages/graphql/src/schema-model/parser/annotations-parser/authorization-annotation.ts b/packages/graphql/src/schema-model/parser/annotations-parser/authorization-annotation.ts index 8f8378dceb..b23d9054d8 100644 --- a/packages/graphql/src/schema-model/parser/annotations-parser/authorization-annotation.ts +++ b/packages/graphql/src/schema-model/parser/annotations-parser/authorization-annotation.ts @@ -17,6 +17,7 @@ * limitations under the License. */ import type { DirectiveNode } from "graphql"; +import { asArray } from "../../../utils/utils"; import type { AuthorizationFilterRuleConstructor, AuthorizationValidateRuleConstructor, @@ -34,7 +35,7 @@ export function parseAuthorizationAnnotation(directive: DirectiveNode): Authoriz validate?: Record[]; }; const filterRules = filter?.map((rule) => new AuthorizationFilterRule(rule as AuthorizationFilterRuleConstructor)); - const validateRules = validate?.map( + const validateRules = asArray(validate).map( (rule) => new AuthorizationValidateRule(rule as AuthorizationValidateRuleConstructor) ); diff --git a/packages/graphql/tests/tck/directives/authorization/arguments/bind/interface-relationships/implementation-bind.test.ts b/packages/graphql/tests/tck/directives/authorization/arguments/validate/interface-relationships/implementation-bind.test.ts similarity index 100% rename from packages/graphql/tests/tck/directives/authorization/arguments/bind/interface-relationships/implementation-bind.test.ts rename to packages/graphql/tests/tck/directives/authorization/arguments/validate/interface-relationships/implementation-bind.test.ts diff --git a/packages/graphql/tests/tck/directives/authorization/arguments/bind/bind.test.ts b/packages/graphql/tests/tck/directives/authorization/arguments/validate/validate.test.ts similarity index 98% rename from packages/graphql/tests/tck/directives/authorization/arguments/bind/bind.test.ts rename to packages/graphql/tests/tck/directives/authorization/arguments/validate/validate.test.ts index 1f85ee1ede..8c9cdc0f40 100644 --- a/packages/graphql/tests/tck/directives/authorization/arguments/bind/bind.test.ts +++ b/packages/graphql/tests/tck/directives/authorization/arguments/validate/validate.test.ts @@ -41,13 +41,11 @@ describe("Cypher Auth Allow", () => { extend type User @authorization( - validate: [ - { - when: AFTER - operations: [CREATE, UPDATE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP] - where: { node: { id: "$jwt.sub" } } - } - ] + validate: { + when: AFTER + operations: [CREATE, UPDATE, CREATE_RELATIONSHIP, DELETE_RELATIONSHIP] + where: { node: { id: "$jwt.sub" } } + } ) extend type Post