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.CssParser;
import sft.integration.fixtures.JUnitHtmlHelper;
import sft.integration.use.sut.ContextInAction;
import sft.integration.use.sut.ErrorOccursWhenRaisingAnUseCaseContext;
import sft.integration.use.sut.ErrorOccursWhenTerminatingAnUseCaseContext;
import java.io.IOException;
import static org.junit.Assert.*;
import static sft.integration.use.sut.ContextInAction.getCallSequence;
/*
Context could be defined and handle for the whole use case
using JUnit annotation @BeforeClass and @AfterClass.
*/
@RunWith(SimpleFunctionalTest.class)
@Decorate(decorator = Breadcrumb.class)
public class DefiningTestContextForAnUseCase {
@FixturesHelper
private JUnitHtmlHelper functionalTest = new JUnitHtmlHelper();
private CssParser cssParser;
@Test
public void definingContextForAnUseCase() throws IOException {
youCanInstantiateAUseCaseContextSpecificInPublicStaticMethodAnnotatedWithBeforeClassAndTerminateItInPublicStaticMethodAnnotatedWithAfterClass();
theContextInstantiationIsRunOnceBeforeAllScenariosAndTheContextFinalizationIsRunOnceAfterAllScenarios();
finallyTheContextInstantiationIsDisplayedInAParagraphBeforeAllScenariosAndTheContextFinalizationIsDisplayedInAnotherParagraphBeforeAllScenarios();
}
@Test
public void errorOccursWhenRaisingUseCaseContext() throws IOException {
whenAnErrorOccursWhenRaisingAnUseCaseContext();
theUseCaseIsSeenAsFailed();
theFailedContextIsShowInRed();
allScenariosAreIgnored();
theUseCaseContextTerminationIsIgnoredAndShownInYellow();
stackTraceIsDisplayedAtUseCaseStart();
}
@Test
public void errorOccursWhenTerminatingUseCaseContext() throws IOException {
whenAnErrorOccursWhenTerminatingAnUseCaseContext();
theUseCaseIsSeenAsFailed();
allScenariosAreRan();
theTerminatingFailedContextIsShowInRed();
stackTraceIsDisplayedAtUseCaseEnd();
}
private void stackTraceIsDisplayedAtUseCaseEnd() {
Elements teardDown = functionalTest.html.select("*.afterUseCase > div");
assertEquals(2,teardDown.size());
assertNotNull(teardDown.get(1).select("*.exception"));
}
private void stackTraceIsDisplayedAtUseCaseStart() {
Elements setup = functionalTest.html.select("*.beforeUseCase > div");
assertEquals(2, setup.size());
assertNotNull(setup.get(1).select("*.exception"));
}
private void theUseCaseIsSeenAsFailed() {
assertTrue(functionalTest.html.select("*.useCase").get(0).hasClass("failed"));
}
private void theUseCaseContextTerminationIsIgnoredAndShownInYellow() {
assertTrue(functionalTest.html.select("*.afterUseCase").hasClass("ignored"));
assertEquals("rgb(255, 255, 163)", cssParser.get("*.afterUseCase.ignored").getStyle().getPropertyCSSValue("background-color").getCssText());
}
private void allScenariosAreIgnored() {
assertTrue(functionalTest.html.select("*.scenario").hasClass("ignored"));
}
private void theFailedContextIsShowInRed() {
assertTrue(functionalTest.html.select("*.beforeUseCase").hasClass("failed"));
assertEquals("rgb(255, 194, 194)", cssParser.get("*.beforeUseCase.failed").getStyle().getPropertyCSSValue("background-color").getCssText());
}
private void theTerminatingFailedContextIsShowInRed() {
assertTrue(functionalTest.html.select("*.afterUseCase").hasClass("failed"));
assertEquals("rgb(255, 194, 194)", cssParser.get("*.afterUseCase.failed").getStyle().getPropertyCSSValue("background-color").getCssText());
}
private void whenAnErrorOccursWhenTerminatingAnUseCaseContext() throws IOException {
getCallSequence().clear();
functionalTest.run(this.getClass(),ErrorOccursWhenTerminatingAnUseCaseContext.class);
}
private void allScenariosAreRan() {
assertTrue(functionalTest.html.select("*.scenario").hasClass("succeeded"));
}
@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();
functionalTest.run(this.getClass(),ContextInAction.class);
}
private void theContextInstantiationIsRunOnceBeforeAllScenariosAndTheContextFinalizationIsRunOnceAfterAllScenarios() {
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));
}
private void finallyTheContextInstantiationIsDisplayedInAParagraphBeforeAllScenariosAndTheContextFinalizationIsDisplayedInAnotherParagraphBeforeAllScenarios() {
Elements useCaseElements = functionalTest.html.select("*.useCase *.container > div");
assertTrue(useCaseElements.get(0).hasClass("page-header"));
assertTrue(useCaseElements.get(1).hasClass("beforeUseCase"));
assertTrue(useCaseElements.get(2).hasClass("scenario"));
assertTrue(useCaseElements.get(3).hasClass("scenario"));
assertTrue(useCaseElements.get(4).hasClass("afterUseCase"));
}
private void whenAnErrorOccursWhenRaisingAnUseCaseContext() throws IOException {
functionalTest.run(this.getClass(),ErrorOccursWhenRaisingAnUseCaseContext.class);
cssParser = new CssParser();
}
}