diff --git a/pom.xml b/pom.xml index ee87942..57e3b19 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,12 @@ 1.3 test + + io.mockk + mockk + 1.12.0 + test + org.jetbrains.kotlin @@ -90,6 +96,11 @@ 1.5.4 test + + org.seleniumhq.selenium + selenium-api + 3.141.59 + src/test/kotlin diff --git a/src/main/java/starter/README.md b/src/main/java/starter/README.md deleted file mode 100644 index c3de858..0000000 --- a/src/main/java/starter/README.md +++ /dev/null @@ -1,4 +0,0 @@ -### Application code - -These packages generally contain application code. -If you are writing a reusable test library, you can also place reusable test components such as Page Objects or Tasks here. \ No newline at end of file diff --git a/src/main/kotlin/Ability.kt b/src/main/kotlin/Ability.kt new file mode 100644 index 0000000..d1db2a1 --- /dev/null +++ b/src/main/kotlin/Ability.kt @@ -0,0 +1,3 @@ +interface Ability { + +} diff --git a/src/main/kotlin/Actor.kt b/src/main/kotlin/Actor.kt new file mode 100644 index 0000000..989bcb7 --- /dev/null +++ b/src/main/kotlin/Actor.kt @@ -0,0 +1,17 @@ +import ability.BrowseTheWeb +import org.openqa.selenium.WebDriver + +class Actor(val abilities: MutableList = mutableListOf()) { + + + var webDriver: WebDriver? = null + + fun perform(performable: Performable) = performable.performAs(this) + + fun asks(question: Question): Any = question.answerAs(this) + fun can(ability: Ability) { + when (ability) { + is BrowseTheWeb -> webDriver = ability.webDriver + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/BrowserInteraction.kt b/src/main/kotlin/BrowserInteraction.kt new file mode 100644 index 0000000..86b7af1 --- /dev/null +++ b/src/main/kotlin/BrowserInteraction.kt @@ -0,0 +1,10 @@ +import ability.BrowseTheWeb + +interface BrowserInteraction : Interaction { + + override fun performUsing(ability: BrowseTheWeb) + + override fun performAs(actor: Actor) { + performUsing(BrowseTheWeb.with(actor.webDriver!!)) + } +} diff --git a/src/main/kotlin/Interaction.kt b/src/main/kotlin/Interaction.kt new file mode 100644 index 0000000..43aa7ce --- /dev/null +++ b/src/main/kotlin/Interaction.kt @@ -0,0 +1,6 @@ +interface Interaction : Performable { + + + fun performUsing(ability: A) + +} diff --git a/src/main/kotlin/Performable.kt b/src/main/kotlin/Performable.kt new file mode 100644 index 0000000..57586ad --- /dev/null +++ b/src/main/kotlin/Performable.kt @@ -0,0 +1,5 @@ +interface Performable { + + fun performAs(actor: Actor) + +} diff --git a/src/main/kotlin/Question.kt b/src/main/kotlin/Question.kt new file mode 100644 index 0000000..4f86311 --- /dev/null +++ b/src/main/kotlin/Question.kt @@ -0,0 +1,9 @@ +fun interface Question { + fun answerAs(actor: Actor): Any { + val ability = actor.abilities[0] + return answerUsingAbility(ability) + } + + fun answerUsingAbility(ability: Ability): Any + +} diff --git a/src/main/kotlin/Task.kt b/src/main/kotlin/Task.kt new file mode 100644 index 0000000..c8a057b --- /dev/null +++ b/src/main/kotlin/Task.kt @@ -0,0 +1,3 @@ +interface Task : Performable { + +} diff --git a/src/main/kotlin/ability/BrowseTheWeb.kt b/src/main/kotlin/ability/BrowseTheWeb.kt new file mode 100644 index 0000000..6379066 --- /dev/null +++ b/src/main/kotlin/ability/BrowseTheWeb.kt @@ -0,0 +1,12 @@ +package ability + +import Ability +import org.openqa.selenium.WebDriver + +class BrowseTheWeb(val webDriver: WebDriver) : Ability { + + + companion object { + fun with(webdriver: WebDriver): BrowseTheWeb = BrowseTheWeb(webdriver) + } +} diff --git a/src/test/kotlin/AbilityTest.kt b/src/test/kotlin/AbilityTest.kt new file mode 100644 index 0000000..e6059df --- /dev/null +++ b/src/test/kotlin/AbilityTest.kt @@ -0,0 +1,72 @@ +import ability.BrowseTheWeb +import io.mockk.confirmVerified +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.impl.annotations.SpyK +import io.mockk.verify +import org.junit.Assert.* +import org.junit.Test +import org.openqa.selenium.WebDriver + +class AbilityTest { + + + @RelaxedMockK + lateinit var mockAbility: Ability + + @SpyK + var task = object : Task { + override fun performAs(actor: Actor) {} + } + + + @SpyK + var interaction = object : Interaction { + override fun performUsing(ability: Ability) {} + override fun performAs(actor: Actor) { + performUsing(actor.abilities.first()) + } + } + + @Test + fun `ability enables interaction`() { + val actor = Actor(abilities = mutableListOf(mockAbility)) + actor.perform(interaction) + verify(exactly = 1) { interaction.performUsing(mockAbility) } + verify(exactly = 1) { interaction.performAs(actor) } + confirmVerified(interaction) + + } + + @Test + fun `no ability to interact will throw`() { + val actor = Actor() + assertThrows(NoSuchElementException::class.java) { + actor.perform(interaction) + } + } + + @Test + fun `tasks don't need abilities`() { + val actor = Actor() + actor.perform(task) + verify(exactly = 1) { task.performAs(actor) } + confirmVerified(interaction) + } + + @RelaxedMockK + lateinit var browser: WebDriver + + @Test + internal fun `ability to browse with a webdriver`() { + val actor = Actor() + actor.can(BrowseTheWeb.with(browser)) + actor.perform(object : BrowserInteraction { + override fun performUsing(ability: BrowseTheWeb) { + ability.webDriver.navigate().to("page") + } + }) + verify(exactly = 1) { browser.navigate().to("page") } + confirmVerified(browser) + + } +} diff --git a/src/test/kotlin/ActorTest.kt b/src/test/kotlin/ActorTest.kt new file mode 100644 index 0000000..bdfc177 --- /dev/null +++ b/src/test/kotlin/ActorTest.kt @@ -0,0 +1,48 @@ +import io.mockk.confirmVerified +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.verify +import org.hamcrest.MatcherAssert +import org.hamcrest.Matchers +import org.junit.Test + +class ActorTest { + + @RelaxedMockK + lateinit var mockQuestion: Question + + @RelaxedMockK + lateinit var mockAbility: Ability + + @RelaxedMockK + lateinit var mockTask: Task + + @Test + fun `an actor exists`() { + val actor = Actor() + MatcherAssert.assertThat(actor, Matchers.`is`(Matchers.not(Matchers.nullValue()))) + } + + @Test + fun `actor has ability`() { + val actor = Actor(abilities = mutableListOf(mockAbility)) + MatcherAssert.assertThat(actor.abilities[0], Matchers.`is`(Matchers.not(Matchers.nullValue()))) + } + + @Test + fun `actor performs tasks`() { + val actor = Actor() + actor.perform(mockTask) + verify(exactly = 1) { mockTask.performAs(actor) } + confirmVerified(mockTask) + } + + @Test + fun `actor asks question`() { + val actor = Actor() + val answer = actor.asks(mockQuestion) + + MatcherAssert.assertThat(answer, Matchers.not(Matchers.`is`(Matchers.nullValue()))) + verify(exactly = 1) { mockQuestion.answerAs(actor) } + confirmVerified(mockQuestion) + } +} diff --git a/src/test/kotlin/TaskTest.kt b/src/test/kotlin/TaskTest.kt new file mode 100644 index 0000000..2a3f017 --- /dev/null +++ b/src/test/kotlin/TaskTest.kt @@ -0,0 +1,43 @@ +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.impl.annotations.SpyK +import io.mockk.verify +import org.junit.Test + +class TaskTest { + + + @RelaxedMockK + lateinit var mockAbility: Ability + + @SpyK + var task = object : Task { + override fun performAs(actor: Actor) { + actor.perform(subTask) + } + } + + @SpyK + var subTask = object : Task { + override fun performAs(actor: Actor) { + actor.perform(interaction) + } + } + + @SpyK + var interaction = object : Interaction { + override fun performUsing(ability: Ability) {} + + override fun performAs(actor: Actor) { + performUsing(actor.abilities.first()) + } + + } + + @Test + fun `task are performed recursively`() { + val actor = Actor(abilities = mutableListOf(mockAbility)) + actor.perform(task) + verify(exactly = 1) { interaction.performUsing(mockAbility) } + } + +} diff --git a/src/test/kotlin/com/example/e2e/api/JsonPlaceHolderIT.kt b/src/test/kotlin/com/example/e2e/api/JsonPlaceHolderIT.kt deleted file mode 100644 index 86965d8..0000000 --- a/src/test/kotlin/com/example/e2e/api/JsonPlaceHolderIT.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.example.e2e.api - -import com.example.screenplay.action.GetListOfAllPosts -import com.example.screenplay.action.UploadNewPost -import com.example.screenplay.question.NumberOfReturnedPosts -import net.serenitybdd.junit.runners.SerenityRunner -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.GivenWhenThen.* -import net.serenitybdd.screenplay.rest.abilities.CallAnApi -import net.serenitybdd.screenplay.rest.questions.ResponseConsequence.* -import net.thucydides.core.annotations.Narrative -import org.apache.http.HttpStatus -import org.hamcrest.CoreMatchers -import org.hamcrest.Matchers.* -import org.junit.BeforeClass -import org.junit.Test -import org.junit.runner.RunWith - -@RunWith(SerenityRunner::class) -@Narrative(text = ["a simple REST API example"]) -open class JsonPlaceHolderIT { - - @Test - fun `when there are many posts`() { - author.attemptsTo(GetListOfAllPosts()) - author.should(seeThat(NumberOfReturnedPosts(), greaterThan(99))) - } - - @Test - fun `when posting`() { - author.attemptsTo(UploadNewPost.containing("{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}")) - author.should(seeThatResponse { - it.statusCode(HttpStatus.SC_CREATED).body("id", CoreMatchers.`is`(101)) - }) - } - - companion object { - private lateinit var author: Actor - - @JvmStatic - @BeforeClass - fun setUp() { - author = Actor("author") - author.can(CallAnApi.at("https://jsonplaceholder.typicode.com")) - } - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/e2e/api/package-info.java b/src/test/kotlin/com/example/e2e/api/package-info.java deleted file mode 100644 index 9c4b648..0000000 --- a/src/test/kotlin/com/example/e2e/api/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -@Narrative(title = "API Checks", text={ - "List of Rest API examples", -}) -package com.example.e2e.api; -import net.thucydides.core.annotations.Narrative; diff --git a/src/test/kotlin/com/example/e2e/browser/CompareScreenshotsIT.kt b/src/test/kotlin/com/example/e2e/browser/CompareScreenshotsIT.kt deleted file mode 100644 index a854f84..0000000 --- a/src/test/kotlin/com/example/e2e/browser/CompareScreenshotsIT.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.e2e.browser - -import com.example.screenplay.question.image.NoDifferenceToSnapshot -import net.serenitybdd.junit.runners.SerenityRunner -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.GivenWhenThen.* -import net.serenitybdd.screenplay.abilities.BrowseTheWeb -import net.serenitybdd.screenplay.actions.Open -import net.thucydides.core.annotations.Managed -import org.hamcrest.CoreMatchers.* -import org.junit.Test -import org.junit.runner.RunWith -import org.openqa.selenium.WebDriver - -@RunWith(SerenityRunner::class) -class CompareScreenshotsIT { - - @Managed(driver = "chrome") - private lateinit var aBrowser: WebDriver - - /** - * naive example of a failing screenshot comparison - * would need to be extended to only screenshot specific elements, see implementation CreateSnapshot - */ - @Test - fun `when comparing full size page`() { - val tester = Actor("tester") - tester.can(BrowseTheWeb.with(aBrowser)) - tester.attemptsTo(Open.url("https://www.gns.cri.nz/Home/Our-Science/Energy-Futures/Oil-and-Gas/Petroleum-Basin-Explorer")) - tester.should(seeThat(NoDifferenceToSnapshot("homepage.png"), `is`(true))) - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/e2e/browser/ReportNavigatorIT.kt b/src/test/kotlin/com/example/e2e/browser/ReportNavigatorIT.kt deleted file mode 100644 index d5ffc0a..0000000 --- a/src/test/kotlin/com/example/e2e/browser/ReportNavigatorIT.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.example.e2e.browser - -import com.example.screenplay.action.AccessTheLatestReport -import com.example.screenplay.action.LookUpAllUnsuccessfulOutcomes -import com.example.screenplay.question.OutcomesShown -import net.serenitybdd.junit.runners.SerenityRunner -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.EventualConsequence.* -import net.serenitybdd.screenplay.GivenWhenThen.* -import net.serenitybdd.screenplay.abilities.BrowseTheWeb -import net.serenitybdd.screenplay.questions.CountQuestion -import net.thucydides.core.annotations.Managed -import net.thucydides.core.annotations.Narrative -import org.hamcrest.CoreMatchers.* -import org.junit.Test -import org.junit.runner.RunWith -import org.openqa.selenium.WebDriver - -@RunWith(SerenityRunner::class) -@Narrative(text = ["describes the report behavior"]) -class ReportNavigatorIT { - - @Managed(driver = "chrome") - private lateinit var aBrowser: WebDriver - - @Test - fun whenTracingErrors() { - val tester = Actor("tester") - tester.can(BrowseTheWeb.with(aBrowser)) - tester.attemptsTo(AccessTheLatestReport()) - tester.attemptsTo(LookUpAllUnsuccessfulOutcomes()) - tester.should(eventually(seeThat(CountQuestion(OutcomesShown()), `is`(9)))) - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/e2e/browser/package-info.java b/src/test/kotlin/com/example/e2e/browser/package-info.java deleted file mode 100644 index 8e1ddd4..0000000 --- a/src/test/kotlin/com/example/e2e/browser/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@Narrative(title = "Living Documentation", text={ - "Produced by testers and for testers, a test report naturally has a very strong testing focus. The emphasis is primarily on knowing whether a test passes or fails, and, at a higher level, knowing what proportion of tests pass or fail.", - "Living Documentation is more like a very detailed illustrated user manual. The focus is about describing what the application does, in business terms." -}) -package com.example.e2e.browser; -import net.thucydides.core.annotations.Narrative; diff --git a/src/test/kotlin/com/example/screenplay/action/AccessTheLatestReport.kt b/src/test/kotlin/com/example/screenplay/action/AccessTheLatestReport.kt deleted file mode 100644 index b7cd181..0000000 --- a/src/test/kotlin/com/example/screenplay/action/AccessTheLatestReport.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.screenplay.action - -import com.example.screenplay.page.NavigatorDemo -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.GivenWhenThen.* -import net.serenitybdd.screenplay.Performable -import net.serenitybdd.screenplay.actions.Open -import net.serenitybdd.screenplay.matchers.WebElementStateMatchers.* -import net.serenitybdd.screenplay.questions.WebElementQuestion.* - -open class AccessTheLatestReport : Performable { - override fun performAs(actor: T) { - actor.attemptsTo(Open.browserOn(NavigatorDemo())) - actor.should(seeThat(the(NavigatorDemo.shareCurrentView), isVisible())) - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/screenplay/action/GetListOfAllPosts.kt b/src/test/kotlin/com/example/screenplay/action/GetListOfAllPosts.kt deleted file mode 100644 index af75273..0000000 --- a/src/test/kotlin/com/example/screenplay/action/GetListOfAllPosts.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.screenplay.action - -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.Performable -import net.serenitybdd.screenplay.rest.interactions.Get - -open class GetListOfAllPosts : Performable { - override fun performAs(actor: T) { - actor.attemptsTo(Get.resource("/posts")) - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/screenplay/action/LookUpAllUnsuccessfulOutcomes.kt b/src/test/kotlin/com/example/screenplay/action/LookUpAllUnsuccessfulOutcomes.kt deleted file mode 100644 index 2327dde..0000000 --- a/src/test/kotlin/com/example/screenplay/action/LookUpAllUnsuccessfulOutcomes.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.screenplay.action - -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.Performable -import net.serenitybdd.screenplay.actions.Click - -open class LookUpAllUnsuccessfulOutcomes : Performable { - override fun performAs(actor: T) { - actor.attemptsTo(Click.on(".ToggleSideMenu")) - actor.attemptsTo(Click.on(".traceErrors")) - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/screenplay/action/UploadNewPost.kt b/src/test/kotlin/com/example/screenplay/action/UploadNewPost.kt deleted file mode 100644 index 4df7a37..0000000 --- a/src/test/kotlin/com/example/screenplay/action/UploadNewPost.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.screenplay.action - -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.Performable -import net.serenitybdd.screenplay.Tasks.* -import net.serenitybdd.screenplay.rest.interactions.Post -import net.thucydides.core.annotations.Step - -open class UploadNewPost(private val jsonBody: String) : Performable { - - @Step("{0} uploads new post containing #jsonBody") - override fun performAs(actor: T) { - actor.attemptsTo(Post.to("/posts").with { - it.header("Content-type", "application/json; charset=UTF-8").body(jsonBody) - }) - } - - companion object { - fun containing(jsonBody: String): UploadNewPost { - return instrumented(UploadNewPost::class.java, jsonBody) - } - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/screenplay/action/image/CreateSnapshot.kt b/src/test/kotlin/com/example/screenplay/action/image/CreateSnapshot.kt deleted file mode 100644 index 5aad40c..0000000 --- a/src/test/kotlin/com/example/screenplay/action/image/CreateSnapshot.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.screenplay.action.image - -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.Performable -import net.serenitybdd.screenplay.abilities.BrowseTheWeb -import org.openqa.selenium.By -import ru.yandex.qatools.ashot.AShot -import java.nio.file.Path -import javax.imageio.ImageIO - -class CreateSnapshot(private val snapshotFile: String) : Performable { - override fun performAs(actor: T) { - val driver = BrowseTheWeb.`as`(actor).driver - val screenShot = AShot().takeScreenshot(driver, driver.findElement(By.cssSelector("body"))) - val snapshotPath = Path.of(this::class.java.getResource(".").toURI()).resolve("snapshots") - snapshotPath.toFile().mkdirs() - ImageIO.write(screenShot.image, "png", snapshotPath.resolve(snapshotFile).toFile()) - } -} diff --git a/src/test/kotlin/com/example/screenplay/action/image/ImageDifference.kt b/src/test/kotlin/com/example/screenplay/action/image/ImageDifference.kt deleted file mode 100644 index 3024382..0000000 --- a/src/test/kotlin/com/example/screenplay/action/image/ImageDifference.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.example.screenplay.action.image - -import com.example.screenplay.question.QuestionWithDefaultSubject -import com.example.screenplay.question.image.WeWantToCreateSnapshots -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.abilities.BrowseTheWeb -import net.serenitybdd.screenplay.conditions.Check -import org.openqa.selenium.By -import ru.yandex.qatools.ashot.AShot -import ru.yandex.qatools.ashot.comparison.ImageDiff -import ru.yandex.qatools.ashot.comparison.ImageDiffer -import java.awt.image.BufferedImage -import java.nio.file.Path -import javax.imageio.IIOException -import javax.imageio.ImageIO - - -open class ImageDifference(private val snapshotFile: String?) : QuestionWithDefaultSubject() { - - - override fun answeredBy(actor: Actor): ImageDiff { - actor.attemptsTo(Check.whether(WeWantToCreateSnapshots()).andIfSo(CreateSnapshot(snapshotFile!!))) - val expectedImage: BufferedImage = try { - ImageIO.read(Path.of(this::class.java.getResource(".").toURI()).resolve("snapshots").resolve(snapshotFile).toFile()) - } catch (e: IIOException) { - throw RuntimeException(e) - } - val driver = BrowseTheWeb.`as`(actor).driver - val screenShot = AShot().takeScreenshot(driver, driver.findElement(By.cssSelector("body"))).image - val imgdiffer = ImageDiffer() - val imgdiff = imgdiffer.makeDiff(expectedImage, screenShot) - return imgdiff - } - - companion object { - fun with(snapshot: String): ImageDifference = ImageDifference(snapshot) - - } - -} - diff --git a/src/test/kotlin/com/example/screenplay/page/NavigatorDemo.kt b/src/test/kotlin/com/example/screenplay/page/NavigatorDemo.kt deleted file mode 100644 index 7eb90c4..0000000 --- a/src/test/kotlin/com/example/screenplay/page/NavigatorDemo.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.screenplay.page - -import net.serenitybdd.core.pages.PageObject -import net.serenitybdd.screenplay.targets.Target -import net.serenitybdd.screenplay.targets.Target.* -import net.thucydides.core.annotations.DefaultUrl - -@DefaultUrl("https://lemon-desert-049177e03.azurestaticapps.net/") -class NavigatorDemo : PageObject() { - companion object { - val shareCurrentView: Target = the("share current view").locatedBy(".MuiFab-label") - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/screenplay/question/NumberOfReturnedPosts.kt b/src/test/kotlin/com/example/screenplay/question/NumberOfReturnedPosts.kt deleted file mode 100644 index 2b73617..0000000 --- a/src/test/kotlin/com/example/screenplay/question/NumberOfReturnedPosts.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.example.screenplay.question - -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.rest.questions.LastResponse - -class NumberOfReturnedPosts : QuestionWithDefaultSubject() { - override fun answeredBy(actor: Actor): Int { - return actor.asksFor(LastResponse()).jsonPath().getList("").size - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/screenplay/question/OutcomesShown.kt b/src/test/kotlin/com/example/screenplay/question/OutcomesShown.kt deleted file mode 100644 index f0f04ea..0000000 --- a/src/test/kotlin/com/example/screenplay/question/OutcomesShown.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.screenplay.question - -import net.serenitybdd.core.pages.WebElementFacade -import net.serenitybdd.screenplay.Actor -import net.serenitybdd.screenplay.targets.Target - -class OutcomesShown : QuestionWithDefaultSubject>() { - override fun answeredBy(actor: Actor): List { - return Target.the("outcomes that can be selected").locatedBy(".selectOutcome").resolveAllFor(actor) - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/screenplay/question/QuestionWithDefaultSubject.kt b/src/test/kotlin/com/example/screenplay/question/QuestionWithDefaultSubject.kt deleted file mode 100644 index 5c9504f..0000000 --- a/src/test/kotlin/com/example/screenplay/question/QuestionWithDefaultSubject.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.screenplay.question - -import net.serenitybdd.screenplay.Question - -abstract class QuestionWithDefaultSubject : Question { - override fun getSubject(): String { - return this::class.simpleName!!.replace("([a-z])([A-Z])".toRegex(), "$1 $2") - } - - override fun toString(): String { - return subject - } -} \ No newline at end of file diff --git a/src/test/kotlin/com/example/screenplay/question/image/NoDifferenceToSnapshot.kt b/src/test/kotlin/com/example/screenplay/question/image/NoDifferenceToSnapshot.kt deleted file mode 100644 index f51b1c7..0000000 --- a/src/test/kotlin/com/example/screenplay/question/image/NoDifferenceToSnapshot.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.screenplay.question.image - -import com.example.screenplay.action.image.ImageDifference -import com.example.screenplay.question.QuestionWithDefaultSubject -import net.serenitybdd.core.Serenity -import net.serenitybdd.screenplay.Actor -import java.nio.file.Path -import javax.imageio.IIOException -import javax.imageio.ImageIO - -class NoDifferenceToSnapshot(private val snapshot: String) : QuestionWithDefaultSubject() { - override fun answeredBy(actor: Actor): Boolean { - val diff = actor.asksFor(ImageDifference.with(snapshot)) - val hasDiff = diff.hasDiff() - if (hasDiff) { - val snapshotPath = Path.of(this::class.java.getResource(".").toURI()).resolve("diffs") - snapshotPath.toFile().mkdirs() - try { - val diffPath = snapshotPath.resolve(snapshot + "-diff.png") - ImageIO.write(diff.markedImage, "png", diffPath.toFile()) - Serenity.recordReportData().withTitle("Image diff").downloadable().fromFile(diffPath) - } catch (e: IIOException) { - throw RuntimeException(e) - } - } - return !hasDiff - } - -} diff --git a/src/test/kotlin/com/example/screenplay/question/image/WeWantToCreateSnapshots.kt b/src/test/kotlin/com/example/screenplay/question/image/WeWantToCreateSnapshots.kt deleted file mode 100644 index 34d6078..0000000 --- a/src/test/kotlin/com/example/screenplay/question/image/WeWantToCreateSnapshots.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.screenplay.question.image - -import com.example.screenplay.question.QuestionWithDefaultSubject -import net.serenitybdd.screenplay.Actor -import net.thucydides.core.util.SystemEnvironmentVariables - -class WeWantToCreateSnapshots : QuestionWithDefaultSubject() { - - override fun answeredBy(actor: Actor): Boolean { - return SystemEnvironmentVariables.createEnvironmentVariables().getPropertyAsBoolean("ashot.image.comparison.create.snapshots", false) - } - -}