This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch attempting-to-bring-in-bdd-specs in repository https://gitbox.apache.org/repos/asf/isis-app-simpleapp.git
commit 70d13bc3e563ce942c4a2c40586df1d388ef0c10 Author: Dan Haywood <d...@haywood-associates.co.uk> AuthorDate: Tue Aug 30 22:53:34 2022 +0100 no joy yet --- .../webapp/bdd/specs/CucumberTestAbstract.java | 81 ++++++++++++- .../testdomain/conf/Configuration_headless.java | 130 +++++++++++++++++++++ .../isis/testdomain/cucumber/CucumberTest.java} | 27 +++-- .../apache/isis/testdomain/cucumber/StepDefs.java | 61 ++++++++++ .../src/test/resources/application-test.properties | 8 +- .../webapp/bdd/specs/is_it_friday_yet.feature | 8 ++ .../src/test/resources/junit-platform.properties | 27 ++++- .../testdomain/cucumber/is_it_friday_yet.feature | 8 ++ 8 files changed, 333 insertions(+), 17 deletions(-) diff --git a/webapp-tests/src/test/java/domainapp/webapp/bdd/specs/CucumberTestAbstract.java b/webapp-tests/src/test/java/domainapp/webapp/bdd/specs/CucumberTestAbstract.java index d19ba11..2471ebe 100644 --- a/webapp-tests/src/test/java/domainapp/webapp/bdd/specs/CucumberTestAbstract.java +++ b/webapp-tests/src/test/java/domainapp/webapp/bdd/specs/CucumberTestAbstract.java @@ -18,7 +18,30 @@ */ package domainapp.webapp.bdd.specs; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.test.context.ActiveProfiles; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.apache.isis.core.config.presets.IsisPresets; +import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices; +import org.apache.isis.persistence.jpa.eclipselink.IsisModulePersistenceJpaEclipselink; +import org.apache.isis.security.bypass.IsisModuleSecurityBypass; +import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib; +import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract; + +import domainapp.modules.simple.SimpleModule; +import domainapp.webapp.application.ApplicationModule; import domainapp.webapp.integtests.WebAppIntegTestAbstract; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import io.cucumber.spring.CucumberContextConfiguration; /** @@ -26,9 +49,63 @@ import io.cucumber.spring.CucumberContextConfiguration; * Provides the App's Spring Context for testing with Cucumber. * */ +@SpringBootTest( + classes = { + // we use a slightly different configuration compared to the production (AppManifest/webapp) + domainapp.webapp.integtests.WebAppIntegTestAbstract.TestApp.class, + BddStepDefsModule.class, + ApplicationModule.class, + } +) @CucumberContextConfiguration -public abstract class CucumberTestAbstract extends WebAppIntegTestAbstract { +@ActiveProfiles("test") +public abstract class CucumberTestAbstract extends IsisIntegrationTestAbstract { + + /** + * Compared to the production app manifest <code>domainapp.webapp.AppManifest</code>, + * here we in effect disable security checks, and we exclude any web/UI modules. + */ + @SpringBootConfiguration + @EnableAutoConfiguration + @EnableJpaRepositories + @Import({ + + IsisModuleCoreRuntimeServices.class, + IsisModuleSecurityBypass.class, + IsisModulePersistenceJpaEclipselink.class, + IsisModuleTestingFixturesApplib.class, + + SimpleModule.class + }) + @PropertySources({ + @PropertySource(IsisPresets.H2InMemory_withUniqueSchema), + @PropertySource(IsisPresets.UseLog4j2Test), + }) + public static class TestApp { + + } + + private String today; + private String actualAnswer; + +// @Given("today is Sunday") +// public void today_is_sunday() { +// this.today = "Sunday"; +// } + + @Given("^today is (.+)$") + public void today_is(final String today) { + this.today = today; + } + + @When("I ask whether it's Friday yet") + public void i_ask_whether_it_s_Friday_yet() { + actualAnswer = "Friday".equals(today) ? "TGIF" : "Nope"; + } - // any cucumber specific stuff might go here + @Then("I should be told {string}") + public void i_should_be_told(final String expectedAnswer) { + assertEquals(expectedAnswer, actualAnswer); + } } diff --git a/webapp-tests/src/test/java/org/apache/isis/testdomain/conf/Configuration_headless.java b/webapp-tests/src/test/java/org/apache/isis/testdomain/conf/Configuration_headless.java new file mode 100644 index 0000000..ba14c24 --- /dev/null +++ b/webapp-tests/src/test/java/org/apache/isis/testdomain/conf/Configuration_headless.java @@ -0,0 +1,130 @@ +/* + * 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.isis.testdomain.conf; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; +import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionException; +import org.springframework.transaction.TransactionStatus; + +import org.apache.isis.applib.annotation.PriorityPrecedence; +import org.apache.isis.applib.services.iactn.Interaction; +import org.apache.isis.applib.services.metrics.MetricsService; +import org.apache.isis.core.config.presets.IsisPresets; +import org.apache.isis.core.interaction.scope.TransactionBoundaryAware; +import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices; +import org.apache.isis.security.bypass.IsisModuleSecurityBypass; +//import org.apache.isis.testdomain.util.interaction.DomainObjectTesterFactory; +//import org.apache.isis.testdomain.util.kv.KVStoreForTesting; + +import lombok.RequiredArgsConstructor; + +@Configuration +@Import({ + IsisModuleCoreRuntimeServices.class, + IsisModuleSecurityBypass.class, + Configuration_headless.HeadlessCommandSupport.class, +// KVStoreForTesting.class, // Helper for JUnit Tests +// DomainObjectTesterFactory.class // Helper for JUnit Tests +}) +@PropertySources({ + @PropertySource(IsisPresets.NoTranslations), +}) +public class Configuration_headless { + + @Service + @javax.annotation.Priority(PriorityPrecedence.MIDPOINT) + @RequiredArgsConstructor(onConstructor_ = {@Inject}) + public static class HeadlessCommandSupport + implements TransactionBoundaryAware { + + @Override + public void beforeEnteringTransactionalBoundary(final Interaction interaction) { +// _Probe.errOut("Interaction HAS_STARTED conversationId=%s", interaction.getInteractionId()); + setupCommandCreateIfMissing(); + } + + @Override + public void afterLeavingTransactionalBoundary(final Interaction interaction) { +// _Probe.errOut("Interaction IS_ENDING conversationId=%s", interaction.getInteractionId()); + } + + public void setupCommandCreateIfMissing() { + +// val interactionProvider = interactionProviderProvider.get(); +// @SuppressWarnings("unused") +// final Interaction interaction = Optional.ofNullable(interactionContext.getInteraction()) +// .orElseGet(()->{ +// val newCommand = new Command(); +// val newInteraction = new Interaction(newCommand); +// interactionProvider.setInteraction(newInteraction); +// return newInteraction; +// }); + } + + } + + @Bean @Singleton + public PlatformTransactionManager platformTransactionManager() { + return new PlatformTransactionManager() { + + @Override + public void rollback(final TransactionStatus status) throws TransactionException { + } + + @Override + public TransactionStatus getTransaction(final TransactionDefinition definition) throws TransactionException { + return null; + } + + @Override + public void commit(final TransactionStatus status) throws TransactionException { + } + }; + } + + + @Bean @Singleton + public MetricsService metricsService() { + return new MetricsService() { + + @Override + public int numberEntitiesLoaded() { + return 0; + } + + @Override + public int numberEntitiesDirtied() { + return 0; + } + + }; + } + + +} diff --git a/webapp-tests/src/test/java/domainapp/webapp/bdd/specs/CucumberTestAbstract.java b/webapp-tests/src/test/java/org/apache/isis/testdomain/cucumber/CucumberTest.java similarity index 51% copy from webapp-tests/src/test/java/domainapp/webapp/bdd/specs/CucumberTestAbstract.java copy to webapp-tests/src/test/java/org/apache/isis/testdomain/cucumber/CucumberTest.java index d19ba11..7a7c373 100644 --- a/webapp-tests/src/test/java/domainapp/webapp/bdd/specs/CucumberTestAbstract.java +++ b/webapp-tests/src/test/java/org/apache/isis/testdomain/cucumber/CucumberTest.java @@ -16,19 +16,28 @@ * specific language governing permissions and limitations * under the License. */ -package domainapp.webapp.bdd.specs; +package org.apache.isis.testdomain.cucumber; + +import org.junit.platform.suite.api.IncludeEngines; +import org.junit.platform.suite.api.SelectClasspathResource; +import org.junit.platform.suite.api.Suite; -import domainapp.webapp.integtests.WebAppIntegTestAbstract; -import io.cucumber.spring.CucumberContextConfiguration; /** - * - * Provides the App's Spring Context for testing with Cucumber. - * + * Cucumber will scan this package for feature files. + * <p> + * Make sure this class name ends with Test, as Surefire when bundled with Apache Isis + * filters JUnit tests also by class name. */ -@CucumberContextConfiguration -public abstract class CucumberTestAbstract extends WebAppIntegTestAbstract { +@Suite +@IncludeEngines("cucumber") +@SelectClasspathResource("org/apache/isis/testdomain/cucumber") +public class CucumberTest { - // any cucumber specific stuff might go here + // See 7.x: + // https://github.com/cucumber/cucumber-jvm/blob/main/release-notes/v7.0.0.md + // See 6.x: + // https://github.com/cucumber/cucumber-jvm/issues/1149 + // https://github.com/cucumber/cucumber-jvm/tree/master/junit-platform-engine } diff --git a/webapp-tests/src/test/java/org/apache/isis/testdomain/cucumber/StepDefs.java b/webapp-tests/src/test/java/org/apache/isis/testdomain/cucumber/StepDefs.java new file mode 100644 index 0000000..13c587e --- /dev/null +++ b/webapp-tests/src/test/java/org/apache/isis/testdomain/cucumber/StepDefs.java @@ -0,0 +1,61 @@ +/* + * 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.isis.testdomain.cucumber; + +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +import org.apache.isis.testdomain.conf.Configuration_headless; + +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import io.cucumber.spring.CucumberContextConfiguration; + +@CucumberContextConfiguration +@SpringBootTest( + classes = { + Configuration_headless.class, + }) +public class StepDefs { + private String today; + private String actualAnswer; + +// @Given("today is Sunday") +// public void today_is_sunday() { +// this.today = "Sunday"; +// } + + @Given("^today is (.+)$") + public void today_is(final String today) { + this.today = today; + } + + @When("I ask whether it's Friday yet") + public void i_ask_whether_it_s_Friday_yet() { + actualAnswer = "Friday".equals(today) ? "TGIF" : "Nope"; + } + + @Then("I should be told {string}") + public void i_should_be_told(final String expectedAnswer) { + assertEquals(expectedAnswer, actualAnswer); + } +} diff --git a/webapp-tests/src/test/resources/application-test.properties b/webapp-tests/src/test/resources/application-test.properties index eaf3275..7951c94 100644 --- a/webapp-tests/src/test/resources/application-test.properties +++ b/webapp-tests/src/test/resources/application-test.properties @@ -1,4 +1,4 @@ -eclipselink.weaving=false -eclipselink.weaving.changetracking=false -eclipselink.weaving.internal=false -eclipselink.weaving.lazy=false +#eclipselink.weaving=false +#eclipselink.weaving.changetracking=false +#eclipselink.weaving.internal=false +#eclipselink.weaving.lazy=false diff --git a/webapp-tests/src/test/resources/domainapp/webapp/bdd/specs/is_it_friday_yet.feature b/webapp-tests/src/test/resources/domainapp/webapp/bdd/specs/is_it_friday_yet.feature new file mode 100644 index 0000000..b93e94b --- /dev/null +++ b/webapp-tests/src/test/resources/domainapp/webapp/bdd/specs/is_it_friday_yet.feature @@ -0,0 +1,8 @@ +Feature: Is it Friday yet? + Everybody wants to know when it's Friday + + Scenario: Sunday isn't Friday + Given today is Sunday + When I ask whether it's Friday yet + Then I should be told "Nope" + diff --git a/webapp-tests/src/test/resources/junit-platform.properties b/webapp-tests/src/test/resources/junit-platform.properties index d4347d9..2d2392b 100644 --- a/webapp-tests/src/test/resources/junit-platform.properties +++ b/webapp-tests/src/test/resources/junit-platform.properties @@ -1,8 +1,31 @@ +## as per https://github.com/cucumber/cucumber-jvm/tree/master/junit-platform-engine#configuration-options +#cucumber.publish.quiet=true +#cucumber.filter.tags=not @backlog and not @ignore +# +#cucumber.glue=domainapp.webapp.bdd.specs +##we are using built-in reporting plugins +#cucumber.plugin=pretty, html:target/cucumber-reports/cucumber-report.html +# +#cucumber.junit-platform.naming-strategy=long +# +## WARNING: +## +## cucumber.plugin=..., json:target/cucumber-reports/cucumber-report.json, ... +## +## will cause an empty file to be created when running from mvn. +## +## this is why the maven configuration to execute cucumber using the CLI (antrun:run@cucumber-cli) +## is configured to use --plugins json:target/cucumber-no-clobber.json +## + + + + # as per https://github.com/cucumber/cucumber-jvm/tree/master/junit-platform-engine#configuration-options cucumber.publish.quiet=true cucumber.filter.tags=not @backlog and not @ignore - -cucumber.glue=domainapp.webapp.bdd.specs +#we are using @Cucumber annotated classes and restrict classpath search to +cucumber.glue=org.apache.isis.testdomain.cucumber #we are using built-in reporting plugins cucumber.plugin=pretty, html:target/cucumber-reports/cucumber-report.html diff --git a/webapp-tests/src/test/resources/org/apache/isis/testdomain/cucumber/is_it_friday_yet.feature b/webapp-tests/src/test/resources/org/apache/isis/testdomain/cucumber/is_it_friday_yet.feature new file mode 100644 index 0000000..b93e94b --- /dev/null +++ b/webapp-tests/src/test/resources/org/apache/isis/testdomain/cucumber/is_it_friday_yet.feature @@ -0,0 +1,8 @@ +Feature: Is it Friday yet? + Everybody wants to know when it's Friday + + Scenario: Sunday isn't Friday + Given today is Sunday + When I ask whether it's Friday yet + Then I should be told "Nope" +