- When autoLogin is enabled, it will no longer flash an unresponsive "login" screen. Instead, it will straight up open the admin panel. That's because, on the server, we will now always & immediately see the user as authenticated, thus no initial login view is pushed to the client until the client component sends the auth request anymore. Less useless requests. Additionally, jwt verification is now completely skipped - No more auto-login related frontend code. autoLogin handling has been removed from the frontend `Auth` component - less code to maintain, this is way simpler now **For reviewers:** - The new logic for autoFill without prefillOnly is here: [jwt auth strategy](https://github.com/payloadcms/payload/pull/7224/files#diff-7d40839079a8b2abb58233e5904513ab321023a70538229dfaf1dfee067dc8bfR21) - The new logic for autoFill with prefillOnly is here: [Server Login View](https://github.com/payloadcms/payload/pull/7224/files#diff-683770104f196196743398a698fbf8987f00e4426ca1c0ace3658d18ab80e82dL72) => [Client Login Form](https://github.com/payloadcms/payload/pull/7224/files#diff-ac3504d3b3b0489455245663649bef9e84477bf0c1185da5a4d3a612450f01eeL20) **BREAKING** `autoLogin` without `prefillOnly` set now also affects graphQL/Rest operations. Only the user specified in `autoLogin` will be returned. Within the graphQL/Rest/Local API, this should still allow you to authenticate with a different user, as the autoLogin user is only used if no token is set.
140 lines
4.8 KiB
TypeScript
140 lines
4.8 KiB
TypeScript
import type { Page } from '@playwright/test'
|
|
|
|
import { expect, test } from '@playwright/test'
|
|
import path from 'path'
|
|
import { fileURLToPath } from 'url'
|
|
|
|
import type { Config, Page as PayloadPage } from './payload-types.js'
|
|
|
|
import { ensureCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js'
|
|
import { AdminUrlUtil } from '../helpers/adminUrlUtil.js'
|
|
import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js'
|
|
import { TEST_TIMEOUT_LONG } from '../playwright.config.js'
|
|
const filename = fileURLToPath(import.meta.url)
|
|
const dirname = path.dirname(filename)
|
|
|
|
const { beforeAll, describe } = test
|
|
let url: AdminUrlUtil
|
|
let page: Page
|
|
let draftParentId: string
|
|
let parentId: string
|
|
let draftChildId: string
|
|
let childId: string
|
|
|
|
describe('Nested Docs Plugin', () => {
|
|
beforeAll(async ({ browser }, testInfo) => {
|
|
testInfo.setTimeout(TEST_TIMEOUT_LONG)
|
|
const { serverURL, payload } = await initPayloadE2ENoConfig<Config>({ dirname })
|
|
url = new AdminUrlUtil(serverURL, 'pages')
|
|
const context = await browser.newContext()
|
|
page = await context.newPage()
|
|
|
|
initPageConsoleErrorCatch(page)
|
|
|
|
async function createPage({
|
|
slug,
|
|
title = 'Title page',
|
|
parent,
|
|
_status = 'published',
|
|
}: Partial<PayloadPage>): Promise<PayloadPage> {
|
|
return payload.create({
|
|
collection: 'pages',
|
|
data: {
|
|
title,
|
|
slug,
|
|
_status,
|
|
parent,
|
|
},
|
|
}) as unknown as Promise<PayloadPage>
|
|
}
|
|
|
|
const parentPage = await createPage({ slug: 'parent-slug' })
|
|
parentId = parentPage.id
|
|
|
|
const childPage = await createPage({
|
|
slug: 'child-slug',
|
|
title: 'Child page',
|
|
parent: parentId,
|
|
})
|
|
childId = childPage.id
|
|
|
|
const draftParentPage = await createPage({ slug: 'parent-slug-draft', _status: 'draft' })
|
|
draftParentId = draftParentPage.id
|
|
|
|
const draftChildPage = await createPage({
|
|
slug: 'child-slug-draft',
|
|
title: 'Child page',
|
|
parent: draftParentId,
|
|
_status: 'draft',
|
|
})
|
|
draftChildId = draftChildPage.id
|
|
|
|
await ensureCompilationIsDone({ page, serverURL })
|
|
})
|
|
|
|
describe('Core functionality', () => {
|
|
const slugClass = '#field-slug'
|
|
const publishButtonClass = '#action-save'
|
|
const draftButtonClass = '#action-save-draft'
|
|
|
|
test('Parent slug updates breadcrumbs in child', async () => {
|
|
await page.goto(url.edit(childId))
|
|
let slug = page.locator(slugClass).nth(0)
|
|
await expect(slug).toHaveValue('child-slug')
|
|
|
|
// TODO: remove when error states are fixed
|
|
const apiTabButton = page.locator('text=API')
|
|
await apiTabButton.click()
|
|
const breadcrumbs = page.locator('text=/parent-slug').first()
|
|
await expect(breadcrumbs).toBeVisible()
|
|
|
|
// TODO: add back once error states are fixed
|
|
// const parentSlugInChildClass = '#field-breadcrumbs__0__url'
|
|
// const parentSlugInChild = page.locator(parentSlugInChildClass).nth(0)
|
|
// await expect(parentSlugInChild).toHaveValue('/parent-slug')
|
|
|
|
await page.goto(url.edit(parentId))
|
|
slug = page.locator(slugClass).nth(0)
|
|
await slug.fill('updated-parent-slug')
|
|
await expect(slug).toHaveValue('updated-parent-slug')
|
|
await page.locator(publishButtonClass).nth(0).click()
|
|
await page.goto(url.edit(childId))
|
|
|
|
// TODO: remove when error states are fixed
|
|
await apiTabButton.click()
|
|
const updatedBreadcrumbs = page.locator('text=/updated-parent-slug').first()
|
|
await expect(updatedBreadcrumbs).toBeVisible()
|
|
|
|
// TODO: add back once error states are fixed
|
|
// await expect(parentSlugInChild).toHaveValue('/updated-parent-slug')
|
|
})
|
|
|
|
test('Draft parent slug does not update child', async () => {
|
|
await page.goto(url.edit(draftChildId))
|
|
|
|
// TODO: remove when error states are fixed
|
|
const apiTabButton = page.locator('text=API')
|
|
await apiTabButton.click()
|
|
const breadcrumbs = page.locator('text=/parent-slug-draft').first()
|
|
await expect(breadcrumbs).toBeVisible()
|
|
|
|
// TODO: add back once error states are fixed
|
|
// const parentSlugInChildClass = '#field-breadcrumbs__0__url'
|
|
// const parentSlugInChild = page.locator(parentSlugInChildClass).nth(0)
|
|
// await expect(parentSlugInChild).toHaveValue('/parent-slug-draft')
|
|
|
|
await page.goto(url.edit(parentId))
|
|
await page.locator(slugClass).nth(0).fill('parent-updated-draft')
|
|
await page.locator(draftButtonClass).nth(0).click()
|
|
await page.goto(url.edit(draftChildId))
|
|
|
|
await apiTabButton.click()
|
|
const updatedBreadcrumbs = page.locator('text=/parent-slug-draft').first()
|
|
await expect(updatedBreadcrumbs).toBeVisible()
|
|
|
|
// TODO: add back when error states are fixed
|
|
// await expect(parentSlugInChild).toHaveValue('/parent-slug-draft')
|
|
})
|
|
})
|
|
})
|