From 8671e24917e403da76a6a23cd7567af4fea9622f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3gvan=20Olsen?= Date: Thu, 28 Nov 2019 15:22:29 +0000 Subject: [PATCH] #65: Fixed issue top level fields with directives are being ignored --- .../execution/ParallelRequestExecutor.kt | 11 +++++++---- .../typesystem/DirectivesSpecificationTest.kt | 19 +++++++++++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/execution/ParallelRequestExecutor.kt b/kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/execution/ParallelRequestExecutor.kt index a6834f9b..7468d924 100644 --- a/kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/execution/ParallelRequestExecutor.kt +++ b/kgraphql/src/main/kotlin/com/apurebase/kgraphql/schema/execution/ParallelRequestExecutor.kt @@ -52,16 +52,19 @@ class ParallelRequestExecutor(val schema: DefaultSchema) : RequestExecutor, Coro val data = root.putObject("data") val resultMap = plan.toMapAsync { - writeOperation( + val ctx = ExecutionContext(Variables(schema, variables, it.variables), context) + if (determineInclude(ctx, it)) writeOperation( isSubscription = plan.isSubscription, - ctx = ExecutionContext(Variables(schema, variables, it.variables), context), + ctx = ctx, node = it, operation = it.field as Field.Function<*, *> - ) + ) else null } for (operation in plan) { - data.set(operation.aliasOrKey, resultMap[operation]) + if (resultMap[operation] != null) { // Remove all by skip/include directives + data.set(operation.aliasOrKey, resultMap[operation]) + } } return objectWriter.writeValueAsString(root) diff --git a/kgraphql/src/test/kotlin/com/apurebase/kgraphql/specification/typesystem/DirectivesSpecificationTest.kt b/kgraphql/src/test/kotlin/com/apurebase/kgraphql/specification/typesystem/DirectivesSpecificationTest.kt index 56f6b63f..796a163b 100644 --- a/kgraphql/src/test/kotlin/com/apurebase/kgraphql/specification/typesystem/DirectivesSpecificationTest.kt +++ b/kgraphql/src/test/kotlin/com/apurebase/kgraphql/specification/typesystem/DirectivesSpecificationTest.kt @@ -1,8 +1,8 @@ package com.apurebase.kgraphql.specification.typesystem -import com.apurebase.kgraphql.Specification -import com.apurebase.kgraphql.extractOrNull +import com.apurebase.kgraphql.* import com.apurebase.kgraphql.integration.BaseSchemaTest +import org.amshove.kluent.shouldEqual import org.hamcrest.CoreMatchers.notNullValue import org.hamcrest.CoreMatchers.nullValue import org.hamcrest.MatcherAssert.assertThat @@ -38,6 +38,21 @@ class DirectivesSpecificationTest : BaseSchemaTest() { assertThat(extractOrNull(mapNeither, "data/film/year"), notNullValue()) } + @Test + fun `query with @include and @skip directive on field object`() { + val mapWithSkip = execute("{ number(big: true), film @skip(if: true) { title } }") + mapWithSkip.extract("data/film") shouldEqual null + + val mapWithoutSkip = execute("{ number(big: true), film @skip(if: false) { title } }") + mapWithoutSkip.extract("data/film/title") shouldEqual "Prestige" + + val mapWithInclude = execute("{ number(big: true), film @include(if: true) { title } }") + mapWithInclude.extract("data/film/title") shouldEqual "Prestige" + + val mapWithoutInclude = execute("{ number(big: true), film @include(if: false) { title } }") + mapWithoutInclude.extract("data/film") shouldEqual null + } + @Test fun `query with @include directive on field with variable`(){ val map = execute(