diff --git a/.travis.yml b/.travis.yml
index f7d78f1a4..a9d5117be 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,16 +2,30 @@ language: java
sudo: false
install: true
+services:
+ - docker
+
addons:
sonarcloud:
organization: "bpsdproject"
token:
- secure: "GBSEwXoZaohdFQyW5yJ3h6t8+HIztd+sEMS8jt10zo5tnenrGNv59YTl7B5VwxR2X/mJcdLsouR4z81TZfP4FX93NZAKwAdkj1d3yAyvEDYSlLywI7Xp3BGcO7Zc4mnHAU+yMhVI98Ww6C45OjirUgBT8STmjLTXk2yuA9T6IttwAmGdLzzzPjon710/6mIY3MzoqRpyhGhuJJjbJLA9BM5h1X79ikbOMk4e2ig3KaTIANS3oeCiQlNHgdikBZcsxow7qMXA5d8mgrBJnKH52EerLbMgVuKPBxdV+RMZQxOLZR6xzg5EQVUpoXCG8EqMbZw6lEdqfIYasm8EPQPaRM4fT6zIbJoQEFFXCIL1Wht7h0pO5RTavPE9jcpjni/QG+MAcr+v80/8RGOQ5MhQ/vF6T5DDf6J/03zAGX4LpPOb7s/8YuWWz+wB+uFYXsdZLOhFb8uuAyEiBzyXIn3ZgkLHxo57sGVgfSDiLgKGea7fIw+xN72JzTKts19jR1x+Sy6SvIgOJdjdmV+qzpbkn1nFtXo0t73RxwQkLLBx5hin02fEr1jWVXszVGCqKrxwglE0oTucMP6qtujMoqNo+eUUE064IAhRl9EPPcDMezctIKLp4vTUP3X5RCL1KRfE8uzeaY+Nnd+/DCh71Nhr4AHm570ISw6q7mKeStaB1dQ="
+ secure: "FKHLAA1VC6XvrJTDFXwh7IvHAgX+hHkzuGmiOJ9RvguTkP8yQTQqczQA0QFUaCKoOXLQf7n1Xadx60vKDxk1FQS4GxhvB1n9muvhjkLOXstpRjKEBL/t3CgVeIYPdf676lT/vED2yeFmTC0BcC82k2h8dNpBpr2c/iRsHriiyf8NOOM9XO6sbDfPPGYhTzkuBRhplVZ6723z5KaHDvSgjQmT/dlIZkY00fqyVPI20JZqvScbR0/8QjED8jWtnlZpzU02lIrpkcIJF2gS4OGkucE1GBvJtkAejm5V2g++mdj3B+ja4x2rZmLmAhOVV2PzRatMSrEyoSCRpjXMf39WaTlehaii2foWPvj+CTl4iO4ApdVluFufS5EuPknJ3/pOQVAilR0qad3NBokUGCnfGhAqo06AA0aeLb05A3nfhT/CeOPEklwpkWNHNG6B4XWkNUH54WemqvmDvUjPspSbFlU3RBwjVcacj4Dyuh4eo48E/+bYnoIhaAZiyh/SXqrIx9Wh0COxYv1tgcqJ/xbDtJf3CZdjGZfKCpC3OUCliRTHtKQrzxQxai4oTlTtGTWhxm81BIOStRY0IgkTGvMiymv91wcWN6Q937D4CsRGJ7O4ZKWeqPXCmntVVqEiWd5av2Lpnv7W2QnajkcNZ4UyGtH3mzo4OykKGc9EV9fcu64="
jdk: oraclejdk8
+install:
+ - docker-compose build
+
+before_script:
+ - docker-compose up -d
+
script:
- - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar
+ - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dskip.failsafe.tests sonar:sonar
+ - docker exec springpetclinic_pet-clinic_1 mvn verify -Dskip.surefire.tests -q --batch-mode
+
+after_script:
+ - docker-compose stop
+ - docker-compose rm -f
cache:
directories:
diff --git a/Dockerfile b/Dockerfile
index a1c890445..e43802fb4 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,17 +1,17 @@
-FROM maven:latest
-
-# Set the workdir
-WORKDIR /app
-
-# Copy the source to the container
-COPY . .
-
-# Build the project
-RUN mvn package
-
-# Make the jar executable
-RUN sh -c 'touch target/spring-petclinic-*.jar'
-
-#Start the project
-ENV JAVA_OPTS=""
-ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar target/spring-petclinic-*.jar" ]
\ No newline at end of file
+FROM maven:latest
+
+# Set the workdir
+WORKDIR /app
+
+# Copy the source to the container
+COPY . .
+
+# Build the project
+RUN mvn package -Dskip.failsafe.tests -q --batch-mode
+
+# Make the jar executable
+RUN sh -c 'touch target/spring-petclinic-*.jar'
+
+#Start the project
+ENV JAVA_OPTS=""
+ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar target/spring-petclinic-*.jar" ]
diff --git a/docker-compose.yml b/docker-compose.yml
index b2c662c3f..fba4e9a6c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,14 +5,20 @@ services:
ports:
- "8080:8080"
links:
- - mysql:mysql
+# - mysql:mysql
+ - selenium
command: java -jar ./target/*.jar
- mysql:
- image: mysql
+# mysql:
+# image: mysql
+# ports:
+# - "3306:3306"
+# environment:
+# - MYSQL_ROOT_PASSWORD=root
+# - MYSQL_DATABASE=test
+# volumes:
+# - "./conf.d:/etc/mysql/conf.d:ro"
+ selenium:
+ image: selenium/standalone-firefox
+ shm_size: 2g
ports:
- - "3306:3306"
- environment:
- - MYSQL_ROOT_PASSWORD=root
- - MYSQL_DATABASE=test
- volumes:
- - "./conf.d:/etc/mysql/conf.d:ro"
\ No newline at end of file
+ - "4444:4444"
diff --git a/pom.xml b/pom.xml
index 747032c28..e7a215877 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,229 +1,265 @@
- 4.0.0
- org.springframework.samples.bpsd
- spring-petclinic
- 1.5.1
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ 4.0.0
+ org.springframework.samples.bpsd
+ spring-petclinic
+ 1.5.1
-
- org.springframework.boot
- spring-boot-starter-parent
- 1.5.1.RELEASE
-
- petclinic
-
-
-
-
- 1.8
- UTF-8
- UTF-8
-
-
- 3.3.6
- 1.11.4
- 2.2.4
- 1.8.0
-
- 3.0.2.RELEASE
-
- 2.7
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
- org.springframework.boot
- spring-boot-starter-cache
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-thymeleaf
-
-
- nz.net.ultraq.thymeleaf
- thymeleaf-layout-dialect
-
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
- org.hsqldb
- hsqldb
- runtime
-
-
- mysql
- mysql-connector-java
- runtime
-
-
-
-
- javax.cache
- cache-api
-
-
- org.ehcache
- ehcache
-
-
-
-
- org.webjars
- webjars-locator
-
-
- org.webjars
- jquery
- ${webjars-jquery.version}
-
-
- org.webjars
- jquery-ui
- ${webjars-jquery-ui.version}
-
-
- org.webjars
- bootstrap
- ${webjars-bootstrap.version}
-
-
-
-
- org.springframework.boot
- spring-boot-devtools
- runtime
-
-
-
-
-
-
+
org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
- build-info
-
-
-
- ${project.build.sourceEncoding}
- ${project.reporting.outputEncoding}
- ${maven.compiler.source}
- ${maven.compiler.target}
-
-
-
-
-
-
- org.codehaus.mojo
- cobertura-maven-plugin
- ${cobertura.version}
-
-
-
-
-
-
- clean
- check
-
-
-
-
+ spring-boot-starter-parent
+ 1.5.1.RELEASE
+
+ petclinic
-
-
- pl.project13.maven
- git-commit-id-plugin
-
-
-
- revision
-
-
-
-
- true
- yyyy-MM-dd'T'HH:mm:ssZ
- true
- ${project.build.outputDirectory}/git.properties
-
- false
-
-
+
-
- ro.isdc.wro4j
- wro4j-maven-plugin
- ${wro4j.version}
-
-
- generate-resources
-
- run
-
-
-
-
- ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory
- ${project.build.directory}/classes/static/resources/css
- ${basedir}/src/main/wro/wro.xml
- ${basedir}/src/main/wro/wro.properties
- ${basedir}/src/main/less
-
-
-
+
+ 1.8
+ UTF-8
+ UTF-8
+
+
+ 3.3.6
+ 1.11.4
+ 2.2.4
+ 1.8.0
+
+ 3.0.2.RELEASE
+
+ 2.7
+
+ 3.4.0
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ nz.net.ultraq.thymeleaf
+ thymeleaf-layout-dialect
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ org.hsqldb
+ hsqldb
+ runtime
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+
+
+ javax.cache
+ cache-api
+
+
+ org.ehcache
+ ehcache
+
+
+
+
+ org.webjars
+ webjars-locator
+
+
+ org.webjars
+ jquery
+ ${webjars-jquery.version}
+
+
+ org.webjars
+ jquery-ui
+ ${webjars-jquery-ui.version}
+
+
org.webjars
bootstrap
${webjars-bootstrap.version}
-
-
-
-
-
-
-
-
-
- org.codehaus.mojo
- cobertura-maven-plugin
- ${cobertura.version}
-
-
- html
-
-
-
-
-
-
+
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+
+
+
+
+ org.seleniumhq.selenium
+ selenium-java
+ ${selenium-java.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ ${skip.surefire.tests}
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+
+
+ ${skip.failsafe.tests}
+
+
+
+ run-integration-tests
+ integration-test
+
+ integration-test
+ verify
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+ build-info
+
+
+
+ ${project.build.sourceEncoding}
+ ${project.reporting.outputEncoding}
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+ org.codehaus.mojo
+ cobertura-maven-plugin
+ ${cobertura.version}
+
+
+
+
+
+
+ clean
+ check
+
+
+
+
+
+
+
+ pl.project13.maven
+ git-commit-id-plugin
+
+
+
+ revision
+
+
+
+
+ true
+ yyyy-MM-dd'T'HH:mm:ssZ
+ true
+ ${project.build.outputDirectory}/git.properties
+
+ false
+
+
+
+
+ ro.isdc.wro4j
+ wro4j-maven-plugin
+ ${wro4j.version}
+
+
+ generate-resources
+
+ run
+
+
+
+
+ ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory
+ ${project.build.directory}/classes/static/resources/css
+ ${basedir}/src/main/wro/wro.xml
+ ${basedir}/src/main/wro/wro.properties
+ ${basedir}/src/main/less
+
+
+
+ org.webjars
+ bootstrap
+ ${webjars-bootstrap.version}
+
+
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ cobertura-maven-plugin
+ ${cobertura.version}
+
+
+ html
+
+
+
+
+
+
diff --git a/sonar-project.properties b/sonar-project.properties
index 30d6dbb0c..7ca4b7b7c 100755
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -11,6 +11,3 @@ sonar.language=java
# Encoding of the source files
sonar.sourceEncoding=UTF-8
-
-sonar.organization=ihristovut-github
-sonar.login=CqXf1kvNas7kaHHD3TKCcVrAL//0kdYsg/EjVphwABi7JsKILKGHSPiu4JZNG0fQf9DQZpAMBolTnVEyBC89sCR2NalML0m+MZZzBeihvnhqo8wETWoyGvnkPrLe9WILiZBK591qOVRoyipWMqYacyiV42mDpJjTcMJf1HkDPDxcD7kCQTw6qo3TLXbpphR8Y8LeZMDsty0HxPc02QtKS5kOTCiW7NljKWXdnsNDc2ZrGQDj7zVNRsYZ5ULgH8Psi06I7vC2HS9/o7QJcc42nRcoFzkGjVxWEBYPS9r11GQoUM+FwRCL/CKGv2Xzw2H7h/5zrJ89A0ZxHyHR4fKQTv4MRkCHj5WIMSL9a9K1E6nnP9Rk6OTzbKAr+iPt1IMRvU5lxsEzy5yZwOaGw9t6ebtdo8PB6IxVeNVwsg2rFTjeB+G/ct6eOnCU8Kd9yB5WAeA2ySZf9qBIjHKReq1fS9pI9/ps+85a+irW8Ei6TSD3JFWI6wkWPAG00NErWmeWN1AWWgmR16u8uXMQxQcCHRUs1To5aNV4HsNtCqbZOMe8VtH6MF0Yir2vVLG7Ljes5Il1hp2Qhsqxqv2aWmgbtiM6yobJTUMYpZLVuXml5RDoq72b+wgJduH7gwy0H0FzvRQKn+NTEDcKeEt06nI0U42F8mb6TDYeSQsF038rDs8=
diff --git a/src/test/java/nl/utwente/bpsd/selenium/AddOwnerIT.java b/src/test/java/nl/utwente/bpsd/selenium/AddOwnerIT.java
new file mode 100644
index 000000000..de1dfaba9
--- /dev/null
+++ b/src/test/java/nl/utwente/bpsd/selenium/AddOwnerIT.java
@@ -0,0 +1,47 @@
+package nl.utwente.bpsd.selenium;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.Select;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.net.MalformedURLException;
+
+/**
+ * @author Martijn
+ * @since 21-6-2017.
+ */
+public class AddOwnerIT extends SeleniumBaseIT {
+ public AddOwnerIT() throws MalformedURLException {
+ super();
+ }
+
+ @Test
+ @Category(SeleniumBaseIT.class)
+ public void addOwnerIT() {
+ driver.get(BASE_URL+"/owners/new");
+
+ //Add an owner
+ fillTextField(By.name("firstName"), "Sophie");
+ fillTextField(By.name("lastName"), "Lathouwers");
+ fillTextField(By.name("address"), "Homeroad 12");
+ fillTextField(By.name("city"), "Enschede");
+ fillTextField(By.name("telephone"), "0534890000");
+ driver.findElement(By.name("telephone")).submit();
+ Assert.assertTrue(pageContainsText("Sophie Lathouwers"));
+
+ //Add a pet
+ new WebDriverWait(driver, 3).until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.linkText("Add New Pet")));
+ driver.findElement(By.linkText("Add New Pet")).click();
+ fillTextField(By.name("name"), "Thumper");
+ fillTextField(By.name("birthDate"), "1942/08/09");
+ new Select(driver.findElement(By.name("type"))).selectByValue("hamster");
+ driver.findElement(By.name("name")).submit();
+
+ Assert.assertTrue(pageContainsText("Thumper"));
+ }
+
+}
diff --git a/src/test/java/nl/utwente/bpsd/selenium/AddVisitIT.java b/src/test/java/nl/utwente/bpsd/selenium/AddVisitIT.java
new file mode 100644
index 000000000..c36098cda
--- /dev/null
+++ b/src/test/java/nl/utwente/bpsd/selenium/AddVisitIT.java
@@ -0,0 +1,41 @@
+package nl.utwente.bpsd.selenium;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import java.net.MalformedURLException;
+import java.util.List;
+
+/**
+ * @author Martijn
+ * @since 21-6-2017.
+ */
+public class AddVisitIT extends SeleniumBaseIT {
+ public AddVisitIT() throws MalformedURLException {
+ super();
+ }
+
+ @Test
+ @Category(SeleniumBaseIT.class)
+ public void addOwnerTest() {
+ driver.findElement(By.name("lastName")).submit();
+
+ //Go to first owner
+ WebElement table = driver.findElement(By.tagName("table"));
+ List cells = table.findElements(By.xpath("tr/td"));
+ cells.get(0).findElement(By.xpath("a")).click();
+
+ //Go to edit page of first pet
+ driver.findElement(By.xpath("//table//tr/td/table/tbody//a[text()='Edit Pet']")).click();
+
+ //Edit Name of pet
+ fillTextField(By.name("name"), "foobar");
+ driver.findElement(By.name("name")).submit();
+
+ Assert.assertNotNull(driver.findElement(By.xpath("//table//tr/td/dl/dd/[contains(text(), 'foobar')]")));
+ }
+
+}
diff --git a/src/test/java/nl/utwente/bpsd/selenium/FailingIT.java b/src/test/java/nl/utwente/bpsd/selenium/FailingIT.java
new file mode 100644
index 000000000..87a26e3ad
--- /dev/null
+++ b/src/test/java/nl/utwente/bpsd/selenium/FailingIT.java
@@ -0,0 +1,26 @@
+package nl.utwente.bpsd.selenium;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.net.MalformedURLException;
+
+/**
+ * @author Martijn
+ * @since 21-6-2017.
+ */
+public class FailingIT extends SeleniumBaseIT {
+ public FailingIT() throws MalformedURLException {
+ super();
+ }
+
+ @Test
+ @Category(SeleniumBaseIT.class)
+ @Ignore
+ public void failIT() {
+ Assert.fail();
+ }
+
+}
diff --git a/src/test/java/nl/utwente/bpsd/selenium/FindOwnerIT.java b/src/test/java/nl/utwente/bpsd/selenium/FindOwnerIT.java
new file mode 100644
index 000000000..17fcd7de4
--- /dev/null
+++ b/src/test/java/nl/utwente/bpsd/selenium/FindOwnerIT.java
@@ -0,0 +1,28 @@
+package nl.utwente.bpsd.selenium;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.openqa.selenium.By;
+
+import java.net.MalformedURLException;
+
+/**
+ *
+ * @author Martijn
+ * @since 21-6-2017.
+ */
+public class FindOwnerIT extends SeleniumBaseIT {
+ public FindOwnerIT() throws MalformedURLException {
+ super();
+ }
+
+ @Test
+ @Category(SeleniumBaseIT.class)
+ public void findOwnerIT() {
+ driver.get(BASE_URL+"/owners/find");
+ fillTextField(By.name("lastName"),"Coleman");
+ driver.findElement(By.name("lastName")).submit();
+ Assert.assertTrue(driver.findElementsByXPath("//*[text()='Jean Coleman']").size() == 1);
+ }
+}
diff --git a/src/test/java/nl/utwente/bpsd/selenium/SeleniumBaseIT.java b/src/test/java/nl/utwente/bpsd/selenium/SeleniumBaseIT.java
new file mode 100644
index 000000000..d4f701966
--- /dev/null
+++ b/src/test/java/nl/utwente/bpsd/selenium/SeleniumBaseIT.java
@@ -0,0 +1,43 @@
+package nl.utwente.bpsd.selenium;
+
+import org.junit.After;
+import org.openqa.selenium.By;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.remote.DesiredCapabilities;
+import org.openqa.selenium.remote.RemoteWebDriver;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ *
+ * @author Martijn
+ * @since 21-6-2017.
+ */
+public class SeleniumBaseIT {
+ protected final RemoteWebDriver driver;
+ public static final String BASE_URL = "http://pet-clinic:8080/";
+// public static final String BASE_URL = "http://localhost:8080/";
+
+ public SeleniumBaseIT() throws MalformedURLException {
+// System.setProperty("webdriver.chrome.driver","C:\\Users\\marti\\Downloads\\chromedriver_win32\\chromedriver.exe");
+// this.driver = new ChromeDriver();
+ this.driver = new RemoteWebDriver(new URL("http://selenium:4444/wd/hub"), DesiredCapabilities.firefox());
+ driver.get(BASE_URL);
+ }
+
+ public void fillTextField(By by, String text){
+ driver.findElement(by).clear();
+ driver.findElement(by).sendKeys(text);
+ }
+
+ @After
+ public void afterTest() {
+ driver.close();
+ }
+
+
+ protected boolean pageContainsText(String text) {
+ return driver.findElementsByXPath("//*[text()='"+text+"']").size() == 1;
+ }
+}