* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ /** * @group functional */ class phpbb_functional_feed_test extends phpbb_functional_test_case { protected $data = array(); static public $init_values = array(); public function setUp(): void { parent::setUp(); $this->purge_cache(); } public function __construct($name = null, array $data = array(), $dataName = '') { parent::__construct($name, $data, $dataName); $this->backupStaticAttributesBlacklist['phpbb_functional_feed_test'] = array('init_values'); $this->purge_cache(); } public function test_setup_config_before_state() { $this->login(); $this->admin_login(); $crawler = self::request('GET', "adm/index.php?sid={$this->sid}&i=acp_board&mode=feed"); $form = $crawler->selectButton('Submit')->form(); $values = $form->getValues(); self::$init_values['post_base_items'] = (int) $values['config[feed_limit_post]']; self::$init_values['topic_base_items'] = (int) $values['config[feed_limit_topic]']; // Enable all feeds $values['config[feed_enable]'] = true; $values['config[feed_forum]'] = true; $values['config[feed_item_statistics]'] = true; $values['config[feed_overall]'] = true; $values['config[feed_overall_forums]'] = true; $values['config[feed_topic]'] = true; $values['config[feed_topics_active]'] = true; $values['config[feed_topics_new]'] = true; $form->setValues($values); $crawler = self::submit($form); self::assertContainsLang('CONFIG_UPDATED', $crawler->filter('.successbox')->text()); // Special config (Guest can't see attachments) $this->add_lang('acp/permissions'); $crawler = self::request('GET', "adm/index.php?i=acp_permissions&sid={$this->sid}&icat=16&mode=setting_group_global&group_id[0]=1"); self::assertContains($this->lang('ACL_SET'), $crawler->filter('h1')->eq(1)->text()); $form = $crawler->selectButton($this->lang('APPLY_PERMISSIONS'))->form(); $form['setting[1][0][u_download]']->select(-1); $crawler = self::submit($form); self::assertContainsLang('AUTH_UPDATED', $crawler->filter('.successbox')->text()); } public function test_dump_board_state() { $crawler = self::request('GET', 'app.php/feed/forums', array(), false); self::assert_response_xml(); self::$init_values['disapprove_user']['forums_value'] = $crawler->filterXPath('//entry')->count(); $crawler = self::request('GET', 'app.php/feed/overall', array(), false); self::assert_response_xml(); self::$init_values['disapprove_user']['overall_value'] = $crawler->filterXPath('//entry')->count(); $crawler = self::request('GET', 'app.php/feed/topics', array(), false); self::assert_response_xml(); self::$init_values['disapprove_user']['topics_value'] = $crawler->filterXPath('//entry')->count(); $crawler = self::request('GET', 'app.php/feed/topics_new', array(), false); self::assert_response_xml(); self::$init_values['disapprove_user']['topics_new_value'] = $crawler->filterXPath('//entry')->count(); $crawler = self::request('GET', 'app.php/feed/topics_active', array(), false); self::assert_response_xml(); self::$init_values['disapprove_user']['topics_active_value'] = $crawler->filterXPath('//entry')->count(); $this->login(); $crawler = self::request('GET', 'app.php/feed/forums', array(), false); self::assert_response_xml(); self::$init_values['admin']['forums_value'] = $crawler->filterXPath('//entry')->count(); $crawler = self::request('GET', 'app.php/feed/overall', array(), false); self::assert_response_xml(); self::$init_values['admin']['overall_value'] = $crawler->filterXPath('//entry')->count(); $crawler = self::request('GET', 'app.php/feed/topics', array(), false); self::assert_response_xml(); self::$init_values['admin']['topics_value'] = $crawler->filterXPath('//entry')->count(); $crawler = self::request('GET', 'app.php/feed/topics_new', array(), false); self::assert_response_xml(); self::$init_values['admin']['topics_new_value'] = $crawler->filterXPath('//entry')->count(); $crawler = self::request('GET', 'app.php/feed/topics_active', array(), false); self::assert_response_xml(); self::$init_values['admin']['topics_active_value'] = $crawler->filterXPath('//entry')->count(); } public function test_setup_forums() { $this->login(); $this->admin_login(); $this->create_user('disapprove_user'); $this->add_user_group('NEWLY_REGISTERED', array('disapprove_user')); $crawler = self::request('GET', "adm/index.php?i=acp_forums&mode=manage&sid={$this->sid}"); $form = $crawler->selectButton('addforum')->form(array( 'forum_name' => 'Feeds #1', )); $crawler = self::submit($form); $form = $crawler->selectButton('update')->form(array( 'forum_perm_from' => 2, )); self::submit($form); $this->load_ids(array( 'forums' => array( 'Feeds #1', ), )); // 'Feeds #1.1' is a sub-forum of 'Feeds #1' $crawler = self::request('GET', "adm/index.php?i=acp_forums&sid={$this->sid}&icat=6&mode=manage&parent_id={$this->data['forums']['Feeds #1']}"); $form = $crawler->selectButton('addforum')->form(array( 'forum_name' => 'Feeds #1.1', )); $crawler = self::submit($form); $form = $crawler->selectButton('update')->form(array( 'forum_perm_from' => 2, )); self::submit($form); // 'Feeds #news' will be used for feed.php?mode=news $crawler = self::request('GET', "adm/index.php?i=acp_forums&mode=manage&sid={$this->sid}"); $form = $crawler->selectButton('addforum')->form(array( 'forum_name' => 'Feeds #news', )); $crawler = self::submit($form); $form = $crawler->selectButton('update')->form(array( 'forum_perm_from' => 2, )); self::submit($form); // 'Feeds #exclude' will not be displayed on app.php/feed/forums $crawler = self::request('GET', "adm/index.php?i=acp_forums&mode=manage&sid={$this->sid}"); $form = $crawler->selectButton('addforum')->form(array( 'forum_name' => 'Feeds #exclude', )); $crawler = self::submit($form); $form = $crawler->selectButton('update')->form(array( 'forum_perm_from' => 2, )); self::submit($form); } public function test_setup_config_after_forums() { $this->login(); $this->admin_login(); $this->load_ids(array( 'forums' => array( 'Feeds #news', 'Feeds #exclude', ), )); $crawler = self::request('GET', "adm/index.php?sid={$this->sid}&i=acp_board&mode=feed"); $form = $crawler->selectButton('Submit')->form(); // News/Exclude's forums config $form['feed_news_id']->select(array($this->data['forums']['Feeds #news'])); $form['feed_exclude_id']->select(array($this->data['forums']['Feeds #exclude'])); $crawler = self::submit($form); self::assertContainsLang('CONFIG_UPDATED', $crawler->filter('.successbox')->text()); } public function test_feeds_empty() { $this->load_ids(array( 'forums' => array( 'Feeds #1', 'Feeds #1.1', ), )); // Excluded forums (and topics under them) shouldn't be displayed in feeds $this->assert_feeds(array( 'f' => array( array( 'id' => $this->data['forums']['Feeds #1'], 'nb_entries' => 0, ), array( 'id' => $this->data['forums']['Feeds #1.1'], 'nb_entries' => 0, ), ), 'forums' => array( array( 'nb_entries' => 3, 'xpath' => array( '//entry/category[@label="Feeds #exclude"]' => 0, ), ), ), 'news' => array( array( 'nb_entries' => 0, ), ), ), 'admin'); } public function test_create_exclude_topic() { $this->login(); $this->load_ids(array( 'forums' => array( 'Feeds #exclude', ), )); $post = $this->create_topic($this->data['forums']['Feeds #exclude'], 'Feeds #exclude - Topic #1', 'This is a test topic posted by the testing framework.'); $this->data['topics']['Feeds #exclude - Topic #1'] = (int) $post['topic_id']; } public function test_feeds_exclude() { $this->load_ids(array( 'forums' => array( 'Feeds #exclude', ), 'topics' => array( 'Feeds #exclude - Topic #1', ), )); // Assert that feeds aren't available for excluded forums $this->assert_feeds(array( 'f' => array( array( 'id' => $this->data['forums']['Feeds #exclude'], 'contents_lang' => array('NO_FEED'), 'invalid' => true, 'response_code' => 404, ), ), 't' => array( array( 'id' => $this->data['topics']['Feeds #exclude - Topic #1'], 'contents_lang' => array('NO_FEED'), 'invalid' => true, 'response_code' => 404, ), ), 'overall' => array( array( 'nb_entries' => 0, 'xpath' => array( '//entry/title[contains(., "#exclude")]' => 0, ), ), ), 'topics' => array( array( 'nb_entries' => 0, 'xpath' => array( '//entry/title[contains(., "#exclude")]' => 0, ), ), ), 'topics_new' => array( array( 'nb_entries' => 0, 'xpath' => array( '//entry/title[contains(., "#exclude")]' => 0, ), ), ), 'topics_active' => array( array( 'nb_entries' => 0, 'xpath' => array( '//entry/title[contains(., "#exclude")]' => 0, ), ), ), ), 'admin'); } public function test_create_news_topics() { $this->login(); $this->load_ids(array( 'forums' => array( 'Feeds #news', ), )); $post = $this->create_topic($this->data['forums']['Feeds #news'], 'Feeds #news - Topic #1', 'This is a test topic posted by the testing framework.'); $this->data['topics']['Feeds #news - Topic #1'] = (int) $post['topic_id']; $post = $this->create_topic($this->data['forums']['Feeds #news'], 'Feeds #news - Topic #2', 'This is a test topic posted by the testing framework.'); $crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}"); self::assertContains('Feeds #news - Topic #2', $crawler->filter('html')->text()); $this->data['topics']['Feeds #news - Topic #2'] = (int) $post['topic_id']; $this->data['posts']['Feeds #news - Topic #2'] = (int) $this->get_parameter_from_link($crawler->filter('.post')->selectLink($this->lang('POST', '', ''))->link()->getUri(), 'p'); // Test creating a reply $post2 = $this->create_post($this->data['forums']['Feeds #news'], $post['topic_id'], 'Re: Feeds #news - Topic #2', 'This is a test post posted by the testing framework.'); $crawler = self::request('GET', "viewtopic.php?p={$post2['post_id']}&sid={$this->sid}"); self::assertContains('Re: Feeds #news - Topic #2', $crawler->filter('html')->text()); $this->data['posts']['Re: Feeds #news - Topic #2'] = (int) $post2['post_id']; } public function test_feeds_news_admin() { $this->load_ids(array( 'forums' => array( 'Feeds #news', ), 'topics' => array( 'Feeds #news - Topic #1', 'Feeds #news - Topic #2', ), 'posts' => array( 'Feeds #news - Topic #2', ), )); // Assert that the first post of the two topics are displayed in news feed $this->assert_feeds(array( 'news' => array( array( 'nb_entries' => 2, 'contents' => array( 1 => 'This is a test topic posted by the testing framework.', 2 => 'This is a test topic posted by the testing framework.', ), ), ), // News should also be displayed in other feeds 'f' => array( array( 'nb_entries' => 3, 'id' => $this->data['forums']['Feeds #news'], ), ), 't' => array( array( 'nb_entries' => 1, 'id' => $this->data['topics']['Feeds #news - Topic #1'], ), array( 'nb_entries' => 2, 'id' => $this->data['topics']['Feeds #news - Topic #2'], ), ), 'overall' => array( array( 'nb_entries' => 3, 'xpath' => array( '//entry/title[contains(., "#news")]' => 3, ), ), ), 'topics' => array( array( 'nb_entries' => 2, 'xpath' => array( '//entry/title[contains(., "#news")]' => 2, ), ), ), 'topics_new' => array( array( 'nb_entries' => 2, 'xpath' => array( '//entry/title[contains(., "#news")]' => 2, ), ), ), 'topics_active' => array( array( 'nb_entries' => 2, 'xpath' => array( '//entry/title[contains(., "#news")]' => 2, ), ), ), ), 'admin'); } public function test_feeds_news_guest() { $this->load_ids(array( 'posts' => array( 'Feeds #news - Topic #2', ), )); // Assert that first post of the the two topics are displayed in news feed $this->assert_feeds(array( 'news' => array( array( 'nb_entries' => 2, 'contents' => array( 1 => 'This is a test topic posted by the testing framework.', 2 => 'This is a test topic posted by the testing framework.', ), ), ), )); } public function test_create_sub_forum_topic() { $this->login(); $this->load_ids(array( 'forums' => array( 'Feeds #1', 'Feeds #1.1', ), )); $post = $this->create_topic($this->data['forums']['Feeds #1'], 'Feeds #1 - Topic #1', 'This is a test topic posted by the testing framework.'); $this->data['topics']['Feeds #1 - Topic #1'] = (int) $post['topic_id']; $post = $this->create_topic($this->data['forums']['Feeds #1.1'], 'Feeds #1.1 - Topic #1', 'This is a test topic posted by the testing framework.'); $this->data['topics']['Feeds #1.1 - Topic #1'] = (int) $post['topic_id']; } public function test_feeds_sub_forum() { $this->load_ids(array( 'forums' => array( 'Feeds #1', ), )); // The topics of the sub-forum shouldn't be displayed $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 1, 'id' => $this->data['forums']['Feeds #1'], ), ), ), 'admin'); } public function test_create_softdelete_post() { $this->login(); $this->load_ids(array( 'forums' => array( 'Feeds #1', ), )); $post = $this->create_topic($this->data['forums']['Feeds #1'], 'Feeds #1 - Topic #2', 'This is a test topic posted by the testing framework.'); $this->data['topics']['Feeds #1 - Topic #2'] = (int) $post['topic_id']; // Test creating a reply $post2 = $this->create_post($this->data['forums']['Feeds #1'], $post['topic_id'], 'Re: Feeds #1 - Topic #2', 'This is a test post posted by the testing framework.'); $crawler = self::request('GET', "viewtopic.php?p={$post2['post_id']}&sid={$this->sid}"); self::assertContains('Re: Feeds #1 - Topic #2', $crawler->filter('html')->text()); $this->data['posts']['Re: Feeds #1 - Topic #2'] = (int) $post2['post_id']; } public function test_softdelete_post() { $this->login(); $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #2', ), 'posts' => array( 'Re: Feeds #1 - Topic #2', ), )); $this->add_lang('posting'); $crawler = self::request('GET', "posting.php?mode=delete&f={$this->data['forums']['Feeds #1']}&p={$this->data['posts']['Re: Feeds #1 - Topic #2']}&sid={$this->sid}"); self::assertContainsLang('DELETE_PERMANENTLY', $crawler->text()); $form = $crawler->selectButton('Yes')->form(); $crawler = self::submit($form); self::assertContainsLang('POST_DELETED', $crawler->text()); $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Feeds #1 - Topic #2']}&sid={$this->sid}"); self::assertContains($this->lang('POST_DISPLAY', '', ''), $crawler->text()); } public function test_feeds_softdeleted_post_admin() { $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #2', ), )); // Assert that the soft-deleted post is marked as soft-delete for users that have the right to see it. $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 3, 'id' => $this->data['forums']['Feeds #1'], 'contents_lang' => array( 1 => 'POST_DELETED', ), ), ), 't' => array( array( 'nb_entries' => 2, 'id' => $this->data['topics']['Feeds #1 - Topic #2'], 'contents_lang' => array( 1 => 'POST_DELETED', ), ), ), 'overall' => array( array( 'nb_entries' => 7, 'contents_lang' => array( 1 => 'POST_DELETED', ), ), ), ), 'admin'); } public function test_feeds_softdeleted_post_guest() { $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #2', ), )); // Assert that the soft-deleted post is marked as soft-delete for users that have the right to see it. $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 2, 'id' => $this->data['forums']['Feeds #1'], ), ), 't' => array( array( 'nb_entries' => 1, 'id' => $this->data['topics']['Feeds #1 - Topic #2'], ), ), 'overall' => array( array( 'nb_entries' => 6, ), ), )); } public function test_softdelete_topic() { $this->login(); $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #2', ), )); $this->add_lang('posting'); $crawler = $this->get_quickmod_page($this->data['topics']['Feeds #1 - Topic #2'], 'DELETE_TOPIC'); self::assertContainsLang('DELETE_PERMANENTLY', $crawler->text()); $this->add_lang('mcp'); $form = $crawler->selectButton('Yes')->form(); $crawler = self::submit($form); self::assertContainsLang('TOPIC_DELETED_SUCCESS', $crawler->text()); $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Feeds #1 - Topic #2']}&sid={$this->sid}"); self::assertContains('Feeds #1 - Topic #2', $crawler->filter('h2')->text()); } public function test_feeds_softdeleted_topic_admin() { $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #2', ), )); // Assert that the soft-deleted post is marked as soft-delete for users that have the right to see it. $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 3, 'id' => $this->data['forums']['Feeds #1'], 'contents_lang' => array( 1 => 'POST_DELETED', 2 => 'POST_DELETED', ), ), ), 't' => array( array( 'nb_entries' => 2, 'id' => $this->data['topics']['Feeds #1 - Topic #2'], 'contents_lang' => array( 1 => 'POST_DELETED', 2 => 'POST_DELETED', ), ), ), 'overall' => array( array( 'nb_entries' => 7, 'contents_lang' => array( 1 => 'POST_DELETED', 2 => 'POST_DELETED', ), ), ), 'topics' => array( array( 'nb_entries' => 5, 'contents_lang' => array( 1 => 'TOPIC_DELETED', ), ), ), 'topics_new' => array( array( 'nb_entries' => 5, 'contents_lang' => array( 1 => 'TOPIC_DELETED', ), ), ), 'topics_active' => array( array( 'nb_entries' => 5, 'contents_lang' => array( 1 => 'TOPIC_DELETED', ), ), ), ), 'admin'); } public function test_feeds_softdeleted_topic_guest() { $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #2', ), )); $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 1, 'id' => $this->data['forums']['Feeds #1'], ), ), 't' => array( array( 'id' => $this->data['topics']['Feeds #1 - Topic #2'], 'contents_lang' => array('SORRY_AUTH_READ_TOPIC'), 'invalid' => true, 'response_code' => 403, ), ), 'overall' => array( array( 'nb_entries' => 5, ), ), 'topics' => array( array( 'nb_entries' => 4, ), ), 'topics_new' => array( array( 'nb_entries' => 4, ), ), 'topics_active' => array( array( 'nb_entries' => 4, ), ), )); } public function test_create_unapproved_post() { $this->load_ids(array( 'forums' => array( 'Feeds #1.1', ), )); $this->login('admin'); $post = $this->create_topic($this->data['forums']['Feeds #1.1'], 'Feeds #1.1 - Topic #2', 'This is a test topic posted by the testing framework.'); $this->data['topics']['Feeds #1.1 - Topic #2'] = (int) $post['topic_id']; $this->logout(); // Test creating a reply $this->login('disapprove_user'); $this->create_post($this->data['forums']['Feeds #1.1'], $post['topic_id'], 'Re: Feeds #1.1 - Topic #2', 'This is a test post posted by the testing framework.', array(), 'POST_STORED_MOD'); $crawler = self::request('GET', "viewtopic.php?t={$this->data['topics']['Feeds #1.1 - Topic #2']}&sid={$this->sid}"); self::assertNotContains('Re: Feeds #1.1 - Topic #2', $crawler->filter('html')->text()); } public function test_feeds_unapproved_post_admin() { $this->load_ids(array( 'forums' => array( 'Feeds #1.1', ), 'topics' => array( 'Feeds #1.1 - Topic #2', ), )); // Assert that the unapproved post is marked as unapproved for users that have the right to see it. $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 3, 'id' => $this->data['forums']['Feeds #1.1'], 'contents_lang' => array( 1 => 'POST_UNAPPROVED', ), ), ), 't' => array( array( 'nb_entries' => 2, 'id' => $this->data['topics']['Feeds #1.1 - Topic #2'], 'contents_lang' => array( 1 => 'POST_UNAPPROVED', ), ), ), 'overall' => array( array( 'nb_entries' => 9, 'contents_lang' => array( 1 => 'POST_UNAPPROVED', ), ), ), ), 'admin'); } public function test_feeds_unapproved_post_disapprove_user() { $this->load_ids(array( 'forums' => array( 'Feeds #1.1', ), 'topics' => array( 'Feeds #1.1 - Topic #2', ), )); // Assert that the unapproved isn't displayed for regular users $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 2, 'id' => $this->data['forums']['Feeds #1.1'], ), ), 't' => array( array( 'nb_entries' => 1, 'id' => $this->data['topics']['Feeds #1.1 - Topic #2'], ), ), 'overall' => array( array( 'nb_entries' => 6, ), ), ), 'disapprove_user'); } public function test_create_unapproved_topic() { $this->load_ids(array( 'forums' => array( 'Feeds #1.1', ), )); $this->set_flood_interval(0); $this->login('disapprove_user'); $post = $this->create_topic($this->data['forums']['Feeds #1.1'], 'Feeds #1.1 - Topic #3', 'This is a test topic posted by the testing framework.', array(), 'POST_STORED_MOD'); $this->data['topics']['Feeds #1 - Topic #3'] = (int) $post['topic_id']; $crawler = self::request('GET', "viewforum.php?f={$this->data['forums']['Feeds #1.1']}&sid={$this->sid}"); self::assertNotContains('Feeds #1.1 - Topic #3', $crawler->filter('html')->text()); $this->logout(); $this->set_flood_interval(15); } protected function set_flood_interval($flood_interval) { $this->login(); $this->admin_login(); $crawler = self::request('GET', 'adm/index.php?sid=' . $this->sid . '&i=acp_board&mode=post'); $form = $crawler->selectButton('Submit')->form(); $values = $form->getValues(); $values['config[flood_interval]'] = $flood_interval; $form->setValues($values); $crawler = self::submit($form); self::assertGreaterThan(0, $crawler->filter('.successbox')->count()); $this->logout(); } public function test_feeds_unapproved_topic_admin() { $this->load_ids(array( 'forums' => array( 'Feeds #1.1', ), 'topics' => array( 'Feeds #1.1 - Topic #3', ), )); // Assert that the unapproved topic is marked as unapproved for users that have the right to see it. $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 4, 'id' => $this->data['forums']['Feeds #1.1'], 'contents_lang' => array( 1 => 'POST_UNAPPROVED', ), ), ), 't' => array( array( 'nb_entries' => 1, 'id' => $this->data['topics']['Feeds #1.1 - Topic #3'], 'contents_lang' => array( 1 => 'POST_UNAPPROVED', ), ), ), 'overall' => array( array( 'nb_entries' => 10, 'contents_lang' => array( 1 => 'POST_UNAPPROVED', ), ), ), 'topics' => array( array( 'nb_entries' => 7, 'contents_lang' => array( 1 => 'TOPIC_UNAPPROVED', ), ), ), 'topics_new' => array( array( 'nb_entries' => 7, 'contents_lang' => array( 1 => 'TOPIC_UNAPPROVED', ), ), ), 'topics_active' => array( array( 'nb_entries' => 7, 'contents_lang' => array( 1 => 'TOPIC_UNAPPROVED', ), ), ), ), 'admin'); } public function test_feeds_unapproved_topic_disapprove_user() { $this->load_ids(array( 'forums' => array( 'Feeds #1.1', ), 'topics' => array( 'Feeds #1.1 - Topic #3', ), )); $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 2, 'id' => $this->data['forums']['Feeds #1.1'], ), ), 't' => array( array( 'id' => $this->data['topics']['Feeds #1.1 - Topic #3'], 'contents_lang' => array('SORRY_AUTH_READ_TOPIC'), 'invalid' => true, 'response_code' => 403, ), ), 'overall' => array( array( 'nb_entries' => 6, ), ), 'topics' => array( array( 'nb_entries' => 5, ), ), 'topics_new' => array( array( 'nb_entries' => 5, ), ), 'topics_active' => array( array( 'nb_entries' => 5, ), ), ), 'disapprove_user'); } public function test_create_attachment_topic() { $this->login(); $this->load_ids(array( 'forums' => array( 'Feeds #1', ), )); // Test creating a topic with 1 attachment $post = $this->create_topic($this->data['forums']['Feeds #1'], 'Feeds #1 - Topic #3', 'This is a test topic posted by the testing framework. [attachment=0]Attachment #0[/attachment]', array('upload_files' => 1)); $crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}"); self::assertContains('Feeds #1 - Topic #3', $crawler->filter('html')->text()); $this->data['topics']['Feeds #1 - Topic #3'] = (int) $post['topic_id']; } public function test_feeds_attachment_admin() { $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #3', ), 'posts' => array( 'Feeds #1 - Topic #3', ), 'attachments' => true, )); $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 4, 'id' => $this->data['forums']['Feeds #1'], 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => true, ), ), ), ), ), 't' => array( array( 'nb_entries' => 1, 'id' => $this->data['topics']['Feeds #1 - Topic #3'], 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => true, ), ), ), ), ), 'overall' => array( array( 'nb_entries' => 11, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => true, ), ), ), ), ), 'topics' => array( array( 'nb_entries' => 8, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => true, ), ), ), ), ), 'topics_new' => array( array( 'nb_entries' => 8, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => true, ), ), ), ), ), 'topics_active' => array( array( 'nb_entries' => 8, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => true, ), ), ), ), ), ), 'admin'); } public function test_feeds_attachment_guest() { $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #3', ), 'posts' => array( 'Feeds #1 - Topic #3', ), 'attachments' => true, )); $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 2, 'id' => $this->data['forums']['Feeds #1'], 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => false, ), ), ), ), ), 't' => array( array( 'nb_entries' => 1, 'id' => $this->data['topics']['Feeds #1 - Topic #3'], 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => false, ), ), ), ), ), 'overall' => array( array( 'nb_entries' => 7, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => false, ), ), ), ), ), 'topics' => array( array( 'nb_entries' => 6, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => false, ), ), ), ), ), 'topics_new' => array( array( 'nb_entries' => 6, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => false, ), ), ), ), ), 'topics_active' => array( array( 'nb_entries' => 6, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => false, ), ), ), ), ), )); } public function test_create_missing_attachment_post() { $this->login(); $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #3', ), )); // Test creating a reply with 1 missing attachment $post2 = $this->create_post($this->data['forums']['Feeds #1'], $this->data['topics']['Feeds #1 - Topic #3'], 'Re: Feeds #1 - Topic #3-1', 'This is a test post posted by the testing framework. [attachment=0]Attachment #0[/attachment]'); $crawler = self::request('GET', "viewtopic.php?p={$post2['post_id']}&sid={$this->sid}"); self::assertContains('Re: Feeds #1 - Topic #3-1', $crawler->filter('html')->text()); $this->data['posts']['Re: Feeds #1 - Topic #3-1'] = (int) $post2['post_id']; } public function test_feeds_missing_attachment_admin() { $this->load_ids(array( 'forums' => array( 'Feeds #1', ), 'topics' => array( 'Feeds #1 - Topic #3', ), 'posts' => array( 'Feeds #1 - Topic #3', ), )); $this->add_lang('viewtopic'); $this->assert_feeds(array( 'f' => array( array( 'nb_entries' => 5, 'id' => $this->data['forums']['Feeds #1'], 'contents' => array( 1 => 'Attachment #0', ), ), ), 't' => array( array( 'nb_entries' => 2, 'id' => $this->data['topics']['Feeds #1 - Topic #3'], 'contents' => array( 1 => 'Attachment #0', ), ), ), 'overall' => array( array( 'nb_entries' => 12, 'contents' => array( 1 => 'Attachment #0', ), ), ), 'topics' => array( array( 'nb_entries' => 8, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => true, ), ), ), ), ), 'topics_new' => array( array( 'nb_entries' => 8, 'attachments' => array( 1 => array( // First entry array( // First attachment to fetch 'id' => $this->data['attachments'][$this->data['posts']['Feeds #1 - Topic #3']][0], 'displayed' => true, ), ), ), ), ), 'topics_active' => array( array( 'nb_entries' => 8, 'contents' => array( 1 => 'Attachment #0', ), ), ), ), 'admin'); } protected function assert_feeds($data, $username = false) { if ($username) { $this->login($username); $init_values = self::$init_values[$username]; } else { $init_values = self::$init_values['disapprove_user']; } foreach ($data as $mode => $feeds) { foreach ($feeds as $feed_data) { if ($mode === 'f') { $params = "/forum/{$feed_data['id']}"; $this->assert_feed($params, $feed_data); } else if ($mode === 't') { $params = "/topic/{$feed_data['id']}"; $this->assert_feed($params, $feed_data); } else { switch ($mode) { case 'forums': $feed_data['nb_entries'] = ((int)$feed_data['nb_entries'] + $init_values['forums_value']); break; case 'overall': $feed_data['nb_entries'] = min($feed_data['nb_entries'] + $init_values['overall_value'], self::$init_values['post_base_items']); break; case 'topics': $feed_data['nb_entries'] = min($feed_data['nb_entries'] + $init_values['topics_value'], self::$init_values['topic_base_items']); break; case 'topics_new': $feed_data['nb_entries'] = min($feed_data['nb_entries'] + $init_values['topics_new_value'], self::$init_values['topic_base_items']); break; case 'topics_active': $feed_data['nb_entries'] = min($feed_data['nb_entries'] + $init_values['topics_active_value'], self::$init_values['topic_base_items']); break; case 'news': break; default: self::fail('Unsupported feed mode: ' . $mode); } $params = "/{$mode}"; $this->assert_feed($params, $feed_data); } } } } protected function assert_feed($params, $data) { $crawler = self::request('GET', 'app.php/feed' . $params, array(), false); if (empty($data['invalid'])) { self::assert_response_xml(); self::assertEquals($data['nb_entries'], $crawler->filter('entry')->count(), "Tested feed : 'app.php/feed{$params}'"); if (!empty($data['xpath'])) { foreach($data['xpath'] as $xpath => $count_expected) { self::assertCount($count_expected, $crawler->filterXPath($xpath), "Tested feed : 'app.php/feed{$params}', Search for {$xpath}"); } } if (!empty($data['contents'])) { foreach($data['contents'] as $entry_id => $string) { $content = $crawler->filterXPath("//entry[{$entry_id}]/content")->text(); self::assertContains($string, $content, "Tested feed : 'app.php/feed{$params}'"); } } if (!empty($data['contents_lang'])) { foreach($data['contents_lang'] as $entry_id => $string) { $content = $crawler->filterXPath("//entry[{$entry_id}]/content")->text(); self::assertContainsLang($string, $content, "Tested feed : 'app.php/feed{$params}'"); } } if (!empty($data['attachments'])) { foreach($data['attachments'] as $entry_id => $attachments) { $content = $crawler->filterXPath("//entry[{$entry_id}]/content")->text(); foreach ($attachments as $i => $attachment) { $url = self::$root_url . "download/file.php?id={$attachment['id']}"; $string = "Attachment #{$i}"; if ($attachment['displayed']) { self::assertContains($url, $content, "Tested feed : 'app.php/feed{$params}'"); self::assertNotContains($string, $content, "Tested feed : 'app.php/feed{$params}'"); } else { self::assertContains($string, $content, "Tested feed : 'app.php/feed{$params}'"); self::assertNotContains($url, $content, "Tested feed : 'app.php/feed{$params}'"); } } } } } else { self::assert_response_html($data['response_code'] ?: 202); if (!empty($data['contents_lang'])) { $content = $crawler->filter('html')->text(); foreach($data['contents_lang'] as $string) { self::assertContainsLang($string, $content, "Tested feed : 'app.php/feed{$params}'"); } } } } protected function load_ids($data) { $this->db = $this->get_db(); if (!empty($data['forums'])) { $sql = 'SELECT * FROM phpbb_forums WHERE ' . $this->db->sql_in_set('forum_name', $data['forums']); $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { if (in_array($row['forum_name'], $data['forums'], false)) { $this->data['forums'][$row['forum_name']] = (int) $row['forum_id']; } } $this->db->sql_freeresult($result); } if (!empty($data['topics'])) { $sql = 'SELECT * FROM phpbb_topics WHERE ' . $this->db->sql_in_set('topic_title', $data['topics']); $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { if (in_array($row['topic_title'], $data['topics'], false)) { $this->data['topics'][$row['topic_title']] = (int) $row['topic_id']; } } $this->db->sql_freeresult($result); } $post_ids = array(); if (!empty($data['posts'])) { $sql = 'SELECT * FROM phpbb_posts WHERE ' . $this->db->sql_in_set('post_subject', $data['posts']); $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { if (in_array($row['post_subject'], $data['posts'], false)) { $this->data['posts'][$row['post_subject']] = (int) $row['post_id']; $post_ids[] = (int) $row['post_id']; } } $this->db->sql_freeresult($result); if (isset($data['attachments'])) { $sql = 'SELECT * FROM phpbb_attachments WHERE in_message = 0 AND ' . $this->db->sql_in_set('post_msg_id', $post_ids); $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { $this->data['attachments'][(int) $row['post_msg_id']][] = (int) $row['attach_id']; } $this->db->sql_freeresult($result); } } } }