first commit

This commit is contained in:
2025-08-02 16:30:27 +02:00
commit 23646bfcee
14851 changed files with 1750626 additions and 0 deletions

135
tests/end2end/bootstrap.js vendored Normal file
View 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();
});
});

View 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();
});

View 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();
});
});