From 333b1c8ca1b3ec37acf726d90fded22d19cf9bc7 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Sat, 23 Sep 2023 03:33:53 -0700 Subject: [PATCH] setting-admin@1 - Add E2E tests --- .../example/tests/mixin/SettingsAdminTest.php | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 mixin/setting-admin@1/example/tests/mixin/SettingsAdminTest.php diff --git a/mixin/setting-admin@1/example/tests/mixin/SettingsAdminTest.php b/mixin/setting-admin@1/example/tests/mixin/SettingsAdminTest.php new file mode 100644 index 0000000000..77d9fea1e1 --- /dev/null +++ b/mixin/setting-admin@1/example/tests/mixin/SettingsAdminTest.php @@ -0,0 +1,82 @@ +assertFileExists(static::getPath('/xml/Menu/shimmy.xml'), 'The shimmy extension must have a Menu XML file.'); + } + + public function testInstalled($cv): void { + // The permission is registered... + $items = $cv->api4('Permission', 'get', ['where' => [['name', '=', 'administer shimmy']]]); + $this->assertEquals(TRUE, $items[0]['is_active']); + + // The route is registered... + $items = $cv->api4('Route', 'get', ['where' => [['path', '=', 'civicrm/admin/setting/shimmy']]]); + $this->assertEquals('CRM_Admin_Form_Generic', $items[0]['page_callback']); + + // The nav-menu is registered... + $navMenu = $this->adminHttp('civicrm/ajax/navmenu'); + $this->assertTrue(static::hasPathLikeExpr(';civicrm/admin/setting/shimmy;', $navMenu), 'Page should be in nav-menu'); + + // And the route works... + $pageContent = $this->adminHttp('civicrm/admin/setting/shimmy?reset=1'); + $this->assertMatchesRegularExpression(';crm-setting-block;', $pageContent); + } + + public function testDisabled($cv): void { + $items = $cv->api4('Permission', 'get', ['where' => [['name', '=', 'administer shimmy']]]); + $this->assertEquals(FALSE, $items[0]['is_active']); + + $items = $cv->api4('Route', 'get', ['where' => [['path', '=', 'civicrm/admin/setting/shimmy']]]); + $this->assertEmpty($items); + + $navMenu = $this->adminHttp('civicrm/ajax/navmenu'); + $this->assertFalse(static::hasPathLikeExpr(';civicrm/admin/setting/shimmy;', $navMenu), 'Page should not be in nav-menu'); + + $pageContent = $this->adminHttp('civicrm/admin/setting/shimmy?reset=1'); + $this->assertDoesNotMatchRegularExpression(';crm-setting-block;', $pageContent); + } + + public function testUninstalled($cv): void { + $items = $cv->api4('Permission', 'get', ['where' => [['name', '=', 'administer shimmy']]]); + $this->assertEquals(0, count($items)); + + $items = $cv->api4('Route', 'get', ['where' => [['path', '=', 'civicrm/admin/setting/shimmy']]]); + $this->assertEmpty($items); + + $navMenu = $this->adminHttp('civicrm/ajax/navmenu'); + $this->assertFalse(static::hasPathLikeExpr(';civicrm/admin/setting/shimmy;', $navMenu), 'Page should not be in nav-menu'); + + $pageContent = $this->adminHttp('civicrm/admin/setting/shimmy?reset=1'); + $this->assertDoesNotMatchRegularExpression(';crm-setting-block;', $pageContent); + } + + protected static function getPath($suffix = ''): string { + return dirname(__DIR__, 2) . $suffix; + } + + protected static function adminHttp(string $path) { + $cmd = sprintf('http %s --login -U %s', escapeshellarg($path), escapeshellarg($GLOBALS['_CV']['ADMIN_USER'])); + return cv($cmd, 'raw'); + } + + protected static function hasPathLikeExpr($pattern, $httpResponse) { + // URL formatting varies by UF and content-type... we just want something generally close... + $httpResponse = str_replace('%2F', '/', $httpResponse); + $httpResponse = str_replace('%2f', '/', $httpResponse); + $httpResponse = str_replace('\\/', '/', $httpResponse); + return (bool) preg_match($pattern, $httpResponse); + } + +} -- 2.25.1