Skip to content

Commit

Permalink
#208: improves dryness of test code
Browse files Browse the repository at this point in the history
  • Loading branch information
rladstaetter committed Apr 3, 2024
1 parent 12f7035 commit f2bfa32
Show file tree
Hide file tree
Showing 13 changed files with 141 additions and 110 deletions.

This file was deleted.

This file was deleted.

19 changes: 19 additions & 0 deletions app-tests/src/test/scala/app/logorrr/steps/CanCloseAllFiles.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package app.logorrr.steps

import app.logorrr.usecases.TestFxBaseApplicationTest
import app.logorrr.views.LogoRRRNodes
import org.testfx.api.FxRobotInterface

/**
* Mix in if you want to be able to close all files in your test
*/
trait CanCloseAllFiles {
self: TestFxBaseApplicationTest =>

protected def closeAllFiles(): FxRobotInterface = {
clickOnNode(LogoRRRNodes.FileMenu)
waitForVisibility(LogoRRRNodes.FileMenuCloseAll)
clickOnNode(LogoRRRNodes.FileMenuCloseAll)
}

}
24 changes: 24 additions & 0 deletions app-tests/src/test/scala/app/logorrr/steps/CanOpenFile.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package app.logorrr.steps

import app.logorrr.io.FileId
import app.logorrr.usecases.TestFxBaseApplicationTest
import app.logorrr.views.LogoRRRNodes
import app.logorrr.views.logfiletab.LogFileTab

import java.nio.file.Path

/**
* Mix in if you need to be able to open a file in your test
*/
trait CanOpenFile {
self: TestFxBaseApplicationTest =>

protected def openFile(path: Path): Unit = {
waitForVisibility(LogoRRRNodes.FileMenu)
clickOnNode(LogoRRRNodes.FileMenu)
waitForVisibility(LogoRRRNodes.FileMenuOpenFile)
clickOnNode(LogoRRRNodes.FileMenuOpenFile)
waitForVisibility(LogFileTab.idFor(FileId(path)))
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package app.logorrr.steps

import app.logorrr.conf.Settings
import app.logorrr.services.LogoRRRServices
import app.logorrr.LogoRRRApp
import app.logorrr.usecases.TestFxBaseApplicationTest
import javafx.stage.Stage

/**
* Startup LogoRRR
*/
trait CanStartApplication {
self: TestFxBaseApplicationTest =>

def services: LogoRRRServices

@throws[Exception]
override def start(stage: Stage): Unit = {
LogoRRRApp.start(stage, Settings.Default, services)
stage.toFront()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package app.logorrr.usecases

import app.logorrr.services.LogoRRRServices
import app.logorrr.services.fileservices.OpenMultipleFilesService
import app.logorrr.services.hostservices.MockHostServices
import app.logorrr.steps.{CanOpenFile, CanStartApplication}

import java.nio.file.Path

/**
* Extend this class if you have tests which involve more than one file
*
* @param files files which are supported for this test
*/
class MultipleFileApplicationTest(val files: Seq[Path])
extends TestFxBaseApplicationTest
with CanStartApplication
with CanOpenFile {

val services = LogoRRRServices(new MockHostServices
, new OpenMultipleFilesService(files)
, isUnderTest = true)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package app.logorrr.usecases

import app.logorrr.services.LogoRRRServices
import app.logorrr.services.fileservices.OpenSingleFileService
import app.logorrr.services.hostservices.MockHostServices
import app.logorrr.steps.{CanOpenFile, CanStartApplication}

import java.nio.file.Path


/**
* Test which work with a single file can extend this test
*/
class SingleFileApplicationTest(val path: Path)
extends TestFxBaseApplicationTest
with CanStartApplication
with CanOpenFile{

val services = LogoRRRServices(new MockHostServices
, new OpenSingleFileService(Option(path))
, isUnderTest = true)


}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.logorrr
package app.logorrr.usecases

import app.logorrr.views.LogoRRRNode
import javafx.scene.Node
Expand All @@ -17,7 +17,6 @@ import scala.concurrent.duration.{DurationInt, FiniteDuration}
*/
class TestFxBaseApplicationTest extends ApplicationTest {


@AfterEach
@throws[Exception]
def tearDown(): Unit = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,30 @@
package app.logorrr.usecases.openclose

import app.logorrr.io.FileId
import app.logorrr.TestFiles
import app.logorrr.steps.CanCloseAllFiles
import app.logorrr.usecases.SingleFileApplicationTest
import app.logorrr.views.LogoRRRNodes
import app.logorrr.views.logfiletab.LogFileTab
import app.logorrr.{SingleFileApplicationTest, TestFiles}
import javafx.scene.control.TabPane
import org.junit.jupiter.api.Test

/**
* Checks if a file can be opened and closed
*/
class OpenAndCloseFileTestViaFileMenuCloseAllTest extends SingleFileApplicationTest(TestFiles.simpleLog0) {
class OpenAndCloseFileTestViaFileMenuCloseAllTest extends SingleFileApplicationTest(TestFiles.simpleLog0)
with CanCloseAllFiles {

override val path = TestFiles.simpleLog0

/**
* checks if an open file creates a new logfiletab with an id matching the file opened.
*/
@Test def openAndCloseFileTest(): Unit = {
// wait until file menu is visible
waitForVisibility(LogoRRRNodes.FileMenu)
clickOnNode(LogoRRRNodes.FileMenu)
waitForVisibility(LogoRRRNodes.FileMenuOpenFile)
clickOnNode(LogoRRRNodes.FileMenuOpenFile)
waitForVisibility(LogFileTab.idFor(FileId(path)))
openFile(path)

// file menu is already visible, we don't need to wait again
// click on file menu and then close all button
clickOnNode(LogoRRRNodes.FileMenu)
waitForVisibility(LogoRRRNodes.FileMenuCloseAll)
clickOnNode(LogoRRRNodes.FileMenuCloseAll)
closeAllFiles()

waitForPredicate[TabPane](LogoRRRNodes.MainTabPane, classOf[TabPane], tabPane => {
tabPane.getTabs.isEmpty
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package app.logorrr.usecases.openclose

import app.logorrr.io.FileId
import app.logorrr.TestFiles
import app.logorrr.usecases.SingleFileApplicationTest
import app.logorrr.views.LogoRRRNodes
import app.logorrr.views.logfiletab.LogFileTab
import app.logorrr.{SingleFileApplicationTest, TestFiles}
import javafx.scene.control.TabPane
import javafx.scene.layout.StackPane
import org.junit.jupiter.api.Test
Expand All @@ -13,16 +12,14 @@ import org.junit.jupiter.api.Test
*/
class OpenAndCloseFileTestViaTabCloseButtonTest extends SingleFileApplicationTest(TestFiles.simpleLog0) {

override val path = TestFiles.simpleLog0

/**
* checks if an open file creates a new logfiletab with an id matching the file opened.
*/
@Test def openAndCloseFileTest(): Unit = {
// wait until file menu is visible
waitForVisibility(LogoRRRNodes.FileMenu)
clickOnNode(LogoRRRNodes.FileMenu)
waitForVisibility(LogoRRRNodes.FileMenuOpenFile)
clickOnNode(LogoRRRNodes.FileMenuOpenFile)
waitForVisibility(LogFileTab.idFor(FileId(path)))
openFile(path)

// yields only one tab since there is only one loaded
val tabsQuery = LogoRRRNodes.LogFileHeaderTabs
Expand All @@ -32,7 +29,6 @@ class OpenAndCloseFileTestViaTabCloseButtonTest extends SingleFileApplicationTes

clickOn(closeButtonQuery.queryAs[StackPane](classOf[StackPane]))


waitForPredicate[TabPane](LogoRRRNodes.MainTabPane, classOf[TabPane], tabPane => {
tabPane.getTabs.isEmpty
})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package app.logorrr.usecases.openclose

import app.logorrr.io.FileId
import app.logorrr.views.LogoRRRNodes
import app.logorrr.views.logfiletab.LogFileTab
import app.logorrr.{MultipleFileApplicationTest, TestFiles}
import app.logorrr.TestFiles
import app.logorrr.usecases.MultipleFileApplicationTest
import javafx.scene.control.TabPane
import javafx.scene.layout.StackPane
import org.junit.jupiter.api.Test
Expand All @@ -18,7 +17,7 @@ class OpenAndCloseMultipleFilesViaCloseButtonTest extends MultipleFileApplicatio

@Test def openFilesAndCloseOneByOneViaTabCloseButton(): Unit = {
TestFiles.seq.foreach {
p => openFile(FileId(p))
p => openFile(p)
}

val tabCards = lookup(LogoRRRNodes.LogFileHeaderTabs).queryAll[StackPane]().asScala
Expand All @@ -35,11 +34,5 @@ class OpenAndCloseMultipleFilesViaCloseButtonTest extends MultipleFileApplicatio

}

private def openFile(fileId: FileId): Unit = {
waitForVisibility(LogoRRRNodes.FileMenu)
clickOnNode(LogoRRRNodes.FileMenu)
waitForVisibility(LogoRRRNodes.FileMenuOpenFile)
clickOnNode(LogoRRRNodes.FileMenuOpenFile)
waitForVisibility(LogFileTab.idFor(fileId))
}

}
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package app.logorrr.usecases.openclose

import app.logorrr.io.FileId
import app.logorrr.views.LogoRRRNodes
import app.logorrr.views.logfiletab.LogFileTab
import app.logorrr.{MultipleFileApplicationTest, TestFiles}
import app.logorrr.TestFiles
import app.logorrr.usecases.MultipleFileApplicationTest
import javafx.scene.control.TabPane
import org.junit.jupiter.api.Test


/**
* Check if multiple files can be opened and then closed again via file menu 'close all'
*/
class OpenAndCloseMultipleFilesViaMenuTest extends MultipleFileApplicationTest(TestFiles.seq) {
class OpenAndCloseMultipleFilesViaMenuTest extends MultipleFileApplicationTest(TestFiles.seq){

@Test def openFilesAndCloseAllViaMenu(): Unit = {
TestFiles.seq.foreach {
p => openFile(FileId(p))
p => openFile(p)
}
// now close them all again
clickOnNode(LogoRRRNodes.FileMenu)
Expand All @@ -28,11 +28,4 @@ class OpenAndCloseMultipleFilesViaMenuTest extends MultipleFileApplicationTest(T

}

private def openFile(fileId: FileId): Unit = {
waitForVisibility(LogoRRRNodes.FileMenu)
clickOnNode(LogoRRRNodes.FileMenu)
waitForVisibility(LogoRRRNodes.FileMenuOpenFile)
clickOnNode(LogoRRRNodes.FileMenuOpenFile)
waitForVisibility(LogFileTab.idFor(fileId))
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package app.logorrr.usecases.openclose

import app.logorrr.io.FileId
import app.logorrr.views.LogoRRRNodes
import app.logorrr.views.logfiletab.LogFileTab
import app.logorrr.{SingleFileApplicationTest, TestFiles}
import app.logorrr.TestFiles
import app.logorrr.usecases.SingleFileApplicationTest
import org.junit.jupiter.api.Test

/**
Expand All @@ -14,12 +12,7 @@ class OpenSingleFileTest extends SingleFileApplicationTest(TestFiles.simpleLog0)
/**
* checks if an open file creates a new logfiletab with an id matching the file opened.
*/
@Test def openFileTest(): Unit = {
waitForVisibility(LogoRRRNodes.FileMenu)
clickOnNode(LogoRRRNodes.FileMenu)
waitForVisibility(LogoRRRNodes.FileMenuOpenFile)
clickOnNode(LogoRRRNodes.FileMenuOpenFile)
waitForVisibility(LogFileTab.idFor(FileId(path)))
}
@Test def openFileTest(): Unit = openFile(path)

}

0 comments on commit f2bfa32

Please sign in to comment.