mirror of
https://github.com/spring-projects/spring-petclinic.git
synced 2025-07-18 13:35:50 +00:00
Fixed tests
This commit is contained in:
commit
15ed28d37c
14 changed files with 136 additions and 78 deletions
|
@ -28,7 +28,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
public class PetClinicApplication {
|
public class PetClinicApplication {
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(PetClinicApplication.class, args);
|
SpringApplication.run(PetClinicApplication.class, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -126,13 +126,13 @@ public class Owner extends Person {
|
||||||
* @param name to test
|
* @param name to test
|
||||||
* @return true if pet name is already in use
|
* @return true if pet name is already in use
|
||||||
*/
|
*/
|
||||||
public Pet getPet(String name, boolean ignoreNew) {
|
public Pet getPet(final String name, final boolean ignoreNew) {
|
||||||
name = name.toLowerCase();
|
String lowerCaseName = name.toLowerCase();
|
||||||
for (Pet pet : getPetsInternal()) {
|
for (Pet pet : getPetsInternal()) {
|
||||||
if (!ignoreNew || !pet.isNew()) {
|
if (!ignoreNew || !pet.isNew()) {
|
||||||
String compName = pet.getName();
|
String compName = pet.getName();
|
||||||
compName = compName.toLowerCase();
|
compName = compName.toLowerCase();
|
||||||
if (compName.equals(name)) {
|
if (compName.equals(lowerCaseName)) {
|
||||||
return pet;
|
return pet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,7 +78,7 @@ class OwnerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(value = "/owners", method = RequestMethod.GET)
|
@RequestMapping(value = "/owners", method = RequestMethod.GET)
|
||||||
public String processFindForm(Owner owner, BindingResult result, Map<String, Object> model) {
|
public String processFindForm(final Owner owner, final BindingResult result, final Map<String, Object> model) {
|
||||||
|
|
||||||
// allow parameterless GET request for /owners to return all records
|
// allow parameterless GET request for /owners to return all records
|
||||||
if (owner.getLastName() == null) {
|
if (owner.getLastName() == null) {
|
||||||
|
@ -93,8 +93,8 @@ class OwnerController {
|
||||||
return "owners/findOwners";
|
return "owners/findOwners";
|
||||||
} else if (results.size() == 1) {
|
} else if (results.size() == 1) {
|
||||||
// 1 owner found
|
// 1 owner found
|
||||||
owner = results.iterator().next();
|
Owner founndOwner = results.iterator().next();
|
||||||
return "redirect:/owners/" + owner.getId();
|
return "redirect:/owners/" + founndOwner.getId();
|
||||||
} else {
|
} else {
|
||||||
// multiple owners found
|
// multiple owners found
|
||||||
model.put("selections", results);
|
model.put("selections", results);
|
||||||
|
|
|
@ -31,8 +31,7 @@ class CrashController {
|
||||||
|
|
||||||
@RequestMapping(value = "/oups", method = RequestMethod.GET)
|
@RequestMapping(value = "/oups", method = RequestMethod.GET)
|
||||||
public String triggerException() {
|
public String triggerException() {
|
||||||
throw new RuntimeException(
|
throw new ExampleException("Expected: controller used to showcase what happens when an exception is thrown");
|
||||||
"Expected: controller used to showcase what " + "happens when an exception is thrown");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
package org.springframework.samples.petclinic.system;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Martijn
|
||||||
|
* @since 21-6-2017.
|
||||||
|
*/
|
||||||
|
public class ExampleException extends RuntimeException {
|
||||||
|
public ExampleException(String message) {
|
||||||
|
super(ExampleException.class.getSimpleName() + ": " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ExampleException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||||
|
super(ExampleException.class.getSimpleName() + ": " + message, cause, enableSuppression, writableStackTrace);
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,11 +31,11 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
@Controller
|
@Controller
|
||||||
class VetController {
|
class VetController {
|
||||||
|
|
||||||
private final VetRepository vets;
|
private final VetRepository vetRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public VetController(VetRepository clinicService) {
|
public VetController(VetRepository clinicService) {
|
||||||
this.vets = clinicService;
|
this.vetRepository = clinicService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(value = { "/vets.html" })
|
@RequestMapping(value = { "/vets.html" })
|
||||||
|
@ -43,7 +43,7 @@ class VetController {
|
||||||
// Here we are returning an object of type 'Vets' rather than a collection of Vet
|
// Here we are returning an object of type 'Vets' rather than a collection of Vet
|
||||||
// objects so it is simpler for Object-Xml mapping
|
// objects so it is simpler for Object-Xml mapping
|
||||||
Vets vets = new Vets();
|
Vets vets = new Vets();
|
||||||
vets.getVetList().addAll(this.vets.findAll());
|
vets.getVetList().addAll(this.vetRepository.findAll());
|
||||||
model.put("vets", vets);
|
model.put("vets", vets);
|
||||||
return "vets/vetList";
|
return "vets/vetList";
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ class VetController {
|
||||||
// Here we are returning an object of type 'Vets' rather than a collection of Vet
|
// Here we are returning an object of type 'Vets' rather than a collection of Vet
|
||||||
// objects so it is simpler for JSon/Object mapping
|
// objects so it is simpler for JSon/Object mapping
|
||||||
Vets vets = new Vets();
|
Vets vets = new Vets();
|
||||||
vets.getVetList().addAll(this.vets.findAll());
|
vets.getVetList().addAll(this.vetRepository.findAll());
|
||||||
return vets;
|
return vets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ package org.springframework.samples.petclinic.vet;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.dao.DataAccessException;
|
|
||||||
import org.springframework.data.repository.Repository;
|
import org.springframework.data.repository.Repository;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@ -40,7 +39,7 @@ public interface VetRepository extends Repository<Vet, Integer> {
|
||||||
*/
|
*/
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
@Cacheable("vets")
|
@Cacheable("vets")
|
||||||
Collection<Vet> findAll() throws DataAccessException;
|
Collection<Vet> findAll();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,14 +30,14 @@ import javax.xml.bind.annotation.XmlRootElement;
|
||||||
@XmlRootElement
|
@XmlRootElement
|
||||||
public class Vets {
|
public class Vets {
|
||||||
|
|
||||||
private List<Vet> vets;
|
private List<Vet> vetList;
|
||||||
|
|
||||||
@XmlElement
|
@XmlElement
|
||||||
public List<Vet> getVetList() {
|
public List<Vet> getVetList() {
|
||||||
if (vets == null) {
|
if (vetList == null) {
|
||||||
vets = new ArrayList<>();
|
vetList = new ArrayList<>();
|
||||||
}
|
}
|
||||||
return vets;
|
return vetList;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ package org.springframework.samples.petclinic.visit;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.dao.DataAccessException;
|
|
||||||
import org.springframework.data.repository.Repository;
|
import org.springframework.data.repository.Repository;
|
||||||
import org.springframework.samples.petclinic.model.BaseEntity;
|
import org.springframework.samples.petclinic.model.BaseEntity;
|
||||||
|
|
||||||
|
@ -38,7 +37,7 @@ public interface VisitRepository extends Repository<Visit, Integer> {
|
||||||
* @param visit the <code>Visit</code> to save
|
* @param visit the <code>Visit</code> to save
|
||||||
* @see BaseEntity#isNew
|
* @see BaseEntity#isNew
|
||||||
*/
|
*/
|
||||||
void save(Visit visit) throws DataAccessException;
|
void save(Visit visit);
|
||||||
|
|
||||||
List<Visit> findByPetId(Integer petId);
|
List<Visit> findByPetId(Integer petId);
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ import org.junit.experimental.categories.Category;
|
||||||
import org.openqa.selenium.By;
|
import org.openqa.selenium.By;
|
||||||
import org.openqa.selenium.support.ui.ExpectedConditions;
|
import org.openqa.selenium.support.ui.ExpectedConditions;
|
||||||
import org.openqa.selenium.support.ui.Select;
|
import org.openqa.selenium.support.ui.Select;
|
||||||
import org.openqa.selenium.support.ui.WebDriverWait;
|
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
|
||||||
|
@ -31,20 +30,23 @@ public class AddOwnerIT extends SeleniumBaseIT {
|
||||||
fillTextField(By.name("city"), "Enschede");
|
fillTextField(By.name("city"), "Enschede");
|
||||||
fillTextField(By.name("telephone"), "0534890000");
|
fillTextField(By.name("telephone"), "0534890000");
|
||||||
driver.findElement(By.name("telephone")).submit();
|
driver.findElement(By.name("telephone")).submit();
|
||||||
new WebDriverWait(driver, 5).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[text()='Owner Information']")));
|
waitForPageToLoad();
|
||||||
Assert.assertTrue(pageContainsText("Sophie Lathouwers"));
|
waitFor(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[text()='Sophie Lathouwers']")));
|
||||||
|
Assert.assertTrue("Could not locate \"Sophie Lathouwers\" on the page. This is the html of the current page: "+getHTML(), pageContainsText("Sophie Lathouwers"));
|
||||||
|
|
||||||
//Add a pet
|
//Add a pet
|
||||||
new WebDriverWait(driver, 5).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[text()='Pets and Visits']")));
|
//The link text has \n thats why it cannot find it
|
||||||
driver.findElements(By.className("btn")).get(1).click();
|
waitFor(ExpectedConditions.presenceOfAllElementsLocatedBy(By.partialLinkText("Add")));
|
||||||
new WebDriverWait(driver, 5).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[text()='New']")));
|
driver.findElement(By.partialLinkText("Add")).click();
|
||||||
|
waitForPageToLoad();
|
||||||
fillTextField(By.name("name"), "Thumper");
|
fillTextField(By.name("name"), "Thumper");
|
||||||
fillTextField(By.name("birthDate"), "1942/08/09");
|
fillTextField(By.name("birthDate"), "1942/08/09");
|
||||||
new Select(driver.findElement(By.name("type"))).selectByValue("hamster");
|
new Select(driver.findElement(By.name("type"))).selectByValue("hamster");
|
||||||
driver.findElement(By.name("name")).submit();
|
driver.findElement(By.name("name")).submit();
|
||||||
|
|
||||||
new WebDriverWait(driver, 5).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[text()='Pets and Visits']")));
|
waitForPageToLoad();
|
||||||
Assert.assertTrue(pageContainsText("Thumper"));
|
Assert.assertTrue("Could not locate \"Thumper\" on the page. This is the html of the current page: "+getHTML(),pageContainsText("Thumper"));
|
||||||
|
setTestFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ import java.net.MalformedURLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Martijn
|
* @author Sophie
|
||||||
* @since 21-6-2017.
|
* @since 21-6-2017.
|
||||||
*/
|
*/
|
||||||
public class AddVisitIT extends SeleniumBaseIT {
|
public class AddVisitIT extends SeleniumBaseIT {
|
||||||
|
@ -20,22 +20,31 @@ public class AddVisitIT extends SeleniumBaseIT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Category(SeleniumBaseIT.class)
|
@Category(SeleniumBaseIT.class)
|
||||||
public void addOwnerTest() {
|
public void editPetNameAndAddAVisit() {
|
||||||
|
driver.get(BASE_URL+"/owners/find");
|
||||||
|
|
||||||
driver.findElement(By.name("lastName")).submit();
|
driver.findElement(By.name("lastName")).submit();
|
||||||
|
waitForPageToLoad();
|
||||||
|
|
||||||
//Go to first owner
|
//Go to first owner
|
||||||
WebElement table = driver.findElement(By.tagName("table"));
|
WebElement table = driver.findElement(By.tagName("table"));
|
||||||
List<WebElement> cells = table.findElements(By.xpath("tr/td"));
|
List<WebElement> cells = table.findElements(By.xpath(".//tr/td"));
|
||||||
cells.get(0).findElement(By.xpath("a")).click();
|
cells.get(0).findElement(By.xpath("a")).click();
|
||||||
|
waitForPageToLoad();
|
||||||
|
|
||||||
//Go to edit page of first pet
|
//Go to edit page of first pet
|
||||||
driver.findElement(By.xpath("//table//tr/td/table/tbody//a[text()='Edit Pet']")).click();
|
driver.findElement(By.xpath("//table//tr/td/table/tbody//a[contains(text(),'Edit')]")).click();
|
||||||
|
waitForPageToLoad();
|
||||||
|
|
||||||
//Edit Name of pet
|
//Edit Name of pet
|
||||||
fillTextField(By.name("name"), "foobar");
|
fillTextField(By.name("name"), "foobar");
|
||||||
driver.findElement(By.name("name")).submit();
|
driver.findElement(By.name("name")).submit();
|
||||||
|
|
||||||
Assert.assertNotNull(driver.findElement(By.xpath("//table//tr/td/dl/dd/[contains(text(), 'foobar')]")));
|
waitForPageToLoad();
|
||||||
|
Assert.assertNotNull(driver.findElement(By.xpath("//table//tr/td/dl/dd[contains(text(), 'foobar')]")));
|
||||||
|
|
||||||
|
//TODO add a visit
|
||||||
|
setTestFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -25,7 +25,9 @@ public class FindOwnerIT extends SeleniumBaseIT {
|
||||||
driver.get(BASE_URL+"/owners/find");
|
driver.get(BASE_URL+"/owners/find");
|
||||||
fillTextField(By.name("lastName"),"Coleman");
|
fillTextField(By.name("lastName"),"Coleman");
|
||||||
driver.findElement(By.name("lastName")).submit();
|
driver.findElement(By.name("lastName")).submit();
|
||||||
new WebDriverWait(driver, 5).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[text()='Owner Information']")));
|
waitForPageToLoad();
|
||||||
Assert.assertTrue(driver.findElementsByXPath("//*[text()='Jean Coleman']").size() == 1);
|
Assert.assertTrue("Could not find \"Jean Coleman\" on the current page. This is the html of the current page: "+getHTML(),driver.findElements(By.xpath("//*[text()='Jean Coleman']")).size() == 1);
|
||||||
|
setTestFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,43 +1,102 @@
|
||||||
package nl.utwente.bpsd.selenium;
|
package nl.utwente.bpsd.selenium;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.openqa.selenium.By;
|
import org.openqa.selenium.*;
|
||||||
import org.openqa.selenium.chrome.ChromeDriver;
|
import org.openqa.selenium.chrome.ChromeDriver;
|
||||||
|
import org.openqa.selenium.remote.Augmenter;
|
||||||
import org.openqa.selenium.remote.DesiredCapabilities;
|
import org.openqa.selenium.remote.DesiredCapabilities;
|
||||||
import org.openqa.selenium.remote.RemoteWebDriver;
|
import org.openqa.selenium.remote.RemoteWebDriver;
|
||||||
|
import org.openqa.selenium.support.ui.ExpectedCondition;
|
||||||
|
import org.openqa.selenium.support.ui.WebDriverWait;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Martijn
|
* @author Martijn
|
||||||
* @since 21-6-2017.
|
* @since 21-6-2017.
|
||||||
*/
|
*/
|
||||||
public class SeleniumBaseIT {
|
public class SeleniumBaseIT {
|
||||||
protected final RemoteWebDriver driver;
|
protected final WebDriver driver;
|
||||||
|
private boolean testFinished = false;
|
||||||
public static final String BASE_URL = "http://pet-clinic:8080/";
|
public static final String BASE_URL = "http://pet-clinic:8080/";
|
||||||
// public static final String BASE_URL = "http://localhost:8080/";
|
// public static final String BASE_URL = "http://localhost:8080/";
|
||||||
|
|
||||||
public SeleniumBaseIT() throws MalformedURLException {
|
public SeleniumBaseIT() throws MalformedURLException {
|
||||||
// System.setProperty("webdriver.chrome.driver","C:\\Users\\marti\\Downloads\\chromedriver_win32\\chromedriver.exe");
|
// System.setProperty("webdriver.chrome.driver","C:\\Users\\marti\\Downloads\\chromedriver_win32\\chromedriver.exe");
|
||||||
// this.driver = new ChromeDriver();
|
// this.driver = new ChromeDriver();
|
||||||
this.driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox());
|
|
||||||
|
this.driver = new Augmenter().augment(new RemoteWebDriver(new URL("http://selenium:4444/wd/hub"), DesiredCapabilities.firefox()));
|
||||||
driver.get(BASE_URL);
|
driver.get(BASE_URL);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fillTextField(By by, String text){
|
public void fillTextField(By by, String text) {
|
||||||
driver.findElement(by).clear();
|
driver.findElement(by).clear();
|
||||||
driver.findElement(by).sendKeys(text);
|
driver.findElement(by).sendKeys(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void setTestFinished() {
|
||||||
|
testFinished = true;
|
||||||
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void afterTest() {
|
public void afterTest() {
|
||||||
|
if (!testFinished) {
|
||||||
|
if (driver instanceof TakesScreenshot) {
|
||||||
|
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
|
||||||
|
Logger.getLogger(this.getClass().getName()).warning(screenshot.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
driver.close();
|
driver.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected boolean pageContainsText(String text) {
|
protected boolean pageContainsText(String text) {
|
||||||
return driver.findElementsByXPath("//*[text()='"+text+"']").size() == 1;
|
return driver.findElements(By.xpath("//*[text()='" + text + "']")).size() == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHTML() {
|
||||||
|
return driver.findElement(By.xpath("//html")).getAttribute("innerHTML");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void waitForPageToLoad() {
|
||||||
|
waitFor(new FixedPeriod(333));
|
||||||
|
waitFor(new PageLoadedExpectedCondition());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void waitFor(ExpectedCondition<?> condition) {
|
||||||
|
new WebDriverWait(driver, 3).until(condition);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class PageLoadedExpectedCondition implements ExpectedCondition<Boolean> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean apply(WebDriver webDriver) {
|
||||||
|
if (webDriver instanceof JavascriptExecutor) {
|
||||||
|
return ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete");
|
||||||
|
}
|
||||||
|
throw new ClassCastException("This webdriver is not able to execute javascript.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected class FixedPeriod implements ExpectedCondition<Boolean> {
|
||||||
|
private final int time;
|
||||||
|
|
||||||
|
public FixedPeriod(int timeInMilliseconds) {
|
||||||
|
this.time = timeInMilliseconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean apply(WebDriver webDriver) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(time);
|
||||||
|
return true;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue