[IMP] website: test class with test for website_sale sale process

bzr revid: chm@openerp.com-20140120182643-tw65rig4qqi3sqqf
This commit is contained in:
Christophe Matthieu 2014-01-20 19:26:43 +01:00
parent 4d6e7e2d2e
commit 53d8280f1d
10 changed files with 310 additions and 115 deletions

View File

@ -19,104 +19,108 @@
});
this.registerSteps();
},
registerSteps: function () {
registerStep: function (step) {
var self = this;
this.tour.addSteps(_.map(this.steps, function (step) {
step.title = openerp.qweb.render('website.tour_popover_title', { title: step.title });
if (!step.element) {
step.orphan = true;
}
if (step.snippet) {
step.element = '#oe_snippets div.oe_snippet[data-snippet-id="'+step.snippet+'"] .oe_snippet_thumbnail';
}
if (step.trigger) {
if (step.trigger === 'click') {
step.title = openerp.qweb.render('website.tour_popover_title', { title: step.title });
if (!step.element) {
step.orphan = true;
}
if (step.snippet) {
step.element = '#oe_snippets div.oe_snippet[data-snippet-id="'+step.snippet+'"] .oe_snippet_thumbnail';
}
if (step.trigger) {
if (step.trigger === 'click') {
step.triggers = function (callback) {
$(step.element).one('click', function () {
(callback || self.moveToNextStep).apply(self);
});
};
} else if (step.trigger === 'reload') {
step.triggers = function (callback) {
var stack = JSON.parse(localStorage.getItem("website-reloads")) || [];
var index = stack.indexOf(step.stepId);
if (index !== -1 || window.localStorage.getItem("test-wait-reload")) {
stack.splice(index,1);
(callback || self.moveToNextStep).apply(self);
} else {
stack.push(step.stepId);
}
localStorage.setItem("website-reloads", JSON.stringify(stack));
};
} else if (step.trigger.url) {
step.triggers = function (callback) {
var stack = JSON.parse(localStorage.getItem("website-geturls")) || [];
var id = step.trigger.url.toString();
var index = stack.indexOf(id);
if (index !== -1) {
var url = new website.UrlParser(window.location.href);
var test = typeof step.trigger.url === "string" ?
step.trigger.url == url.pathname+url.search :
step.trigger.url.test(url.pathname+url.search);
if (!test) return;
stack.splice(index,1);
(callback || self.moveToNextStep).apply(self);
} else {
stack.push(id);
}
localStorage.setItem("website-geturls", JSON.stringify(stack));
};
} else if (step.trigger === 'drag') {
step.triggers = function (callback) {
self.onSnippetDragged(callback || self.moveToNextStep);
};
} else if (step.trigger.id) {
if (step.trigger.emitter && step.trigger.type === 'openerp') {
step.triggers = function (callback) {
$(step.element).one('click', function () {
(callback || self.moveToNextStep).apply(self);
step.trigger.emitter.on(step.trigger.id, self, function customHandler () {
step.trigger.emitter.off(step.trigger.id, customHandler);
(callback || self.moveToNextStep).apply(self, arguments);
});
};
} else if (step.trigger === 'reload') {
} else {
step.triggers = function (callback) {
var stack = JSON.parse(localStorage.getItem("website-reloads")) || [];
var index = stack.indexOf(step.stepId);
if (index !== -1) {
stack.splice(index,1);
(callback || self.moveToNextStep).apply(self);
} else {
stack.push(step.stepId);
}
localStorage.setItem("website-reloads", JSON.stringify(stack));
};
} else if (step.trigger && step.trigger.url) {
step.triggers = function (callback) {
var stack = JSON.parse(localStorage.getItem("website-geturls")) || [];
var id = step.trigger.url.toString();
var index = stack.indexOf(id);
if (index !== -1) {
var url = new website.UrlParser(window.location.href);
var test = typeof step.trigger.url === "string" ?
step.trigger.url == url.pathname+url.search :
step.trigger.url.test(url.pathname+url.search);
if (!test) return;
stack.splice(index,1);
(callback || self.moveToNextStep).apply(self);
} else {
stack.push(id);
}
localStorage.setItem("website-geturls", JSON.stringify(stack));
};
} else if (step.trigger === 'drag') {
step.triggers = function (callback) {
self.onSnippetDragged(callback || self.moveToNextStep);
};
} else if (step.trigger && step.trigger.id) {
if (step.trigger.emitter && step.trigger.type === 'openerp') {
step.triggers = function (callback) {
step.trigger.emitter.on(step.trigger.id, self, function customHandler () {
step.trigger.emitter.off(step.trigger.id, customHandler);
(callback || self.moveToNextStep).apply(self, arguments);
});
};
} else {
step.triggers = function (callback) {
var emitter = _.isString(step.trigger.emitter) ? $(step.trigger.emitter) : (step.trigger.emitter || $(step.element));
if (!emitter.size()) throw "Emitter is undefined";
emitter.on(step.trigger.id, function () {
(callback || self.moveToNextStep).apply(self, arguments);
});
};
}
} else if (step.trigger.modal) {
step.triggers = function (callback) {
var $doc = $(document);
function onStop () {
if (step.trigger.modal.stopOnClose) {
self.stop();
}
}
$doc.on('hide.bs.modal', onStop);
$doc.one('shown.bs.modal', function () {
$('.modal button.btn-primary').one('click', function () {
$doc.off('hide.bs.modal', onStop);
(callback || self.moveToNextStep).apply(self, [step.trigger.modal.afterSubmit]);
});
(callback || self.moveToNextStep).apply(self);
var emitter = _.isString(step.trigger.emitter) ? $(step.trigger.emitter) : (step.trigger.emitter || $(step.element));
if (!emitter.size()) throw "Emitter is undefined";
emitter.on(step.trigger.id, function () {
(callback || self.moveToNextStep).apply(self, arguments);
});
};
}
}
step.onShow = (function () {
var executed = false;
return function () {
if (!executed) {
_.isFunction(step.onStart) && step.onStart();
_.isFunction(step.triggers) && step.triggers();
executed = true;
} else if (step.trigger.modal) {
step.triggers = function (callback) {
var $doc = $(document);
function onStop () {
if (step.trigger.modal.stopOnClose) {
self.stop();
}
}
$doc.on('hide.bs.modal', onStop);
$doc.one('shown.bs.modal', function () {
$('.modal button.btn-primary').one('click', function () {
$doc.off('hide.bs.modal', onStop);
(callback || self.moveToNextStep).apply(self, [step.trigger.modal.afterSubmit]);
});
(callback || self.moveToNextStep).apply(self);
});
};
}());
return step;
}
}
step.onShow = (function () {
var executed = false;
return function () {
if (!executed) {
_.isFunction(step.onStart) && step.onStart();
_.isFunction(step.triggers) && step.triggers();
executed = true;
}
};
}());
return step;
},
registerSteps: function () {
var self = this;
this.tour.addSteps(_.map(this.steps, function (step) {
return self.registerStep(step);
}));
},
reset: function () {
@ -332,6 +336,9 @@
var actionSteps = _.filter(tour.steps, function (step) {
return step.trigger || step.sampleText;
});
window.onbeforeunload = function () {
window.localStorage.setItem("test-wait-reload", true);
};
function executeStep (step) {
window.localStorage.setItem(testId, step.stepId);
function next () {
@ -343,8 +350,9 @@
}
}
setTimeout(function () {
if (step.triggers) step.triggers(next);
var $element = $(step.element);
if (step.triggers) step.triggers(next);
window.localStorage.removeItem("test-wait-reload");
if (step.snippet && step.trigger === 'drag') {
website.TestConsole.dragAndDropSnippet(step.snippet);
} else if (step.trigger && step.trigger.id === 'change') {
@ -353,13 +361,21 @@
$element.val(step.sampleText);
$element.trigger($.Event("change", { srcElement: $element }));
} else if ($element.is(":visible")) { // Click by default
$element.trigger($.Event("click", { srcElement: $element }));
if (step.trigger.id === 'mousedown') {
$element.trigger($.Event("mousedown", { srcElement: $element }));
}
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
$element[0].dispatchEvent(evt);
if (step.trigger.id === 'mouseup') {
$element.trigger($.Event("mouseup", { srcElement: $element }));
}
}
if (!step.triggers) next();
}, step.delay || defaultDelay);
}
var url = new website.UrlParser(window.location.href);
if (tour.path && url.pathname !== tour.path) {
if (tour.path && url.pathname !== tour.path && !window.localStorage.getItem(testId)) {
window.localStorage.setItem(testId, actionSteps[0].stepId);
window.location.href = tour.path;
} else {

View File

@ -141,11 +141,11 @@ class WebsiteUiSuite(unittest.TestSuite):
except ValueError:
result.addError(self._test, 'Unexpected message: "%s"' % "\n".join(lines))
def full_path(filename):
return os.path.join(os.path.join(os.path.dirname(__file__), 'ui_suite'), filename)
def full_path(pyfile, filename):
return os.path.join(os.path.join(os.path.dirname(pyfile), 'ui_suite'), filename)
def load_tests(loader, base, _):
base.addTest(WebsiteUiSuite(full_path('dummy_test.js'), {}, 5.0))
base.addTest(WebsiteUiSuite(full_path('simple_dom_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
base.addTest(WebsiteUiSuite(full_path('homepage_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
base.addTest(WebsiteUiSuite(full_path(__file__, 'dummy_test.js'), {}, 5.0))
base.addTest(WebsiteUiSuite(full_path(__file__, 'simple_dom_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
base.addTest(WebsiteUiSuite(full_path(__file__, 'homepage_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
return base

View File

@ -96,8 +96,8 @@
<t t-foreach="website.menu_id.child_id" t-as="submenu">
<t t-call="website.submenu"/>
</t>
<li class="divider" t-if="user_id.id != website.public_user.id"/>
<li class="dropdown" t-ignore="true" t-if="user_id.id != website.public_user.id">
<li class="divider" groups="base.group_user,base.group_portal"/>
<li class="dropdown" t-ignore="true" groups="base.group_user,base.group_portal">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<b>
<span t-esc="user_id.name"/>
@ -241,8 +241,8 @@
<template id="show_sign_in" inherit_option_id="website.layout" inherit_id="website.layout" name="Show Sign In">
<xpath expr="//ul[@id='top_menu']" position="inside">
<li class="divider" t-if="user_id.id == website.public_user.id"/>
<li t-if="user_id.id == website.public_user.id">
<li class="divider" groups="base.group_public"/>
<li groups="base.group_public">
<a t-attf-href="/web#redirect=#{ quote_plus(url_for('', keep_query='*')) }">
<b>Sign in</b>
</a>

View File

@ -1,10 +1,5 @@
import os
import openerp.addons.website.tests.test_ui as test_ui
def full_path(filename):
return os.path.join(os.path.join(os.path.dirname(__file__), 'ui_suite'), filename)
import openerp.addons.website.tests.test_ui as test_ui,full_path
def load_tests(loader, base, _):
base.addTest(test_ui.WebsiteUiSuite(full_path('post_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
base.addTest(test_ui.WebsiteUiSuite(full_path(__file__,'post_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
return base

View File

@ -1,10 +1,5 @@
import os
import openerp.addons.website.tests.test_ui as test_ui
def full_path(filename):
return os.path.join(os.path.join(os.path.dirname(__file__), 'ui_suite'), filename)
import openerp.addons.website.tests.test_ui as test_ui,full_path
def load_tests(loader, base, _):
base.addTest(test_ui.WebsiteUiSuite(full_path('event_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
base.addTest(test_ui.WebsiteUiSuite(full_path(__file__,'event_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
return base

View File

@ -6,6 +6,7 @@
website.EditorBar.include({
start: function () {
this.registerTour(new website.EditorShopTour(this));
this.registerTour(new website.EditorShopTest(this));
return this._super();
},
});
@ -156,4 +157,154 @@
},
});
website.Test = website.Tour.extend({
registerStep: function (step) {
var self = this;
var step = this._super(step);
if (step.beforeTrigger || step.afterTrigger) {
var fn = step.triggers;
step.triggers = function (callback) {
if (step.beforeTrigger) step.beforeTrigger();
if (!step.afterTrigger) {
fn.call(step, callback);
} else {
fn.call(step, function () {
(callback || self.moveToNextStep).apply(self);
step.afterTrigger();
});
}
};
}
return step;
}
});
website.EditorShopTest = website.Test.extend({
id: 'shoptest',
name: "Try to by 3 products",
path: '/shop',
init: function (editor) {
var self = this;
self.steps = [
{
stepId: 'begin-test',
title: 'begin-test',
template: self.popover({ next: "Start Test"}),
backdrop: true,
},
{
stepId: 'display-ipod',
element: '.oe_product_cart a:contains("iPod")',
trigger: 'click',
},
{
stepId: 'display-wait-ipod',
trigger: 'reload',
},
{
stepId: 'choose-ipod',
element: 'input[name="product_id"]:not([checked])',
trigger: {
id: 'mouseup',
},
},
{
stepId: 'add-ipod',
element: 'form[action="/shop/add_cart/"] button',
trigger: {
url: '/shop/mycart/',
},
},
{
stepId: 'add-suggested-product',
element: 'form[action="/shop/add_cart/"] button:contains("Add to Cart")',
trigger: 'reload',
},
{
stepId: 'more-product',
element: '.oe_mycart a.js_add_cart_json:eq(1)',
trigger: 'click',
},
{
stepId: 'less-product',
element: '.oe_mycart a.js_add_cart_json:eq(2)',
trigger: 'reload',
},
{
stepId: 'number-product',
element: '.oe_mycart input.js_quantity',
trigger: 'reload',
beforeTrigger: function (tour, callback) {
if (parseInt($(".oe_mycart input.js_quantity").val(),10) !== 1)
$(".oe_mycart input.js_quantity").val("1").change();
},
afterTrigger: function (tour, callback) {
if ($(".oe_mycart input.js_quantity").size() !== 1)
throw "Can't remove suggested item from my cart";
if (parseInt($(".oe_mycart input.js_quantity").val(),10) !== 1)
throw "Can't defined number of items in my cart";
},
},
{
stepId: 'go-checkout-product',
element: 'a[href="/shop/checkout/"]',
trigger: {
url: '/shop/checkout/',
},
},
{
stepId: 'confirm-false-checkout-product',
element: 'form[action="/shop/confirm_order/"] button',
trigger: {
url: '/shop/confirm_order/',
},
beforeTrigger: function (tour, callback) {
$("input[name='phone']").val("");
},
},
{
stepId: 'confirm-checkout-product',
element: 'form[action="/shop/confirm_order/"] button',
trigger: {
url: '/shop/payment/',
},
beforeTrigger: function (tour, callback) {
$("input[name='phone']").val("123");
$("input[name='street']").val("123");
$("input[name='city']").val("123");
$("input[name='zip']").val("123");
$("select[name='country_id']").val("21");
},
},
{
stepId: 'delivery-checkout-product',
element: 'input[name="delivery_type"]:eq(1)',
trigger: 'reload',
},
{
stepId: 'acquirer-checkout-product',
element: 'input[name="acquirer"]',
trigger: 'mouseup',
},
{
stepId: 'pay-checkout-product',
element: 'button:contains("Pay Now")',
trigger: 'click',
},
{
stepId: 'end-test',
title: "end-test",
backdrop: true,
},
];
return this._super();
},
trigger: function () {
return (this.resume() && this.testUrl(/^\/shop\//)) || this._super();
},
});
}());

View File

@ -0,0 +1 @@
import test_ui

View File

@ -0,0 +1,6 @@
import openerp.addons.website.tests.test_ui as test_ui,full_path
def load_tests(loader, base, _):
base.addTest(test_ui.WebsiteUiSuite(full_path(__file__,'website_sale-sale_process-test.js'),
{ 'action': 'website.action_website_homepage' }, 60.0))
return base

View File

@ -0,0 +1,31 @@
var testRunner = require('../../../website/tests/ui_suite/ui_test_runner.js');
var waitFor = testRunner.waitFor;
testRunner.run(function websiteSaleTest (page, timeout) {
page.evaluate(function () { localStorage.clear(); });
waitFor(function clientReady () {
return page.evaluate(function () {
return window.$ && window.openerp && window.openerp.website
&& window.openerp.website.TestConsole
&& window.openerp.website.TestConsole.test('shoptest');
});
}, function executeTest () {
page.evaluate(function () {
window.openerp.website.TestConsole.test('shoptest').run(true);
});
waitFor(function testExecuted () {
var after = page.evaluate(function () {
return window.$ && $('button[data-action=edit]').is(":visible") && {
image: $('#wrap [data-snippet-id=image-text]').length,
text: $('#wrap [data-snippet-id=text-block]').length,
};
});
var result = after && (after.image === 1) && (after.text === 1);
return result;
}, function finish () {
console.log('{ "event": "success" }');
phantom.exit();
}, 4*timeout/5);
}, timeout/5);
});

View File

@ -713,7 +713,7 @@
<div class="row">
<div class="col-md-8 oe_mycart">
<h3 class="page-header mt16">Billing Information
<small t-if="user_id.id == website.public_user.id"> or
<small groups="base.group_public"> or
<a t-if="not partner" t-attf-href="/web#action=redirect&amp;url=#{ request.httprequest.url }">sign in</a>
</small>
</h3>