From 85f23474d760d25f6095732bde709d8f742a38e5 Mon Sep 17 00:00:00 2001 From: rxu Date: Sun, 19 Dec 2021 19:30:47 +0700 Subject: [PATCH] [ticket/16688] Fix 'Remove' link for Extension manager 'Remove' link is broken and rendered as 'Array'. PHPBB3-16943 --- phpBB/adm/style/acp_ext_list.html | 4 +- phpBB/includes/acp/acp_extensions.php | 18 ++--- tests/functional/extension_acp_test.php | 98 +++++++++++++++++++++++-- 3 files changed, 99 insertions(+), 21 deletions(-) diff --git a/phpBB/adm/style/acp_ext_list.html b/phpBB/adm/style/acp_ext_list.html index c5527c14bc..0b63302eed 100644 --- a/phpBB/adm/style/acp_ext_list.html +++ b/phpBB/adm/style/acp_ext_list.html @@ -60,7 +60,7 @@ {L_DETAILS} - title="{enabled.actions.L_ACTION_EXPLAIN}">{enabled.actions.L_ACTION} + style="color: #bc2a4d;" title="{enabled.actions.L_ACTION_EXPLAIN}">{enabled.actions.L_ACTION}  |  @@ -88,7 +88,7 @@ - title="{disabled.actions.L_ACTION_EXPLAIN}">{disabled.actions.L_ACTION} + style="color: #bc2a4d;" title="{disabled.actions.L_ACTION_EXPLAIN}">{disabled.actions.L_ACTION}  |  diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php index 5bdb381d1b..de98bfadb1 100644 --- a/phpBB/includes/acp/acp_extensions.php +++ b/phpBB/includes/acp/acp_extensions.php @@ -838,10 +838,7 @@ class acp_extensions { $this->output_actions('enabled', [ 'UPDATE' => $this->u_catalog_action . '&action=update&extension=' . urlencode($block_vars['META_NAME']), - 'REMOVE' => [ - 'url' => $this->u_catalog_action . '&action=remove&extension=' . urlencode($block_vars['META_NAME']), - 'color' => '#BC2A4D;', - ] + 'REMOVE' => $this->u_catalog_action . '&action=remove&extension=' . urlencode($block_vars['META_NAME']), ]); } } @@ -922,10 +919,7 @@ class acp_extensions { $this->output_actions('disabled', [ 'UPDATE' => $this->u_catalog_action . '&action=update&extension=' . urlencode($block_vars['META_NAME']), - 'REMOVE' => [ - 'url' => $this->u_catalog_action . '&action=remove&extension=' . urlencode($block_vars['META_NAME']), - 'color' => '#BC2A4D;', - ] + 'REMOVE' => $this->u_catalog_action . '&action=remove&extension=' . urlencode($block_vars['META_NAME']), ]); } } @@ -997,6 +991,7 @@ class acp_extensions $this->output_actions('disabled', array( 'ENABLE' => $this->u_action . '&action=enable_pre&ext_name=' . urlencode($name), + 'REMOVE' => $this->u_catalog_action . '&action=remove&extension=' . urlencode($block_vars['META_NAME']), )); } } @@ -1009,11 +1004,12 @@ class acp_extensions */ private function output_actions($block, $actions) { - foreach ($actions as $lang => $url) + foreach ($actions as $action => $url) { $this->template->assign_block_vars($block . '.actions', [ - 'L_ACTION' => $this->user->lang('EXTENSION_' . $lang), - 'L_ACTION_EXPLAIN' => (isset($this->user->lang['EXTENSION_' . $lang . '_EXPLAIN'])) ? $this->user->lang('EXTENSION_' . $lang . '_EXPLAIN') : '', + 'ACTION' => $action, + 'L_ACTION' => $this->user->lang('EXTENSION_' . $action), + 'L_ACTION_EXPLAIN' => (isset($this->user->lang['EXTENSION_' . $action . '_EXPLAIN'])) ? $this->user->lang('EXTENSION_' . $action . '_EXPLAIN') : '', 'U_ACTION' => $url, ]); } diff --git a/tests/functional/extension_acp_test.php b/tests/functional/extension_acp_test.php index 3764abe9de..f36df243f3 100644 --- a/tests/functional/extension_acp_test.php +++ b/tests/functional/extension_acp_test.php @@ -267,29 +267,111 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case public function test_extensions_catalog_installing_extension() { - // Lets check page 6 where 'Scroll Page' should be listed + // Lets check page 6 where 'Scroll Page' and 'Scroll To Top' should be listed $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=catalog&start=100&sid=' . $this->sid); $this->assertContainsLang('ACP_EXTENSIONS_CATALOG', $this->get_content()); - // Ensure catalog has any records in extensions list - $this->assertGreaterThan(0, $crawler->filter('tbody > tr > td > strong')->count()); - - // Attempt to install vse/scrollpage extension - $extension_install_link = $crawler->filter('tr')->reduce( + // Get Install links for both extensions + $scrollpage_install_link = $crawler->filter('tr')->reduce( function ($node, $i) { return (bool) (strpos($node->text(), 'Scroll Page') !== false); } )->selectLink($this->lang('INSTALL'))->link(); - $crawler = self::$client->click($extension_install_link); - $this->assertContainsLang('EXTENSIONS_INSTALLED', $crawler->filter('.successbox > p')->text()); + $scrolltotop_install_link = $crawler->filter('tr')->reduce( + function ($node, $i) + { + return (bool) (strpos($node->text(), 'Scroll To Top') !== false); + } + )->selectLink($this->lang('INSTALL'))->link(); + // Attempt to install vse/scrollpage extension + $crawler = self::$client->click($scrollpage_install_link); + $this->assertContainsLang('EXTENSIONS_INSTALLED', $crawler->filter('.successbox > p')->text()); // Assert there's console log output $this->assertStringContainsString('Installing vse/scrollpage', $crawler->filter('.console-output > pre')->text()); + // Attempt to install vse/scrolltotop extension + $crawler = self::$client->click($scrolltotop_install_link); + $this->assertContainsLang('EXTENSIONS_INSTALLED', $crawler->filter('.successbox > p')->text()); + // Assert there's console log output + $this->assertStringContainsString('Installing vse/scrolltotop', $crawler->filter('.console-output > pre')->text()); + // Ensure installed extension appears in available extensions list $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid); + $this->assertStringContainsString('Scroll To Top', $crawler->filter('strong[title="vse/scrolltotop"]')->text()); + $this->assertStringContainsString('Scroll Page', $crawler->filter('strong[title="vse/scrollpage"]')->text()); + } + + public function test_extensions_catalog_updating_extension() + { + // Enable 'Scroll Page' extension installed earlier + $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid); + $extension_enable_link = $crawler->filter('tr')->reduce( + function ($node, $i) + { + return (bool) (strpos($node->text(), 'Scroll Page') !== false); + } + )->selectLink($this->lang('EXTENSION_ENABLE'))->link(); + $crawler = self::$client->click($extension_enable_link); + $form = $crawler->selectButton($this->lang('EXTENSION_ENABLE'))->form(); + $crawler = self::submit($form); + $this->assertContainsLang('EXTENSION_ENABLE_SUCCESS', $crawler->filter('.successbox')->text()); + + // Update 'Scroll Page' enabled extension + $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid); + $scrollpage_update_link = $crawler->filter('tr')->reduce( + function ($node, $i) + { + return (bool) (strpos($node->text(), 'Scroll Page') !== false); + } + )->selectLink($this->lang('EXTENSION_UPDATE'))->link(); + $crawler = self::$client->click($scrollpage_update_link); + $this->assertContainsLang('EXTENSIONS_UPDATED', $crawler->filter('.successbox > p')->text()); + // Assert there's console log output + $this->assertStringContainsString('Updating packages', $crawler->filter('.console-output > pre')->text()); + + // Ensure installed extension still appears in available extensions list + $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid); $this->assertStringContainsString('Scroll Page', $crawler->filter('strong[title="vse/scrollpage"]')->text()); } + + public function test_extensions_catalog_removing_extension() + { + $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid); + + // Check if both enabled and disabled extensions have 'Remove' action available + $scrollpage_remove_link = $crawler->filter('tr')->reduce( + function ($node, $i) + { + return (bool) (strpos($node->text(), 'Scroll Page') !== false); + } + )->selectLink($this->lang('EXTENSION_REMOVE'))->link(); + + $scrolltotop_remove_link = $crawler->filter('tr')->reduce( + function ($node, $i) + { + return (bool) (strpos($node->text(), 'Scroll To Top') !== false); + } + )->selectLink($this->lang('EXTENSION_REMOVE'))->link(); + + // Test extensions removal + // Remove 'Scroll Page' enabled extension + $crawler = self::$client->click($scrollpage_remove_link); + $this->assertContainsLang('EXTENSIONS_REMOVED', $crawler->filter('.successbox > p')->text()); + // Assert there's console log output + $this->assertStringContainsString('Deleting ext/vse/scrollpage', $crawler->filter('.console-output > pre')->text()); + + // Remove 'Scroll To Top' disabled extension + $crawler = self::$client->click($scrolltotop_remove_link); + $this->assertContainsLang('EXTENSIONS_REMOVED', $crawler->filter('.successbox > p')->text()); + // Assert there's console log output + $this->assertStringContainsString('Deleting ext/vse/scrolltotop', $crawler->filter('.console-output > pre')->text()); + + // Ensure removed extensions do not appear in available extensions list + $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid); + $this->assertStringNotContainsString('Scroll Page', $this->get_content()); + $this->assertStringNotContainsString('Scroll To Top', $this->get_content()); + } }