Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

54 linhas
3.3 KiB

  1. import fs from 'node:fs'
  2. import path from 'node:path'
  3. import { test, expect, type Page, type TestInfo } from '@playwright/test'
  4. // @ts-ignore Report metadata does not perform application actions.
  5. import { sceneEvidenceBindings } from '../tools/scene-editor-evidence-bindings.mjs'
  6. // @ts-ignore Private credentials stay outside the report and repository.
  7. import { call, login, teacherLogin, freshScene, registerProject, report, work, fixture } from '../tools/scene-editor-closure-live.mjs'
  8. export { call, freshScene, registerProject, report, work, fixture }
  9. export async function signIn(page: Page, account = 'teacher') {
  10. const session = account === 'teacher' ? await teacherLogin() : await login(account)
  11. await page.addInitScript(({ accessToken, refreshToken }) => {
  12. if (!sessionStorage.getItem('scene-closure-initialized')) {
  13. sessionStorage.setItem('unreal-tran:web:access-token:v1', accessToken)
  14. sessionStorage.setItem('unreal-tran:web:refresh-token:v1', refreshToken || '')
  15. sessionStorage.setItem('scene-closure-initialized', '1')
  16. }
  17. }, { accessToken: session.accessToken, refreshToken: session.refreshToken })
  18. return session.accessToken as string
  19. }
  20. export const diagnostics = (page: Page) => page.evaluate(() => (window as any).__sceneEditorDiagnostics?.())
  21. export async function ready(page: Page) {
  22. await expect(page.locator('.se-shell')).toBeVisible({ timeout: 90000 })
  23. await expect.poll(async () => { const d = await diagnostics(page); return Boolean(d?.readySettled && d.pendingLoads === 0) }, { timeout: 90000 }).toBe(true)
  24. }
  25. export async function openEditor(page: Page, id: string) { await page.goto(`/content/scenes/${id}/edit`); await ready(page) }
  26. export const action = (page: Page, name: string) => page.locator(`.se-shell [data-action="${name}"]`).first()
  27. export async function save(page: Page) {
  28. await action(page, 'save').click()
  29. await expect.poll(async () => { const d = await diagnostics(page); return !d.saving && !d.dirty }).toBe(true)
  30. }
  31. export async function exportDocument(page: Page) {
  32. const waiting = page.waitForEvent('download')
  33. await action(page, 'export').click()
  34. const download = await waiting
  35. const stream = await download.createReadStream()
  36. const chunks: Buffer[] = []; for await (const chunk of stream!) chunks.push(chunk)
  37. return JSON.parse(Buffer.concat(chunks).toString('utf8'))
  38. }
  39. export async function shot(page: Page, info: TestInfo, name: string) {
  40. const folder = path.join(report, 'screenshots'); fs.mkdirSync(folder, { recursive: true })
  41. const file = path.join(folder, `${name}.png`)
  42. await page.screenshot({ path: file, fullPage: true, animations: 'disabled' })
  43. await info.attach(name, { path: file, contentType: 'image/png' })
  44. }
  45. export function evidence(name: string, data: unknown) {
  46. const folder = path.join(report, 'evidence'); fs.mkdirSync(folder, { recursive: true })
  47. const metadata = { kind: 'browser', status: 'PASS', testTitle: test.info().title, ...(sceneEvidenceBindings[name] || {}) }
  48. fs.writeFileSync(path.join(folder, `${name}.json`), JSON.stringify({ time: new Date().toISOString(), data: { ...metadata, ...(data as object) } }, null, 2))
  49. }
  50. export async function closeSession(page: Page) {
  51. const token = await page.evaluate(() => sessionStorage.getItem('unreal-tran:web:access-token:v1')).catch(() => null)
  52. if (token) await call('auth/v1/auth/logout', token, {}).catch(() => {})
  53. }