1<?php
2/**
3 * Acceptance tests for Conflict Merger Plugin for Dokuwiki
4 *
5 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6 * @author     Daniel Calviño Sánchez <danxuliu@gmail.com>
7 */
8
9//TODO apply PageObjects pattern (http://code.google.com/p/webdriver/wiki/PageObjects)?
10class Acceptance_test extends WebTestCase {
11
12    //Button labels
13    var $editButton = 'Edit this page';
14    var $saveButton = 'Save';
15    var $cancelButton = 'Cancel';
16
17    //Text area and hidden input name
18    var $textField = 'wikitext';
19
20    //URL to the page used in the tests, including trailing & to add further parameters
21    var $basePageName;
22
23    //Browser that acts as a second user editing the pages
24    var $secondUser;
25
26    function setUp() {
27        $this->basePageName = WEB_TEST_URL . '/doku.php?id=testConflictMerger&';
28
29        $this->secondUser = &$this->createBrowser();
30
31        $this->get($this->basePageName . 'do=edit');
32        $this->setField($this->textField, "First line\n\nSecond line\n\nThird line");
33        $this->click($this->saveButton);
34    }
35
36    function tearDown() {
37        unset($this->secondUser);
38
39        $this->get($this->basePageName . 'do=edit');
40        $this->setField($this->textField, '');
41        $this->click($this->saveButton);
42    }
43
44    function assertViewPage($text) {
45        //assertText ignores new lines
46        $text = preg_replace("/\n+/", ' ', $text);
47
48        $this->assertNoText('merged');
49        $this->assertText($text);
50    }
51
52    function assertRightMergePage($textField) {
53        //assertFieldByName seems to use \r\n line ending
54        $textField = str_replace("\n", "\r\n", $textField);
55
56        $this->assertText('could be merged');
57        $this->assertFieldByName($this->textField, $textField);
58
59        //Diff table isn't checked as it is too complex
60    }
61
62    function assertWrongMergePage($textField) {
63        //assertFieldByName seems to use \r\n line ending
64        $textField = str_replace("\n", "\r\n", $textField);
65
66        $this->assertText('couldn\'t be merged');
67        $this->assertFieldByName($this->textField, $textField);
68
69        //Diff table isn't checked as it is too complex
70    }
71
72    function assertDiffEditPage($textField) {
73        //assertFieldByName seems to use \r\n line ending
74        $textField = str_replace("\n", "\r\n", $textField);
75
76        $this->assertText('Edit the page and hit Save');
77        $this->assertFieldByName($this->textField, $textField);
78    }
79
80    function testEditCancel() {
81        $this->get($this->basePageName);
82        $this->click($this->editButton);
83
84        $this->setField($this->textField, 'Some text');
85
86        $this->assertTrue($this->click($this->cancelButton));
87
88        $this->assertViewPage("First line\n\nSecond line\n\nThird line");
89    }
90
91    function testEditSave() {
92        $this->get($this->basePageName);
93        $this->click($this->editButton);
94
95        $this->setField($this->textField, 'Some text');
96
97        sleep(1);
98        $this->assertTrue($this->click($this->saveButton));
99
100        $this->assertViewPage('Some text');
101    }
102
103    function testEditSaveMergeable() {
104        $this->get($this->basePageName);
105        $this->click($this->editButton);
106
107        $this->setField($this->textField, "First line modified by user 1\n\nSecond line\n\nThird line");
108
109        $this->secondUser->get($this->basePageName . 'do=edit');
110        $this->secondUser->setField($this->textField, "First line\n\nSecond line\n\nThird line modified by user 2");
111        sleep(1);
112        $this->secondUser->click($this->saveButton);
113
114        $this->assertTrue($this->click($this->saveButton));
115
116        $this->assertRightMergePage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 2");
117    }
118
119    function testEditSaveNotMergeable() {
120        $this->get($this->basePageName);
121        $this->click($this->editButton);
122
123        $this->setField($this->textField, "First line modified by user 1\n\nSecond line\n\nThird line");
124
125        $this->secondUser->get($this->basePageName . 'do=edit');
126        $this->secondUser->setField($this->textField, "First line modified by user 2\n\nSecond line\n\nThird line modified by user 2");
127        sleep(1);
128        $this->secondUser->click($this->saveButton);
129
130        $this->assertTrue($this->click($this->saveButton));
131
132        $this->assertWrongMergePage("First line modified by user 1\n\nSecond line\n\nThird line");
133    }
134
135    function prepareRightMergePage() {
136        $this->get($this->basePageName);
137        $this->click($this->editButton);
138
139        $this->setField($this->textField, "First line modified by user 1\n\nSecond line\n\nThird line");
140
141        $this->secondUser->get($this->basePageName . 'do=edit');
142        $this->secondUser->setField($this->textField, "First line\n\nSecond line\n\nThird line modified by user 2");
143        sleep(1);
144        $this->secondUser->click($this->saveButton);
145
146        $this->click($this->saveButton);
147    }
148
149    function testRightMergeCancel() {
150        $this->prepareRightMergePage();
151
152        $this->assertTrue($this->click($this->cancelButton));
153
154        $this->assertViewPage("First line\n\nSecond line\n\nThird line modified by user 2");
155    }
156
157    function testRightMergeEdit() {
158        $this->prepareRightMergePage();
159
160        $this->assertTrue($this->click($this->editButton));
161
162        $this->assertDiffEditPage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 2");
163    }
164
165    function testRightMergeEditNewSaveMergeable() {
166        $this->prepareRightMergePage();
167
168        $this->click($this->editButton);
169
170        $this->setField($this->textField, "First line modified by user 1 again\n\nSecond line\n\nThird line modified by user 2");
171        sleep(1);
172        $this->assertTrue($this->click($this->saveButton));
173
174        $this->assertViewPage("First line modified by user 1 again\n\nSecond line\n\nThird line modified by user 2");
175    }
176
177    function testRightMergeEditNewSaveNotMergeable() {
178        $this->prepareRightMergePage();
179
180        $this->click($this->editButton);
181
182        $this->setField($this->textField, "First line modified by user 1\n\nSecond line\n\nThird line modified by user 1");
183        sleep(1);
184        $this->assertTrue($this->click($this->saveButton));
185
186        $this->assertViewPage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 1");
187    }
188
189    function testRightMergeEditMergeable() {
190        $this->prepareRightMergePage();
191
192        $this->secondUser->get($this->basePageName . 'do=edit');
193        $this->secondUser->setField($this->textField, "First line\n\nSecond line modified by user 3\n\nThird line");
194        sleep(1);
195        $this->secondUser->click($this->saveButton);
196
197        $this->assertTrue($this->click($this->editButton));
198
199        $this->assertRightMergePage("First line modified by user 1\n\nSecond line modified by user 3\n\nThird line");
200    }
201
202    function testRightMergeEditNotMergeable() {
203        $this->prepareRightMergePage();
204
205        $this->secondUser->get($this->basePageName . 'do=edit');
206        $this->secondUser->setField($this->textField, "First line modified by user 3\n\nSecond line\n\nThird line");
207        sleep(1);
208        $this->secondUser->click($this->saveButton);
209
210        $this->assertTrue($this->click($this->editButton));
211
212        $this->assertWrongMergePage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 2");
213    }
214
215    function testRightMergeSave() {
216        $this->prepareRightMergePage();
217
218        sleep(1);
219        $this->assertTrue($this->click($this->saveButton));
220
221        $this->assertViewPage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 2");
222    }
223
224    function testRightMergeSaveMergeable() {
225        $this->prepareRightMergePage();
226
227        $this->secondUser->get($this->basePageName . 'do=edit');
228        $this->secondUser->setField($this->textField, "First line\n\nSecond line\n\nThird line modified by user 3");
229        sleep(1);
230        $this->secondUser->click($this->saveButton);
231
232        $this->assertTrue($this->click($this->saveButton));
233
234        $this->assertRightMergePage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 3");
235    }
236
237    function testRightMergeSaveNotMergeable() {
238        $this->prepareRightMergePage();
239
240        $this->secondUser->get($this->basePageName . 'do=edit');
241        $this->secondUser->setField($this->textField, "First line modified by user 3\n\nSecond line\n\nThird line modified by user 2");
242        sleep(1);
243        $this->secondUser->click($this->saveButton);
244
245        $this->assertTrue($this->click($this->saveButton));
246
247        $this->assertWrongMergePage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 2");
248    }
249
250    function prepareWrongMergePage() {
251        $this->get($this->basePageName);
252        $this->click($this->editButton);
253
254        $this->setField($this->textField, "First line modified by user 1\n\nSecond line\n\nThird line");
255
256        $this->secondUser->get($this->basePageName . 'do=edit');
257        $this->secondUser->setField($this->textField, "First line modified by user 2\n\nSecond line\n\nThird line");
258        sleep(1);
259        $this->secondUser->click($this->saveButton);
260
261        $this->click($this->saveButton);
262    }
263
264    function testWrongMergeCancel() {
265        $this->prepareWrongMergePage();
266
267        $this->assertTrue($this->click($this->cancelButton));
268
269        $this->assertViewPage("First line modified by user 2\n\nSecond line\n\nThird line");
270    }
271
272    function testWrongMergeEdit() {
273        $this->prepareWrongMergePage();
274
275        $this->assertTrue($this->click($this->editButton));
276
277        $this->assertDiffEditPage("First line modified by user 1\n\nSecond line\n\nThird line");
278    }
279
280    function testWrongMergeEditNewSaveMergeable() {
281        $this->prepareWrongMergePage();
282
283        $this->click($this->editButton);
284
285        $this->setField($this->textField, "First line modified by user 2\n\nSecond line\n\nThird line modified by user 1");
286        sleep(1);
287        $this->assertTrue($this->click($this->saveButton));
288
289        $this->assertRightMergePage("First line modified by user 2\n\nSecond line\n\nThird line modified by user 1");
290    }
291
292    function testWrongMergeEditNewSaveNotMergeable() {
293        $this->prepareWrongMergePage();
294
295        $this->click($this->editButton);
296
297        $this->setField($this->textField, "First line modified by user 1\n\nSecond line\n\nThird line modified by user 1");
298        sleep(1);
299        $this->assertTrue($this->click($this->saveButton));
300
301        $this->assertWrongMergePage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 1");
302    }
303
304    function testWrongMergeEditMergeable() {
305        $this->prepareWrongMergePage();
306
307        $this->secondUser->get($this->basePageName . 'do=edit');
308        $this->secondUser->setField($this->textField, "First line\n\nSecond line modified by user 3\n\nThird line");
309        sleep(1);
310        $this->secondUser->click($this->saveButton);
311
312        $this->assertTrue($this->click($this->editButton));
313
314        $this->assertRightMergePage("First line modified by user 1\n\nSecond line modified by user 3\n\nThird line");
315    }
316
317    function testWrongMergeEditNotMergeable() {
318        $this->prepareWrongMergePage();
319
320        $this->secondUser->get($this->basePageName . 'do=edit');
321        $this->secondUser->setField($this->textField, "First line modified by user 3\n\nSecond line\n\nThird line");
322        sleep(1);
323        $this->secondUser->click($this->saveButton);
324
325        $this->assertTrue($this->click($this->editButton));
326
327        $this->assertWrongMergePage("First line modified by user 1\n\nSecond line\n\nThird line");
328    }
329
330    function testWrongMergeSave() {
331        $this->prepareWrongMergePage();
332
333        sleep(1);
334        $this->assertTrue($this->click($this->saveButton));
335
336        $this->assertViewPage("First line modified by user 1\n\nSecond line\n\nThird line");
337    }
338
339    function testWrongMergeSaveMergeable() {
340        $this->prepareWrongMergePage();
341
342        $this->secondUser->get($this->basePageName . 'do=edit');
343        $this->secondUser->setField($this->textField, "First line\n\nSecond line\n\nThird line modified by user 3");
344        sleep(1);
345        $this->secondUser->click($this->saveButton);
346
347        $this->assertTrue($this->click($this->saveButton));
348
349        $this->assertRightMergePage("First line modified by user 1\n\nSecond line\n\nThird line modified by user 3");
350    }
351
352    function testWrongMergeSaveNotMergeable() {
353        $this->prepareWrongMergePage();
354
355        $this->secondUser->get($this->basePageName . 'do=edit');
356        $this->secondUser->setField($this->textField, "First line modified by user 3\n\nSecond line\n\nThird line modified by user 3");
357        sleep(1);
358        $this->secondUser->click($this->saveButton);
359
360        $this->assertTrue($this->click($this->saveButton));
361
362        $this->assertWrongMergePage("First line modified by user 1\n\nSecond line\n\nThird line");
363    }
364
365    //FIXME Tests for failed merges when diff3 isn't found, how to do it?
366}
367
368?>
369