[IMP] website: test class with test for website_sale sale process
bzr revid: chm@openerp.com-20140120182643-tw65rig4qqi3sqqf
This commit is contained in:
parent
4d6e7e2d2e
commit
53d8280f1d
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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();
|
||||
},
|
||||
});
|
||||
|
||||
}());
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
import test_ui
|
|
@ -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
|
|
@ -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);
|
||||
});
|
|
@ -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&url=#{ request.httprequest.url }">sign in</a>
|
||||
</small>
|
||||
</h3>
|
||||
|
|
Loading…
Reference in New Issue