diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 8cca80c..9bb0bff 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -31,6 +31,9 @@ jobs: tools: composer coverage: none + - name: Install Composer dependencies + run: composer install --no-dev --no-scripts --optimize-autoloader + - name: Install npm dependencies run: npm ci env: @@ -55,6 +58,14 @@ jobs: echo "exit_code=$?" >> $GITHUB_OUTPUT continue-on-error: false + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-test-results-${{ matrix.shardIndex }} + path: ${{ inputs.path-to-results || 'test-results/' }} + if-no-files-found: ignore + retention-days: 2 + - name: Check test results if: steps.playwright-tests.outcome == 'failure' run: | diff --git a/.gitignore b/.gitignore index aafd4f4..7443871 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ assets/js/ .env tmp/ .phpunit.result.cache +test-results/ !tests/phpunit/hello-elementor diff --git a/tests/playwright/pages/settings-page.ts b/tests/playwright/pages/settings-page.ts new file mode 100644 index 0000000..7f50eb5 --- /dev/null +++ b/tests/playwright/pages/settings-page.ts @@ -0,0 +1,157 @@ +import { APIRequestContext, type Page, type TestInfo, expect } from '@playwright/test'; +import WpAdminPage from './wp-admin-page.ts'; + +export default class SettingsPage extends WpAdminPage { + async gotoSettingsPage(): Promise { + await this.page.goto( '/wp-admin/admin.php?page=hello-elementor-settings' ); + await this.page.waitForSelector( 'h4:has-text("Advanced theme settings")', { timeout: 10000 } ); + } + + getTab( tabName: string ) { + return this.page.getByRole( 'tab', { name: tabName } ); + } + + getTabPanel( tabName: string ) { + return this.page.getByRole( 'tabpanel', { name: tabName } ); + } + + async createNewBasicPost(): Promise { + const request: APIRequestContext = this.page.context().request, + postDataInitial = { + title: 'Playwright Test Page - Uninitialized', + content: 'This is a test content for the post.', + status: 'publish' as const, + excerpt: 'This is a test excerpt that should appear in meta description.', + }, + postId = await this.apiRequests.create( request, 'pages', postDataInitial ), + postDataUpdated = { + title: `Playwright Test Page #${ postId }`, + }; + + await this.apiRequests.create( request, `pages/${ postId }`, postDataUpdated ); + + return postId; + } + + async clickTab( tabName: string ): Promise { + await this.getTab( tabName ).click(); + await this.page.waitForSelector( `[role="tabpanel"]:visible`, { timeout: 5000 } ); + } + + getCheckboxByIndex( index: number ) { + return this.page.locator( 'input[type="checkbox"]' ).nth( index ); + } + + getCheckboxBySetting( settingName: string ) { + const settingMap: { [key: string]: number } = { + 'Disable description meta tag': 0, + 'Disable skip links': 1, + 'Disable theme header and footer': 0, + 'Hide page title': 1, + 'Deregister Hello reset.css': 0, + 'Deregister Hello theme.css': 1, + }; + return this.page.locator( `input[type="checkbox"]` ).nth( settingMap[ settingName ] || 0 ); + } + + async toggleSetting( settingName: string ): Promise { + const checkbox = this.getCheckboxBySetting( settingName ); + await checkbox.click(); + await this.waitForSaveNotification(); + return await checkbox.isChecked(); + } + + async toggleCheckboxByIndex( index: number ): Promise { + const checkbox = this.getCheckboxByIndex( index ); + await checkbox.click(); + await this.waitForSaveNotification(); + return await checkbox.isChecked(); + } + + async waitForSaveNotification(): Promise { + await expect( this.page.locator( '[role="alert"]:has-text("Settings Saved")' ).first() ).toBeVisible( { timeout: 5000 } ); + } + + async closeSaveNotification(): Promise { + const notification = this.page.locator( '[role="alert"]:has-text("Settings Saved")' ); + if ( await notification.isVisible() ) { + await notification.getByRole( 'button', { name: 'Close' } ).click(); + } + } + + async openChangelog(): Promise { + await this.page.getByRole( 'link', { name: 'Changelog' } ).click(); + await expect( this.page.locator( 'h4:has-text("Changelog")' ) ).toBeVisible( { timeout: 5000 } ); + } + + async closeChangelogWithEscape(): Promise { + await this.page.keyboard.press( 'Escape' ); + await expect( this.page.locator( '[role="dialog"]' ) ).not.toBeVisible( { timeout: 3000 } ); + } + + async closeChangelogByClickingOutside(): Promise { + await this.page.locator( '[role="dialog"]' ).click( { position: { x: 5, y: 5 } } ); + await expect( this.page.locator( '[role="dialog"]' ) ).not.toBeVisible( { timeout: 3000 } ); + } + + async getChangelogVersions(): Promise { + const versionElements = this.page.locator( 'h6[class*="MuiTypography"]:regex("\\d+\\.\\d+\\.\\d+ - \\d{4}-\\d{2}-\\d{2}")' ); + return await versionElements.allTextContents(); + } + + async hasWarningAlert(): Promise { + return await this.page.locator( '[role="alert"]:has-text("Be Careful")' ).isVisible(); + } + + async getSettingDescription( settingName: string ): Promise { + const descriptionElement = this.page.locator( `h6:has-text("${ settingName }") ~ * p:has-text("What it does:")` ); + return await descriptionElement.textContent() || ''; + } + + async getSettingTip( settingName: string ): Promise { + const tipElement = this.page.locator( `h6:has-text("${ settingName }") ~ * p:has-text("Tip:")` ); + return await tipElement.textContent() || ''; + } + + async getSettingCode( settingName: string ): Promise { + const codeElement = this.page.locator( `h6:has-text("${ settingName }") ~ * code` ); + return await codeElement.textContent() || ''; + } + + async waitForPageLoad(): Promise { + await this.page.waitForSelector( 'h4:has-text("Advanced theme settings")', { timeout: 10000 } ); + await this.page.waitForSelector( '[role="tablist"]', { timeout: 5000 } ); + await this.page.waitForSelector( '[role="tabpanel"]:visible', { timeout: 5000 } ); + await this.page.waitForTimeout( 1000 ); + } + + async resetToDefaults(): Promise { + const tabs = [ + 'SEO and accessibility', + 'Structure and layout', + 'CSS and styling control', + ]; + + for ( const tabName of tabs ) { + await this.clickTab( tabName ); + + const checkboxes = this.page.locator( 'input[type="checkbox"]' ); + const count = await checkboxes.count(); + + for ( let i = 0; i < count; i++ ) { + const checkbox = checkboxes.nth( i ); + const isChecked = await checkbox.isChecked(); + + let shouldBeChecked = false; + if ( 'Structure and layout' === tabName && 1 === i ) { + shouldBeChecked = true; + } + + if ( isChecked !== shouldBeChecked ) { + await checkbox.click(); + await this.waitForSaveNotification(); + } + } + } + } +} diff --git a/tests/playwright/tests/settings/description-meta-tag.test.ts b/tests/playwright/tests/settings/description-meta-tag.test.ts new file mode 100644 index 0000000..4260612 --- /dev/null +++ b/tests/playwright/tests/settings/description-meta-tag.test.ts @@ -0,0 +1,60 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Description Meta Tag Setting - Behavior Tests', () => { + let postId: string; + + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + postId = await settingsPage.createNewBasicPost(); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'SEO and accessibility' ); + } ); + + test( 'should not show meta description on page when the "Disable description meta tag" setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const metaCheckbox = settingsPage.getCheckboxBySetting( 'Disable description meta tag' ); + + const isChecked = await metaCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Disable description meta tag' ); + } + + await page.goto( `/?p=${ postId }` ); + + const metaDescription = page.locator( 'meta[name="description"]' ); + await expect( metaDescription ).not.toBeAttached(); + } ); + + test( 'should show meta description on page when the "Disable description meta tag" setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const metaCheckbox = settingsPage.getCheckboxBySetting( 'Disable description meta tag' ); + + const isChecked = await metaCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Disable description meta tag' ); + } + + await page.goto( `/?p=${ postId }` ); + + const metaDescription = page.locator( 'meta[name="description"]' ); + await expect( metaDescription ).toBeAttached(); + } ); + + test( 'should not show meta description on home page when the "Disable description meta tag" setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const metaCheckbox = settingsPage.getCheckboxBySetting( 'Disable description meta tag' ); + + const isChecked = await metaCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Disable description meta tag' ); + } + + await page.goto( '/' ); + + const metaDescription = page.locator( 'meta[name="description"]' ); + await expect( metaDescription ).not.toBeAttached(); + } ); +} ); diff --git a/tests/playwright/tests/settings/header-footer.test.ts b/tests/playwright/tests/settings/header-footer.test.ts new file mode 100644 index 0000000..1450bf4 --- /dev/null +++ b/tests/playwright/tests/settings/header-footer.test.ts @@ -0,0 +1,48 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Header and Footer Setting - Behavior Tests', () => { + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'Structure and layout' ); + } ); + + test( 'should show header and footer by default when setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const headerFooterCheckbox = settingsPage.getCheckboxBySetting( 'Disable theme header and footer' ); + + const isChecked = await headerFooterCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Disable theme header and footer' ); + } + + await page.goto( '/' ); + + const header = page.locator( 'header#site-header.site-header' ); + const footer = page.locator( 'footer#site-footer.site-footer' ); + + await expect( header ).toBeAttached(); + await expect( footer ).toBeAttached(); + } ); + + test( 'should hide header and footer when setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const headerFooterCheckbox = settingsPage.getCheckboxBySetting( 'Disable theme header and footer' ); + const isChecked = await headerFooterCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Disable theme header and footer' ); + } + + await page.goto( '/' ); + + const header = page.locator( 'header#site-header.site-header' ); + const footer = page.locator( 'footer#site-footer.site-footer' ); + + await expect( header ).not.toBeAttached(); + await expect( footer ).not.toBeAttached(); + } ); +} ); diff --git a/tests/playwright/tests/settings/page-title.test.ts b/tests/playwright/tests/settings/page-title.test.ts new file mode 100644 index 0000000..b740e73 --- /dev/null +++ b/tests/playwright/tests/settings/page-title.test.ts @@ -0,0 +1,49 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Page Title Setting - Behavior Tests', () => { + let postId: string; + + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + postId = await settingsPage.createNewBasicPost(); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'Structure and layout' ); + } ); + + test( 'should hide page title when setting is checked', async ( { page, apiRequests, request }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const pageTitleCheckbox = settingsPage.getCheckboxBySetting( 'Hide page title' ); + + const isChecked = await pageTitleCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Hide page title' ); + } + + // Act - Navigate to the test post + await page.goto( `/?p=${ postId }` ); + + // Assert - Page title should be hidden + const pageHeader = page.locator( '.page-header h1.entry-title' ); + await expect( pageHeader ).not.toBeAttached(); + } ); + + test( 'should show page title when setting is unchecked', async ( { page, apiRequests, request }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const pageTitleCheckbox = settingsPage.getCheckboxBySetting( 'Hide page title' ); + const isChecked = await pageTitleCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Hide page title' ); + } + + // Act - Navigate to the test post + await page.goto( `/?p=${ postId }` ); + + // Assert - Page title should be visible + const pageHeader = page.locator( '.page-header h1.entry-title' ); + await expect( pageHeader ).toBeAttached(); + await expect( pageHeader ).toHaveText( 'Playwright Test Page #' + postId ); + } ); +} ); diff --git a/tests/playwright/tests/settings/reset-css.test .ts b/tests/playwright/tests/settings/reset-css.test .ts new file mode 100644 index 0000000..654f296 --- /dev/null +++ b/tests/playwright/tests/settings/reset-css.test .ts @@ -0,0 +1,68 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Reset CSS Setting - Behavior Tests', () => { + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'CSS and styling control' ); + } ); + + test( 'should load reset.css by default when setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const themeCssCheckbox = settingsPage.getCheckboxBySetting( 'Deregister Hello reset.css' ); + + const isChecked = await themeCssCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Deregister Hello reset.css' ); + } + + const cssRequests: string[] = []; + page.on( 'request', ( request ) => { + if ( request.url().includes( '.css' ) ) { + cssRequests.push( request.url() ); + } + } ); + + await page.goto( '/' ); + + const themeCssLoaded = cssRequests.some( ( url ) => + url.includes( '/hello-theme/assets/css/reset.css' ), + ); + + expect( themeCssLoaded ).toBeTruthy(); + + const themeCssLink = page.locator( 'link[rel="stylesheet"][href*="hello-theme"][href*="reset.css"]' ); + await expect( themeCssLink ).toBeAttached(); + } ); + + test( 'should not load reset.css when setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const themeCssCheckbox = settingsPage.getCheckboxBySetting( 'Deregister Hello reset.css' ); + const isChecked = await themeCssCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Deregister Hello reset.css' ); + } + + const cssRequests: string[] = []; + page.on( 'request', ( request ) => { + if ( request.url().includes( '.css' ) ) { + cssRequests.push( request.url() ); + } + } ); + + await page.goto( '/' ); + + const themeCssLoaded = cssRequests.some( ( url ) => + url.includes( '/hello-theme/assets/css/reset.css' ), + ); + + expect( themeCssLoaded ).toBeFalsy(); + + const themeCssLink = page.locator( 'link[rel="stylesheet"][href*="hello-theme"][href*="reset.css"]' ); + await expect( themeCssLink ).not.toBeAttached(); + } ); +} ); diff --git a/tests/playwright/tests/settings/settings-suite.test.ts b/tests/playwright/tests/settings/settings-suite.test.ts new file mode 100644 index 0000000..0d00a83 --- /dev/null +++ b/tests/playwright/tests/settings/settings-suite.test.ts @@ -0,0 +1,73 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Hello Biz Settings - Complete Test Suite', () => { + test( 'should verify all settings tabs are accessible', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + + const tabs = [ + 'SEO and accessibility', + 'Structure and layout', + 'CSS and styling control', + ]; + + for ( const tabName of tabs ) { + const tab = settingsPage.getTab( tabName ); + await expect( tab ).toBeVisible(); + + await settingsPage.clickTab( tabName ); + const panel = settingsPage.getTabPanel( tabName ); + await expect( panel ).toBeVisible(); + } + } ); + + test( 'should toggle settings correctly', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + + await settingsPage.clickTab( 'SEO and accessibility' ); + const skipLinksCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + const initialSkipLinksState = await skipLinksCheckbox.isChecked(); + + await settingsPage.toggleSetting( 'Disable skip links' ); + const newSkipLinksState = await skipLinksCheckbox.isChecked(); + expect( newSkipLinksState ).toBe( ! initialSkipLinksState ); + + await settingsPage.clickTab( 'Structure and layout' ); + const headerFooterCheckbox = settingsPage.getCheckboxBySetting( 'Disable theme header and footer' ); + const initialHeaderFooterState = await headerFooterCheckbox.isChecked(); + + await settingsPage.toggleSetting( 'Disable theme header and footer' ); + const newHeaderFooterState = await headerFooterCheckbox.isChecked(); + expect( newHeaderFooterState ).toBe( ! initialHeaderFooterState ); + } ); + + test( 'should persist settings across page reloads', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + + await settingsPage.clickTab( 'SEO and accessibility' ); + const skipLinksCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + const initialState = await skipLinksCheckbox.isChecked(); + + await settingsPage.toggleSetting( 'Disable skip links' ); + const stateAfterToggle = await skipLinksCheckbox.isChecked(); + + await page.reload(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'SEO and accessibility' ); + + const stateAfterReload = await skipLinksCheckbox.isChecked(); + expect( stateAfterReload ).toBe( stateAfterToggle ); + + await settingsPage.toggleSetting( 'Disable skip links' ); + const finalState = await skipLinksCheckbox.isChecked(); + expect( finalState ).toBe( initialState ); + } ); +} ); diff --git a/tests/playwright/tests/settings/skip-links.test.ts b/tests/playwright/tests/settings/skip-links.test.ts new file mode 100644 index 0000000..c863c46 --- /dev/null +++ b/tests/playwright/tests/settings/skip-links.test.ts @@ -0,0 +1,63 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Skip Links Setting - Behavior Tests', () => { + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'SEO and accessibility' ); + } ); + + test( 'should show skip link by default when setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const skipLinkCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + + const isChecked = await skipLinkCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Disable skip links' ); + } + + await page.goto( '/' ); + + const skipLink = page.locator( 'a.skip-link.screen-reader-text[href="#content"]' ); + await expect( skipLink ).toBeAttached(); + await expect( skipLink ).toHaveText( 'Skip to content' ); + } ); + + test( 'should hide skip link when setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const skipLinkCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + const isChecked = await skipLinkCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Disable skip links' ); + } + + await page.goto( '/' ); + + const skipLink = page.locator( 'a.skip-link.screen-reader-text[href="#content"]' ); + await expect( skipLink ).not.toBeAttached(); + } ); + + test( 'should verify skip link functionality when visible', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const skipLinkCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + const isChecked = await skipLinkCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Disable skip links' ); + } + + await page.goto( '/' ); + + const skipLink = page.locator( 'a.skip-link.screen-reader-text[href="#content"]' ); + await expect( skipLink ).toBeAttached(); + + await skipLink.focus(); + await skipLink.click(); + + await expect( page ).toHaveURL( /#content$/ ); + } ); +} ); diff --git a/tests/playwright/tests/settings/theme-css.test.ts b/tests/playwright/tests/settings/theme-css.test.ts new file mode 100644 index 0000000..0ea08b6 --- /dev/null +++ b/tests/playwright/tests/settings/theme-css.test.ts @@ -0,0 +1,68 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Theme CSS Setting - Behavior Tests', () => { + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'CSS and styling control' ); + } ); + + test( 'should load theme.css by default when setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const themeCssCheckbox = settingsPage.getCheckboxBySetting( 'Deregister Hello theme.css' ); + + const isChecked = await themeCssCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Deregister Hello theme.css' ); + } + + const cssRequests: string[] = []; + page.on( 'request', ( request ) => { + if ( request.url().includes( '.css' ) ) { + cssRequests.push( request.url() ); + } + } ); + + await page.goto( '/' ); + + const themeCssLoaded = cssRequests.some( ( url ) => + url.includes( '/hello-theme/assets/css/theme.css' ), + ); + + expect( themeCssLoaded ).toBeTruthy(); + + const themeCssLink = page.locator( 'link[rel="stylesheet"][href*="hello-theme"][href*="theme.css"]' ); + await expect( themeCssLink ).toBeAttached(); + } ); + + test( 'should not load theme.css when setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const themeCssCheckbox = settingsPage.getCheckboxBySetting( 'Deregister Hello theme.css' ); + const isChecked = await themeCssCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Deregister Hello theme.css' ); + } + + const cssRequests: string[] = []; + page.on( 'request', ( request ) => { + if ( request.url().includes( '.css' ) ) { + cssRequests.push( request.url() ); + } + } ); + + await page.goto( '/' ); + + const themeCssLoaded = cssRequests.some( ( url ) => + url.includes( '/hello-theme/assets/css/theme.css' ), + ); + + expect( themeCssLoaded ).toBeFalsy(); + + const themeCssLink = page.locator( 'link[rel="stylesheet"][href*="hello-theme"][href*="theme.css"]' ); + await expect( themeCssLink ).not.toBeAttached(); + } ); +} );