diff --git a/src/Umbraco.Web.UI.Client/e2e/upgrader.spec.ts b/src/Umbraco.Web.UI.Client/e2e/upgrader.spec.ts new file mode 100644 index 0000000000..8421f333e7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/e2e/upgrader.spec.ts @@ -0,0 +1,62 @@ +import { rest } from 'msw'; + +import umbracoPath from '../src/core/helpers/umbraco-path'; +import { ProblemDetails, StatusResponse } from '../src/core/models'; +import { expect, test } from '../test'; + +test.describe('upgrader tests', () => { + test.beforeEach(async ({ page, worker }) => { + await worker.use( + // Override the server status to be "must-install" + rest.get(umbracoPath('/server/status'), (_req, res, ctx) => { + return res( + // Respond with a 200 status code + ctx.status(200), + ctx.json({ + serverStatus: 'must-upgrade', + }) + ); + }) + ); + + await page.goto('/upgrade'); + }); + + test('upgrader is shown', async ({ page }) => { + await page.waitForSelector('[data-test="upgrader"]'); + await expect(page).toHaveURL('/upgrade'); + await expect(page.locator('h1')).toHaveText('Upgrading Umbraco', { useInnerText: true }); + }); + + test('upgrader has a "View Report" button', async ({ page }) => { + await expect(page.locator('[data-test="view-report-button"]')).toBeVisible(); + }); + + test('upgrader completes successfully', async ({ page }) => { + await page.click('[data-test="continue-button"]'); + await page.waitForSelector('umb-backoffice', { timeout: 30000 }); + }); + + test('upgrader fails and shows error', async ({ page, worker }) => { + await worker.use( + // Override the server status to be "must-install" + rest.post(umbracoPath('/upgrade/authorize'), (_req, res, ctx) => { + return res( + // Respond with a 200 status code + ctx.status(400), + ctx.json({ + status: 400, + type: 'error', + detail: 'Something went wrong', + }) + ); + }) + ); + + await page.click('[data-test="continue-button"]'); + + await expect(page.locator('[data-test="error-message"]')).toHaveText('Something went wrong', { + useInnerText: true, + }); + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.element.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.element.ts index 7a2c3608fc..8b694109de 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader-view.element.ts @@ -55,6 +55,7 @@ export class UmbUpgraderView extends LitElement { ? html`

${this.errorMessage}

` : ''} `; + return html` + ${this.errorMessage ? html`

${this.errorMessage}

` : ''} + `; } render() { diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts index d9e65a755b..8b1a339c60 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts @@ -5,7 +5,8 @@ import { html, LitElement } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { getUpgradeSettings, PostUpgradeAuthorize } from '../core/api/fetcher'; -import { UmbracoUpgrader } from '../core/models'; + +import type { UmbracoUpgrader } from '../core/models'; /** * @element umb-upgrader @@ -30,7 +31,7 @@ export class UmbUpgrader extends LitElement { } render() { - return html` + return html` ({ worker: createWorkerFixture(...handlers), + page: async ({ page }, use) => { + // Set is-authenticated in sessionStorage to true + await page.addInitScript(`window.sessionStorage.setItem('is-authenticated', 'true');`); + + // Use signed-in page in all tests + await use(page); + }, }); export { test, expect };