From 3a738fe701a8de593a77540509aa4a562a2d66a1 Mon Sep 17 00:00:00 2001 From: Nathan Panchout Date: Mon, 25 Nov 2024 12:10:16 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=85(frontend)=20adapt=20all=20tests=20rel?= =?UTF-8?q?ated=20to=20the=20new=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since we no longer use an editable div but an input, we must modify the tests accordingly --- .../apps/e2e/__tests__/app-impress/common.ts | 13 +- .../e2e/__tests__/app-impress/config.spec.ts | 5 +- .../__tests__/app-impress/doc-editor.spec.ts | 27 +++-- .../__tests__/app-impress/doc-export.spec.ts | 8 +- .../__tests__/app-impress/doc-header.spec.ts | 112 ++++-------------- .../app-impress/doc-member-list.spec.ts | 6 +- .../app-impress/doc-table-content.spec.ts | 6 +- .../__tests__/app-impress/doc-version.spec.ts | 19 +-- .../app-impress/doc-visibility.spec.ts | 44 ++++--- 9 files changed, 103 insertions(+), 137 deletions(-) diff --git a/src/frontend/apps/e2e/__tests__/app-impress/common.ts b/src/frontend/apps/e2e/__tests__/app-impress/common.ts index 65e00df0..017001c8 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/common.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/common.ts @@ -40,14 +40,21 @@ export const createDoc = async ( }) .click(); - await page.getByRole('heading', { name: 'Untitled document' }).click(); - await page.keyboard.type(randomDocs[i], { delay: 100 }); - await page.getByText('Created at ').click(); + const input = page.getByRole('textbox', { name: 'doc title input' }); + await input.click(); + await input.fill(randomDocs[i]); + await input.blur(); } return randomDocs; }; +export const verifyDocName = async (page: Page, docName: string) => { + const input = page.getByRole('textbox', { name: 'doc title input' }); + await expect(input).toBeVisible(); + await expect(input).toHaveText(docName); +}; + export const addNewMember = async ( page: Page, index: number, diff --git a/src/frontend/apps/e2e/__tests__/app-impress/config.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/config.spec.ts index ebb32cce..cbc9a025 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/config.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/config.spec.ts @@ -2,7 +2,7 @@ import path from 'path'; import { expect, test } from '@playwright/test'; -import { createDoc } from './common'; +import { createDoc, verifyDocName } from './common'; const config = { CRISP_WEBSITE_ID: null, @@ -129,7 +129,8 @@ test.describe('Config', () => { browserName, 1, ); - await expect(page.locator('h2').getByText(randomDoc[0])).toBeVisible(); + + await verifyDocName(page, randomDoc[0]); const webSocket = await webSocketPromise; expect(webSocket.url()).toContain('ws://localhost:8083/collaboration/ws/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts index af5b8220..2e8c41d7 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts @@ -2,7 +2,12 @@ import path from 'path'; import { expect, test } from '@playwright/test'; -import { createDoc, goToGridDoc, mockedDocument } from './common'; +import { + createDoc, + goToGridDoc, + mockedDocument, + verifyDocName, +} from './common'; test.beforeEach(async ({ page }) => { await page.goto('/'); @@ -98,7 +103,7 @@ test.describe('Doc Editor', () => { }); const randomDoc = await createDoc(page, 'doc-editor', browserName, 1); - await expect(page.locator('h2').getByText(randomDoc[0])).toBeVisible(); + await verifyDocName(page, randomDoc[0]); let webSocket = await webSocketPromise; expect(webSocket.url()).toContain( @@ -153,7 +158,7 @@ test.describe('Doc Editor', () => { }) => { const randomDoc = await createDoc(page, 'doc-markdown', browserName, 1); - await expect(page.locator('h2').getByText(randomDoc[0])).toBeVisible(); + await verifyDocName(page, randomDoc[0]); const editor = page.locator('.ProseMirror'); await editor.click(); @@ -178,7 +183,7 @@ test.describe('Doc Editor', () => { }) => { // Check the first doc const [firstDoc] = await createDoc(page, 'doc-switch-1', browserName, 1); - await expect(page.locator('h2').getByText(firstDoc)).toBeVisible(); + await verifyDocName(page, firstDoc); const editor = page.locator('.ProseMirror'); await editor.click(); @@ -187,7 +192,8 @@ test.describe('Doc Editor', () => { // Check the second doc const [secondDoc] = await createDoc(page, 'doc-switch-2', browserName, 1); - await expect(page.locator('h2').getByText(secondDoc)).toBeVisible(); + await verifyDocName(page, secondDoc); + await expect(editor.getByText('Hello World Doc 1')).toBeHidden(); await editor.click(); await editor.fill('Hello World Doc 2'); @@ -197,7 +203,7 @@ test.describe('Doc Editor', () => { await goToGridDoc(page, { title: firstDoc, }); - await expect(page.locator('h2').getByText(firstDoc)).toBeVisible(); + await verifyDocName(page, firstDoc); await expect(editor.getByText('Hello World Doc 2')).toBeHidden(); await expect(editor.getByText('Hello World Doc 1')).toBeVisible(); }); @@ -208,7 +214,7 @@ test.describe('Doc Editor', () => { }) => { // Check the first doc const [doc] = await createDoc(page, 'doc-saves-change', browserName, 1); - await expect(page.locator('h2').getByText(doc)).toBeVisible(); + await verifyDocName(page, doc); const editor = page.locator('.ProseMirror'); await editor.click(); @@ -219,7 +225,7 @@ test.describe('Doc Editor', () => { nthRow: 2, }); - await expect(page.locator('h2').getByText(secondDoc)).toBeVisible(); + await verifyDocName(page, secondDoc); await goToGridDoc(page, { title: doc, @@ -233,8 +239,9 @@ test.describe('Doc Editor', () => { test.skip(browserName === 'webkit', 'This test is very flaky with webkit'); // Check the first doc - const [doc] = await createDoc(page, 'doc-quit-1', browserName, 1); - await expect(page.locator('h2').getByText(doc)).toBeVisible(); + const doc = await goToGridDoc(page); + + await verifyDocName(page, doc); const editor = page.locator('.ProseMirror'); await editor.click(); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts index 694cda8a..c26ed973 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts @@ -3,7 +3,7 @@ import cs from 'convert-stream'; import jsdom from 'jsdom'; import pdf from 'pdf-parse'; -import { createDoc } from './common'; +import { createDoc, verifyDocName } from './common'; test.beforeEach(async ({ page }) => { await page.goto('/'); @@ -20,7 +20,7 @@ test.describe('Doc Export', () => { return download.suggestedFilename().includes(`${randomDoc}.pdf`); }); - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); + await verifyDocName(page, randomDoc); await page.locator('.ProseMirror.bn-editor').click(); await page.locator('.ProseMirror.bn-editor').fill('Hello World'); @@ -57,7 +57,7 @@ test.describe('Doc Export', () => { return download.suggestedFilename().includes(`${randomDoc}.docx`); }); - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); + await verifyDocName(page, randomDoc); await page.locator('.ProseMirror.bn-editor').click(); await page.locator('.ProseMirror.bn-editor').fill('Hello World'); @@ -97,7 +97,7 @@ test.describe('Doc Export', () => { await route.continue(); }); - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); + await verifyDocName(page, randomDoc); await page.locator('.bn-block-outer').last().fill('Hello World'); await page.locator('.bn-block-outer').last().click(); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts index 487ac015..66b10ba1 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts @@ -6,6 +6,7 @@ import { mockedAccesses, mockedDocument, mockedInvitations, + verifyDocName, } from './common'; test.beforeEach(async ({ page }) => { @@ -59,84 +60,31 @@ test.describe('Doc Header', () => { const card = page.getByLabel( 'It is the card information about the document.', ); - await expect(card.locator('a').getByText('home')).toBeVisible(); - await expect(card.locator('h2').getByText('Mocked document')).toBeVisible(); - await expect(card.getByText('Public')).toBeVisible(); - await expect( - card.getByText('Created at 09/01/2021, 11:00 AM'), - ).toBeVisible(); - await expect(card.getByText('Your role: Owner')).toBeVisible(); + + const docTitle = card.getByRole('textbox', { name: 'doc title input' }); + await expect(docTitle).toBeVisible(); + + await expect(card.getByText('Public document')).toBeVisible(); + + await expect(card.getByText('Owner ยท')).toBeVisible(); await expect(page.getByRole('button', { name: 'Share' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'download' })).toBeVisible(); + await expect( + page.getByRole('button', { name: 'Open the document options' }), + ).toBeVisible(); }); test('it updates the title doc', async ({ page, browserName }) => { - const [randomDoc] = await createDoc(page, 'doc-update', browserName, 1); - - await page.getByRole('heading', { name: randomDoc }).fill(' '); - await page.getByText('Created at').click(); - - await expect( - page.getByRole('heading', { name: 'Untitled document' }), - ).toBeVisible(); - }); - - test('it updates the title doc from editor heading', async ({ page }) => { - await page - .getByRole('button', { - name: 'New doc', - }) - .click(); - - const docHeader = page.getByLabel( - 'It is the card information about the document.', - ); - - await expect( - docHeader.getByRole('heading', { name: 'Untitled document', level: 2 }), - ).toBeVisible(); - - const editor = page.locator('.ProseMirror'); - - await editor.locator('h1').click(); - await page.keyboard.type('Hello World', { delay: 100 }); - - await expect( - docHeader.getByRole('heading', { name: 'Hello World', level: 2 }), - ).toBeVisible(); - - await expect( - page.getByText('Document title updated successfully'), - ).toBeVisible(); - - await docHeader - .getByRole('heading', { name: 'Hello World', level: 2 }) - .fill('Top World'); - - await editor.locator('h1').fill('Super World'); - - await expect( - docHeader.getByRole('heading', { name: 'Top World', level: 2 }), - ).toBeVisible(); - - await editor.locator('h1').fill(''); - - // eslint-disable-next-line playwright/no-wait-for-timeout - await page.waitForTimeout(500); - - await docHeader - .getByRole('heading', { name: 'Top World', level: 2 }) - .fill(' '); - - await page.getByText('Created at').click(); - - await expect( - docHeader.getByRole('heading', { name: 'Untitled document', level: 2 }), - ).toBeVisible(); + await createDoc(page, 'doc-update', browserName, 1); + const docTitle = page.getByRole('textbox', { name: 'doc title input' }); + await expect(docTitle).toBeVisible(); + await docTitle.fill('Hello World'); + await docTitle.blur(); + await verifyDocName(page, 'Hello World'); }); test('it deletes the doc', async ({ page, browserName }) => { const [randomDoc] = await createDoc(page, 'doc-delete', browserName, 1); - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); await page.getByLabel('Open the document options').click(); await page @@ -193,16 +141,13 @@ test.describe('Doc Header', () => { await goToGridDoc(page); - await expect( - page.locator('h2').getByText('Mocked document'), - ).toHaveAttribute('contenteditable'); + await expect(page.getByRole('button', { name: 'download' })).toBeVisible(); await page.getByLabel('Open the document options').click(); - await expect(page.getByRole('button', { name: 'Export' })).toBeVisible(); await expect( page.getByRole('button', { name: 'Delete document' }), - ).toBeHidden(); + ).toBeDisabled(); // Click somewhere else to close the options await page.click('body', { position: { x: 0, y: 0 } }); @@ -271,16 +216,12 @@ test.describe('Doc Header', () => { await goToGridDoc(page); - await expect( - page.locator('h2').getByText('Mocked document'), - ).toHaveAttribute('contenteditable'); - + await expect(page.getByRole('button', { name: 'download' })).toBeVisible(); await page.getByLabel('Open the document options').click(); - await expect(page.getByRole('button', { name: 'Export' })).toBeVisible(); await expect( page.getByRole('button', { name: 'Delete document' }), - ).toBeHidden(); + ).toBeDisabled(); // Click somewhere else to close the options await page.click('body', { position: { x: 0, y: 0 } }); @@ -349,16 +290,12 @@ test.describe('Doc Header', () => { await goToGridDoc(page); - await expect( - page.locator('h2').getByText('Mocked document'), - ).not.toHaveAttribute('contenteditable'); - + await expect(page.getByRole('button', { name: 'download' })).toBeVisible(); await page.getByLabel('Open the document options').click(); - await expect(page.getByRole('button', { name: 'Export' })).toBeVisible(); await expect( page.getByRole('button', { name: 'Delete document' }), - ).toBeHidden(); + ).toBeDisabled(); // Click somewhere else to close the options await page.click('body', { position: { x: 0, y: 0 } }); @@ -497,6 +434,7 @@ test.describe('Documents Header mobile', () => { await goToGridDoc(page); + await page.getByLabel('Open the document options').click(); await page.getByRole('button', { name: 'Share' }).click(); await expect(page.getByLabel('Share modal')).toBeVisible(); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts index f45eba01..3d9553a1 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from '@playwright/test'; import { waitForElementCount } from '../helpers'; -import { addNewMember, createDoc, goToGridDoc } from './common'; +import { addNewMember, createDoc, goToGridDoc, verifyDocName } from './common'; test.beforeEach(async ({ page }) => { await page.goto('/'); @@ -127,7 +127,7 @@ test.describe('Document list members', () => { test('it checks the role rules', async ({ page, browserName }) => { const [docTitle] = await createDoc(page, 'Doc role rules', browserName, 1); - await expect(page.locator('h2').getByText(docTitle)).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); @@ -188,7 +188,7 @@ test.describe('Document list members', () => { test('it checks the delete members', async ({ page, browserName }) => { const [docTitle] = await createDoc(page, 'Doc role rules', browserName, 1); - await expect(page.locator('h2').getByText(docTitle)).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-table-content.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-table-content.spec.ts index a3ce178a..5fd42f6f 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-table-content.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-table-content.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { createDoc, goToGridDoc } from './common'; +import { createDoc, goToGridDoc, verifyDocName } from './common'; test.beforeEach(async ({ page }) => { await page.goto('/'); @@ -17,7 +17,7 @@ test.describe('Doc Table Content', () => { 1, ); - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); + await verifyDocName(page, randomDoc); await page.getByLabel('Open the document options').click(); await page @@ -108,7 +108,7 @@ test.describe('Doc Table Content', () => { 1, ); - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); + await verifyDocName(page, randomDoc); await expect(page.getByLabel('Open the panel')).toBeHidden(); const editor = page.locator('.ProseMirror'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts index bca0fc38..3166bd27 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts @@ -1,6 +1,11 @@ import { expect, test } from '@playwright/test'; -import { createDoc, goToGridDoc, mockedDocument } from './common'; +import { + createDoc, + goToGridDoc, + mockedDocument, + verifyDocName, +} from './common'; test.beforeEach(async ({ page }) => { await page.goto('/'); @@ -10,7 +15,7 @@ test.describe('Doc Version', () => { test('it displays the doc versions', async ({ page, browserName }) => { const [randomDoc] = await createDoc(page, 'doc-version', browserName, 1); - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); + await verifyDocName(page, randomDoc); await page.getByLabel('Open the document options').click(); await page @@ -79,12 +84,12 @@ test.describe('Doc Version', () => { await goToGridDoc(page); - await expect(page.locator('h2').getByText('Mocked document')).toBeVisible(); + await verifyDocName(page, 'Mocked document'); await page.getByLabel('Open the document options').click(); await expect( page.getByRole('button', { name: 'Version history' }), - ).toBeHidden(); + ).toBeDisabled(); await page.getByRole('button', { name: 'Table of content' }).click(); @@ -95,12 +100,12 @@ test.describe('Doc Version', () => { test('it restores the doc version', async ({ page, browserName }) => { const [randomDoc] = await createDoc(page, 'doc-version', browserName, 1); - - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); + await verifyDocName(page, randomDoc); await page.locator('.bn-block-outer').last().click(); await page.locator('.bn-block-outer').last().fill('Hello'); + expect(true).toBe(true); await goToGridDoc(page, { title: randomDoc, }); @@ -152,7 +157,7 @@ test.describe('Doc Version', () => { }) => { const [randomDoc] = await createDoc(page, 'doc-version', browserName, 1); - await expect(page.locator('h2').getByText(randomDoc)).toBeVisible(); + await verifyDocName(page, randomDoc); const editor = page.locator('.ProseMirror'); await editor.locator('.bn-block-outer').last().click(); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts index ede359b6..c5a0cc77 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { createDoc, keyCloakSignIn } from './common'; +import { createDoc, keyCloakSignIn, verifyDocName } from './common'; const browsersName = ['chromium', 'webkit', 'firefox']; @@ -85,7 +85,7 @@ test.describe('Doc Visibility: Restricted', () => { 1, ); - await expect(page.getByRole('heading', { name: docTitle })).toBeVisible(); + await verifyDocName(page, docTitle); const urlDoc = page.url(); @@ -111,7 +111,7 @@ test.describe('Doc Visibility: Restricted', () => { const [docTitle] = await createDoc(page, 'Restricted auth', browserName, 1); - await expect(page.getByRole('heading', { name: docTitle })).toBeVisible(); + await verifyDocName(page, docTitle); const urlDoc = page.url(); @@ -139,7 +139,7 @@ test.describe('Doc Visibility: Restricted', () => { const [docTitle] = await createDoc(page, 'Restricted auth', browserName, 1); - await expect(page.getByRole('heading', { name: docTitle })).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); @@ -176,7 +176,7 @@ test.describe('Doc Visibility: Restricted', () => { await page.goto(urlDoc); - await expect(page.locator('h2').getByText(docTitle)).toBeVisible(); + await verifyDocName(page, docTitle); await expect(page.getByRole('button', { name: 'Share' })).toBeVisible(); }); }); @@ -198,7 +198,7 @@ test.describe('Doc Visibility: Public', () => { 1, ); - await expect(page.getByRole('heading', { name: docTitle })).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); await page @@ -227,10 +227,14 @@ test.describe('Doc Visibility: Public', () => { position: { x: 0, y: 0 }, }); + const cardContainer = page.getByLabel( + 'It is the card information about the document.', + ); + + await expect(cardContainer.getByTestId('public-icon')).toBeVisible(); + await expect( - page - .getByLabel('It is the card information about the document.') - .getByText('Public', { exact: true }), + cardContainer.getByText('Public document', { exact: true }), ).toBeVisible(); const urlDoc = page.url(); @@ -261,7 +265,7 @@ test.describe('Doc Visibility: Public', () => { const [docTitle] = await createDoc(page, 'Public editable', browserName, 1); - await expect(page.getByRole('heading', { name: docTitle })).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); await page @@ -290,10 +294,14 @@ test.describe('Doc Visibility: Public', () => { position: { x: 0, y: 0 }, }); + const cardContainer = page.getByLabel( + 'It is the card information about the document.', + ); + + await expect(cardContainer.getByTestId('public-icon')).toBeVisible(); + await expect( - page - .getByLabel('It is the card information about the document.') - .getByText('Public', { exact: true }), + cardContainer.getByText('Public document', { exact: true }), ).toBeVisible(); const urlDoc = page.url(); @@ -308,7 +316,7 @@ test.describe('Doc Visibility: Public', () => { await page.goto(urlDoc); - await expect(page.locator('h2').getByText(docTitle)).toBeVisible(); + await verifyDocName(page, docTitle); await expect(page.getByRole('button', { name: 'Share' })).toBeHidden(); await expect( page.getByText('Read only, you cannot edit this document'), @@ -333,7 +341,7 @@ test.describe('Doc Visibility: Authenticated', () => { 1, ); - await expect(page.getByRole('heading', { name: docTitle })).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); await page @@ -385,7 +393,7 @@ test.describe('Doc Visibility: Authenticated', () => { 1, ); - await expect(page.getByRole('heading', { name: docTitle })).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); await page @@ -451,7 +459,7 @@ test.describe('Doc Visibility: Authenticated', () => { 1, ); - await expect(page.getByRole('heading', { name: docTitle })).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); await page @@ -498,7 +506,7 @@ test.describe('Doc Visibility: Authenticated', () => { await page.goto(urlDoc); - await expect(page.locator('h2').getByText(docTitle)).toBeVisible(); + await verifyDocName(page, docTitle); await page.getByRole('button', { name: 'Share' }).click(); await expect( page.getByText('Read only, you cannot edit this document'),