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; + } +}