Commit 86dcfc66 authored by Administrator's avatar Administrator

Fixes acceptance tests

Acceptance tests were not working as they wasn't adapted to the Angular
framework after the migration. This commit fixes these test that now
work again.
parent 3752bc2a
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
<spring-test-dbunit.version>1.3.0</spring-test-dbunit.version> <spring-test-dbunit.version>1.3.0</spring-test-dbunit.version>
<hsqldb.version>2.3.3</hsqldb.version> <hsqldb.version>2.3.3</hsqldb.version>
<mysql.version>5.1.45</mysql.version> <mysql.version>5.1.45</mysql.version>
<geckodriver.version>v0.24.0</geckodriver.version> <geckodriver.version>v0.26.0</geckodriver.version>
<equalsverifier.version>2.4.2</equalsverifier.version> <equalsverifier.version>2.4.2</equalsverifier.version>
<!-- Plugins --> <!-- Plugins -->
......
{ {
"name": "daa-example", "name": "daa-example",
"version": "0.2.0-alpha.5", "version": "0.2.0-alpha.6",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
......
{ {
"name": "daa-example", "name": "daa-example",
"version": "0.2.0-alpha.5", "version": "0.2.0-alpha.6",
"scripts": { "scripts": {
"ng": "./node_modules/.bin/ng", "ng": "./node_modules/.bin/ng",
"start": "./node_modules/.bin/ng serve", "start": "./node_modules/.bin/ng serve",
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<form class="mb-5 mb-10"> <form id="people-form" class="mb-5 mb-10">
<input name="id" type="hidden" value=""/> <input name="id" type="hidden" value=""/>
<div class="row"> <div class="row">
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<table id="list" class="table"> <table id="people-list" class="table">
<thead> <thead>
<tr class="row"> <tr class="row">
<th class="col-sm-4">Nombre</th> <th class="col-sm-4">Nombre</th>
...@@ -26,12 +26,12 @@ ...@@ -26,12 +26,12 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr *ngFor="let person of people" class="row"> <tr *ngFor="let person of people" class="row" id="person-{{person.id}}">
<td class="col-sm-4">{{person.name}}</td> <td class="col-sm-4 name">{{person.name}}</td>
<td class="col-sm-5">{{person.surname}}</td> <td class="col-sm-5 surname">{{person.surname}}</td>
<td class="col-sm-3"> <td class="col-sm-3">
<button class="btn btn-primary" (click)="onEdit(person)">Edit</button> <button class="btn btn-primary edit" (click)="onEdit(person)">Edit</button>
<button class="btn btn-warning" (click)="onDelete(person)">Delete</button> <button class="btn btn-warning delete" (click)="onDelete(person)">Delete</button>
</td> </td>
</tr> </tr>
</tbody> </tbody>
......
package es.uvigo.esei.daa.util;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.support.ui.ExpectedCondition;
/*
* Implementation based on https://stackoverflow.com/questions/33348600/selenium-wait-for-ajax-content-to-load-universal-approach
*/
public class AdditionalConditions {
public static ExpectedCondition<Boolean> jQueryAjaxCallsHaveCompleted() {
return driver ->
(Boolean) ((JavascriptExecutor) driver).executeScript("return (window.jQuery !== null) && (jQuery.active === 0)");
}
}
package es.uvigo.esei.daa.util;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
/**
* Utility class to wait for several JavaScript events to complete.
*
* Code adapted from
* https://www.swtestacademy.com/selenium-wait-javascript-angular-ajax/
*/
public class JSWaiter {
private final WebDriverWait jsWait;
private final JavascriptExecutor jsExec;
private JSWaiter(WebDriver driver) {
this.jsWait = new WebDriverWait(driver, 10);
this.jsExec = (JavascriptExecutor) driver;
}
public static JSWaiter wait(WebDriver driver) {
return new JSWaiter(driver);
}
public void untilAngular5Ready() {
try {
final Object angular5Check = jsExec.executeScript("return getAllAngularRootElements()[0].attributes['ng-version']");
if (angular5Check != null) {
final Boolean angularPageLoaded = (Boolean) jsExec
.executeScript("return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1");
if (!angularPageLoaded) {
poll(20);
waitForAngular5Load();
poll(20);
}
}
} catch (WebDriverException ignored) {}
}
private void waitForAngular5Load() {
String angularReadyScript = "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1";
try {
final ExpectedCondition<Boolean> angularLoad = driver -> Boolean
.valueOf(((JavascriptExecutor) driver).executeScript(angularReadyScript).toString());
final boolean angularReady = Boolean.valueOf(jsExec.executeScript(angularReadyScript).toString());
if (!angularReady) {
jsWait.until(angularLoad);
}
} catch (WebDriverException ignored) {}
}
private void poll(long milis) {
try {
Thread.sleep(milis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
...@@ -25,7 +25,6 @@ import org.openqa.selenium.firefox.FirefoxDriver; ...@@ -25,7 +25,6 @@ import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile; import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.html5.LocalStorage; import org.openqa.selenium.html5.LocalStorage;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
...@@ -71,7 +70,7 @@ public class PeopleWebTest { ...@@ -71,7 +70,7 @@ public class PeopleWebTest {
final FirefoxProfile profile = new FirefoxProfile(); final FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("browser.privatebrowsing.autostart", true); profile.setPreference("browser.privatebrowsing.autostart", true);
final FirefoxOptions options = new FirefoxOptions(DesiredCapabilities.firefox()); final FirefoxOptions options = new FirefoxOptions();
options.setProfile(profile); options.setProfile(profile);
final FirefoxDriver firefoxDriver; final FirefoxDriver firefoxDriver;
...@@ -84,7 +83,8 @@ public class PeopleWebTest { ...@@ -84,7 +83,8 @@ public class PeopleWebTest {
// Login as "admin:adminpass" // Login as "admin:adminpass"
final LocalStorage localStorage = firefoxDriver.getLocalStorage(); final LocalStorage localStorage = firefoxDriver.getLocalStorage();
localStorage.setItem("authorization-token", "YWRtaW46YWRtaW5wYXNz"); // YWRtaW46YWRtaW5wYXNz
localStorage.setItem("user", "{\"login\":\"admin\",\"password\":\"adminpass\"}");
mainPage = new MainPage(driver, baseUrl); mainPage = new MainPage(driver, baseUrl);
mainPage.navigateTo(); mainPage.navigateTo();
......
package es.uvigo.esei.daa.web.pages; package es.uvigo.esei.daa.web.pages;
import static es.uvigo.esei.daa.util.AdditionalConditions.jQueryAjaxCallsHaveCompleted;
import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toList;
import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated; import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
import static org.openqa.selenium.support.ui.ExpectedConditions.textToBePresentInElement; import static org.openqa.selenium.support.ui.ExpectedConditions.textToBePresentInElement;
...@@ -14,6 +13,7 @@ import org.openqa.selenium.WebElement; ...@@ -14,6 +13,7 @@ import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.WebDriverWait;
import es.uvigo.esei.daa.entities.Person; import es.uvigo.esei.daa.entities.Person;
import es.uvigo.esei.daa.util.JSWaiter;
public class MainPage { public class MainPage {
private static final String TABLE_ID = "people-list"; private static final String TABLE_ID = "people-list";
...@@ -35,9 +35,9 @@ public class MainPage { ...@@ -35,9 +35,9 @@ public class MainPage {
} }
public void navigateTo() { public void navigateTo() {
this.driver.get(this.baseUrl + "main.html"); this.driver.get(this.baseUrl + "#/people");
this.wait.until(presenceOfElementLocated(By.id("people-list"))); this.wait.until(presenceOfElementLocated(By.id(TABLE_ID)));
} }
public int countPeople() { public int countPeople() {
...@@ -87,7 +87,7 @@ public class MainPage { ...@@ -87,7 +87,7 @@ public class MainPage {
table.deletePerson(id); table.deletePerson(id);
wait.until(jQueryAjaxCallsHaveCompleted()); JSWaiter.wait(driver).untilAngular5Ready();
} }
private final static class PeopleTable { private final static class PeopleTable {
......
...@@ -139,9 +139,17 @@ ...@@ -139,9 +139,17 @@
<Realm className="org.apache.catalina.realm.JDBCRealm" <Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.hsqldb.jdbc.JDBCDriver" driverName="org.hsqldb.jdbc.JDBCDriver"
connectionURL="jdbc:hsqldb:hsql://localhost/daatestdb?user=sa" connectionURL="jdbc:hsqldb:hsql://localhost/daatestdb?user=sa"
userTable="users" userNameCol="login" userCredCol="password" userTable="users"
userRoleTable="users" roleNameCol="role" /> userNameCol="login"
userCredCol="password"
userRoleTable="users"
roleNameCol="role"
digest="SHA-256"
>
<CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler"
algorithm="SHA-256"/>
</Realm>
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<!-- SingleSignOn valve, share authentication between web applications <!-- SingleSignOn valve, share authentication between web applications
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment