This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/isis.git
commit 0f8b103f794091927b4325823918e24791f3d5fe Author: Dan Haywood <d...@haywood-associates.co.uk> AuthorDate: Wed Dec 6 06:35:31 2017 +0000 ISIS-1794: reworks BDD bootstrapping to support dependency injection ... to use new integrationTest3, and have a consistent programming model for the glue, similar to integration tests. Currently this is just in the example simpleapp, need to generalize and refactor. --- .../scenarios/ObjectFactoryForIntegration.java | 55 ++++++++++++++++ .../simpleapp/application/lib/.gitignore | 5 -- ...arDown.java => DomainAppApplicationModule.java} | 17 +++-- .../fixture/scenarios/DomainAppDemo.java | 24 +++---- .../application/manifest/DomainAppAppManifest.java | 25 +++---- .../manifest/DomainAppAppManifestWithFixtures.java | 4 +- .../bdd/specglue/BootstrappingGlue.java | 17 ++++- .../bdd/specglue/CatalogOfFixturesGlue.java | 8 ++- .../application/bdd/specs/RunIntegBddSpecs.java | 3 +- .../SimpleObjectSpec_listAllAndCreate.feature | 4 +- .../integtests/DomainAppIntegTestAbstract.java | 13 ++-- .../application/integtests/Smoke_IntegTest.java | 10 ++- .../src/test/resources/cucumber.properties | 1 + ...leModuleDomSubmodule.java => SimpleModule.java} | 30 ++++++++- .../modules/simple/SimpleModuleManifest.java | 9 +-- .../simple/dom/impl/SimpleObjectRepository.java | 10 +++ ...pleObjectData.java => SimpleObjectBuilder.java} | 49 +++++++------- ...leObjectData.java => SimpleObject_persona.java} | 22 +++++-- .../fixture/scenario/CreateSimpleObjects.java | 77 ---------------------- .../integtests/SimpleModuleIntegTestAbstract.java | 14 ++-- .../tests/SimpleObjectMenu_IntegTest.java | 38 ++++++----- .../integtests/tests/SimpleObject_IntegTest.java | 12 +--- .../simple/specglue/SimpleObjectMenuGlue.java | 11 ++-- 23 files changed, 241 insertions(+), 217 deletions(-) diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java new file mode 100644 index 0000000..a52868a --- /dev/null +++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ObjectFactoryForIntegration.java @@ -0,0 +1,55 @@ +package org.apache.isis.core.integtestsupport.scenarios; + +import java.lang.reflect.Constructor; +import java.util.Map; + +import com.google.common.collect.Maps; + +import org.apache.isis.core.specsupport.scenarios.ScenarioExecution; + +import cucumber.api.java.ObjectFactory; +import cucumber.runtime.CucumberException; + +public class ObjectFactoryForIntegration implements ObjectFactory { + private final Map<Class<?>, Object> instances = Maps.newHashMap(); + + public void start() { } + + public void stop() { + this.instances.clear(); + } + + public boolean addClass(Class<?> clazz) { + return true; + } + + public <T> T getInstance(Class<T> type) { + T instance = type.cast(this.instances.get(type)); + if (instance == null) { + instance = this.newInstance(type); + if(ScenarioExecution.peek() != null) { + instance = this.cacheInstance(type, instance); + ScenarioExecution.current().injectServices(instance); + } else { + // don't cache + } + } + return instance; + } + + private <T> T cacheInstance(Class<T> type, T instance) { + this.instances.put(type, instance); + return instance; + } + + private <T> T newInstance(Class<T> type) { + try { + Constructor<T> constructor = type.getConstructor(); + return constructor.newInstance(); + } catch (NoSuchMethodException var4) { + throw new CucumberException(String.format("%s doesn't have an empty constructor.", type), var4); + } catch (Exception var5) { + throw new CucumberException(String.format("Failed to instantiate %s", type), var5); + } + } +} diff --git a/example/application/simpleapp/application/lib/.gitignore b/example/application/simpleapp/application/lib/.gitignore deleted file mode 100644 index 70eee7e..0000000 --- a/example/application/simpleapp/application/lib/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# -# explicitly ignoring Microsoft JDBC4 jar -# (cannot redistribute, licensing) -# -sqljdbc4.jar diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/fixture/teardown/DomainAppTearDown.java b/example/application/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java similarity index 68% rename from example/application/simpleapp/application/src/main/java/domainapp/application/fixture/teardown/DomainAppTearDown.java rename to example/application/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java index f7ea288..9dda7e7 100644 --- a/example/application/simpleapp/application/src/main/java/domainapp/application/fixture/teardown/DomainAppTearDown.java +++ b/example/application/simpleapp/application/src/main/java/domainapp/application/DomainAppApplicationModule.java @@ -16,17 +16,22 @@ * specific language governing permissions and limitations * under the License. */ -package domainapp.application.fixture.teardown; +package domainapp.application; -import org.apache.isis.applib.fixturescripts.FixtureScript; +import java.util.Set; -import domainapp.modules.simple.fixture.teardown.SimpleModuleTearDown; +import com.google.common.collect.Sets; -public class DomainAppTearDown extends FixtureScript { +import org.apache.isis.applib.Module; +import org.apache.isis.applib.ModuleAbstract; + +import domainapp.modules.simple.SimpleModule; + +public class DomainAppApplicationModule extends ModuleAbstract { @Override - protected void execute(ExecutionContext executionContext) { - executionContext.executeChild(this, new SimpleModuleTearDown()); + public Set<Module> getDependencies() { + return Sets.<Module>newHashSet(new SimpleModule()); } } diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/fixture/scenarios/DomainAppDemo.java b/example/application/simpleapp/application/src/main/java/domainapp/application/fixture/scenarios/DomainAppDemo.java index 7f3ce27..eab6c29 100644 --- a/example/application/simpleapp/application/src/main/java/domainapp/application/fixture/scenarios/DomainAppDemo.java +++ b/example/application/simpleapp/application/src/main/java/domainapp/application/fixture/scenarios/DomainAppDemo.java @@ -18,14 +18,11 @@ */ package domainapp.application.fixture.scenarios; -import javax.annotation.Nullable; +import javax.inject.Inject; +import org.apache.isis.applib.AppManifest2; import org.apache.isis.applib.fixturescripts.FixtureScript; - -import domainapp.application.fixture.teardown.DomainAppTearDown; -import domainapp.modules.simple.fixture.scenario.CreateSimpleObjects; -import lombok.Getter; -import lombok.Setter; +import org.apache.isis.applib.services.metamodel.MetaModelService4; public class DomainAppDemo extends FixtureScript { @@ -33,16 +30,13 @@ public class DomainAppDemo extends FixtureScript { withDiscoverability(Discoverability.DISCOVERABLE); } - @Nullable - @Getter @Setter - private Integer number; - @Override protected void execute(final ExecutionContext ec) { - - // execute - ec.executeChild(this, new DomainAppTearDown()); - ec.executeChild(this, new CreateSimpleObjects().setNumber(number)); - + AppManifest2 appManifest2 = metaModelService4.getAppManifest2(); + ec.executeChild(this, appManifest2.getTeardownFixture()); + ec.executeChild(this, appManifest2.getRefDataSetupFixture()); } + + @Inject + MetaModelService4 metaModelService4; } diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java index c52599a..462f82f 100644 --- a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java +++ b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifest.java @@ -18,32 +18,25 @@ */ package domainapp.application.manifest; -import org.apache.isis.applib.AppManifestAbstract; +import org.apache.isis.applib.AppManifestAbstract2; -import domainapp.application.fixture.DomainAppApplicationModuleFixtureSubmodule; -import domainapp.application.services.DomainAppApplicationModuleServicesSubmodule; -import domainapp.modules.simple.dom.SimpleModuleDomSubmodule; +import domainapp.application.DomainAppApplicationModule; /** * Bootstrap the application. */ -public class DomainAppAppManifest extends AppManifestAbstract { +public class DomainAppAppManifest extends AppManifestAbstract2 { - public static final Builder BUILDER = Builder.forModules( - SimpleModuleDomSubmodule.class, - DomainAppApplicationModuleFixtureSubmodule.class, - DomainAppApplicationModuleServicesSubmodule.class - ) - .withConfigurationPropertiesFile(DomainAppAppManifest.class, + public DomainAppAppManifest() { + super(Builder2 + .forModule(new DomainAppApplicationModule()) + .withConfigurationPropertiesFile(DomainAppAppManifest.class, "isis.properties", "authentication_shiro.properties", "persistor_datanucleus.properties", "viewer_restfulobjects.properties", - "viewer_wicket.properties" - ).withAuthMechanism("shiro"); - - public DomainAppAppManifest() { - super(BUILDER); + "viewer_wicket.properties") + .withAuthMechanism("shiro")); } } diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java index 39331ab..062795e 100644 --- a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java +++ b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java @@ -22,7 +22,7 @@ import java.util.List; import org.apache.isis.applib.fixturescripts.FixtureScript; -import domainapp.modules.simple.fixture.scenario.CreateSimpleObjects; +import domainapp.modules.simple.fixture.SimpleObjectBuilder; /** * Run the app but setting up any fixtures. @@ -30,7 +30,7 @@ import domainapp.modules.simple.fixture.scenario.CreateSimpleObjects; public class DomainAppAppManifestWithFixtures extends DomainAppAppManifest { @Override protected void overrideFixtures(final List<Class<? extends FixtureScript>> fixtureScripts) { - fixtureScripts.add(CreateSimpleObjects.class); + fixtureScripts.add(SimpleObjectBuilder.class); } } diff --git a/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specglue/BootstrappingGlue.java b/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specglue/BootstrappingGlue.java index 43f59e1..29d13da 100644 --- a/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specglue/BootstrappingGlue.java +++ b/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specglue/BootstrappingGlue.java @@ -16,24 +16,37 @@ O * Licensed to the Apache Software Foundation (ASF) under one or more */ package domainapp.application.bdd.specglue; +import org.apache.isis.core.integtestsupport.IntegrationTestAbstract3; import org.apache.isis.core.specsupport.scenarios.ScenarioExecutionScope; import org.apache.isis.core.specsupport.specs.CukeGlueAbstract; import cucumber.api.java.After; import cucumber.api.java.Before; -import domainapp.application.integtests.DomainAppIntegTestAbstract; +import domainapp.application.DomainAppApplicationModule; public class BootstrappingGlue extends CukeGlueAbstract { @Before(value={"@integration"}, order=100) public void beforeScenarioIntegrationScope() { - DomainAppIntegTestAbstract.initSystem(); + + IntegrationTestAbstract3 integTest = + new IntegrationTestAbstract3(new DomainAppApplicationModule()) {}; + integTest.bootstrapAndSetupIfRequired(); + before(ScenarioExecutionScope.INTEGRATION); + + scenarioExecution().putVar(IntegrationTestAbstract3.class.getName(), "current", integTest); } @After public void afterScenario(cucumber.api.Scenario sc) { assertMocksSatisfied(); + + IntegrationTestAbstract3 integTest = + scenarioExecution().getVar(IntegrationTestAbstract3.class.getName(), "current", + IntegrationTestAbstract3.class); + integTest.tearDownAllModules(); + after(sc); } } diff --git a/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specglue/CatalogOfFixturesGlue.java b/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specglue/CatalogOfFixturesGlue.java index a5adbac..9d6b816 100644 --- a/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specglue/CatalogOfFixturesGlue.java +++ b/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specglue/CatalogOfFixturesGlue.java @@ -16,6 +16,9 @@ */ package domainapp.application.bdd.specglue; +import javax.inject.Inject; + +import org.apache.isis.applib.fixturescripts.FixtureScripts; import org.apache.isis.core.specsupport.specs.CukeGlueAbstract; import cucumber.api.java.Before; @@ -25,7 +28,10 @@ public class CatalogOfFixturesGlue extends CukeGlueAbstract { @Before(value={"@integration", "@DomainAppDemo"}, order=20000) public void integrationFixtures() throws Throwable { - scenarioExecution().install(new DomainAppDemo()); + fixtureScripts.runFixtureScript(new DomainAppDemo(), null); } + @Inject + FixtureScripts fixtureScripts; + } diff --git a/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specs/RunIntegBddSpecs.java b/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specs/RunIntegBddSpecs.java index 4d9f543..77e5a5e 100644 --- a/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specs/RunIntegBddSpecs.java +++ b/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specs/RunIntegBddSpecs.java @@ -36,7 +36,8 @@ import cucumber.api.junit.Cucumber; "classpath:domainapp.modules.simple.specglue" }, strict = true, - tags = { "~@backlog", "~@ignore" }) + tags = { "~@backlog", "~@ignore" } +) public class RunIntegBddSpecs { // intentionally empty } diff --git a/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specs/SimpleObjectSpec_listAllAndCreate.feature b/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specs/SimpleObjectSpec_listAllAndCreate.feature index 083e2cb..24d69b7 100644 --- a/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specs/SimpleObjectSpec_listAllAndCreate.feature +++ b/example/application/simpleapp/application/src/test/java/domainapp/application/bdd/specs/SimpleObjectSpec_listAllAndCreate.feature @@ -19,8 +19,8 @@ Feature: List and Create New Simple Objects @integration Scenario: Existing simple objects can be listed and new ones created - Given there are initially 3 simple objects + Given there are initially 10 simple objects When I create a new simple object - Then there are 4 simple objects + Then there are 11 simple objects \ No newline at end of file diff --git a/example/application/simpleapp/application/src/test/java/domainapp/application/integtests/DomainAppIntegTestAbstract.java b/example/application/simpleapp/application/src/test/java/domainapp/application/integtests/DomainAppIntegTestAbstract.java index 02ee1e1..675278d 100644 --- a/example/application/simpleapp/application/src/test/java/domainapp/application/integtests/DomainAppIntegTestAbstract.java +++ b/example/application/simpleapp/application/src/test/java/domainapp/application/integtests/DomainAppIntegTestAbstract.java @@ -18,17 +18,14 @@ */ package domainapp.application.integtests; -import org.junit.BeforeClass; +import org.apache.isis.core.integtestsupport.IntegrationTestAbstract3; -import org.apache.isis.core.integtestsupport.IntegrationTestAbstract2; +import domainapp.application.DomainAppApplicationModule; -import domainapp.application.manifest.DomainAppAppManifest; +public abstract class DomainAppIntegTestAbstract extends IntegrationTestAbstract3 { -public abstract class DomainAppIntegTestAbstract extends IntegrationTestAbstract2 { - - @BeforeClass - public static void initSystem() { - bootstrapUsing(new DomainAppAppManifest()); + public DomainAppIntegTestAbstract() { + super(new DomainAppApplicationModule()); } } diff --git a/example/application/simpleapp/application/src/test/java/domainapp/application/integtests/Smoke_IntegTest.java b/example/application/simpleapp/application/src/test/java/domainapp/application/integtests/Smoke_IntegTest.java index 08e64ef..b724fb9 100644 --- a/example/application/simpleapp/application/src/test/java/domainapp/application/integtests/Smoke_IntegTest.java +++ b/example/application/simpleapp/application/src/test/java/domainapp/application/integtests/Smoke_IntegTest.java @@ -24,10 +24,11 @@ import javax.inject.Inject; import org.junit.Test; +import org.apache.isis.applib.AppManifest2; import org.apache.isis.applib.fixturescripts.FixtureScripts; +import org.apache.isis.applib.services.metamodel.MetaModelService4; import org.apache.isis.applib.services.xactn.TransactionService; -import domainapp.application.fixture.teardown.DomainAppTearDown; import domainapp.modules.simple.dom.impl.SimpleObject; import domainapp.modules.simple.dom.impl.SimpleObjectMenu; import static org.assertj.core.api.Assertions.assertThat; @@ -41,12 +42,15 @@ public class Smoke_IntegTest extends DomainAppIntegTestAbstract { @Inject SimpleObjectMenu menu; + @Inject + MetaModelService4 metaModelService4; + @Test public void create() throws Exception { // given - DomainAppTearDown fs = new DomainAppTearDown(); - fixtureScripts.runFixtureScript(fs, null); + AppManifest2 appManifest2 = metaModelService4.getAppManifest2(); + fixtureScripts.runFixtureScript(appManifest2.getTeardownFixture(), null); transactionService.nextTransaction(); diff --git a/example/application/simpleapp/application/src/test/resources/cucumber.properties b/example/application/simpleapp/application/src/test/resources/cucumber.properties new file mode 100644 index 0000000..683c38a --- /dev/null +++ b/example/application/simpleapp/application/src/test/resources/cucumber.properties @@ -0,0 +1 @@ +cucumber.api.java.ObjectFactory=org.apache.isis.core.integtestsupport.scenarios.ObjectFactoryForIntegration \ No newline at end of file diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/SimpleModuleDomSubmodule.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java similarity index 52% rename from example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/SimpleModuleDomSubmodule.java rename to example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java index 7d314e8..e961c22 100644 --- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/SimpleModuleDomSubmodule.java +++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModule.java @@ -16,10 +16,34 @@ * specific language governing permissions and limitations * under the License. */ -package domainapp.modules.simple.dom; +package domainapp.modules.simple; -public final class SimpleModuleDomSubmodule { - private SimpleModuleDomSubmodule(){} +import org.apache.isis.applib.fixturescripts.FixtureScript; +import org.apache.isis.applib.fixturescripts.setup.PersonaEnumPersistAll; +import org.apache.isis.applib.fixturescripts.teardown.TeardownFixtureAbstract2; +import org.apache.isis.applib.ModuleAbstract; + +import domainapp.modules.simple.dom.impl.SimpleObject; +import domainapp.modules.simple.fixture.SimpleObject_persona; + +public class SimpleModule extends ModuleAbstract { + + @Override + public FixtureScript getRefDataSetupFixture() { + // the intention of this method is to initialize ref data rather than operational/transactional data + // the line below demonstrates how to persist every instance of SimpleObject_persona enum easily + return new PersonaEnumPersistAll(SimpleObject_persona.class); + } + + @Override + public FixtureScript getTeardownFixture() { + return new TeardownFixtureAbstract2() { + @Override + protected void execute(ExecutionContext executionContext) { + deleteFrom(SimpleObject.class); + } + }; + } public static class PropertyDomainEvent<S,T> extends org.apache.isis.applib.services.eventbus.PropertyDomainEvent<S,T> {} diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModuleManifest.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModuleManifest.java index 961695d..32396fa 100644 --- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModuleManifest.java +++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/SimpleModuleManifest.java @@ -19,19 +19,14 @@ package domainapp.modules.simple; import org.apache.isis.applib.AppManifestAbstract; - -import domainapp.modules.simple.dom.SimpleModuleDomSubmodule; -import domainapp.modules.simple.fixture.SimpleModuleFixtureSubmodule; +import org.apache.isis.applib.Module; /** * Used by <code>isis-maven-plugin</code> (build-time validation of the module) and also by module-level integration tests. */ public class SimpleModuleManifest extends AppManifestAbstract { - public static final Builder BUILDER = Builder.forModules( - SimpleModuleDomSubmodule.class, - SimpleModuleFixtureSubmodule.class - ); + public static final Builder BUILDER = Module.Util.builderFor(new SimpleModule()); public SimpleModuleManifest() { super(BUILDER); diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjectRepository.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjectRepository.java index 1b652d5..8e2fc91 100644 --- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjectRepository.java +++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjectRepository.java @@ -47,6 +47,16 @@ public class SimpleObjectRepository { .executeList(); } + public SimpleObject findByNameExact(final String name) { + TypesafeQuery<SimpleObject> q = isisJdoSupport.newTypesafeQuery(SimpleObject.class); + final QSimpleObject cand = QSimpleObject.candidate(); + q = q.filter( + cand.name.eq(q.stringParameter("name")) + ); + return q.setParameter("name", name) + .executeUnique(); + } + public SimpleObject create(final String name) { return repositoryService.persist(new SimpleObject(name)); } diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/SimpleObjectData.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObjectBuilder.java similarity index 59% copy from example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/SimpleObjectData.java copy to example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObjectBuilder.java index 8cf4270..bda6adb 100644 --- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/SimpleObjectData.java +++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObjectBuilder.java @@ -17,33 +17,34 @@ * under the License. */ -package domainapp.modules.simple.fixture.scenario; +package domainapp.modules.simple.fixture; + +import org.apache.isis.applib.fixturescripts.BuilderScriptAbstract; import domainapp.modules.simple.dom.impl.SimpleObject; import domainapp.modules.simple.dom.impl.SimpleObjectMenu; -import lombok.AllArgsConstructor; - -@AllArgsConstructor -public enum SimpleObjectData { - - FOO("Foo"), - BAR("Bar"), - BAZ("Baz"), - FRODO("Frodo"), - FROYO("Froyo"), - FIZZ("Fizz"), - BIP("Bip"), - BOP("Bop"), - BANG("Bang"), - BOO("Boo"); - - private final String name; - - public SimpleObject createWith(final SimpleObjectMenu menu) { - return menu.create(name); - } +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +@Accessors(chain = true) +public class SimpleObjectBuilder extends BuilderScriptAbstract<SimpleObject, SimpleObjectBuilder> { + + @Getter @Setter + private String name; + + @Getter + private SimpleObject object; - public SimpleObject findWith(final SimpleObjectMenu menu) { - return menu.findByName(name).get(0); + @Override + protected void execute(final ExecutionContext ec) { + + checkParam("name", ec, String.class); + + object = wrap(simpleObjectMenu).create(name); } + + @javax.inject.Inject + SimpleObjectMenu simpleObjectMenu; + } diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/SimpleObjectData.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java similarity index 58% rename from example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/SimpleObjectData.java rename to example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java index 8cf4270..6786d95 100644 --- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/SimpleObjectData.java +++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/SimpleObject_persona.java @@ -17,14 +17,19 @@ * under the License. */ -package domainapp.modules.simple.fixture.scenario; +package domainapp.modules.simple.fixture; + +import org.apache.isis.applib.fixturescripts.PersonaWithBuilderScript; +import org.apache.isis.applib.fixturescripts.PersonaWithFinder; +import org.apache.isis.applib.services.registry.ServiceRegistry2; import domainapp.modules.simple.dom.impl.SimpleObject; -import domainapp.modules.simple.dom.impl.SimpleObjectMenu; +import domainapp.modules.simple.dom.impl.SimpleObjectRepository; import lombok.AllArgsConstructor; @AllArgsConstructor -public enum SimpleObjectData { +public enum SimpleObject_persona implements PersonaWithBuilderScript<SimpleObject, SimpleObjectBuilder>, + PersonaWithFinder<SimpleObject> { FOO("Foo"), BAR("Bar"), @@ -39,11 +44,14 @@ public enum SimpleObjectData { private final String name; - public SimpleObject createWith(final SimpleObjectMenu menu) { - return menu.create(name); + @Override + public SimpleObjectBuilder builder() { + return new SimpleObjectBuilder().setName(name); } - public SimpleObject findWith(final SimpleObjectMenu menu) { - return menu.findByName(name).get(0); + @Override + public SimpleObject findUsing(final ServiceRegistry2 serviceRegistry) { + SimpleObjectRepository simpleObjectRepository = serviceRegistry.lookupService(SimpleObjectRepository.class); + return simpleObjectRepository.findByNameExact(name); } } diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/CreateSimpleObjects.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/CreateSimpleObjects.java deleted file mode 100644 index 2fc9e55..0000000 --- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/fixture/scenario/CreateSimpleObjects.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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 domainapp.modules.simple.fixture.scenario; - -import java.util.List; - -import javax.annotation.Nullable; - -import com.google.common.collect.Lists; - -import org.apache.isis.applib.fixturescripts.FixtureScript; - -import domainapp.modules.simple.dom.impl.SimpleObject; -import domainapp.modules.simple.dom.impl.SimpleObjectMenu; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -@Accessors(chain = true) -public class CreateSimpleObjects extends FixtureScript { - - /** - * The number of objects to create, up to 10; optional, defaults to 3. - */ - @Nullable - @Getter @Setter - private Integer number; - - /** - * The objects created by this fixture (output). - */ - @Getter - private final List<SimpleObject> simpleObjects = Lists.newArrayList(); - - @Override - protected void execute(final ExecutionContext ec) { - - int max = SimpleObjectData.values().length; - - // defaults - final int number = defaultParam("number", ec, 3); - - // validate - if(number < 0 || number > max) { - throw new IllegalArgumentException(String.format("number must be in range [0,%d)", max)); - } - - // execute - for (int i = 0; i < number; i++) { - final SimpleObjectData data = SimpleObjectData.values()[i]; - final SimpleObject simpleObject = data.createWith(wrap(simpleObjectMenu)); - ec.addResult(this, simpleObject); - simpleObjects.add(simpleObject); - } - } - - @javax.inject.Inject - SimpleObjectMenu simpleObjectMenu; - -} diff --git a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java index 18ff06b..bf3cf52 100644 --- a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java +++ b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java @@ -18,17 +18,15 @@ */ package domainapp.modules.simple.integtests; -import org.junit.BeforeClass; +import org.apache.isis.core.integtestsupport.IntegrationTestAbstract3; -import org.apache.isis.core.integtestsupport.IntegrationTestAbstract2; +import domainapp.modules.simple.SimpleModule; -import domainapp.modules.simple.SimpleModuleManifest; +public abstract class SimpleModuleIntegTestAbstract extends IntegrationTestAbstract3 { -public abstract class SimpleModuleIntegTestAbstract extends IntegrationTestAbstract2 { - - @BeforeClass - public static void initSystem() { - bootstrapUsing(SimpleModuleManifest.BUILDER.withConfigurationProperty("isis.objects.editing","false")); + public SimpleModuleIntegTestAbstract() { + super(new SimpleModule().withConfigurationProperty("isis.objects.editing","false")); } + } diff --git a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjectMenu_IntegTest.java b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjectMenu_IntegTest.java index 88016a9..8e8b030 100644 --- a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjectMenu_IntegTest.java +++ b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjectMenu_IntegTest.java @@ -32,12 +32,14 @@ import org.junit.Test; import org.apache.isis.applib.fixturescripts.FixtureScript; import org.apache.isis.applib.fixturescripts.FixtureScripts; +import org.apache.isis.applib.fixturescripts.teardown.TeardownFixtureAbstract2; import org.apache.isis.applib.services.xactn.TransactionService; +import domainapp.modules.simple.SimpleModule; import domainapp.modules.simple.dom.impl.SimpleObject; import domainapp.modules.simple.dom.impl.SimpleObjectMenu; -import domainapp.modules.simple.fixture.scenario.CreateSimpleObjects; -import domainapp.modules.simple.fixture.teardown.SimpleModuleTearDown; +import domainapp.modules.simple.fixture.SimpleObjectBuilder; +import domainapp.modules.simple.fixture.SimpleObject_persona; import domainapp.modules.simple.integtests.SimpleModuleIntegTestAbstract; import static org.assertj.core.api.Assertions.assertThat; @@ -55,27 +57,23 @@ public class SimpleObjectMenu_IntegTest extends SimpleModuleIntegTestAbstract { @Test public void happyCase() throws Exception { - // given - fixtureScripts.runFixtureScript(new SimpleModuleTearDown(), null); - CreateSimpleObjects fs = new CreateSimpleObjects(); - fixtureScripts.runFixtureScript(fs, null); - transactionService.nextTransaction(); - // when final List<SimpleObject> all = wrap(menu).listAll(); // then - assertThat(all).hasSize(fs.getSimpleObjects().size()); - - SimpleObject simpleObject = wrap(all.get(0)); - assertThat(simpleObject.getName()).isEqualTo(fs.getSimpleObjects().get(0).getName()); + assertThat(all).hasSize(SimpleObject_persona.values().length); } @Test public void whenNone() throws Exception { // given - FixtureScript fs = new SimpleModuleTearDown(); + FixtureScript fs = new TeardownFixtureAbstract2() { + @Override + protected void execute(ExecutionContext executionContext) { + deleteFrom(SimpleObject.class); + } + }; fixtureScripts.runFixtureScript(fs, null); transactionService.nextTransaction(); @@ -93,7 +91,12 @@ public class SimpleObjectMenu_IntegTest extends SimpleModuleIntegTestAbstract { public void happyCase() throws Exception { // given - FixtureScript fs = new SimpleModuleTearDown(); + FixtureScript fs = new TeardownFixtureAbstract2() { + @Override + protected void execute(ExecutionContext executionContext) { + deleteFrom(SimpleObject.class); + } + }; fixtureScripts.runFixtureScript(fs, null); transactionService.nextTransaction(); @@ -109,7 +112,12 @@ public class SimpleObjectMenu_IntegTest extends SimpleModuleIntegTestAbstract { public void whenAlreadyExists() throws Exception { // given - FixtureScript fs = new SimpleModuleTearDown(); + FixtureScript fs = new TeardownFixtureAbstract2() { + @Override + protected void execute(ExecutionContext executionContext) { + deleteFrom(SimpleObject.class); + } + }; fixtureScripts.runFixtureScript(fs, null); transactionService.nextTransaction(); wrap(menu).create("Faz"); diff --git a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java index c7f99ab..a974686 100644 --- a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java +++ b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObject_IntegTest.java @@ -35,9 +35,7 @@ import org.apache.isis.core.metamodel.services.jdosupport.Persistable_datanucleu import domainapp.modules.simple.dom.impl.SimpleObject; import domainapp.modules.simple.dom.impl.SimpleObjectMenu; -import domainapp.modules.simple.fixture.scenario.CreateSimpleObjects; -import domainapp.modules.simple.fixture.scenario.SimpleObjectData; -import domainapp.modules.simple.fixture.teardown.SimpleModuleTearDown; +import domainapp.modules.simple.fixture.SimpleObject_persona; import domainapp.modules.simple.integtests.SimpleModuleIntegTestAbstract; import static org.assertj.core.api.Assertions.assertThat; @@ -54,13 +52,7 @@ public class SimpleObject_IntegTest extends SimpleModuleIntegTestAbstract { @Before public void setUp() throws Exception { - // given - fixtureScripts.runFixtureScript(new SimpleModuleTearDown(), null); - CreateSimpleObjects fs = new CreateSimpleObjects().setNumber(1); - fixtureScripts.runFixtureScript(fs, null); - transactionService.nextTransaction(); - - simpleObject = SimpleObjectData.FOO.findWith(wrap(simpleObjectMenu)); + simpleObject = SimpleObject_persona.FOO.findUsing(serviceRegistry); assertThat(simpleObject).isNotNull(); } diff --git a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/specglue/SimpleObjectMenuGlue.java b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/specglue/SimpleObjectMenuGlue.java index c0b887e..ffa3ba2 100644 --- a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/specglue/SimpleObjectMenuGlue.java +++ b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/specglue/SimpleObjectMenuGlue.java @@ -19,6 +19,8 @@ package domainapp.modules.simple.specglue; import java.util.List; import java.util.UUID; +import javax.inject.Inject; + import org.apache.isis.core.specsupport.specs.CukeGlueAbstract; import cucumber.api.java.en.Given; @@ -33,7 +35,7 @@ public class SimpleObjectMenuGlue extends CukeGlueAbstract { @Given("^there are.* (\\d+) simple objects$") public void there_are_N_simple_objects(int n) throws Throwable { try { - final List<SimpleObject> list = simpleObjectMenu().listAll(); + final List<SimpleObject> list = wrap(simpleObjectMenu).listAll(); assertThat(list.size(), is(n)); putVar("java.util.List", "simpleObjects", list); } finally { @@ -43,11 +45,10 @@ public class SimpleObjectMenuGlue extends CukeGlueAbstract { @When("^.*create a .*simple object$") public void create_a_simple_object() throws Throwable { - simpleObjectMenu().create(UUID.randomUUID().toString()); + wrap(simpleObjectMenu).create(UUID.randomUUID().toString()); } - private SimpleObjectMenu simpleObjectMenu() { - return service(SimpleObjectMenu.class); - } + @Inject + SimpleObjectMenu simpleObjectMenu; } -- To stop receiving notification emails like this one, please contact "commits@isis.apache.org" <commits@isis.apache.org>.