From 1c2b769a1fc3e978ded0211af8a119b4a24c35f3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 18 Feb 2013 16:06:04 +0100 Subject: [PATCH] [IMP] final section of the module guide bzr revid: xmo@openerp.com-20130218150604-pjd9lkmc834tmbiz --- addons/web/doc/module.rst | 43 +++++++++++++++++++++++++++- addons/web/doc/module/26 | 14 +++++++-- addons/web/doc/module/27 | 28 ++++++++++++++++++ addons/web/doc/module/28 | 13 +++++++++ addons/web/doc/module/29 | 37 ++++++++++++++++++++++++ addons/web/doc/module/series | 3 ++ addons/web/doc/module/testing_1.png | Bin 0 -> 36183 bytes addons/web/doc/testing.rst | 2 ++ 8 files changed, 136 insertions(+), 4 deletions(-) create mode 100644 addons/web/doc/module/27 create mode 100644 addons/web/doc/module/28 create mode 100644 addons/web/doc/module/29 create mode 100644 addons/web/doc/module/testing_1.png diff --git a/addons/web/doc/module.rst b/addons/web/doc/module.rst index 138a8e91a4c..7971a919780 100644 --- a/addons/web/doc/module.rst +++ b/addons/web/doc/module.rst @@ -385,12 +385,53 @@ which for us means going to query the user's times. We don't have any records to get in our test, and we don't want to test the initialization yet! So let's cheat a bit: we can manually -:js:func:`set a widget's DOM `, let's create a basic DOM matching what each method expects then call the method: .. patch:: +The next group of patches (in terms of setup/complexity) is RPC tests: +testing components/methods which perform network calls (RPC +requests). In our module, ``start`` and ``watch_stop`` are in that +case: ``start`` fetches the user's recorded times and ``watch_stop`` +creates a new record with the current watch. + +By default, tests don't allow RPC requests and will generate an error +when trying to perform one: + +.. image:: module/testing_1.png + :align: center + +To allow them, the test case (or the test suite) has to explicitly opt +into :js:attr:`rpc support ` by adding the ``rpc: +'mock'`` option to the test case, and providing its own "rpc +responses": + +.. patch:: + +.. note:: + + By defaut, tests cases don't load templates either. We had not + needed to perform any template rendering before here, so we must + now enable templates loading via :js:attr:`the corresponding + option `. + +Our final test requires altering the module's code: asynchronous tests +use :doc:`deferred ` to know when a test ends and the other +one can start (otherwise test content will execute non-linearly and +the assertions of a test will be executed during the next test or +worse), but although ``watch_stop`` performs an asynchronous +``create`` operation it doesn't return a deferred we can synchronize +on. We simply need to return its result: + +.. patch:: + +This makes no difference to the original code, but allows us to write +our test: + +.. patch:: + .. [#DOM-building] they are not alternative solutions: they work very well together. Templates are used to build "just DOM", sub-widgets are used to build DOM subsections diff --git a/addons/web/doc/module/26 b/addons/web/doc/module/26 index 4085350db24..ec0b345a908 100644 --- a/addons/web/doc/module/26 +++ b/addons/web/doc/module/26 @@ -2,7 +2,7 @@ Index: web_example/static/src/tests/timer.js =================================================================== --- web_example.orig/static/src/tests/timer.js +++ web_example/static/src/tests/timer.js -@@ -42,4 +42,25 @@ openerp.testing.section('timer', functio +@@ -42,4 +42,33 @@ openerp.testing.section('timer', functio w.format_time(84092336), '23:21:32'); }); @@ -18,13 +18,21 @@ Index: web_example/static/src/tests/timer.js + w.update_counter(22733958); + // And check the DOM matches + strictEqual($fixture.text(), '06:18:53'); -+ ++ + w.update_counter(73451828) + strictEqual($fixture.text(), '20:24:11'); + }); + test('display_record', function (instance, $fixture) { + var w = new instance.web_example.Action(); + $fixture.append('
    ') -+ ok(false, "test display records"); ++ w.setElement($fixture); ++ ++ w.display_record({time: 41676639}); ++ w.display_record({time: 84092336}); ++ ++ var $lis = $fixture.find('li'); ++ strictEqual($lis.length, 2, "should have printed 2 records"); ++ strictEqual($lis[0].textContent, '11:34:36'); ++ strictEqual($lis[1].textContent, '23:21:32'); + }); }); diff --git a/addons/web/doc/module/27 b/addons/web/doc/module/27 new file mode 100644 index 00000000000..2061b7007e6 --- /dev/null +++ b/addons/web/doc/module/27 @@ -0,0 +1,28 @@ +Index: web_example/static/src/tests/timer.js +=================================================================== +--- web_example.orig/static/src/tests/timer.js ++++ web_example/static/src/tests/timer.js +@@ -71,4 +71,23 @@ openerp.testing.section('timer', functio + strictEqual($lis[0].textContent, '11:34:36'); + strictEqual($lis[1].textContent, '23:21:32'); + }); ++ test('start', {templates: true, rpc: 'mock', asserts: 3}, function (instance, $fixture, mock) { ++ // Rather odd-looking shortcut for search+read in a single RPC call ++ mock('/web/dataset/search_read', function () { ++ // ignore parameters, just return a pair of records. ++ return {records: [ ++ {time: 22733958}, ++ {time: 84092336} ++ ]}; ++ }); ++ ++ var w = new instance.web_example.Action(); ++ return w.appendTo($fixture) ++ .then(function () { ++ var $lis = $fixture.find('li'); ++ strictEqual($lis.length, 2); ++ strictEqual($lis[0].textContent, '06:18:53'); ++ strictEqual($lis[1].textContent, '23:21:32'); ++ }); ++ }); + }); diff --git a/addons/web/doc/module/28 b/addons/web/doc/module/28 new file mode 100644 index 00000000000..800e7a6f084 --- /dev/null +++ b/addons/web/doc/module/28 @@ -0,0 +1,13 @@ +Index: web_example/static/src/js/first_module.js +=================================================================== +--- web_example.orig/static/src/js/first_module.js ++++ web_example/static/src/js/first_module.js +@@ -66,7 +66,7 @@ openerp.web_example = function (instance + user_id: instance.session.uid, + time: time, + }; +- this.model.call('create', [record]).done(function () { ++ return this.model.call('create', [record]).done(function () { + self.display_record(record); + }); + }, diff --git a/addons/web/doc/module/29 b/addons/web/doc/module/29 new file mode 100644 index 00000000000..509d4b78662 --- /dev/null +++ b/addons/web/doc/module/29 @@ -0,0 +1,37 @@ +Index: web_example/static/src/tests/timer.js +=================================================================== +--- web_example.orig/static/src/tests/timer.js ++++ web_example/static/src/tests/timer.js +@@ -90,4 +90,32 @@ openerp.testing.section('timer', functio + strictEqual($lis[1].textContent, '23:21:32'); + }); + }); ++ test('watch_stop', {templates: true, rpc: 'mock', asserts: 3}, function (instance, $fix, mock) { ++ var created = false; ++ mock('web_example.stopwatch:create', function (args, kwargs) { ++ created = true; ++ // return a fake id (unused) ++ return 42; ++ }); ++ mock('/web/dataset/search_read', function () { ++ return {records: []}; ++ }); ++ ++ var w = new instance.web_example.Action(); ++ return w.appendTo($fix) ++ .then(function () { ++ // Virtual start point 5s before 'now' ++ w._start = new Date() - 5000; ++ return w.watch_stop(); ++ }) ++ .done(function () { ++ ok(created, "should have called create()"); ++ strictEqual($fix.find('.oe_web_example_timer').text(), ++ '00:00:05', ++ "should have updated the timer"); ++ strictEqual($fix.find('li')[0].textContent, ++ '00:00:05', ++ "should have added the new time to the list"); ++ }); ++ }); + }); diff --git a/addons/web/doc/module/series b/addons/web/doc/module/series index 491e7dc3c59..ff1a909a6af 100644 --- a/addons/web/doc/module/series +++ b/addons/web/doc/module/series @@ -22,3 +22,6 @@ 24 25 26 +27 +28 +29 diff --git a/addons/web/doc/module/testing_1.png b/addons/web/doc/module/testing_1.png new file mode 100644 index 0000000000000000000000000000000000000000..40cf32497eb0403f11b4b2bd827af9d7bd1ed883 GIT binary patch literal 36183 zcma&N1x#f@(>BO3xVyvP?(T4bK?k_FySuv$?hNkk4uiY9ySux)F7v+m^6&1KP4-D{ zQe9nLZPm}IzBwlpC?f_Bg98Hs0s=1~E+P*C0%`#Q@=X*9^h?unCp!QF5=kH-0#I~a zIm-Z8+>BuiW-&~?zk_;%HYQn)dvKhHt{1~XGi=aG3bvu;fQ6yuhtz=wLP=_%5ktVe zpfF)otD@-yc;|XpkzZp;o20tuJh>8hhZh};adO2zdl*mP`MfWFJT6*ZR|$OH{_z=L z=Ft3eCwq7!rpYDvR{;!qgkkMf zPW)iP{#OBtn(|*wwjc37i~ncAl(ES*S=I_FqdgD#%eCSZ zLszJZq>hi)_=mTP8t%g0U+UoQGm2q8xVr0nj$Foh*1$ZClU`$~X0#fev*t2HbHoJ7 z$LB8n{iJI}T*RBU$$8V}JTFbQ%D|`X`Dox}3JdcAEPIKDQ|_NvF8=CMp%il$-h$>R z#>|G(oBm}1-G2jv_)Wu)O_+YUusWhy36M;h6*@Syd97(B+|9Wzwb!Y|GrPC_or&op z|9}c!fwaiBFYN!czH|&wkqowS7_sE}>S6g{wXkeniT3G`260;(3yx&!N?e}fB!98O z!Q``#80uz~no>o6ec9ndl}hZX3AL#&-@?eWIjJ&MpfdY*T>O`ogkgRiAsK>rct6x+ z_1LK7qf?nVbNgYPVuu&ICgRvldZ!Gp`VR=vMth`%q`C@bwTvr3Z|X6!3dZul;1Fh@ zs_o@<&j8njm(>T!!4FGmFI;UHeIZ91HQGXOBHKgDVSz^q3_$dzBH;NZS4! zJjOpS9BOSvM^=r^08q~-xg(0e1|xAxHQPnYSHG5Qtbjg>nweHiORbfT`K*MXW{Ask z52sjT9vCp_jlfCrK9v4*N6y@A8&+^5A45&**qAff&iEliFMS{uWBvBBzzmdMdafUa zhm50AZfd`c#FTM^kRf#=dxde}ufOay;8?0I8VOS$j#PXE$@iIMePicV?o>n44*P6r zi;_J|Fp}YIfZL^q#seOv?AE_p7zlT}?L-AL&e7)PN|!E4e=sZLGR`Ug_)Rc8pVf00 zG`&-T8~q80Zt>1k-HQ#sH%E&l%}mtR=1U5BEQY_Put5gnA_5NtTH0m2jc8M)bTle7 zkJ?Ww&8Ox*l-IMUm_PDZ6(n&C+Oy*DQkyR(NW>+(dDLnbjV~w&v;8_uNZ?^twcyhR z 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 ^Dqp6?hWlIa;Rb)nA&28sO~dv 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 DeqCyV literal 0 HcmV?d00001 diff --git a/addons/web/doc/testing.rst b/addons/web/doc/testing.rst index 600d379aa02..7ecf64288e1 100644 --- a/addons/web/doc/testing.rst +++ b/addons/web/doc/testing.rst @@ -327,6 +327,8 @@ a test case (or its containing test suite) through :js:attr:`~TestOptions.rpc`, and can be one of two modes: ``mock`` or ``rpc``. +.. _testing-rpc-mock: + Mock RPC ++++++++