This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch CAUSEWAY-3676 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit ca70d48ff49795454a3e826fc877be719491e1b4 Author: danhaywood <[email protected]> AuthorDate: Mon Feb 12 08:34:45 2024 +0000 CAUSEWAY-3676: wip, adds tests for scenario --- .../viewer/graphql/model/domain/GqlvScenario.java | 23 ++++++++-- .../graphql/model/domain/GqlvScenarioGiven.java | 1 - .../graphql/model/domain/GqlvScenarioName.java | 43 +++++++++++++++++++ .../viewer/graphql/model/domain/Scenario.java | 44 ++++++++++++++++++- .../e2e/scenario/Calculator_IntegTest.concat._.gql | 12 ++++++ .../test/e2e/scenario/Calculator_IntegTest.java | 50 ++++++++++++++++++++++ viewers/graphql/test/src/test/resources/schema.gql | 3 +- .../graphql/viewer/toplevel/GqlvTopLevelQuery.java | 3 +- 8 files changed, 171 insertions(+), 8 deletions(-) diff --git a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenario.java b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenario.java index 162f30e505..a9eceac23b 100644 --- a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenario.java +++ b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenario.java @@ -18,8 +18,10 @@ */ package org.apache.causeway.viewer.graphql.model.domain; +import graphql.Scalars; import graphql.schema.DataFetcher; import graphql.schema.FieldCoordinates; +import graphql.schema.GraphQLArgument; import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLObjectType; @@ -29,12 +31,14 @@ import static graphql.schema.GraphQLObjectType.newObject; import org.apache.causeway.viewer.graphql.model.context.Context; +import graphql.schema.GraphQLScalarType; + import lombok.Getter; /** * Exposes a domain service (view model or entity) via the GQL viewer. */ -public class GqlvScenario implements GqlvScenarioGiven.Holder { +public class GqlvScenario implements GqlvScenarioName.Holder, GqlvScenarioGiven.Holder { private final Holder holder; private final Context context; @@ -42,6 +46,7 @@ public class GqlvScenario implements GqlvScenarioGiven.Holder { private final GraphQLObjectType.Builder gqlObjectTypeBuilder; private final Scenario scenarioPojo; + private final GqlvScenarioName scenarioName; private final GqlvScenarioGiven scenarioGiven; @Getter private GraphQLFieldDefinition field; @@ -56,13 +61,21 @@ public class GqlvScenario implements GqlvScenarioGiven.Holder { this.scenarioPojo = context.serviceRegistry.lookupService(Scenario.class).orElseThrow(); - this.gqlObjectTypeBuilder = newObject().name("Scenario"); // TODO: probably need to change this type? + this.gqlObjectTypeBuilder = newObject().name("Scenario"); + this.scenarioName = new GqlvScenarioName(this, context); this.scenarioGiven = new GqlvScenarioGiven(this, context); this.gqlObjectType = gqlObjectTypeBuilder.build(); - this.field = new GraphQLFieldDefinition.Builder().name("Scenario").type(gqlObjectType).build(); + this.field = new GraphQLFieldDefinition.Builder() + .name("Scenario") + .type(gqlObjectType) + .argument(new GraphQLArgument.Builder() + .name("name") + .type(Scalars.GraphQLString) + ) + .build(); holder.addField(field); } @@ -83,7 +96,9 @@ public class GqlvScenario implements GqlvScenarioGiven.Holder { context.codeRegistryBuilder.dataFetcher( holder.coordinatesFor(getField()), (DataFetcher<Object>) environment -> scenarioPojo); - // add + + scenarioName.addDataFetchers(); + scenarioGiven.addDataFetchers(); } diff --git a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioGiven.java b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioGiven.java index c16b4629e0..4ebfa15b05 100644 --- a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioGiven.java +++ b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioGiven.java @@ -49,7 +49,6 @@ public class GqlvScenarioGiven implements GqlvDomainService.Holder, GqlvDomainOb } }); - // add services to top-level query context.objectSpecifications().forEach(objectSpec -> { if (Objects.requireNonNull(objectSpec.getBeanSort()) == BeanSort.MANAGED_BEAN_CONTRIBUTING) { // @DomainService context.serviceRegistry.lookupBeanById(objectSpec.getLogicalTypeName()) diff --git a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioName.java b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioName.java new file mode 100644 index 0000000000..d5164f23e2 --- /dev/null +++ b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioName.java @@ -0,0 +1,43 @@ +package org.apache.causeway.viewer.graphql.model.domain; + +import graphql.Scalars; +import graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; +import graphql.schema.GraphQLFieldDefinition; + +import static graphql.schema.GraphQLObjectType.newObject; + +import org.apache.causeway.viewer.graphql.model.context.Context; + +public class GqlvScenarioName { + + private final Holder holder; + private final Context context; + private final GraphQLFieldDefinition field; + + public GqlvScenarioName( + final GqlvScenarioName.Holder holder, + final Context context) { + + this.holder = holder; + this.context = context; + + this.field = GraphQLFieldDefinition.newFieldDefinition().name("Name").type(Scalars.GraphQLString).build(); + this.holder.addField(field); + } + + public void addDataFetchers() { + context.codeRegistryBuilder.dataFetcher( + holder.coordinatesFor(field), + (DataFetcher<Object>) environment -> name(environment)); + } + + private String name(DataFetchingEnvironment environment) { + return context.serviceRegistry.lookupService(Scenario.class).map(Scenario::getName).orElseThrow(); + } + + public interface Holder + extends GqlvHolder { + } + +} diff --git a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Scenario.java b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Scenario.java index 0b67dbddcb..1a868f1432 100644 --- a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Scenario.java +++ b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/Scenario.java @@ -1,9 +1,51 @@ package org.apache.causeway.viewer.graphql.model.domain; -import org.apache.causeway.applib.annotation.InteractionScope; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +import java.util.HashMap; +import java.util.Map; + +import javax.inject.Inject; + +import org.apache.causeway.applib.annotation.Programmatic; +import org.apache.causeway.applib.services.bookmark.Bookmark; + +import org.apache.causeway.applib.services.bookmark.BookmarkService; import org.springframework.stereotype.Service; +/** + * Holds the state of an executing scenario. + * + * <p> + * Note that although this is a singleton, it is <i>not</i> thread-safe. + * </p> + */ @Service +@RequiredArgsConstructor(onConstructor_ = {@Inject}) public class Scenario { + + private final BookmarkService bookmarkService; + + @Getter @Setter private String name; + + private final Map<String, Bookmark> references = new HashMap<>(); + + @Programmatic + public void putReference(String reference, final Object pojo) { + Bookmark bookmark = bookmarkService.bookmarkFor(pojo).orElseThrow(); + references.put(reference, bookmark); + } + + @Programmatic + public Object getReference(String reference) { + return bookmarkService.lookup(references.get(reference)).orElseThrow(); + } + + @Programmatic + public void clearReferences() { + references.clear(); + } } diff --git a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Calculator_IntegTest.concat._.gql b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Calculator_IntegTest.concat._.gql new file mode 100644 index 0000000000..a07ae57dbf --- /dev/null +++ b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Calculator_IntegTest.concat._.gql @@ -0,0 +1,12 @@ +{ + Scenario(name: "Fizz buzz"){ + Name + Given { + university_calc_Calculator { + concat { + invoke(prefix: "Fizz", suffix: "Buzz") + } + } + } + } +} diff --git a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Calculator_IntegTest.java b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Calculator_IntegTest.java new file mode 100644 index 0000000000..ab001059ca --- /dev/null +++ b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Calculator_IntegTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.causeway.viewer.graphql.viewer.test.e2e.scenario; + +import org.apache.causeway.viewer.graphql.viewer.test.e2e.Abstract_IntegTest; + +import org.approvaltests.Approvals; +import org.approvaltests.reporters.DiffReporter; +import org.approvaltests.reporters.UseReporter; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; + +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; + + +//NOT USING @Transactional since we are running server within same transaction otherwise +@Order(30) +@ActiveProfiles("test") +@DirtiesContext +public class Calculator_IntegTest extends Abstract_IntegTest { + + + @Test + @UseReporter(DiffReporter.class) + void concat() throws Exception { + + // when, then + Approvals.verify(submit(), jsonOptions()); + + } + + +} diff --git a/viewers/graphql/test/src/test/resources/schema.gql b/viewers/graphql/test/src/test/resources/schema.gql index ab93b891dd..c3c1d4042e 100644 --- a/viewers/graphql/test/src/test/resources/schema.gql +++ b/viewers/graphql/test/src/test/resources/schema.gql @@ -63,7 +63,7 @@ type Given { } type Query { - Scenario: Scenario + Scenario(name: String): Scenario _gqlv_lookup__causeway_applib_DomainObjectList(object: causeway_applib_DomainObjectList__gqlv_input): causeway_applib_DomainObjectList _gqlv_lookup__causeway_applib_FacetGroupNode(object: causeway_applib_FacetGroupNode__gqlv_input): causeway_applib_FacetGroupNode _gqlv_lookup__causeway_applib_ParameterNode(object: causeway_applib_ParameterNode__gqlv_input): causeway_applib_ParameterNode @@ -113,6 +113,7 @@ type Query { type Scenario { Given: Given + Name: String } type causeway_applib_DomainObjectList { diff --git a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java index ff5ca87aca..7e7946cf1b 100644 --- a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java +++ b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java @@ -80,6 +80,7 @@ public class GqlvTopLevelQuery implements GqlvDomainService.Holder, GqlvDomainOb } public void addDataFetchers() { + domainServices.forEach(domainService -> { boolean actionsAdded = domainService.hasActions(); if (actionsAdded) { @@ -90,7 +91,7 @@ public class GqlvTopLevelQuery implements GqlvDomainService.Holder, GqlvDomainOb domainObjects.forEach(GqlvDomainObject::addDataFetchers); + scenario.addDataFetchers(); } - }
