Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 652
0.00% covered (danger)
0.00%
0 / 14
CRAP
0.00% covered (danger)
0.00%
0 / 1
phpbb_functional_visibility_softdelete_test
0.00% covered (danger)
0.00%
0 / 652
0.00% covered (danger)
0.00%
0 / 14
600
0.00% covered (danger)
0.00%
0 / 1
 test_setup_forums
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 1
2
 test_create_post
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 1
2
 test_softdelete_post
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
2
 test_softdelete_post_no_m_delete
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
2
 test_move_softdeleted_post
0.00% covered (danger)
0.00%
0 / 61
0.00% covered (danger)
0.00%
0 / 1
2
 test_softdelete_topic
0.00% covered (danger)
0.00%
0 / 61
0.00% covered (danger)
0.00%
0 / 1
2
 test_move_softdeleted_topic
0.00% covered (danger)
0.00%
0 / 61
0.00% covered (danger)
0.00%
0 / 1
2
 test_restore_post
0.00% covered (danger)
0.00%
0 / 62
0.00% covered (danger)
0.00%
0 / 1
2
 test_split_topic
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 1
6
 test_move_topic_back
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
2
 test_merge_topics
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 1
2
 test_fork_topic
0.00% covered (danger)
0.00%
0 / 58
0.00% covered (danger)
0.00%
0 / 1
2
 assert_forum_details
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 load_ids
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2/**
3*
4* This file is part of the phpBB Forum Software package.
5*
6* @copyright (c) phpBB Limited <https://www.phpbb.com>
7* @license GNU General Public License, version 2 (GPL-2.0)
8*
9* For full copyright and license information, please see
10* the docs/CREDITS.txt file.
11*
12*/
13
14/**
15* @group functional
16*/
17class phpbb_functional_visibility_softdelete_test extends phpbb_functional_test_case
18{
19    protected $data = array();
20
21    public function test_setup_forums()
22    {
23        $this->login();
24        $this->admin_login();
25
26        $crawler = self::request('GET', "adm/index.php?i=acp_forums&mode=manage&sid={$this->sid}");
27        $form = $crawler->selectButton('addforum')->form(array(
28            'forum_name'    => 'Soft Delete #1',
29        ));
30        $crawler = self::submit($form);
31        $form = $crawler->selectButton('update')->form(array(
32            'forum_perm_from'    => 2,
33        ));
34        $crawler = self::submit($form);
35
36        $crawler = self::request('GET', "adm/index.php?i=acp_forums&mode=manage&sid={$this->sid}");
37        $form = $crawler->selectButton('addforum')->form(array(
38            'forum_name'    => 'Soft Delete #2',
39        ));
40        $crawler = self::submit($form);
41        $form = $crawler->selectButton('update')->form(array(
42            'forum_perm_from'    => 2,
43        ));
44        $crawler = self::submit($form);
45
46        // Create second user which does not have m_delete permission
47        $this->add_lang('acp/permissions');
48
49        $second_user = $this->create_user('no m_delete moderator');
50        $this->add_user_group("GLOBAL_MODERATORS", 'no m_delete moderator', true);
51
52        // Set m_delete to never
53        $crawler = self::request('GET', "adm/index.php?i=acp_permissions&icat=16&mode=setting_user_global&user_id[0]=$second_user&type=m_&sid={$this->sid}");
54        $form = $crawler->selectButton($this->lang('APPLY_PERMISSIONS'))->form();
55        $data = array("setting[$second_user][0][m_delete]" => ACL_NEVER);
56        $form->setValues($data);
57        $crawler = self::submit($form);
58    }
59
60    public function test_create_post()
61    {
62        $this->login();
63        $this->load_ids(array(
64            'forums' => array(
65                'Soft Delete #1',
66                'Soft Delete #2',
67            ),
68        ));
69
70        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
71            'forum_posts_approved'        => 0,
72            'forum_posts_unapproved'    => 0,
73            'forum_posts_softdeleted'    => 0,
74            'forum_topics_approved'        => 0,
75            'forum_topics_unapproved'    => 0,
76            'forum_topics_softdeleted'    => 0,
77            'forum_last_post_id'        => 0,
78        ), 'initial comparison');
79
80        // Test creating topic
81        $post = $this->create_topic($this->data['forums']['Soft Delete #1'], 'Soft Delete Topic #1', 'This is a test topic posted by the testing framework.');
82        $crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}");
83
84        $this->assertStringContainsString('Soft Delete Topic #1', $crawler->filter('html')->text());
85        $this->data['topics']['Soft Delete Topic #1'] = (int) $post['topic_id'];
86        $this->data['posts']['Soft Delete Topic #1'] = (int) $this->get_parameter_from_link($crawler->filter('.post')->selectLink($this->lang('POST', '', ''))->link()->getUri(), 'p');
87
88        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
89            'forum_posts_approved'        => 1,
90            'forum_posts_unapproved'    => 0,
91            'forum_posts_softdeleted'    => 0,
92            'forum_topics_approved'        => 1,
93            'forum_topics_unapproved'    => 0,
94            'forum_topics_softdeleted'    => 0,
95            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
96        ), 'after creating topic #1');
97
98        // Test creating a reply
99        $post2 = $this->create_post($this->data['forums']['Soft Delete #1'], $post['topic_id'], 'Re: Soft Delete Topic #1-#2', 'This is a test post posted by the testing framework.');
100        $crawler = self::request('GET', "viewtopic.php?p={$post2['post_id']}&sid={$this->sid}");
101
102        $this->assertStringContainsString('Re: Soft Delete Topic #1-#2', $crawler->filter('html')->text());
103        $this->data['posts']['Re: Soft Delete Topic #1-#2'] = (int) $post2['post_id'];
104
105        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
106            'forum_posts_approved'        => 2,
107            'forum_posts_unapproved'    => 0,
108            'forum_posts_softdeleted'    => 0,
109            'forum_topics_approved'        => 1,
110            'forum_topics_unapproved'    => 0,
111            'forum_topics_softdeleted'    => 0,
112            'forum_last_post_id'        => $this->data['posts']['Re: Soft Delete Topic #1-#2'],
113        ), 'after replying');
114
115        // Test creating another reply
116        $post3 = $this->create_post($this->data['forums']['Soft Delete #1'], $post['topic_id'], 'Re: Soft Delete Topic #1-#3', 'This is another test post posted by the testing framework.');
117        $crawler = self::request('GET', "viewtopic.php?p={$post3['post_id']}&sid={$this->sid}");
118
119        $this->assertStringContainsString('Re: Soft Delete Topic #1-#3', $crawler->filter('html')->text());
120        $this->data['posts']['Re: Soft Delete Topic #1-#3'] = (int) $post3['post_id'];
121
122        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
123            'forum_posts_approved'        => 3,
124            'forum_posts_unapproved'    => 0,
125            'forum_posts_softdeleted'    => 0,
126            'forum_topics_approved'        => 1,
127            'forum_topics_unapproved'    => 0,
128            'forum_topics_softdeleted'    => 0,
129            'forum_last_post_id'        => $this->data['posts']['Re: Soft Delete Topic #1-#3'],
130        ), 'after replying a second time');
131    }
132
133    public function test_softdelete_post()
134    {
135        $this->login();
136        $this->load_ids(array(
137            'forums' => array(
138                'Soft Delete #1',
139                'Soft Delete #2',
140            ),
141            'topics' => array(
142                'Soft Delete Topic #1',
143            ),
144            'posts' => array(
145                'Soft Delete Topic #1',
146                'Re: Soft Delete Topic #1-#2',
147                'Re: Soft Delete Topic #1-#3',
148            ),
149        ));
150
151        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
152            'forum_posts_approved'        => 3,
153            'forum_posts_unapproved'    => 0,
154            'forum_posts_softdeleted'    => 0,
155            'forum_topics_approved'        => 1,
156            'forum_topics_unapproved'    => 0,
157            'forum_topics_softdeleted'    => 0,
158            'forum_last_post_id'        => $this->data['posts']['Re: Soft Delete Topic #1-#3'],
159        ), 'before softdelete');
160
161        $this->add_lang('posting');
162        $crawler = self::request('GET', "posting.php?mode=delete&f={$this->data['forums']['Soft Delete #1']}&p={$this->data['posts']['Re: Soft Delete Topic #1-#3']}&sid={$this->sid}");
163        $this->assertContainsLang('DELETE_PERMANENTLY', $crawler->text());
164
165        $form = $crawler->selectButton('Yes')->form();
166        $crawler = self::submit($form);
167        $this->assertContainsLang('POST_DELETED', $crawler->text());
168
169        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
170            'forum_posts_approved'        => 2,
171            'forum_posts_unapproved'    => 0,
172            'forum_posts_softdeleted'    => 1,
173            'forum_topics_approved'        => 1,
174            'forum_topics_unapproved'    => 0,
175            'forum_topics_softdeleted'    => 0,
176            'forum_last_post_id'        => $this->data['posts']['Re: Soft Delete Topic #1-#2'],
177        ), 'after softdelete');
178
179        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
180        $this->assertStringContainsString($this->lang('POST_DISPLAY'), $crawler->text());
181    }
182
183    public function test_softdelete_post_no_m_delete()
184    {
185        $this->login('no m_delete moderator');
186        $this->load_ids(array(
187            'forums' => array(
188                'Soft Delete #1',
189                'Soft Delete #2',
190            ),
191            'topics' => array(
192                'Soft Delete Topic #1',
193            ),
194            'posts' => array(
195                'Soft Delete Topic #1',
196                'Re: Soft Delete Topic #1-#2',
197                'Re: Soft Delete Topic #1-#3',
198            ),
199        ));
200
201        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
202            'forum_posts_approved'        => 2,
203            'forum_posts_unapproved'    => 0,
204            'forum_posts_softdeleted'    => 1,
205            'forum_topics_approved'        => 1,
206            'forum_topics_unapproved'    => 0,
207            'forum_topics_softdeleted'    => 0,
208            'forum_last_post_id'        => $this->data['posts']['Re: Soft Delete Topic #1-#2'],
209        ), 'before softdelete without m_delete');
210
211        $this->add_lang('posting');
212        $crawler = self::request('GET', "posting.php?mode=delete&f={$this->data['forums']['Soft Delete #1']}&p={$this->data['posts']['Re: Soft Delete Topic #1-#2']}&sid={$this->sid}");
213        $this->assertNotContainsLang('DELETE_PERMANENTLY', $crawler->text());
214
215        $form = $crawler->selectButton('Yes')->form();
216        $crawler = self::submit($form);
217        $this->assertContainsLang('POST_DELETED', $crawler->text());
218
219        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
220            'forum_posts_approved'        => 1,
221            'forum_posts_unapproved'    => 0,
222            'forum_posts_softdeleted'    => 2,
223            'forum_topics_approved'        => 1,
224            'forum_topics_unapproved'    => 0,
225            'forum_topics_softdeleted'    => 0,
226            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
227        ), 'after softdelete without m_delete');
228
229        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
230        $this->assertStringContainsString($this->lang('POST_DISPLAY'), $crawler->text());
231    }
232
233    public function test_move_softdeleted_post()
234    {
235        $this->login();
236        $this->load_ids(array(
237            'forums' => array(
238                'Soft Delete #1',
239                'Soft Delete #2',
240            ),
241            'topics' => array(
242                'Soft Delete Topic #1',
243            ),
244            'posts' => array(
245                'Soft Delete Topic #1',
246                'Re: Soft Delete Topic #1-#2',
247                'Re: Soft Delete Topic #1-#3',
248            ),
249        ));
250
251        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
252            'forum_posts_approved'        => 1,
253            'forum_posts_unapproved'    => 0,
254            'forum_posts_softdeleted'    => 2,
255            'forum_topics_approved'        => 1,
256            'forum_topics_unapproved'    => 0,
257            'forum_topics_softdeleted'    => 0,
258            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
259        ), 'before moving #1');
260
261        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
262            'forum_posts_approved'        => 0,
263            'forum_posts_unapproved'    => 0,
264            'forum_posts_softdeleted'    => 0,
265            'forum_topics_approved'        => 0,
266            'forum_topics_unapproved'    => 0,
267            'forum_topics_softdeleted'    => 0,
268            'forum_last_post_id'        => 0,
269        ), 'before moving #2');
270
271        $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'MOVE_TOPIC');
272        $this->assertContainsLang('SELECT_DESTINATION_FORUM', $crawler->text());
273
274        $this->add_lang('mcp');
275        $form = $crawler->selectButton('Yes')->form();
276        $form['to_forum_id']->select($this->data['forums']['Soft Delete #2']);
277        $crawler = self::submit($form);
278        $this->assertContainsLang('TOPIC_MOVED_SUCCESS', $crawler->text());
279
280        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
281        $this->assertStringContainsString('Soft Delete #2', $crawler->filter('.navlinks')->text());
282        $this->assertStringContainsString('Soft Delete Topic #1', $crawler->filter('h2')->text());
283
284        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
285            'forum_posts_approved'        => 0,
286            'forum_posts_unapproved'    => 0,
287            'forum_posts_softdeleted'    => 0,
288            'forum_topics_approved'        => 0,
289            'forum_topics_unapproved'    => 0,
290            'forum_topics_softdeleted'    => 0,
291            'forum_last_post_id'        => 0,
292        ), 'after moving #1');
293
294        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
295            'forum_posts_approved'        => 1,
296            'forum_posts_unapproved'    => 0,
297            'forum_posts_softdeleted'    => 2,
298            'forum_topics_approved'        => 1,
299            'forum_topics_unapproved'    => 0,
300            'forum_topics_softdeleted'    => 0,
301            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
302        ), 'after moving #2');
303    }
304
305    public function test_softdelete_topic()
306    {
307        $this->login();
308        $this->load_ids(array(
309            'forums' => array(
310                'Soft Delete #1',
311                'Soft Delete #2',
312            ),
313            'topics' => array(
314                'Soft Delete Topic #1',
315            ),
316            'posts' => array(
317                'Soft Delete Topic #1',
318                'Re: Soft Delete Topic #1-#2',
319                'Re: Soft Delete Topic #1-#3'
320            ),
321        ));
322
323        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
324            'forum_posts_approved'        => 0,
325            'forum_posts_unapproved'    => 0,
326            'forum_posts_softdeleted'    => 0,
327            'forum_topics_approved'        => 0,
328            'forum_topics_unapproved'    => 0,
329            'forum_topics_softdeleted'    => 0,
330            'forum_last_post_id'        => 0,
331        ), 'before softdeleting #1');
332
333        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
334            'forum_posts_approved'        => 1,
335            'forum_posts_unapproved'    => 0,
336            'forum_posts_softdeleted'    => 2,
337            'forum_topics_approved'        => 1,
338            'forum_topics_unapproved'    => 0,
339            'forum_topics_softdeleted'    => 0,
340            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
341        ), 'before softdeleting #2');
342
343        $this->add_lang('posting');
344        $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'DELETE_TOPIC');
345        $this->assertContainsLang('DELETE_PERMANENTLY', $crawler->text());
346
347        $this->add_lang('mcp');
348        $form = $crawler->selectButton('Yes')->form();
349        $crawler = self::submit($form);
350        $this->assertContainsLang('TOPIC_DELETED_SUCCESS', $crawler->text());
351
352        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
353        $this->assertStringContainsString('Soft Delete #2', $crawler->filter('.navlinks')->text());
354        $this->assertStringContainsString('Soft Delete Topic #1', $crawler->filter('h2')->text());
355
356        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
357            'forum_posts_approved'        => 0,
358            'forum_posts_unapproved'    => 0,
359            'forum_posts_softdeleted'    => 0,
360            'forum_topics_approved'        => 0,
361            'forum_topics_unapproved'    => 0,
362            'forum_topics_softdeleted'    => 0,
363            'forum_last_post_id'        => 0,
364        ), 'after moving #1');
365
366        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
367            'forum_posts_approved'        => 0,
368            'forum_posts_unapproved'    => 0,
369            'forum_posts_softdeleted'    => 3,
370            'forum_topics_approved'        => 0,
371            'forum_topics_unapproved'    => 0,
372            'forum_topics_softdeleted'    => 1,
373            'forum_last_post_id'        => 0,
374        ), 'after moving #2');
375    }
376
377    public function test_move_softdeleted_topic()
378    {
379        $this->login();
380        $this->load_ids(array(
381            'forums' => array(
382                'Soft Delete #1',
383                'Soft Delete #2',
384            ),
385            'topics' => array(
386                'Soft Delete Topic #1',
387            ),
388            'posts' => array(
389                'Soft Delete Topic #1',
390                'Re: Soft Delete Topic #1-#2',
391                'Re: Soft Delete Topic #1-#3'
392            ),
393        ));
394
395        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
396            'forum_posts_approved'        => 0,
397            'forum_posts_unapproved'    => 0,
398            'forum_posts_softdeleted'    => 0,
399            'forum_topics_approved'        => 0,
400            'forum_topics_unapproved'    => 0,
401            'forum_topics_softdeleted'    => 0,
402            'forum_last_post_id'        => 0,
403        ), 'before moving #1');
404
405        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
406            'forum_posts_approved'        => 0,
407            'forum_posts_unapproved'    => 0,
408            'forum_posts_softdeleted'    => 3,
409            'forum_topics_approved'        => 0,
410            'forum_topics_unapproved'    => 0,
411            'forum_topics_softdeleted'    => 1,
412            'forum_last_post_id'        => 0,
413        ), 'before moving #2');
414
415        $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'MOVE_TOPIC');
416        $this->assertContainsLang('SELECT_DESTINATION_FORUM', $crawler->text());
417
418        $this->add_lang('mcp');
419        $form = $crawler->selectButton('Yes')->form();
420        $form['to_forum_id']->select($this->data['forums']['Soft Delete #1']);
421        $crawler = self::submit($form);
422        $this->assertContainsLang('TOPIC_MOVED_SUCCESS', $crawler->text());
423
424        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
425        $this->assertStringContainsString('Soft Delete #1', $crawler->filter('.navlinks')->text());
426        $this->assertStringContainsString('Soft Delete Topic #1', $crawler->filter('h2')->text());
427
428        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
429            'forum_posts_approved'        => 0,
430            'forum_posts_unapproved'    => 0,
431            'forum_posts_softdeleted'    => 3,
432            'forum_topics_approved'        => 0,
433            'forum_topics_unapproved'    => 0,
434            'forum_topics_softdeleted'    => 1,
435            'forum_last_post_id'        => 0,
436        ), 'after moving #1');
437
438        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
439            'forum_posts_approved'        => 0,
440            'forum_posts_unapproved'    => 0,
441            'forum_posts_softdeleted'    => 0,
442            'forum_topics_approved'        => 0,
443            'forum_topics_unapproved'    => 0,
444            'forum_topics_softdeleted'    => 0,
445            'forum_last_post_id'        => 0,
446        ), 'after moving #2');
447    }
448
449    public function test_restore_post()
450    {
451        $this->login();
452        $this->load_ids(array(
453            'forums' => array(
454                'Soft Delete #1',
455                'Soft Delete #2',
456            ),
457            'topics' => array(
458                'Soft Delete Topic #1',
459            ),
460            'posts' => array(
461                'Soft Delete Topic #1',
462                'Re: Soft Delete Topic #1-#2',
463                'Re: Soft Delete Topic #1-#3'
464            ),
465        ));
466
467        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
468            'forum_posts_approved'        => 0,
469            'forum_posts_unapproved'    => 0,
470            'forum_posts_softdeleted'    => 3,
471            'forum_topics_approved'        => 0,
472            'forum_topics_unapproved'    => 0,
473            'forum_topics_softdeleted'    => 1,
474            'forum_last_post_id'        => 0,
475        ), 'before restoring #1');
476
477        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
478            'forum_posts_approved'        => 0,
479            'forum_posts_unapproved'    => 0,
480            'forum_posts_softdeleted'    => 0,
481            'forum_topics_approved'        => 0,
482            'forum_topics_unapproved'    => 0,
483            'forum_topics_softdeleted'    => 0,
484            'forum_last_post_id'        => 0,
485        ), 'before restoring #2');
486
487        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
488
489        $this->add_lang('mcp');
490        $form = $crawler->filter('#p' . $this->data['posts']['Soft Delete Topic #1'])->selectButton($this->lang('RESTORE'))->form();
491        $crawler = self::submit($form);
492        $this->assertContainsLang('RESTORE_POST', $crawler->text());
493
494        $form = $crawler->selectButton('Yes')->form();
495        $crawler = self::submit($form);
496        $this->assertContainsLang('POST_RESTORED_SUCCESS', $crawler->text());
497
498        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
499        $this->assertStringContainsString('Soft Delete #1', $crawler->filter('.navlinks')->text());
500        $this->assertStringContainsString('Soft Delete Topic #1', $crawler->filter('h2')->text());
501
502        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
503            'forum_posts_approved'        => 1,
504            'forum_posts_unapproved'    => 0,
505            'forum_posts_softdeleted'    => 2,
506            'forum_topics_approved'        => 1,
507            'forum_topics_unapproved'    => 0,
508            'forum_topics_softdeleted'    => 0,
509            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
510        ), 'after restoring #1');
511
512        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
513            'forum_posts_approved'        => 0,
514            'forum_posts_unapproved'    => 0,
515            'forum_posts_softdeleted'    => 0,
516            'forum_topics_approved'        => 0,
517            'forum_topics_unapproved'    => 0,
518            'forum_topics_softdeleted'    => 0,
519            'forum_last_post_id'        => 0,
520        ), 'after restoring #2');
521    }
522
523    public function test_split_topic()
524    {
525        $this->login();
526        $this->load_ids(array(
527            'forums' => array(
528                'Soft Delete #1',
529                'Soft Delete #2',
530            ),
531            'topics' => array(
532                'Soft Delete Topic #1',
533            ),
534            'posts' => array(
535                'Soft Delete Topic #1',
536                'Re: Soft Delete Topic #1-#2',
537                'Re: Soft Delete Topic #1-#3'
538            ),
539        ));
540
541        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
542            'forum_posts_approved'        => 1,
543            'forum_posts_unapproved'    => 0,
544            'forum_posts_softdeleted'    => 2,
545            'forum_topics_approved'        => 1,
546            'forum_topics_unapproved'    => 0,
547            'forum_topics_softdeleted'    => 0,
548            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
549        ), 'before splitting #1');
550
551        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
552            'forum_posts_approved'        => 0,
553            'forum_posts_unapproved'    => 0,
554            'forum_posts_softdeleted'    => 0,
555            'forum_topics_approved'        => 0,
556            'forum_topics_unapproved'    => 0,
557            'forum_topics_softdeleted'    => 0,
558            'forum_last_post_id'        => 0,
559        ), 'before splitting #2');
560
561        $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'SPLIT_TOPIC');
562
563        $this->add_lang('mcp');
564        $this->assertContainsLang('SPLIT_TOPIC_EXPLAIN', $crawler->text());
565
566        $form = $crawler->selectButton('Submit')->form(array(
567            'subject'            => 'Soft Delete Topic #2 with bang',
568        ));
569        $form['to_forum_id']->select($this->data['forums']['Soft Delete #2']);
570        $form['post_id_list'][1]->tick();
571        $crawler = self::submit($form);
572
573        $form = $crawler->selectButton('Yes')->form();
574        $crawler = self::submit($form);
575        $this->assertContainsLang('TOPIC_SPLIT_SUCCESS', $crawler->text());
576
577        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
578        $this->assertStringContainsString('Soft Delete Topic #1', $crawler->filter('h2')->text());
579        $this->assertStringNotContainsString('Re: Soft Delete Topic #1-#2', $crawler->text());
580
581        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
582            'forum_posts_approved'        => 1,
583            'forum_posts_unapproved'    => 0,
584            'forum_posts_softdeleted'    => 1,
585            'forum_topics_approved'        => 1,
586            'forum_topics_unapproved'    => 0,
587            'forum_topics_softdeleted'    => 0,
588            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
589        ), 'after restoring #1');
590
591        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
592            'forum_posts_approved'        => 0,
593            'forum_posts_unapproved'    => 0,
594            'forum_posts_softdeleted'    => 1,
595            'forum_topics_approved'        => 0,
596            'forum_topics_unapproved'    => 0,
597            'forum_topics_softdeleted'    => 1,
598            'forum_last_post_id'        => 0,
599        ), 'after restoring #2');
600
601        // Assert new topic title is indexed as well
602        $this->add_lang('search');
603        self::request('GET', "search.php?keywords=bang&sid={$this->sid}");
604
605        // Sphinx search doesn't apply to unapproved or softdeleted posts
606        if (strpos($this->get_search_type(), 'fulltext_sphinx'))
607        {
608            $this->assertStringContainsString(sprintf($this->lang['FOUND_SEARCH_MATCHES'][2], 0), self::get_content());
609        }
610        else
611        {
612            $this->assertStringContainsString(sprintf($this->lang['FOUND_SEARCH_MATCHES'][1], 1), self::get_content());
613        }
614    }
615
616    public function test_move_topic_back()
617    {
618        $this->login();
619        $this->load_ids(array(
620            'forums' => array(
621                'Soft Delete #1',
622                'Soft Delete #2',
623            ),
624            'topics' => array(
625                'Soft Delete Topic #1',
626                'Soft Delete Topic #2 with bang',
627            ),
628            'posts' => array(
629                'Soft Delete Topic #1',
630                'Re: Soft Delete Topic #1-#2',
631                'Re: Soft Delete Topic #1-#3'
632            ),
633        ));
634
635        $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #2 with bang'], 'MOVE_TOPIC');
636        $form = $crawler->selectButton('Yes')->form();
637        $form['to_forum_id']->select($this->data['forums']['Soft Delete #1']);
638        $crawler = self::submit($form);
639
640        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
641            'forum_posts_approved'        => 1,
642            'forum_posts_unapproved'    => 0,
643            'forum_posts_softdeleted'    => 2,
644            'forum_topics_approved'        => 1,
645            'forum_topics_unapproved'    => 0,
646            'forum_topics_softdeleted'    => 1,
647            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
648        ), 'after moving back');
649    }
650
651    public function test_merge_topics()
652    {
653        $this->login();
654        $this->load_ids(array(
655            'forums' => array(
656                'Soft Delete #1',
657                'Soft Delete #2',
658            ),
659            'topics' => array(
660                'Soft Delete Topic #1',
661                'Soft Delete Topic #2 with bang',
662            ),
663            'posts' => array(
664                'Soft Delete Topic #1',
665                'Re: Soft Delete Topic #1-#2',
666                'Re: Soft Delete Topic #1-#3'
667            ),
668        ));
669
670        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
671            'forum_posts_approved'        => 1,
672            'forum_posts_unapproved'    => 0,
673            'forum_posts_softdeleted'    => 2,
674            'forum_topics_approved'        => 1,
675            'forum_topics_unapproved'    => 0,
676            'forum_topics_softdeleted'    => 1,
677            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
678        ), 'before merging #1');
679
680        $this->add_lang('viewtopic');
681        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #2 with bang']}&sid={$this->sid}");
682
683        $bookmark_tag = $crawler->filter('a.bookmark-link');
684        $this->assertContainsLang('BOOKMARK_TOPIC', $bookmark_tag->text());
685        $bookmark_link = $bookmark_tag->attr('href');
686        $crawler_bookmark = self::request('GET', $bookmark_link);
687        $this->assertContainsLang('BOOKMARK_ADDED', $crawler_bookmark->text());
688
689        $this->add_lang('mcp');
690        $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #2 with bang'], 'MERGE_TOPIC', $crawler);
691        $this->assertContainsLang('SELECT_MERGE', $crawler->text());
692
693        $crawler = self::request('GET', "mcp.php?f={$this->data['forums']['Soft Delete #1']}&t={$this->data['topics']['Soft Delete Topic #2 with bang']}&i=main&mode=forum_view&action=merge_topic&to_topic_id={$this->data['topics']['Soft Delete Topic #1']}");
694        $this->assertContainsLang('MERGE_TOPICS_CONFIRM', $crawler->text());
695
696        $form = $crawler->selectButton('Yes')->form();
697        $crawler = self::submit($form);
698        $this->assertContainsLang('POSTS_MERGED_SUCCESS', $crawler->text());
699
700        $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Soft Delete Topic #1']}&sid={$this->sid}");
701        $this->assertStringContainsString('Soft Delete Topic #1', $crawler->filter('h2')->text());
702        $this->assertContainsLang('POST_DELETED_ACTION', $crawler->filter('body')->text());
703        $this->assertContainsLang('BOOKMARK_TOPIC_REMOVE', $crawler->filter('body')->text());
704
705        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
706            'forum_posts_approved'        => 1,
707            'forum_posts_unapproved'    => 0,
708            'forum_posts_softdeleted'    => 2,
709            'forum_topics_approved'        => 1,
710            'forum_topics_unapproved'    => 0,
711            'forum_topics_softdeleted'    => 0,
712            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
713        ), 'after merging #1');
714    }
715
716    public function test_fork_topic()
717    {
718        $this->login();
719        $this->load_ids(array(
720            'forums' => array(
721                'Soft Delete #1',
722                'Soft Delete #2',
723            ),
724            'topics' => array(
725                'Soft Delete Topic #1',
726            ),
727            'posts' => array(
728                'Soft Delete Topic #1',
729                'Re: Soft Delete Topic #1-#2',
730                'Re: Soft Delete Topic #1-#3'
731            ),
732        ));
733
734        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
735            'forum_posts_approved'        => 1,
736            'forum_posts_unapproved'    => 0,
737            'forum_posts_softdeleted'    => 2,
738            'forum_topics_approved'        => 1,
739            'forum_topics_unapproved'    => 0,
740            'forum_topics_softdeleted'    => 0,
741            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
742        ), 'before forking #1');
743
744        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
745            'forum_posts_approved'        => 0,
746            'forum_posts_unapproved'    => 0,
747            'forum_posts_softdeleted'    => 0,
748            'forum_topics_approved'        => 0,
749            'forum_topics_unapproved'    => 0,
750            'forum_topics_softdeleted'    => 0,
751            'forum_last_post_id'        => 0,
752        ), 'before forking #2');
753
754        $this->add_lang('mcp');
755        $crawler = $this->get_quickmod_page($this->data['topics']['Soft Delete Topic #1'], 'FORK_TOPIC');
756        $this->assertContainsLang('FORK_TOPIC', $crawler->text());
757
758        $form = $crawler->selectButton('Yes')->form();
759        $form['to_forum_id']->select($this->data['forums']['Soft Delete #2']);
760        $crawler = self::submit($form);
761        $this->assertContainsLang('TOPIC_FORKED_SUCCESS', $crawler->text());
762
763        $this->assert_forum_details($this->data['forums']['Soft Delete #1'], array(
764            'forum_posts_approved'        => 1,
765            'forum_posts_unapproved'    => 0,
766            'forum_posts_softdeleted'    => 2,
767            'forum_topics_approved'        => 1,
768            'forum_topics_unapproved'    => 0,
769            'forum_topics_softdeleted'    => 0,
770            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'],
771        ), 'after forking #1');
772
773        $this->assert_forum_details($this->data['forums']['Soft Delete #2'], array(
774            'forum_posts_approved'        => 1,
775            'forum_posts_unapproved'    => 0,
776            'forum_posts_softdeleted'    => 2,
777            'forum_topics_approved'        => 1,
778            'forum_topics_unapproved'    => 0,
779            'forum_topics_softdeleted'    => 0,
780            'forum_last_post_id'        => $this->data['posts']['Soft Delete Topic #1'] + 3,
781        ), 'after forking #2');
782    }
783
784    public function assert_forum_details($forum_id, $details, $additional_error_message = '')
785    {
786        $sql = 'SELECT ' . implode(', ', array_keys($details)) . '
787            FROM phpbb_forums
788            WHERE forum_id = ' . (int) $forum_id;
789        $result = $this->db->sql_query($sql);
790        $data = $this->db->sql_fetchrow($result);
791        $this->db->sql_freeresult($result);
792
793        $this->assertEquals($details, $data, "Forum {$forum_id} does not match expected {$additional_error_message}");
794    }
795
796    public function load_ids($data)
797    {
798        if (!empty($data['forums']))
799        {
800            $sql = 'SELECT *
801                FROM phpbb_forums
802                WHERE ' . $this->db->sql_in_set('forum_name', $data['forums']);
803            $result = $this->db->sql_query($sql);
804            while ($row = $this->db->sql_fetchrow($result))
805            {
806                if (in_array($row['forum_name'], $data['forums']))
807                {
808                    $this->data['forums'][$row['forum_name']] = (int) $row['forum_id'];
809                }
810            }
811            $this->db->sql_freeresult($result);
812        }
813
814        if (!empty($data['topics']))
815        {
816            $sql = 'SELECT *
817                FROM phpbb_topics
818                WHERE ' . $this->db->sql_in_set('topic_title', $data['topics']);
819            $result = $this->db->sql_query($sql);
820            while ($row = $this->db->sql_fetchrow($result))
821            {
822                if (in_array($row['topic_title'], $data['topics']))
823                {
824                    $this->data['topics'][$row['topic_title']] = (int) $row['topic_id'];
825                }
826            }
827            $this->db->sql_freeresult($result);
828        }
829
830        if (!empty($data['posts']))
831        {
832            $sql = 'SELECT *
833                FROM phpbb_posts
834                WHERE ' . $this->db->sql_in_set('post_subject', $data['posts']);
835            $result = $this->db->sql_query($sql);
836            while ($row = $this->db->sql_fetchrow($result))
837            {
838                if (in_array($row['post_subject'], $data['posts']))
839                {
840                    $this->data['posts'][$row['post_subject']] = (int) $row['post_id'];
841                }
842            }
843            $this->db->sql_freeresult($result);
844        }
845    }
846}