Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 121 additions & 0 deletions screenplay-exercises (2).iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.1.0" level="project" />
<orderEntry type="library" name="Maven: net.serenity-bdd:serenity-core:1.1.40" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:19.0" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.inject:guice:3.0" level="project" />
<orderEntry type="library" name="Maven: javax.inject:javax.inject:1" level="project" />
<orderEntry type="library" name="Maven: aopalliance:aopalliance:1.0" level="project" />
<orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:5.0.3" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.10" level="project" />
<orderEntry type="library" name="Maven: org.objenesis:objenesis:2.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.21" level="project" />
<orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
<orderEntry type="library" name="Maven: info.cukes:cucumber-core:1.2.4" level="project" />
<orderEntry type="library" name="Maven: info.cukes:cucumber-html:0.2.3" level="project" />
<orderEntry type="library" name="Maven: info.cukes:cucumber-jvm-deps:1.0.5" level="project" />
<orderEntry type="library" name="Maven: info.cukes:gherkin:2.12.2" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: org.mockito:mockito-core:1.10.19" level="project" />
<orderEntry type="library" name="Maven: net.serenity-bdd:serenity-report-resources:1.1.40" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.6.1" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.4" level="project" />
<orderEntry type="library" name="Maven: com.opera:operadriver:1.5" level="project" />
<orderEntry type="library" name="Maven: com.opera:operalaunchers:1.1" level="project" />
<orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:2.4.1" level="project" />
<orderEntry type="library" name="Maven: commons-jxpath:commons-jxpath:1.3" level="project" />
<orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.2" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-server:2.53.1" level="project" />
<orderEntry type="library" name="Maven: com.beust:jcommander:1.48" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.48" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.48" level="project" />
<orderEntry type="library" name="Maven: mx4j:mx4j-tools:3.0.1" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:jetty-repacked:9.2.13.v20150730" level="project" />
<orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:3.1.0" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:jetty-rc-repacked:5" level="project" />
<orderEntry type="library" name="Maven: net.jcip:jcip-annotations:1.0" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-java:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-chrome-driver:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-remote-driver:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-api:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-exec:1.3" level="project" />
<orderEntry type="library" name="Maven: net.java.dev.jna:jna:4.1.0" level="project" />
<orderEntry type="library" name="Maven: net.java.dev.jna:jna-platform:4.1.0" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-edge-driver:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:htmlunit-driver:2.21" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-firefox-driver:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-ie-driver:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-safari-driver:2.53.1" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty:3.5.7.Final" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-support:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-leg-rc:2.53.1" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.8" level="project" />
<orderEntry type="library" name="Maven: com.codeborne:phantomjsdriver:1.2.1" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
<orderEntry type="library" name="Maven: io.appium:java-client:4.0.0" level="project" />
<orderEntry type="library" name="Maven: commons-validator:commons-validator:1.5.0" level="project" />
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.2" level="project" />
<orderEntry type="library" name="Maven: commons-digester:commons-digester:1.8.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.4" level="project" />
<orderEntry type="library" name="Maven: org.codehaus.groovy:groovy:2.4.4" level="project" />
<orderEntry type="library" name="Maven: net.sf.opencsv:opencsv:2.0" level="project" />
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils-core:1.8.3" level="project" />
<orderEntry type="library" name="Maven: com.googlecode.lambdaj:lambdaj:2.3.3" level="project" />
<orderEntry type="library" name="Maven: joda-time:joda-time:2.7" level="project" />
<orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.9" level="project" />
<orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" />
<orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.23" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.jexcelapi:jxl:2.6.12" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit:2.21" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit-core-js:2.17" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.htmlunit:neko-htmlunit:2.21" level="project" />
<orderEntry type="library" name="Maven: xerces:xercesImpl:2.11.0" level="project" />
<orderEntry type="library" name="Maven: net.sourceforge.cssparser:cssparser:0.9.18" level="project" />
<orderEntry type="library" name="Maven: org.w3c.css:sac:1.3" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-client:9.2.15.v20160210" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-util:9.2.15.v20160210" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-io:9.2.15.v20160210" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-common:9.2.15.v20160210" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-api:9.2.15.v20160210" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.2" level="project" />
<orderEntry type="library" name="Maven: org.fluentlenium:fluentlenium-core:0.10.2" level="project" />
<orderEntry type="library" name="Maven: com.jhlabs:filters:2.0.235" level="project" />
<orderEntry type="library" name="Maven: org.asciidoctor:asciidoctor-java-integration:0.1.4" level="project" />
<orderEntry type="library" name="Maven: org.jruby:jruby-complete:1.7.4" level="project" />
<orderEntry type="library" name="Maven: org.imgscalr:imgscalr-lib:4.2" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:1.1.0.Final" level="project" />
<orderEntry type="library" name="Maven: org.hibernate:hibernate-validator:5.1.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.1.3.GA" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.0.0" level="project" />
<orderEntry type="library" name="Maven: javax.el:javax.el-api:2.2.4" level="project" />
<orderEntry type="library" name="Maven: org.glassfish.web:javax.el:2.2.4" level="project" />
<orderEntry type="library" name="Maven: xalan:xalan:2.7.2" level="project" />
<orderEntry type="library" name="Maven: xalan:serializer:2.7.2" level="project" />
<orderEntry type="library" name="Maven: com.jayway.awaitility:awaitility:1.6.3" level="project" />
<orderEntry type="library" name="Maven: com.typesafe:config:1.2.1" level="project" />
<orderEntry type="library" name="Maven: org.jsoup:jsoup:1.8.3" level="project" />
<orderEntry type="library" name="Maven: com.google.jimfs:jimfs:1.0" level="project" />
<orderEntry type="library" name="Maven: net.serenity-bdd:serenity-screenplay:1.1.40" level="project" />
<orderEntry type="library" name="Maven: net.serenity-bdd:serenity-screenplay-webdriver:1.1.40" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.serenity-bdd:serenity-junit:1.1.40" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-all:1.3" level="project" />
</component>
</module>
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,28 @@
import net.serenitybdd.screenplay.Question;
import net.serenitybdd.screenplay.questions.Text;
import serenitylabs.tutorials.trains.ui.LiveUpdates;
import serenitylabs.tutorials.trains.ui.UpdateType;

import java.util.Collection;
import java.util.List;

import static serenitylabs.tutorials.trains.ui.UpdateType.*;

public class LiveUpdateIncidents {
public static Question<List<String>> forLineUpdates() {
return actor -> Text.of(LiveUpdates.LINE_UPDATES).viewedBy(actor).asList();
return actor -> Text.of(LiveUpdates.messageForUpdatesOfType(LineUpdates)).viewedBy(actor).asList();
}

public static Question<List<String>> forGeneralUpdates() {
return actor -> Text.of(LiveUpdates.messageForUpdatesOfType(GeneralUpdates)).viewedBy(actor).asList();
}

public static Question<List<String>> forTrainCancellations() {
return actor -> Text.of(LiveUpdates.messageForUpdatesOfType(TrainCancellation)).viewedBy(actor).asList();
}

public static Question<List<String>> forStationUpdates() {
return actor -> Text.of(LiveUpdates.messageForUpdatesOfType(StationUpdates)).viewedBy(actor).asList();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import net.serenitybdd.screenplay.Actor;
import net.serenitybdd.screenplay.Performable;
import net.serenitybdd.screenplay.Task;
import net.serenitybdd.screenplay.actions.Click;
import net.serenitybdd.screenplay.actions.Open;
import net.thucydides.core.annotations.Step;
import serenitylabs.tutorials.trains.ui.MainMenu;
import serenitylabs.tutorials.trains.ui.TicketTypeForm;

import static net.serenitybdd.screenplay.Tasks.instrumented;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,42 @@
import net.serenitybdd.screenplay.actions.Click;
import net.thucydides.core.annotations.Step;
import serenitylabs.tutorials.trains.ui.LiveUpdates;
import serenitylabs.tutorials.trains.ui.UpdateType;

import javax.sound.midi.Instrument;

import static net.serenitybdd.screenplay.Tasks.instrumented;
import static serenitylabs.tutorials.trains.ui.UpdateType.*;

public class ViewTheLiveUpdates implements Task {

private final UpdateType updateType;

public ViewTheLiveUpdates(UpdateType updateType) {
this.updateType = updateType;
}

@Override
@Step("{0} views the live updates for #updateType")
public <T extends Actor> void performAs(T actor) {
actor.attemptsTo(
Click.on(LiveUpdates.LINE_UPDATE_TOGGLE)
Click.on(LiveUpdates.toggleForUpdatesOfType(updateType))
);
}

public static Performable forLineUpdate() {
return Instrumented.instanceOf(ViewTheLiveUpdates.class).newInstance();
return Instrumented.instanceOf(ViewTheLiveUpdates.class).withProperties(LineUpdates);
}

public static Performable forGeneralUpdates() {
return Instrumented.instanceOf(ViewTheLiveUpdates.class).withProperties(GeneralUpdates);
}

public static Performable forTrainCancellations() {
return Instrumented.instanceOf(ViewTheLiveUpdates.class).withProperties(TrainCancellation);
}

public static Performable forStationUpdates() {
return Instrumented.instanceOf(ViewTheLiveUpdates.class).withProperties(StationUpdates);
}
}
33 changes: 31 additions & 2 deletions src/main/java/serenitylabs/tutorials/trains/ui/LiveUpdates.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,38 @@

import net.serenitybdd.screenplay.targets.Target;

import java.util.HashMap;

import static serenitylabs.tutorials.trains.ui.UpdateType.*;

public class LiveUpdates {

public static final Target LINE_UPDATE_BADGE = Target.the("Line updates badge").locatedBy("#line_updatesCount");
public static final Target LINE_UPDATE_TOGGLE = Target.the("Line updates button").locatedBy("//span[contains(.,'Line Updates')]");
public static final Target LINE_UPDATES = Target.the("Line updates").locatedBy("#line_updates .incident");
public static final Target GENERAL_UPDATE_BADGE = Target.the("General updates badge").locatedBy("#general_updatesCount");
public static final Target TRAIN_CANCELLATION_BADGE = Target.the("Train cancellation update badge").locatedBy("#train_cancel_updatesCount");
public static final Target STATION_UPDATES_BADGE = Target.the("Station updates badge").locatedBy("#station_updatesCount");

public static HashMap<UpdateType, Target> UPDATE_TOGGLE = new HashMap<>();
public static HashMap<UpdateType, Target> UPDATE_MESSAGES = new HashMap<>();

static {
UPDATE_TOGGLE.put(LineUpdates, Target.the("Line updates button").locatedBy("//span[contains(.,'Line Updates')]"));
UPDATE_TOGGLE.put(GeneralUpdates, Target.the("General updates button").locatedBy("#general_updates_btn"));
UPDATE_TOGGLE.put(TrainCancellation, Target.the("Train cancellation updates button").locatedBy("#train_cancel_updates_btn"));
UPDATE_TOGGLE.put(StationUpdates, Target.the("Station update button").locatedBy("#station_updates_btn"));

UPDATE_MESSAGES.put(LineUpdates, Target.the("Line updates").locatedBy("#line_updates .incident"));
UPDATE_MESSAGES.put(GeneralUpdates, Target.the("General updates").locatedBy("#general_updates .incident"));
UPDATE_MESSAGES.put(TrainCancellation, Target.the("train Cancellation updates").locatedBy("#train_cancel_updates .incident"));
UPDATE_MESSAGES.put(StationUpdates, Target.the("Station updates").locatedBy("#station_updates .incident"));

}

public static Target toggleForUpdatesOfType(UpdateType updateType) {
return UPDATE_TOGGLE.get(updateType);
}

public static Target messageForUpdatesOfType(UpdateType updateType) {
return UPDATE_MESSAGES.get(updateType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package serenitylabs.tutorials.trains.ui;

/**
* Created by vdheer on 9/24/2016.
*/
public enum UpdateType {
LineUpdates, GeneralUpdates, TrainCancellation, StationUpdates;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import static net.serenitybdd.screenplay.GivenWhenThen.*;
import static net.serenitybdd.screenplay.questions.AggregateQuestions.theTotalNumberOf;
import static org.hamcrest.Matchers.equalTo;

@RunWith(SerenityRunner.class)
public class WhenCheckingForLiveUpdates {

Expand Down Expand Up @@ -52,6 +53,49 @@ public void line_updates_should_be_available() {

@Test
public void general_updates_should_be_available() {
// TODO
givenThat(tracy).has(ChosenTo.checkTheLiveUpdates());

when(tracy).attemptsTo(ViewTheLiveUpdates.forGeneralUpdates());

int generalUpdateCount = Text.of(LiveUpdates.GENERAL_UPDATE_BADGE).viewedBy(tracy).asInteger();

then(tracy).should(
eventually(
seeThat(
theTotalNumberOf(LiveUpdateIncidents.forGeneralUpdates()),
equalTo(generalUpdateCount))
));
}

@Test
public void train_cancellation_updates_should_be_available() {
givenThat(tracy).has(ChosenTo.checkTheLiveUpdates());
when(tracy).attemptsTo(ViewTheLiveUpdates.forTrainCancellations());

int trainCancellationCount = Text.of(LiveUpdates.TRAIN_CANCELLATION_BADGE).viewedBy(tracy).asInteger();

then(tracy).should(
eventually(
seeThat(
theTotalNumberOf(LiveUpdateIncidents.forTrainCancellations()),
equalTo(trainCancellationCount))));
}

@Test
public void station_updates_should_be_able() {
givenThat(tracy).has(ChosenTo.checkTheLiveUpdates());

int stationUpdatesCount = Text.of(LiveUpdates.STATION_UPDATES_BADGE).viewedBy(tracy).asInteger();

when(tracy).attemptsTo(ViewTheLiveUpdates.forStationUpdates());

then(tracy).should(
eventually(
seeThat(
theTotalNumberOf(LiveUpdateIncidents.forStationUpdates()),
equalTo(stationUpdatesCount)
)
)
);
}
}