From 063ebff8f5ba8e7e6cc8686c0472377b639119cc Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 11:17:01 +0100 Subject: [PATCH 01/15] [IMP] Code style + doc bzr revid: ddm@openerp.com-20131223101701-1o9qvlwk96axpd1l --- addons/website/tests/test_ui.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index 32675717943..9819c0fb6ac 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -13,7 +13,7 @@ __all__ = ['load_tests', 'WebsiteUiSuite'] def _exc_info_to_string(err, test): return err -class LineReader(object): +class LineReader: def __init__(self, fd): self._fd = fd self._buf = '' @@ -106,8 +106,9 @@ class WebsiteUiSuite(unittest.TestSuite): readable.remove(stream) break; for line in lines: - # the runner expects only one output line self.process(line, result) + # the runner expects only one output line + # any subsequent line is ignored break if last_check_time >= (self.start_time + self.timeout): From 4a7143d32933273490d49813d548955ddbe482a2 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 11:28:26 +0100 Subject: [PATCH 02/15] [IMP] Sleep a little between reads bzr revid: ddm@openerp.com-20131223102826-u3z9i9ohy7s1d8nb --- addons/website/tests/test_ui.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index 9819c0fb6ac..5657080cf8d 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -76,11 +76,13 @@ class WebsiteUiSuite(unittest.TestSuite): def _run(self, result): self._test = WebsiteUiTest(self.testfile) self.start_time = time.time() + last_check_time = time.time() phantomOptions = json.dumps({ 'timeout': self.timeout, 'port': tools.config['xmlrpc_port'] }) + phantom = subprocess.Popen([ 'phantomjs', os.path.join(ROOT, self.testfile), @@ -88,14 +90,11 @@ class WebsiteUiSuite(unittest.TestSuite): ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - proc_stdout = LineReader(phantom.stdout.fileno()) readable = [proc_stdout] - - last_check_time = time.time() try: while readable and last_check_time < self.start_time + self.timeout: - ready, _, _ = select.select(readable, [], [], 0) + ready, _, _ = select.select(readable, [], [], 0.1) if not ready: last_check_time = time.time() continue @@ -110,7 +109,6 @@ class WebsiteUiSuite(unittest.TestSuite): # the runner expects only one output line # any subsequent line is ignored break - if last_check_time >= (self.start_time + self.timeout): result.addError(self._test, "Timeout after %s s" % (last_check_time - self.start_time )) result.stopTest(self._test) From 8fd5fb82a7d6dcb130e9786729da0fe52a196994 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 14:54:25 +0100 Subject: [PATCH 03/15] [IMP] Added simple DOM UI test as example bzr revid: ddm@openerp.com-20131223135425-9hxb4nmvdr0rrb3t --- addons/website/static/src/js/website.tour.js | 6 +++ addons/website/tests/test_ui.py | 21 +++++----- addons/website/tests/ui_suite/banner_tour.js | 17 -------- addons/website/tests/ui_suite/dom_test.js | 41 +++++++++++++++++++ .../{sample_test.js => dummy_test.js} | 0 5 files changed, 58 insertions(+), 27 deletions(-) delete mode 100644 addons/website/tests/ui_suite/banner_tour.js create mode 100644 addons/website/tests/ui_suite/dom_test.js rename addons/website/tests/ui_suite/{sample_test.js => dummy_test.js} (100%) diff --git a/addons/website/static/src/js/website.tour.js b/addons/website/static/src/js/website.tour.js index ea3c7bcf5b5..a22a31a6857 100644 --- a/addons/website/static/src/js/website.tour.js +++ b/addons/website/static/src/js/website.tour.js @@ -287,6 +287,12 @@ tour.start(); } }); + document.addEventListener('ui-tests:ready', function() { + alert("TOTO_DOM"); + }, false); + if (document.dispatchEvent) { + document.dispatchEvent(new Event('ui-tests:ready', { bubbles: true, cancelable: false })); + } return this._super(); }, registerTour: function (tour) { diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index 5657080cf8d..6c1380032e0 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -43,7 +43,7 @@ class WebsiteUiTest(unittest.TestCase): class WebsiteUiSuite(unittest.TestSuite): # timeout is in seconds - def __init__(self, testfile, timeout=5): + def __init__(self, testfile, timeout=20): self.testfile = testfile self.timeout = timeout self._test = None @@ -93,7 +93,7 @@ class WebsiteUiSuite(unittest.TestSuite): proc_stdout = LineReader(phantom.stdout.fileno()) readable = [proc_stdout] try: - while readable and last_check_time < self.start_time + self.timeout: + while phantom.poll() is None and readable and last_check_time < self.start_time + self.timeout: ready, _, _ = select.select(readable, [], [], 0.1) if not ready: last_check_time = time.time() @@ -104,18 +104,19 @@ class WebsiteUiSuite(unittest.TestSuite): # got EOF on this stream readable.remove(stream) break; - for line in lines: - self.process(line, result) + else: + self.process(lines[0], result) # the runner expects only one output line # any subsequent line is ignored - break + readable.remove(stream) + if last_check_time >= (self.start_time + self.timeout): result.addError(self._test, "Timeout after %s s" % (last_check_time - self.start_time )) - result.stopTest(self._test) finally: # kill phantomjs if phantom.exit() wasn't called in the test if phantom.poll() is None: phantom.terminate() + result.stopTest(self._test) def process(self, line, result): # Test protocol @@ -134,11 +135,11 @@ class WebsiteUiSuite(unittest.TestSuite): message = args.get('message', "") result.addFailure(self._test, message) else: - result.addError(self._test, "Unexpected message: %s" % line) + result.addError(self._test, 'Unexpected message: "%s"' % line) except ValueError: - result.addError(self._test, "Unexpected message: %s" % line) + result.addError(self._test, 'Unexpected message: "%s"' % line) def load_tests(loader, base, _): - base.addTest(WebsiteUiSuite('sample_test.js')) - base.addTest(WebsiteUiSuite('banner_tour.js')) + base.addTest(WebsiteUiSuite('dummy_test.js')) + base.addTest(WebsiteUiSuite('dom_test.js')) return base \ No newline at end of file diff --git a/addons/website/tests/ui_suite/banner_tour.js b/addons/website/tests/ui_suite/banner_tour.js deleted file mode 100644 index 686f86e446e..00000000000 --- a/addons/website/tests/ui_suite/banner_tour.js +++ /dev/null @@ -1,17 +0,0 @@ -var options = JSON.parse(phantom.args); -var page = require('webpage').create(); -var url = 'http://localhost:'+options.port; -page.open(url, function (status) { - if (status !== 'success') { - console.log('{ "event": "failure", "message": "'+url+' failed to load"}'); - phantom.exit(); - } else { - page.evaluate(function() { - $(document).on("tour:ready", function () { - openerp.website.TestConsole.test('banner').run(true) - console.log('{ "event": "success" }'); - phantom.exit(); - }); - }); - } -}); \ No newline at end of file diff --git a/addons/website/tests/ui_suite/dom_test.js b/addons/website/tests/ui_suite/dom_test.js new file mode 100644 index 00000000000..85f9341fab9 --- /dev/null +++ b/addons/website/tests/ui_suite/dom_test.js @@ -0,0 +1,41 @@ +var options = JSON.parse(phantom.args); +var url = 'http://localhost:'+options.port; + +var page = require('webpage').create(); + +page.onError = function(message, trace) { + console.log('{ "event": "error", "message": "'+message+'"}'); +}; + +function waitFor(ready, timeout) { + var maxtimeOutMillis = timeout ? timeout*1000 : 10000; + var start = new Date().getTime(); + var condition = ready(); + var interval = setInterval(function() { + if ((new Date().getTime() - start < maxtimeOutMillis) && !condition ) { + alert("TOTO") + condition = ready(); + } else { + if(!condition) { + console.log('{ "event": "error", "message": "Timeout after'+maxtimeOutMillis+' ms" }'); + phantom.exit(1); + } else { + clearInterval(interval); + console.log('{ "event": "success" }'); + } + } + }, 100); +}; + +page.open(url, function (status) { + if (status !== 'success') { + console.log('{ "event": "failure", "message": "'+url+' failed to load"}'); + phantom.exit(1); + } else { + waitFor(function () { + return page.evaluate(function () { + return window.openerp && window.openerp.website; + }); + }, 5); + } +}); \ No newline at end of file diff --git a/addons/website/tests/ui_suite/sample_test.js b/addons/website/tests/ui_suite/dummy_test.js similarity index 100% rename from addons/website/tests/ui_suite/sample_test.js rename to addons/website/tests/ui_suite/dummy_test.js From 54224e4f3cd24049e167d8f7e31fa7b8a9d841bf Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 14:56:44 +0100 Subject: [PATCH 04/15] [FIX] Remove debugging code bzr revid: ddm@openerp.com-20131223135644-8ri2jbco8khjtlyq --- addons/website/static/src/js/website.tour.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/website/static/src/js/website.tour.js b/addons/website/static/src/js/website.tour.js index a22a31a6857..3e05f8f3832 100644 --- a/addons/website/static/src/js/website.tour.js +++ b/addons/website/static/src/js/website.tour.js @@ -287,9 +287,6 @@ tour.start(); } }); - document.addEventListener('ui-tests:ready', function() { - alert("TOTO_DOM"); - }, false); if (document.dispatchEvent) { document.dispatchEvent(new Event('ui-tests:ready', { bubbles: true, cancelable: false })); } From fbea33821b7a512d72996a0fec3adb89f4a00eb3 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 15:35:47 +0100 Subject: [PATCH 05/15] [IMP] PhantomJS test with authentication bzr revid: ddm@openerp.com-20131223143547-sgx2shqf9vg52e9j --- addons/website/tests/ui_suite/dom_test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/website/tests/ui_suite/dom_test.js b/addons/website/tests/ui_suite/dom_test.js index 85f9341fab9..73e2bb739b0 100644 --- a/addons/website/tests/ui_suite/dom_test.js +++ b/addons/website/tests/ui_suite/dom_test.js @@ -1,5 +1,5 @@ var options = JSON.parse(phantom.args); -var url = 'http://localhost:'+options.port; +var url = 'http://localhost:'+options.port+'/web#action=website.action_website&login=admin&password=admin'; var page = require('webpage').create(); @@ -34,8 +34,8 @@ page.open(url, function (status) { } else { waitFor(function () { return page.evaluate(function () { - return window.openerp && window.openerp.website; + return window.openerp && window.openerp.website && window.openerp.website.editor; }); - }, 5); + }, options.timeout); } }); \ No newline at end of file From dbe5c06d95bc5922a282e39d6469a898460838ef Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 15:41:00 +0100 Subject: [PATCH 06/15] [IMP] PhantomJS UI tests code cleanup bzr revid: ddm@openerp.com-20131223144100-h8eui7szdj40e2mo --- addons/website/static/src/js/website.tour.js | 3 --- addons/website/tests/test_ui.py | 2 +- addons/website/tests/ui_suite/dom_test.js | 10 +++++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/addons/website/static/src/js/website.tour.js b/addons/website/static/src/js/website.tour.js index 3e05f8f3832..ea3c7bcf5b5 100644 --- a/addons/website/static/src/js/website.tour.js +++ b/addons/website/static/src/js/website.tour.js @@ -287,9 +287,6 @@ tour.start(); } }); - if (document.dispatchEvent) { - document.dispatchEvent(new Event('ui-tests:ready', { bubbles: true, cancelable: false })); - } return this._super(); }, registerTour: function (tour) { diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index 6c1380032e0..bb7e1e0f9a5 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -43,7 +43,7 @@ class WebsiteUiTest(unittest.TestCase): class WebsiteUiSuite(unittest.TestSuite): # timeout is in seconds - def __init__(self, testfile, timeout=20): + def __init__(self, testfile, timeout=10): self.testfile = testfile self.timeout = timeout self._test = None diff --git a/addons/website/tests/ui_suite/dom_test.js b/addons/website/tests/ui_suite/dom_test.js index 73e2bb739b0..ee60d827ce0 100644 --- a/addons/website/tests/ui_suite/dom_test.js +++ b/addons/website/tests/ui_suite/dom_test.js @@ -8,16 +8,15 @@ page.onError = function(message, trace) { }; function waitFor(ready, timeout) { - var maxtimeOutMillis = timeout ? timeout*1000 : 10000; + var timeOutMillis = timeout ? timeout*1000 : 10000; var start = new Date().getTime(); var condition = ready(); var interval = setInterval(function() { - if ((new Date().getTime() - start < maxtimeOutMillis) && !condition ) { - alert("TOTO") + if ((new Date().getTime() - start < timeOutMillis) && !condition ) { condition = ready(); } else { if(!condition) { - console.log('{ "event": "error", "message": "Timeout after'+maxtimeOutMillis+' ms" }'); + console.log('{ "event": "error", "message": "Timeout after'+timeOutMillis+' ms" }'); phantom.exit(1); } else { clearInterval(interval); @@ -27,6 +26,7 @@ function waitFor(ready, timeout) { }, 100); }; +page.viewportSize = { width: 1920, height: 1080 }; page.open(url, function (status) { if (status !== 'success') { console.log('{ "event": "failure", "message": "'+url+' failed to load"}'); @@ -34,7 +34,7 @@ page.open(url, function (status) { } else { waitFor(function () { return page.evaluate(function () { - return window.openerp && window.openerp.website && window.openerp.website.editor; + return window.openerp && window.openerp.website && window.openerp.website.TestConsole; }); }, options.timeout); } From faae14704d1b7c7bef8abe6234e73d6b115054c4 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 15:46:03 +0100 Subject: [PATCH 07/15] [IMP] PhantomJS UI error reporting bzr revid: ddm@openerp.com-20131223144603-xxuml794a91nt2sc --- addons/website/tests/test_ui.py | 4 ++-- addons/website/tests/ui_suite/dom_test.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index bb7e1e0f9a5..edf9a352459 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -43,7 +43,7 @@ class WebsiteUiTest(unittest.TestCase): class WebsiteUiSuite(unittest.TestSuite): # timeout is in seconds - def __init__(self, testfile, timeout=10): + def __init__(self, testfile, timeout=10.0): self.testfile = testfile self.timeout = timeout self._test = None @@ -135,7 +135,7 @@ class WebsiteUiSuite(unittest.TestSuite): message = args.get('message', "") result.addFailure(self._test, message) else: - result.addError(self._test, 'Unexpected message: "%s"' % line) + result.addError(self._test, 'Unexpected JSON: "%s"' % line) except ValueError: result.addError(self._test, 'Unexpected message: "%s"' % line) diff --git a/addons/website/tests/ui_suite/dom_test.js b/addons/website/tests/ui_suite/dom_test.js index ee60d827ce0..f1daa87dbb2 100644 --- a/addons/website/tests/ui_suite/dom_test.js +++ b/addons/website/tests/ui_suite/dom_test.js @@ -8,7 +8,7 @@ page.onError = function(message, trace) { }; function waitFor(ready, timeout) { - var timeOutMillis = timeout ? timeout*1000 : 10000; + var timeOutMillis = timeout ? Math.round(timeout*1000) : 10000; var start = new Date().getTime(); var condition = ready(); var interval = setInterval(function() { From 65f48d0ce70f3deceb8274619c9f68837ea947a7 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 15:54:36 +0100 Subject: [PATCH 08/15] [IMP] PhantomJS UI test code bzr revid: ddm@openerp.com-20131223145436-nqrwtsg5avqml7qw --- addons/website/tests/ui_suite/dom_test.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/addons/website/tests/ui_suite/dom_test.js b/addons/website/tests/ui_suite/dom_test.js index f1daa87dbb2..23366312ca2 100644 --- a/addons/website/tests/ui_suite/dom_test.js +++ b/addons/website/tests/ui_suite/dom_test.js @@ -5,22 +5,23 @@ var page = require('webpage').create(); page.onError = function(message, trace) { console.log('{ "event": "error", "message": "'+message+'"}'); + phantom.exit(1); }; -function waitFor(ready, timeout) { - var timeOutMillis = timeout ? Math.round(timeout*1000) : 10000; +function waitFor(ready, callback, timeout) { + var timeoutMillis = timeout ? Math.round(timeout*1000) : 10000; var start = new Date().getTime(); var condition = ready(); var interval = setInterval(function() { - if ((new Date().getTime() - start < timeOutMillis) && !condition ) { + if ((new Date().getTime() - start < timeoutMillis) && !condition ) { condition = ready(); } else { if(!condition) { - console.log('{ "event": "error", "message": "Timeout after'+timeOutMillis+' ms" }'); + console.log('{ "event": "error", "message": "Timeout after'+timeoutMillis+' ms" }'); phantom.exit(1); } else { clearInterval(interval); - console.log('{ "event": "success" }'); + callback(); } } }, 100); @@ -36,6 +37,9 @@ page.open(url, function (status) { return page.evaluate(function () { return window.openerp && window.openerp.website && window.openerp.website.TestConsole; }); + }, function () { + console.log('{ "event": "success" }'); + phantom.exit(); }, options.timeout); } }); \ No newline at end of file From 39c5b09e6e0125e30977fe7160518d2baa9c165a Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 16:25:03 +0100 Subject: [PATCH 09/15] [IMP] Banner tour automated test bzr revid: ddm@openerp.com-20131223152503-saqpy0d8vgvg9p20 --- addons/website/data/website_data.xml | 5 +++ addons/website/tests/test_ui.py | 2 +- .../{dom_test.js => banner_tour_test.js} | 31 ++++++++++++++----- 3 files changed, 30 insertions(+), 8 deletions(-) rename addons/website/tests/ui_suite/{dom_test.js => banner_tour_test.js} (52%) diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml index 9e33a43b5d2..bc387b609ae 100644 --- a/addons/website/data/website_data.xml +++ b/addons/website/data/website_data.xml @@ -75,6 +75,11 @@ /?tutorial.banner=true self + + Website Homepage + /page/website.homepage + self + Website diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index edf9a352459..e6d548137d1 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -43,7 +43,7 @@ class WebsiteUiTest(unittest.TestCase): class WebsiteUiSuite(unittest.TestSuite): # timeout is in seconds - def __init__(self, testfile, timeout=10.0): + def __init__(self, testfile, timeout=60.0): self.testfile = testfile self.timeout = timeout self._test = None diff --git a/addons/website/tests/ui_suite/dom_test.js b/addons/website/tests/ui_suite/banner_tour_test.js similarity index 52% rename from addons/website/tests/ui_suite/dom_test.js rename to addons/website/tests/ui_suite/banner_tour_test.js index 23366312ca2..5b9a6364b99 100644 --- a/addons/website/tests/ui_suite/dom_test.js +++ b/addons/website/tests/ui_suite/banner_tour_test.js @@ -1,5 +1,5 @@ var options = JSON.parse(phantom.args); -var url = 'http://localhost:'+options.port+'/web#action=website.action_website&login=admin&password=admin'; +var url = 'http://localhost:'+options.port+'/web#action=website.action_website_homepage&login=admin&password=admin'; var page = require('webpage').create(); @@ -9,7 +9,7 @@ page.onError = function(message, trace) { }; function waitFor(ready, callback, timeout) { - var timeoutMillis = timeout ? Math.round(timeout*1000) : 10000; + var timeoutMillis = timeout ? Math.round(timeout*1000) : 30000; var start = new Date().getTime(); var condition = ready(); var interval = setInterval(function() { @@ -17,7 +17,7 @@ function waitFor(ready, callback, timeout) { condition = ready(); } else { if(!condition) { - console.log('{ "event": "error", "message": "Timeout after'+timeoutMillis+' ms" }'); + console.log('{ "event": "error", "message": "Timeout after '+timeoutMillis+' ms" }'); phantom.exit(1); } else { clearInterval(interval); @@ -33,13 +33,30 @@ page.open(url, function (status) { console.log('{ "event": "failure", "message": "'+url+' failed to load"}'); phantom.exit(1); } else { + page.evaluate(function () { + localStorage.clear(); + }); waitFor(function () { return page.evaluate(function () { - return window.openerp && window.openerp.website && window.openerp.website.TestConsole; + return window.openerp && window.openerp.website && window.openerp.website.TestConsole && window.openerp.website.TestConsole.test('banner'); }); }, function () { - console.log('{ "event": "success" }'); - phantom.exit(); - }, options.timeout); + page.evaluate(function () { + window.openerp.website.TestConsole.test('banner').run(true); + }); + waitFor(function () { + return page.evaluate(function () { + var $edit = $('button[data-action=edit]'); + var $carousel = $('#wrap [data-snippet-id=carousel]'); + var $columns = $('#wrap [data-snippet-id=three-columns]'); + return $carousel && $carousel.length === 1 + && $columns && $columns.length === 1 + && $('button[data-action=edit]').is(":visible"); + }); + }, function () { + console.log('{ "event": "success" }'); + phantom.exit(); + }); + }); } }); \ No newline at end of file From ddb551cbd6d0e7608f176147039c49ffe54bca33 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 16:46:53 +0100 Subject: [PATCH 10/15] [FIX] Banner tour test bzr revid: ddm@openerp.com-20131223154653-44ws3k6o6u4tegjn --- addons/website/tests/test_ui.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index e6d548137d1..92ee59733b2 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -43,7 +43,7 @@ class WebsiteUiTest(unittest.TestCase): class WebsiteUiSuite(unittest.TestSuite): # timeout is in seconds - def __init__(self, testfile, timeout=60.0): + def __init__(self, testfile, timeout=10.0): self.testfile = testfile self.timeout = timeout self._test = None @@ -141,5 +141,5 @@ class WebsiteUiSuite(unittest.TestSuite): def load_tests(loader, base, _): base.addTest(WebsiteUiSuite('dummy_test.js')) - base.addTest(WebsiteUiSuite('dom_test.js')) + base.addTest(WebsiteUiSuite('banner_tour_test.js')) return base \ No newline at end of file From 71a5a4a9f48cbfb2f4b596b68da6d476fad707e5 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 17:10:32 +0100 Subject: [PATCH 11/15] [IMP] UI tests: removed useless break bzr revid: ddm@openerp.com-20131223161032-ipncw5lfxmdrjz9x --- addons/website/tests/test_ui.py | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index 92ee59733b2..87aeaff3375 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -103,7 +103,6 @@ class WebsiteUiSuite(unittest.TestSuite): if lines is None: # got EOF on this stream readable.remove(stream) - break; else: self.process(lines[0], result) # the runner expects only one output line From cbfadb48a03bb198012c6969a126c1dfdea729c9 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 17:22:34 +0100 Subject: [PATCH 12/15] [IMP] UI tests code cleanup (python) bzr revid: ddm@openerp.com-20131223162234-2cicx8ffnjrp24s4 --- addons/website/tests/test_ui.py | 48 ++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index 87aeaff3375..eb799b0065d 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -14,23 +14,23 @@ def _exc_info_to_string(err, test): return err class LineReader: - def __init__(self, fd): - self._fd = fd - self._buf = '' + def __init__(self, file_descriptor): + self._file_descriptor = file_descriptor + self._buffer = '' def fileno(self): - return self._fd + return self._file_descriptor def readlines(self): - data = os.read(self._fd, 4096) + data = os.read(self._file_descriptor, 4096) if not data: # EOF return None - self._buf += data + self._buffer += data if '\n' not in data: return [] - tmp = self._buf.split('\n') - lines, self._buf = tmp[:-1], tmp[-1] + tmp = self._buffer.split('\n') + lines, self._buffer = tmp[:-1], tmp[-1] return lines class WebsiteUiTest(unittest.TestCase): @@ -42,7 +42,7 @@ class WebsiteUiTest(unittest.TestCase): return self.name class WebsiteUiSuite(unittest.TestSuite): - # timeout is in seconds + # timeout in seconds def __init__(self, testfile, timeout=10.0): self.testfile = testfile self.timeout = timeout @@ -52,14 +52,11 @@ class WebsiteUiSuite(unittest.TestSuite): return iter([self]) def run(self, result): - # Test if phantom is correctly installed + # is PhantomJS correctly installed? try: - subprocess.call([ - 'phantomjs', - '-v' - ], - stdout=open(os.devnull, 'w'), - stderr=subprocess.STDOUT) + subprocess.call([ 'phantomjs', '-v' ], + stdout=open(os.devnull, 'w'), + stderr=subprocess.STDOUT) except OSError: test = WebsiteUiTest('UI Tests') result.startTest(test) @@ -84,12 +81,12 @@ class WebsiteUiSuite(unittest.TestSuite): }) phantom = subprocess.Popen([ - 'phantomjs', - os.path.join(ROOT, self.testfile), - phantomOptions - ], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) + 'phantomjs', + os.path.join(ROOT, self.testfile), + phantomOptions + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) proc_stdout = LineReader(phantom.stdout.fileno()) readable = [proc_stdout] try: @@ -101,14 +98,13 @@ class WebsiteUiSuite(unittest.TestSuite): for stream in ready: lines = stream.readlines() if lines is None: - # got EOF on this stream + # EOF readable.remove(stream) else: self.process(lines[0], result) # the runner expects only one output line # any subsequent line is ignored readable.remove(stream) - if last_check_time >= (self.start_time + self.timeout): result.addError(self._test, "Timeout after %s s" % (last_check_time - self.start_time )) finally: @@ -123,6 +119,7 @@ class WebsiteUiSuite(unittest.TestSuite): # use console.log in phantomjs to output test results using the following format: # - for a success: { "event": "success" } # - for a failure: { "event": "failure", "message": "Failure description" } + # - for an error: { "event": "error", "message": "Error description" } # any other message is treated as an error result.startTest(self._test) try: @@ -133,6 +130,9 @@ class WebsiteUiSuite(unittest.TestSuite): elif event == 'failure': message = args.get('message', "") result.addFailure(self._test, message) + elif event == 'error': + message = args.get('message', "") + result.addError(self._test, message) else: result.addError(self._test, 'Unexpected JSON: "%s"' % line) except ValueError: From 2648d550333229d05908af7ab5d7c67b6ffde0fe Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 17:51:13 +0100 Subject: [PATCH 13/15] [IMP] Refactor UI test code for reusability bzr revid: ddm@openerp.com-20131223165113-kx4aalzs6las1m2z --- addons/website/tests/test_ui.py | 31 ++++---- .../tests/ui_suite/banner_tour_test.js | 77 ++++++------------- .../tests/ui_suite/ui_test_template.js | 51 ++++++++++++ 3 files changed, 90 insertions(+), 69 deletions(-) create mode 100644 addons/website/tests/ui_suite/ui_test_template.js diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index eb799b0065d..b8a8633d694 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -43,9 +43,10 @@ class WebsiteUiTest(unittest.TestCase): class WebsiteUiSuite(unittest.TestSuite): # timeout in seconds - def __init__(self, testfile, timeout=10.0): - self.testfile = testfile - self.timeout = timeout + def __init__(self, testfile, options, timeout=10.0): + self._testfile = testfile + self._timeout = timeout + self._options = options self._test = None def __iter__(self): @@ -71,26 +72,24 @@ class WebsiteUiSuite(unittest.TestSuite): del result._exc_info_to_string def _run(self, result): - self._test = WebsiteUiTest(self.testfile) - self.start_time = time.time() + self._test = WebsiteUiTest(self._testfile) + start_time = time.time() last_check_time = time.time() - phantomOptions = json.dumps({ - 'timeout': self.timeout, - 'port': tools.config['xmlrpc_port'] - }) + self._options['timeout'] = self._timeout + self._options['port'] = tools.config['xmlrpc_port'] phantom = subprocess.Popen([ 'phantomjs', - os.path.join(ROOT, self.testfile), - phantomOptions + os.path.join(ROOT, self._testfile), + json.dumps(self._options) ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) proc_stdout = LineReader(phantom.stdout.fileno()) readable = [proc_stdout] try: - while phantom.poll() is None and readable and last_check_time < self.start_time + self.timeout: + while phantom.poll() is None and readable and last_check_time < start_time + self._timeout: ready, _, _ = select.select(readable, [], [], 0.1) if not ready: last_check_time = time.time() @@ -105,8 +104,8 @@ class WebsiteUiSuite(unittest.TestSuite): # the runner expects only one output line # any subsequent line is ignored readable.remove(stream) - if last_check_time >= (self.start_time + self.timeout): - result.addError(self._test, "Timeout after %s s" % (last_check_time - self.start_time )) + if last_check_time >= (start_time + self._timeout): + result.addError(self._test, "Timeout after %s s" % (last_check_time - start_time )) finally: # kill phantomjs if phantom.exit() wasn't called in the test if phantom.poll() is None: @@ -139,6 +138,6 @@ class WebsiteUiSuite(unittest.TestSuite): result.addError(self._test, 'Unexpected message: "%s"' % line) def load_tests(loader, base, _): - base.addTest(WebsiteUiSuite('dummy_test.js')) - base.addTest(WebsiteUiSuite('banner_tour_test.js')) + base.addTest(WebsiteUiSuite('dummy_test.js', {})) + base.addTest(WebsiteUiSuite('banner_tour_test.js', { 'path': '/web#action=website.action_website_homepage&login=admin&password=admin' })) return base \ No newline at end of file diff --git a/addons/website/tests/ui_suite/banner_tour_test.js b/addons/website/tests/ui_suite/banner_tour_test.js index 5b9a6364b99..0d22d05629a 100644 --- a/addons/website/tests/ui_suite/banner_tour_test.js +++ b/addons/website/tests/ui_suite/banner_tour_test.js @@ -1,62 +1,33 @@ -var options = JSON.parse(phantom.args); -var url = 'http://localhost:'+options.port+'/web#action=website.action_website_homepage&login=admin&password=admin'; +var testTemplate = require('./ui_test_template.js'); -var page = require('webpage').create(); +var waitFor = testTemplate.waitFor; -page.onError = function(message, trace) { - console.log('{ "event": "error", "message": "'+message+'"}'); - phantom.exit(1); -}; - -function waitFor(ready, callback, timeout) { - var timeoutMillis = timeout ? Math.round(timeout*1000) : 30000; - var start = new Date().getTime(); - var condition = ready(); - var interval = setInterval(function() { - if ((new Date().getTime() - start < timeoutMillis) && !condition ) { - condition = ready(); - } else { - if(!condition) { - console.log('{ "event": "error", "message": "Timeout after '+timeoutMillis+' ms" }'); - phantom.exit(1); - } else { - clearInterval(interval); - callback(); - } - } - }, 100); -}; - -page.viewportSize = { width: 1920, height: 1080 }; -page.open(url, function (status) { - if (status !== 'success') { - console.log('{ "event": "failure", "message": "'+url+' failed to load"}'); - phantom.exit(1); - } else { +function test (page) { + page.evaluate(function () { + localStorage.clear(); + }); + waitFor(function () { + return page.evaluate(function () { + return window.openerp && window.openerp.website && window.openerp.website.TestConsole && window.openerp.website.TestConsole.test('banner'); + }); + }, function () { page.evaluate(function () { - localStorage.clear(); + window.openerp.website.TestConsole.test('banner').run(true); }); waitFor(function () { return page.evaluate(function () { - return window.openerp && window.openerp.website && window.openerp.website.TestConsole && window.openerp.website.TestConsole.test('banner'); + var $edit = $('button[data-action=edit]'); + var $carousel = $('#wrap [data-snippet-id=carousel]'); + var $columns = $('#wrap [data-snippet-id=three-columns]'); + return $carousel && $carousel.length === 1 + && $columns && $columns.length === 1 + && $('button[data-action=edit]').is(":visible"); }); }, function () { - page.evaluate(function () { - window.openerp.website.TestConsole.test('banner').run(true); - }); - waitFor(function () { - return page.evaluate(function () { - var $edit = $('button[data-action=edit]'); - var $carousel = $('#wrap [data-snippet-id=carousel]'); - var $columns = $('#wrap [data-snippet-id=three-columns]'); - return $carousel && $carousel.length === 1 - && $columns && $columns.length === 1 - && $('button[data-action=edit]').is(":visible"); - }); - }, function () { - console.log('{ "event": "success" }'); - phantom.exit(); - }); + console.log('{ "event": "success" }'); + phantom.exit(); }); - } -}); \ No newline at end of file + }); +} + +testTemplate.runTest(test); \ No newline at end of file diff --git a/addons/website/tests/ui_suite/ui_test_template.js b/addons/website/tests/ui_suite/ui_test_template.js new file mode 100644 index 00000000000..db355a07570 --- /dev/null +++ b/addons/website/tests/ui_suite/ui_test_template.js @@ -0,0 +1,51 @@ + + +function waitFor(ready, callback, timeout) { + var timeoutMillis = timeout ? Math.round(timeout*1000) : 30000; + var start = new Date().getTime(); + var condition = ready(); + var interval = setInterval(function() { + if ((new Date().getTime() - start < timeoutMillis) && !condition ) { + condition = ready(); + } else { + if(!condition) { + console.log('{ "event": "error", "message": "Timeout after '+timeoutMillis+' ms" }'); + phantom.exit(1); + } else { + clearInterval(interval); + callback(); + } + } + }, 100); +}; + + + +function runTest (test) { + var options = JSON.parse(phantom.args); + var port = options.port ? ':'+options.port : ''; + var path = options.path ? options.path : ''; + var url = 'http://localhost'+port+path; + + var page = require('webpage').create(); + + page.viewportSize = { width: 1920, height: 1080 }; + page.onError = function(message, trace) { + console.log('{ "event": "error", "message": "'+message+'"}'); + phantom.exit(1); + }; + + page.open(url, function (status) { + if (status !== 'success') { + console.log('{ "event": "failure", "message": "'+url+' failed to load"}'); + phantom.exit(1); + } else { + test(page); + } + }); +} + +module.exports = { + waitFor: waitFor, + runTest: runTest +} \ No newline at end of file From 7c695446b8a1e64f76f168fbd90f633616616b65 Mon Sep 17 00:00:00 2001 From: ddm Date: Mon, 23 Dec 2013 17:57:08 +0100 Subject: [PATCH 14/15] bzr revid: ddm@openerp.com-20131223165708-3fz1mk6s9bmlvxka --- addons/website/tests/test_ui.py | 2 +- addons/website/tests/ui_suite/banner_tour_test.js | 9 +++------ addons/website/tests/ui_suite/ui_test_template.js | 7 ------- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index b8a8633d694..fbc729aefad 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -140,4 +140,4 @@ class WebsiteUiSuite(unittest.TestSuite): def load_tests(loader, base, _): base.addTest(WebsiteUiSuite('dummy_test.js', {})) base.addTest(WebsiteUiSuite('banner_tour_test.js', { 'path': '/web#action=website.action_website_homepage&login=admin&password=admin' })) - return base \ No newline at end of file + return base diff --git a/addons/website/tests/ui_suite/banner_tour_test.js b/addons/website/tests/ui_suite/banner_tour_test.js index 0d22d05629a..b8ebb079934 100644 --- a/addons/website/tests/ui_suite/banner_tour_test.js +++ b/addons/website/tests/ui_suite/banner_tour_test.js @@ -1,8 +1,7 @@ var testTemplate = require('./ui_test_template.js'); -var waitFor = testTemplate.waitFor; - -function test (page) { +testTemplate.runTest(function testBannerTour (page) { + var waitFor = testTemplate.waitFor; page.evaluate(function () { localStorage.clear(); }); @@ -28,6 +27,4 @@ function test (page) { phantom.exit(); }); }); -} - -testTemplate.runTest(test); \ No newline at end of file +}); \ No newline at end of file diff --git a/addons/website/tests/ui_suite/ui_test_template.js b/addons/website/tests/ui_suite/ui_test_template.js index db355a07570..e0af7a02307 100644 --- a/addons/website/tests/ui_suite/ui_test_template.js +++ b/addons/website/tests/ui_suite/ui_test_template.js @@ -1,5 +1,3 @@ - - function waitFor(ready, callback, timeout) { var timeoutMillis = timeout ? Math.round(timeout*1000) : 30000; var start = new Date().getTime(); @@ -19,22 +17,17 @@ function waitFor(ready, callback, timeout) { }, 100); }; - - function runTest (test) { var options = JSON.parse(phantom.args); var port = options.port ? ':'+options.port : ''; var path = options.path ? options.path : ''; var url = 'http://localhost'+port+path; - var page = require('webpage').create(); - page.viewportSize = { width: 1920, height: 1080 }; page.onError = function(message, trace) { console.log('{ "event": "error", "message": "'+message+'"}'); phantom.exit(1); }; - page.open(url, function (status) { if (status !== 'success') { console.log('{ "event": "failure", "message": "'+url+' failed to load"}'); From 123185757f51ee7e146d7295864556999d2a6938 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Mon, 23 Dec 2013 18:33:04 +0100 Subject: [PATCH 15/15] [IMP] wording bzr revid: fp@tinyerp.com-20131223173304-mvetk8b2494hup93 --- addons/website_event_track/views/website_event.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/website_event_track/views/website_event.xml b/addons/website_event_track/views/website_event.xml index 282d5fdadd9..a678414ae9c 100644 --- a/addons/website_event_track/views/website_event.xml +++ b/addons/website_event_track/views/website_event.xml @@ -39,7 +39,7 @@
-

You can click on cells to highlight your interests.

+

You can click on cells to highlight your interests.