From c43d85e55c69c154df27e354dcd4c30781f73e36 Mon Sep 17 00:00:00 2001 From: Peter Pribula Date: Sat, 3 Apr 2021 15:44:10 +0200 Subject: [PATCH] Added TYPE_HIERARCHY strategy to DsgData annotation scanning --- .../graphql/dgs/internal/DgsSchemaProvider.kt | 4 +-- .../graphql/dgs/DgsSchemaProviderTest.kt | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt index 14f38716f..be9bf494d 100644 --- a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt +++ b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsSchemaProvider.kt @@ -196,10 +196,10 @@ class DgsSchemaProvider( val javaClass = AopUtils.getTargetClass(dgsComponent) javaClass.methods.asSequence() - .filter { method -> MergedAnnotations.from(method).isPresent(DgsData::class.java) } + .filter { method -> MergedAnnotations.from(method, MergedAnnotations.SearchStrategy.TYPE_HIERARCHY).isPresent(DgsData::class.java) } .forEach { method -> - val dgsDataAnnotation = MergedAnnotations.from(method).get(DgsData::class.java) + val dgsDataAnnotation = MergedAnnotations.from(method, MergedAnnotations.SearchStrategy.TYPE_HIERARCHY).get(DgsData::class.java) val field = dgsDataAnnotation.getString("field").ifEmpty { method.name } val parentType = dgsDataAnnotation.getString("parentType") diff --git a/graphql-dgs/src/test/kotlin/com/netflix/graphql/dgs/DgsSchemaProviderTest.kt b/graphql-dgs/src/test/kotlin/com/netflix/graphql/dgs/DgsSchemaProviderTest.kt index d43e1b6ab..79abe44db 100644 --- a/graphql-dgs/src/test/kotlin/com/netflix/graphql/dgs/DgsSchemaProviderTest.kt +++ b/graphql-dgs/src/test/kotlin/com/netflix/graphql/dgs/DgsSchemaProviderTest.kt @@ -68,6 +68,16 @@ internal class DgsSchemaProviderTest { } } + private interface DefaultHelloFetcherInterface { + @DgsData(parentType = "Query", field = "hello") + fun someFetcher(): String + } + + private val interfaceHelloFetcher = object : DefaultHelloFetcherInterface { + override fun someFetcher(): String = + "Hello" + } + @Test fun findSchemaFiles() { val findSchemaFiles = DgsSchemaProvider( @@ -350,6 +360,22 @@ internal class DgsSchemaProviderTest { assertThat(provider.dataFetcherInstrumentationEnabled["Query.hello"]).isTrue } + @Test + fun enableInstrumentationForDataFetchersFromInterfaces() { + every { applicationContextMock.getBeansWithAnnotation(DgsComponent::class.java) } returns mapOf( + Pair( + "helloFetcher", + interfaceHelloFetcher + ) + ) + every { applicationContextMock.getBeansWithAnnotation(DgsScalar::class.java) } returns emptyMap() + + val provider = DgsSchemaProvider(applicationContextMock, Optional.empty(), Optional.empty(), Optional.empty()) + provider.schema() + assertThat(provider.dataFetcherInstrumentationEnabled).containsKey("Query.hello") + assertThat(provider.dataFetcherInstrumentationEnabled["Query.hello"]).isTrue + } + @Test fun disableInstrumentationForDataFetchersWithAnnotation() {