first commit
This commit is contained in:
135
tests/end2end/bootstrap.js
vendored
Normal file
135
tests/end2end/bootstrap.js
vendored
Normal file
@@ -0,0 +1,135 @@
|
||||
var viewport = casper.cli.options.viewport || 'desktop-standard',
|
||||
viewports = {
|
||||
'smartphone-portrait' : {
|
||||
'name': 'smartphone-portrait',
|
||||
'viewport': {width: 320, height: 480}
|
||||
},
|
||||
'smartphone-landscape': {
|
||||
'name': 'smartphone-landscape',
|
||||
'viewport': {width: 480, height: 320}
|
||||
},
|
||||
'tablet-portrait' : {
|
||||
'name': 'tablet-portrait',
|
||||
'viewport': {width: 768, height: 1024}
|
||||
},
|
||||
'tablet-landscape' : {
|
||||
'name': 'tablet-landscape',
|
||||
'viewport': {width: 1024, height: 768}
|
||||
},
|
||||
'desktop-standard' : {
|
||||
'name': 'desktop-standard',
|
||||
'viewport': {width: 1280, height: 1024}
|
||||
}
|
||||
},
|
||||
activeViewport = viewports[viewport];
|
||||
|
||||
// Setup logging
|
||||
casper.options.verbose = true;
|
||||
casper.options.logLevel = 'warning';
|
||||
|
||||
var common = (function()
|
||||
{
|
||||
var enableScreenshots = casper.cli.options.hasOwnProperty('screenshots');
|
||||
var shopData = {};
|
||||
|
||||
return {
|
||||
|
||||
/**
|
||||
* @param test {Tester}
|
||||
* @returns {*}
|
||||
*/
|
||||
goToHomepage: function(test)
|
||||
{
|
||||
return casper.start('http://kupshop.local/', function() {
|
||||
common.screenshot('homepage');
|
||||
test.assertHttpStatus(200, 'Homepage loded');
|
||||
});
|
||||
},
|
||||
|
||||
screenshotCounter: 0,
|
||||
screenshot: function(name)
|
||||
{
|
||||
if (enableScreenshots) {
|
||||
name = name || ('screenshot' + common.screenshotCounter++);
|
||||
casper.capture(['tests/data/screenshots/', activeViewport.name, '/', name, '.png'].join(''));
|
||||
}
|
||||
},
|
||||
|
||||
error: function(message)
|
||||
{
|
||||
if (enableScreenshots) {
|
||||
var name = 'error' + common.screenshotCounter++,
|
||||
filename = ['tests/data/screenshots/', activeViewport.name, '/', name, '.png'].join('');
|
||||
casper.capture(filename);
|
||||
message += ' >>>> screenshot ' + filename;
|
||||
}
|
||||
|
||||
throw message;
|
||||
},
|
||||
|
||||
log: function(message)
|
||||
{
|
||||
casper.log(message, 'warning');
|
||||
},
|
||||
|
||||
setShopData: function(data)
|
||||
{
|
||||
shopData = data;
|
||||
},
|
||||
|
||||
getOrder: function()
|
||||
{
|
||||
return shopData.order;
|
||||
},
|
||||
|
||||
getUrl: function(url)
|
||||
{
|
||||
return shopData.urls[url];
|
||||
},
|
||||
|
||||
/**
|
||||
* @param login {String}
|
||||
* @param password {String}
|
||||
*/
|
||||
showAndSendLoginForm: function (login, password)
|
||||
{
|
||||
var loginFormSelector = 'form[action="'+common.getUrl('login')+'"]',
|
||||
me = this;
|
||||
casper.click('#login_link', 'Login button clicked.');
|
||||
|
||||
casper.wait(500, function() {
|
||||
casper.test.assertVisible(loginFormSelector, 'Login form is visible.');
|
||||
me.screenshot('login-dialog');
|
||||
casper.fill(loginFormSelector, {
|
||||
'login': login,
|
||||
'password': password
|
||||
}, false);
|
||||
me.screenshot('login-dialog-filled-'+login);
|
||||
casper.click(loginFormSelector + ' input[name="Submit"]');
|
||||
});
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
casper.on('error', function(msg, backtrace) {
|
||||
common.error(msg);
|
||||
});
|
||||
|
||||
casper.start();
|
||||
|
||||
casper.viewport(activeViewport.viewport.width, activeViewport.viewport.height);
|
||||
|
||||
var execFile = require("child_process").execFile;
|
||||
execFile("symfony", ["kupshop:get_end2end_data"], null, function (err, stdout) {
|
||||
try {
|
||||
common.setShopData(JSON.parse(stdout));
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
|
||||
casper.run(function () {
|
||||
this.test.done();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
239
tests/end2end/tests/cartTest.js
Normal file
239
tests/end2end/tests/cartTest.js
Normal file
@@ -0,0 +1,239 @@
|
||||
function CartTest (test) {
|
||||
this.order = common.getOrder();
|
||||
this.test = test;
|
||||
}
|
||||
|
||||
CartTest.prototype = {
|
||||
constructor: CartTest,
|
||||
|
||||
runTests: function () {
|
||||
var me = this;
|
||||
|
||||
phantom.clearCookies();
|
||||
casper.start();
|
||||
|
||||
for (var index in me.order.products)
|
||||
me.addProductToCart(me.order.products[index]);
|
||||
|
||||
casper.then(function() {
|
||||
me.goToCart();
|
||||
});
|
||||
|
||||
casper.then(function() {
|
||||
me.viewOrderCart();
|
||||
});
|
||||
|
||||
casper.thenClick('[name=OrderNext]');
|
||||
|
||||
casper.then(function() {
|
||||
me.viewOrderDelivery();
|
||||
});
|
||||
casper.thenClick('[name=OrderNext]');
|
||||
|
||||
casper.then(function() {
|
||||
me.viewOrderUser();
|
||||
});
|
||||
|
||||
casper.thenClick('[name=OrderNext]');
|
||||
|
||||
casper.then(function() {
|
||||
me.viewOrderSummary();
|
||||
});
|
||||
|
||||
casper.thenClick('[name=SubmitOrder]');
|
||||
|
||||
casper.then(function() {
|
||||
me.checkOrderSuccess();
|
||||
});
|
||||
|
||||
casper.run(function() {
|
||||
this.test.done();
|
||||
});
|
||||
},
|
||||
|
||||
addProductToCart: function(product) {
|
||||
var me = this;
|
||||
|
||||
casper.thenOpen(product.url);
|
||||
|
||||
var buyFormSelector = 'form[action="'+common.getUrl('cart')+'"]';
|
||||
casper.waitForSelector(buyFormSelector, function() {
|
||||
this.test.assert(true, 'Product '+product.id+' detail loaded');
|
||||
common.screenshot('product-detail');
|
||||
|
||||
me.selectVariation();
|
||||
|
||||
// Submit form
|
||||
casper.click(buyFormSelector + ' [type=submit]');
|
||||
});
|
||||
|
||||
casper.waitForSelector('.added-to-cart', function() {
|
||||
this.test.assertVisible('.added-to-cart', 'Added to cart dialog displayed');
|
||||
common.screenshot('product-added-to-cart-'+product.id)
|
||||
}, function() {
|
||||
common.error('Cannot add product to cart')
|
||||
});
|
||||
},
|
||||
|
||||
selectVariation: function (product) {
|
||||
// Select variation
|
||||
var variationSelector = '[name=IDvariation]';
|
||||
if (casper.exists(variationSelector))
|
||||
{
|
||||
common.log('selecting product variation');
|
||||
|
||||
// If variation picker is select, select first option
|
||||
var selectSelector = 'select'+variationSelector;
|
||||
if (casper.exists(selectSelector))
|
||||
{
|
||||
common.log('selecting product variation from <select>');
|
||||
casper.evaluate(function(selector){
|
||||
document.querySelector(selector).selectedIndex = 1;
|
||||
}, selectSelector);
|
||||
}
|
||||
|
||||
// If variation picker is radio, select first option
|
||||
var radioSelector = 'input[type=radio]'+variationSelector;
|
||||
if (casper.exists(radioSelector))
|
||||
{
|
||||
if (casper.visible(radioSelector))
|
||||
{
|
||||
common.log('selecting product variation from <radio>');
|
||||
casper.click(radioSelector);
|
||||
}
|
||||
else
|
||||
{
|
||||
common.log('selecting product variation from <radio> 2');
|
||||
casper.evaluate(function(selector){
|
||||
document.querySelector(selector).checked = 1;
|
||||
}, radioSelector);
|
||||
}
|
||||
}
|
||||
|
||||
common.screenshot('product-select-variation');
|
||||
}
|
||||
},
|
||||
|
||||
goToCart: function() {
|
||||
casper.waitUntilVisible('a[href="'+common.getUrl('cart')+'"]', function() {
|
||||
this.test.assert(true, 'Cart link visible');
|
||||
|
||||
// mel by prejit do kosiku klikem na odkaz, ale pokud je prvni
|
||||
// odkaz do kosiku co najde skryty (arena), zfailuje - TODO dodelat
|
||||
casper.thenOpen("http://kupshop.local" + common.getUrl('cart'));
|
||||
|
||||
}, function() {
|
||||
common.error('Cart link invisible')
|
||||
});
|
||||
},
|
||||
|
||||
viewOrderCart: function() {
|
||||
casper.waitForSelector('[data-cart="row"]', function() {
|
||||
this.test.assert(true, 'Product in cart exists');
|
||||
}, function() {
|
||||
common.error('No product in cart')
|
||||
});
|
||||
},
|
||||
|
||||
viewOrderDelivery: function() {
|
||||
var deliveryBox = '[data-cart="delivery"]';
|
||||
|
||||
casper.waitForSelector(deliveryBox, function() {
|
||||
var delivery = 'input[name=delivery_id]:not([disabled])';
|
||||
var payment = 'input[name=payment_id]:not([disabled])';
|
||||
|
||||
if (casper.exists(delivery))
|
||||
{
|
||||
common.log('selecting first delivery');
|
||||
casper.click(delivery);
|
||||
} else {
|
||||
common.error('Unable to able to select delivery in cart');
|
||||
}
|
||||
|
||||
if (casper.exists(payment))
|
||||
{
|
||||
common.log('selecting first payment');
|
||||
casper.click(payment);
|
||||
} else {
|
||||
common.error('Unable to able to select payment in cart');
|
||||
}
|
||||
|
||||
this.test.assert(true, 'Delivery and payment selected');
|
||||
common.screenshot('order-delivery');
|
||||
|
||||
}, function() {
|
||||
common.error('Not able to select delivery or payment');
|
||||
common.screenshot('order-delivery-fail');
|
||||
});
|
||||
},
|
||||
|
||||
viewOrderUser: function() {
|
||||
var form = 'form#cart';
|
||||
|
||||
casper.waitForSelector(form, function() {
|
||||
|
||||
this.fill(form, {
|
||||
'invoice[email]': 'jana@wpj.cz',
|
||||
'invoice[name]': 'Casper',
|
||||
'invoice[surname]': 'Hodné strašidlo',
|
||||
'invoice[phone]': '498100222',
|
||||
'invoice[street]': 'Fügnerova 1288',
|
||||
'invoice[city]': 'Vrchlabí',
|
||||
'invoice[zip]': '54301'
|
||||
});
|
||||
|
||||
if (this.exists('#iemailAgain')) {
|
||||
|
||||
this.fill(form, {
|
||||
'invoice[emailAgain]': 'jana@wpj.cz'
|
||||
});
|
||||
|
||||
common.log('Thank you Kupkolo for this beautiful if statement');
|
||||
}
|
||||
|
||||
this.test.assert(true, 'Cart user data entered');
|
||||
common.screenshot('order-user-filled');
|
||||
});
|
||||
},
|
||||
|
||||
viewOrderSummary: function() {
|
||||
casper.waitForSelector('[name=SubmitOrder]', function() {
|
||||
this.test.assert(true, 'Viewing order summary');
|
||||
}, function() {
|
||||
common.error('Unable to reach order summary')
|
||||
});
|
||||
|
||||
casper.waitForSelector('[data-cart="row"]', function() {
|
||||
this.test.assertElementCount("[data-cart=row]", 2);
|
||||
});
|
||||
|
||||
casper.then(function() {
|
||||
if (this.exists('#tos')) {
|
||||
casper.click('#tos');
|
||||
} else {
|
||||
common.log('ToS not in DOM')
|
||||
}
|
||||
});
|
||||
|
||||
common.screenshot('order-summary');
|
||||
},
|
||||
|
||||
checkOrderSuccess: function() {
|
||||
common.screenshot('order-finished');
|
||||
|
||||
// matchuje standardne na url /objednavka/
|
||||
var url = common.getUrl('orderView').replace('[ID]/', '');
|
||||
|
||||
casper.waitForSelector('a[href^="'+url+'"]', function() {
|
||||
this.test.assert(true, 'Order submitted successfully');
|
||||
common.screenshot('order-success');
|
||||
}, function() {
|
||||
common.error('Order not submitted');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
casper.test.begin('Frontend: Add to cart', 11, function(test) {
|
||||
var cart = new CartTest(test);
|
||||
cart.runTests();
|
||||
});
|
||||
51
tests/end2end/tests/loginTest.js
Normal file
51
tests/end2end/tests/loginTest.js
Normal file
@@ -0,0 +1,51 @@
|
||||
casper.test.begin('Frontend: Homepage loads', 1, function(test) {
|
||||
phantom.clearCookies();
|
||||
common.goToHomepage(test);
|
||||
casper.run(function() {
|
||||
test.done();
|
||||
});
|
||||
});
|
||||
|
||||
casper.test.begin('Frontend: Login/logout works', 4, function(test) {
|
||||
phantom.clearCookies();
|
||||
common.goToHomepage(test);
|
||||
|
||||
casper.then(function () {
|
||||
common.showAndSendLoginForm('wpj@wpj.cz', 'wpj')
|
||||
});
|
||||
|
||||
casper.waitForSelector('a[href="'+common.getUrl('logout')+'"]', function () {
|
||||
common.screenshot('login-success');
|
||||
test.assert(true, 'Successfully logged in');
|
||||
casper.click('[href="'+common.getUrl('logout')+'"]');
|
||||
}, function() {
|
||||
common.error('Login failed');
|
||||
}, 5 * 1000);
|
||||
|
||||
casper.waitForSelector('#login_link', function () {
|
||||
test.assert(true, 'Successfully logged out');
|
||||
}, null, 5 * 1000);
|
||||
|
||||
casper.run(function() {
|
||||
test.done();
|
||||
});
|
||||
});
|
||||
|
||||
casper.test.begin('Frontend: Login does not exist', 4, function(test) {
|
||||
phantom.clearCookies();
|
||||
common.goToHomepage(test);
|
||||
|
||||
casper.then(function () {
|
||||
common.showAndSendLoginForm('nonexistent', 'XXX');
|
||||
});
|
||||
|
||||
casper.waitForUrl(new RegExp(common.getUrl('login')), function () {
|
||||
common.screenshot('login-invalid');
|
||||
test.assert(true, 'Landed at login form page.');
|
||||
test.assertVisible('.alert.alert-warning', 'Non existent login alert visible.');
|
||||
}, null, 5 * 1000);
|
||||
|
||||
casper.run(function() {
|
||||
test.done();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user