package sft.integration.use; import org.jsoup.select.Elements; import org.junit.Test; import org.junit.runner.RunWith; import sft.Decorate; import sft.FixturesHelper; import sft.SimpleFunctionalTest; import sft.Text; import sft.decorators.Breadcrumb; import sft.integration.fixtures.JUnitHtmlHelper; import sft.integration.use.sut.ContextInAction; import sft.integration.use.sut.ErrorOccursWhenRaisingScenario; import sft.integration.use.sut.ErrorOccursWhenTerminatingScenario; import java.io.IOException; import static org.junit.Assert.*; import static sft.integration.use.sut.ContextInAction.getCallSequence; /* Context could be defined and handle for each scenario using JUnit annotation @Before and @After */ @RunWith(SimpleFunctionalTest.class) @Decorate(decorator = Breadcrumb.class) public class DefiningTestContextForAScenario { @FixturesHelper private JUnitHtmlHelper jUnitHtmlHelper = new JUnitHtmlHelper(); @Test public void definingContextForAScenario() throws IOException { youCanInstantiateAScenarioContextSpecificInPublicMethodAnnotatedWithBeforeAndTerminateItInPublicMethodAnnotatedWithAfter(); theContextInstantiationIsRunBeforeEachScenarioAndTheContextFinalizationIsRunAfterEachScenario(); finallyTheContextInstantiationIsDisplayedInFrontOfEachScenarioAndTheContextFinalizationIsDisplayedBehindEachScenario(); } @Test public void errorOccursWhenRaisingAScenarioContext() throws IOException { whenAnErrorOccursWhenRaisingAnScenarioContext(); theUseCaseIsSeenAsFailed(); theFailedScenarioIsShowInRed(); allScenarioStepsAreIgnored(); stackTraceIsDisplayedAtScenarioEnd(); } @Test public void errorOccursWhenTerminatingAScenarioContext() throws IOException { whenAnErrorOccursWhenTerminatingAnScenarioContext(); theUseCaseIsSeenAsFailed(); theFailedScenarioIsShowInRed(); allScenarioStepsAreRan(); stackTraceIsDisplayedAtScenarioEnd(); } private void stackTraceIsDisplayedAtScenarioEnd() { Elements scenarioPart = jUnitHtmlHelper.html.select("*.scenario *.panel-body"); assertEquals(4,scenarioPart.size()); assertTrue(scenarioPart.get(0).hasClass("beforeScenario")); assertFalse(scenarioPart.get(1).select("*.instruction").isEmpty()); assertTrue(scenarioPart.get(2).hasClass("afterScenario")); assertNotNull("Expecting exception div", scenarioPart.get(3).select("*.exception >div")); } private void allScenarioStepsAreRan() { assertTrue(jUnitHtmlHelper.html.select("*.instruction").hasClass("succeeded")); } private void allScenarioStepsAreIgnored() { assertTrue(jUnitHtmlHelper.html.select("*.instruction").hasClass("ignored")); } private void theUseCaseIsSeenAsFailed() { assertTrue(jUnitHtmlHelper.html.select("*.useCase").get(0).hasClass("failed")); } private void theFailedScenarioIsShowInRed() { assertTrue(jUnitHtmlHelper.html.select("*.scenario").hasClass("failed")); } private void whenAnErrorOccursWhenRaisingAnScenarioContext() throws IOException { getCallSequence().clear(); jUnitHtmlHelper.run(this.getClass(),ErrorOccursWhenRaisingScenario.class); } private void whenAnErrorOccursWhenTerminatingAnScenarioContext() throws IOException { getCallSequence().clear(); jUnitHtmlHelper.run(this.getClass(),ErrorOccursWhenTerminatingScenario.class); } @Text("You can instantiate a use case context specific using public static method annotated with BeforeClass and terminate it in public static method annotated with AfterClass.") private void youCanInstantiateAUseCaseContextSpecificInPublicStaticMethodAnnotatedWithBeforeClassAndTerminateItInPublicStaticMethodAnnotatedWithAfterClass() throws IOException { getCallSequence().clear(); jUnitHtmlHelper.run(this.getClass(),ContextInAction.class); } private void finallyTheContextInstantiationIsDisplayedInFrontOfEachScenarioAndTheContextFinalizationIsDisplayedBehindEachScenario() { Elements scenarioElements = jUnitHtmlHelper.html.select("*.useCase *.container *.scenario"); assertTrue(scenarioElements.get(0).select("> div").get(1).hasClass("beforeScenario")); assertTrue(scenarioElements.get(0).select("> div").get(3).hasClass("afterScenario")); assertTrue(scenarioElements.get(1).select("> div").get(1).hasClass("beforeScenario")); assertTrue(scenarioElements.get(1).select("> div").get(3).hasClass("afterScenario")); } private void theContextInstantiationIsRunBeforeEachScenarioAndTheContextFinalizationIsRunAfterEachScenario() { assertEquals("useCaseInitialization", getCallSequence().get(0)); assertEquals("scenarioInitialization", getCallSequence().get(1)); assertEquals("firstScenario", getCallSequence().get(2)); assertEquals("scenarioFinalization", getCallSequence().get(3)); assertEquals("scenarioInitialization", getCallSequence().get(4)); assertEquals("secondScenario", getCallSequence().get(5)); assertEquals("scenarioFinalization", getCallSequence().get(6)); assertEquals("useCaseFinalization", getCallSequence().get(7)); } @Text("You can instantiate a scenario context specific using public method annotated with Before and terminate it in public method annotated with After</a>.") private void youCanInstantiateAScenarioContextSpecificInPublicMethodAnnotatedWithBeforeAndTerminateItInPublicMethodAnnotatedWithAfter() throws IOException { youCanInstantiateAUseCaseContextSpecificInPublicStaticMethodAnnotatedWithBeforeClassAndTerminateItInPublicStaticMethodAnnotatedWithAfterClass(); } }