import {expect, test} from '@playwright/test';
import {globalDataRequests} from '../../utils/acceptance';
import {mockApi, updatedSettingsResponse} from '@tryghost/admin-x-framework/test/acceptance';

// CodeMirror takes some time to load in Playwright meaning the first few characters typed don't always
// show up in the input. Since that lag is not consistent, this workaround ensures we type enough
// characters to consistently include the full string we want
const PADDING = 'xxxxx ';

test.describe('Code injection settings', async () => {
    test('Supports adding injected code', async ({page}) => {
        const {lastApiRequests} = await mockApi({page, requests: {
            ...globalDataRequests,
            editSettings: {method: 'PUT', path: '/settings/', response: updatedSettingsResponse([
                {key: 'codeinjection_head', value: 'testhead'},
                {key: 'codeinjection_foot', value: 'testfoot'}
            ])}
        }});

        await page.goto('/');

        const section = page.getByTestId('code-injection');

        await section.getByRole('button', {name: 'Open'}).click();

        const modal = page.getByTestId('modal-code-injection');
        // Click on the CodeMirror content to make sure it's loaded
        await modal.getByTestId('header-code').locator('.cm-content').click();

        for (const character of (PADDING + 'testhead').split('')) {
            await page.keyboard.press(character);
        }

        await modal.getByRole('tab', {name: 'Site footer'}).click();
        await modal.getByTestId('footer-code').locator('.cm-content').click();

        for (const character of (PADDING + 'testfoot').split('')) {
            await page.keyboard.press(character);
        }

        await modal.getByRole('button', {name: 'Save'}).click();

        expect(lastApiRequests.editSettings?.body).toMatchObject({
            settings: [
                {key: 'codeinjection_head', value: /testhead$/},
                {key: 'codeinjection_foot', value: /testfoot$/}
            ]
        });
    });
});
