|
1 // Test helpers for karma-e2e-dsl environment |
|
2 // |
|
3 // https://github.com/winsonwq/karma-e2e-dsl |
|
4 |
|
5 |
|
6 exports.page_loading = function (url, title) { |
|
7 test (url+' loads', dsl(function () { |
|
8 // here we are in Karma page |
|
9 browser.navigateTo (url); |
|
10 expect (element ('title').text ()).toMatch (new RegExp (title,'m')); |
|
11 // The same test agin vaniller javascript |
|
12 element ('title').text (function (page_title) { |
|
13 // here we got a value from the test iframe |
|
14 // to display the tested value : console.log (page_title); |
|
15 if (!(new RegExp (title, 'm').test (page_title))) throw 'got page '+page_title+' instead'; |
|
16 }); |
|
17 })); |
|
18 } |
|
19 |
|
20 /** Test if it's possible to change lang to the specified : |
|
21 * c : lang code |
|
22 * l : help label |
|
23 */ |
|
24 exports.i18n = function (c, l) { |
|
25 test ('to '+c, dsl(function () { |
|
26 element ('#footer a[href="/i18n/setlang/'+c+'/"]').click (); |
|
27 browser.navigateTo ('/'); |
|
28 expect (test_.elt ('#footer a[href="/help/"]').text ()).toMatch (new RegExp (l, 'm')); |
|
29 })); |
|
30 } |
|
31 |
|
32 /** Test if the selected DOM element is defined or has a given value : .val() |
|
33 * s : CSS selector |
|
34 * e : expected value, if omited, test existence |
|
35 */ |
|
36 exports.val = function (s, e) { |
|
37 e = typeof e == 'undefined' ? '' : e; // .val() returns defined ? '' : undefined; // if no value |
|
38 test (s+' is '+e, dsl(function () { |
|
39 expect (test_.elt (s).val ()).toMatch (new RegExp (e, 'm')); |
|
40 })); |
|
41 } |
|
42 |
|
43 exports.exist = function (s) { |
|
44 test_.val (s); |
|
45 } |
|
46 |
|
47 /** Test if the selected DOM element has the given text : .text() |
|
48 * s : CSS selector |
|
49 * e : expected value |
|
50 * v : should we test a visible value ? |
|
51 */ |
|
52 exports.text = function (s, e, v) { |
|
53 v = typeof v == 'undefined' ? true : v; |
|
54 test (s+' has text '+e, dsl(function () { |
|
55 expect (test_.elt (s, v).text ()).toBe (e); |
|
56 })); |
|
57 } |
|
58 |
|
59 /** Test if the selected DOM element .text() value match the given regexp |
|
60 * s : CSS selector |
|
61 * r : regexp to match |
|
62 */ |
|
63 exports.match = function (s, r) { |
|
64 test (s+' text match '+r, dsl(function () { |
|
65 expect (test_.elt (s).text ()).toMatch (r); |
|
66 })); |
|
67 } |
|
68 |
|
69 /** Count selector occurences |
|
70 * s : CSS selector |
|
71 * e : expected count |
|
72 */ |
|
73 exports.count = function (s, e) { |
|
74 test (s+' count is '+e, dsl(function () { |
|
75 expect (test_.elt (s).count ()).toBe (e); |
|
76 })); |
|
77 } |
|
78 |
|
79 /** Test Django form field presence |
|
80 */ |
|
81 exports.field = function (form_id, field_id, type, position, label, mandatory) { |
|
82 test ('has a '+label+' form field', dsl(function () { |
|
83 var s = ''; |
|
84 |
|
85 switch (type) { |
|
86 case 'textarea':s = 'textarea#'+field_id; break; |
|
87 case 'select': s = 'select#'+field_id; break; |
|
88 default: s = 'input#'+field_id+'[type="'+type+'"]'; |
|
89 } |
|
90 |
|
91 expect (test_.elt (s).val ()).toBeDefined (); |
|
92 expect (test_.elt ('#'+form_id+' :input:eq('+position+')#'+field_id).val ()).toBeDefined (); |
|
93 expect (test_.elt ('label[for='+field_id+']').text ()).toBe (label); |
|
94 |
|
95 if (mandatory) |
|
96 expect (test_.elt ('label[for='+field_id+'] + span.required_star').val ()).toBeDefined (); |
|
97 })); |
|
98 } |
|
99 |
|
100 /** |
|
101 * Fill form field |
|
102 * s : form field id |
|
103 * v : array containing the value to use |
|
104 */ |
|
105 exports.fill_field = function (s, v) { |
|
106 test ('set '+s, dsl(function () { |
|
107 input (s).enter (v[s]); |
|
108 })); |
|
109 } |
|
110 |
|
111 /** |
|
112 * Submit a form |
|
113 * s : selector of the submit button |
|
114 */ |
|
115 exports.submit = function (s) { |
|
116 test ('submit '+s, dsl(function () { |
|
117 test_.elt (s).click (); |
|
118 browser.waitForPageLoad (); |
|
119 })); |
|
120 } |
|
121 |
|
122 /** |
|
123 * Fails a test |
|
124 */ |
|
125 exports.fail = function () { |
|
126 test ('must fail', dsl(function () { |
|
127 throw 'have been programmed to fail now'; |
|
128 })); |
|
129 } |
|
130 |
|
131 /** |
|
132 * Inbrowser debugger statement |
|
133 */ |
|
134 exports.debug = function () { |
|
135 test ('debugger', dsl(function (){ |
|
136 debugger; // not seen to work |
|
137 })); |
|
138 } |
|
139 |
|
140 /** |
|
141 * Have the browser waiting |
|
142 */ |
|
143 exports.pause = function () { |
|
144 test ('pause', dsl(function () { |
|
145 browser.pause (); |
|
146 })); |
|
147 } |
|
148 |
|
149 /** |
|
150 * Start back the testcases |
|
151 */ |
|
152 exports.resume = function () { |
|
153 test ('resume', dsl(function (){ |
|
154 browser.resume (); |
|
155 })); |
|
156 } |
|
157 |
|
158 /** Ensure the given element is visible |
|
159 * s : CSS selector of the DOM element to check |
|
160 * v : should the element being visible |
|
161 */ |
|
162 exports.elt = function (s, v) { |
|
163 return element (s + (v ? ':visible' : '')); |
|
164 } |
|
165 |
|
166 /** Revive functions after a JSON.stringify which prevented their disappearence |
|
167 * k : key in the object to revive functions in |
|
168 * v : value |
|
169 * |
|
170 * We keep only the string of the body part in order to use it to define a new function in tests files |
|
171 * /!\ do NEVER minify this code ! /!\ |
|
172 * |
|
173 */ |
|
174 exports.reviveFunc = multilineString (function (k, v) { |
|
175 /*! if (v && typeof v === 'string' && v.substr (0, 8) == 'function') { |
|
176 var a = v.indexOf ('{') + 1, // start function body |
|
177 b = v.lastIndexOf ('}'), |
|
178 c = v.indexOf ('(') + 1, // start args |
|
179 d = v.indexOf (')'); |
|
180 return new Function (v.substring (c, d), v.substring (a, b)); |
|
181 } |
|
182 |
|
183 return v;*/ |
|
184 }); |
|
185 |
|
186 function multilineString (f) { return f.toString().replace(/^[^\/]+\/\*!?/, '').replace(/\*\/[^\/]+$/, ''); } |