From 7fa68f82aeee01a7bb7318313f8de5241b7d008a Mon Sep 17 00:00:00 2001 From: James Date: Wed, 11 Jul 2018 20:09:12 +0930 Subject: [PATCH 1/3] Implement defaultValue --- src/domains/arg/compiler.ts | 1 + src/domains/arg/options.ts | 1 + src/domains/arg/registry.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/src/domains/arg/compiler.ts b/src/domains/arg/compiler.ts index e356f62..66311a3 100644 --- a/src/domains/arg/compiler.ts +++ b/src/domains/arg/compiler.ts @@ -114,6 +114,7 @@ function convertArgsArrayToArgsMap( argsMap[argName] = { type: finalType, description: argConfig.description, + defaultValue: argConfig.defaultValue, }; }); return argsMap; diff --git a/src/domains/arg/options.ts b/src/domains/arg/options.ts index ba323cf..0df1a47 100644 --- a/src/domains/arg/options.ts +++ b/src/domains/arg/options.ts @@ -2,6 +2,7 @@ export interface ArgOptions { description?: string; type?: any; isNullable?: boolean; + defaultValue?: any; } export const defaultArgOptions: ArgOptions = { diff --git a/src/domains/arg/registry.ts b/src/domains/arg/registry.ts index a1a6a6e..9d5a416 100644 --- a/src/domains/arg/registry.ts +++ b/src/domains/arg/registry.ts @@ -4,6 +4,7 @@ export interface ArgInnerConfig { description?: string; isNullable?: boolean; type?: any; + defaultValue?: any; } export const argRegistry = new DeepWeakMap< From 3059b314e4e4f2c8bdee75affd280ca2a93efb75 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 11 Jul 2018 20:21:21 +0930 Subject: [PATCH 2/3] Adding a couple of tests --- src/test/arg/basics.spec.ts | 45 ++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/test/arg/basics.spec.ts b/src/test/arg/basics.spec.ts index 9347fb4..40be54b 100644 --- a/src/test/arg/basics.spec.ts +++ b/src/test/arg/basics.spec.ts @@ -91,25 +91,60 @@ describe('Arguments with @Arg', () => { }); it('Will allow registering argument at runtime', () => { + @ObjectType() + class Foo { + @Field() + bar(baz: string, bazRequired: string): string { + return baz; + } + } + + Arg({ type: String, isNullable: true })(Foo.prototype, 'bar', 0); + Arg({ type: String, isNullable: false })(Foo.prototype, 'bar', 1); + + const [bazArg, bazRequiredArg] = compileObjectType( + Foo, + ).getFields().bar.args; + + expect(bazArg.type).toBe(GraphQLString); + expect(bazRequiredArg.type).toEqual(new GraphQLNonNull(GraphQLString)); + }); + + it('Respects unset defaultValue @Arg option', () => { @ObjectType() class Foo { @Field() bar( + @Arg({ isNullable: true }) baz: string, + @Arg({ isNullable: false }) bazRequired: string, ): string { return baz; } } - - Arg({type: String, isNullable: true})(Foo.prototype, 'bar', 0); - Arg({type: String, isNullable: false})(Foo.prototype, 'bar', 1); - const [bazArg, bazRequiredArg] = compileObjectType( Foo, ).getFields().bar.args; - expect(bazArg.type).toBe(GraphQLString); + expect(bazArg.defaultValue).toBe(undefined); expect(bazRequiredArg.type).toEqual(new GraphQLNonNull(GraphQLString)); }); + + it('Respects defaultValue @Arg option', () => { + @ObjectType() + class Foo { + @Field() + bar( + @Arg({ isNullable: true, defaultValue: 'default' }) + baz: string, + ): string { + return baz; + } + } + const compiledObject = compileObjectType(Foo); + const [bazArg] = compiledObject.getFields().bar.args; + expect(bazArg.type).toBe(GraphQLString); + expect(bazArg.defaultValue).toBe('default'); + }); }); From ddc0c3b6b4dc1d7e1d254d03b66422b26cdf795d Mon Sep 17 00:00:00 2001 From: James Date: Sat, 14 Jul 2018 15:34:20 +0930 Subject: [PATCH 3/3] Added schema execution test to defaultValue test. Reverted format change to pre-existing test --- src/test/arg/basics.spec.ts | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/test/arg/basics.spec.ts b/src/test/arg/basics.spec.ts index 40be54b..5383f6f 100644 --- a/src/test/arg/basics.spec.ts +++ b/src/test/arg/basics.spec.ts @@ -1,5 +1,13 @@ -import { GraphQLString, GraphQLNonNull } from 'graphql'; -import { Field, ObjectType, compileObjectType, Arg } from '~/domains'; +import { graphql, GraphQLString, GraphQLNonNull } from 'graphql'; +import { + Field, + ObjectType, + compileObjectType, + Arg, + SchemaRoot, + Query, + compileSchema, +} from '~/domains'; describe('Arguments with @Arg', () => { it('Allows setting argument with @Arg decorator', () => { @@ -131,7 +139,7 @@ describe('Arguments with @Arg', () => { expect(bazRequiredArg.type).toEqual(new GraphQLNonNull(GraphQLString)); }); - it('Respects defaultValue @Arg option', () => { + it('Respects defaultValue @Arg option', async () => { @ObjectType() class Foo { @Field() @@ -142,9 +150,22 @@ describe('Arguments with @Arg', () => { return baz; } } + @SchemaRoot() + class FooSchema { + @Query() + foo(): Foo { + return new Foo(); + } + } + const compiledObject = compileObjectType(Foo); const [bazArg] = compiledObject.getFields().bar.args; expect(bazArg.type).toBe(GraphQLString); expect(bazArg.defaultValue).toBe('default'); + + const compiledSchema = compileSchema({ roots: [FooSchema] }); + expect(await graphql(compiledSchema, '{ foo { bar } }')).toEqual({ + data: { foo: { bar: 'default' } }, + }); }); });