ip-operator-assistant-governance.spec.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { expect, Page, test } from '@playwright/test';
  2. import path from 'node:path';
  3. declare global {
  4. interface Window {
  5. __seedIpOperatorScenario?: (scenario: 'ready') => unknown;
  6. }
  7. }
  8. const scenarioSeedPath = path.resolve(__dirname, '../scripts/validation/ip-operator-scenario-seed.js');
  9. async function seedReadyScenario(page: Page, assistantAction?: Record<string, unknown>) {
  10. await page.addInitScript({ path: scenarioSeedPath });
  11. await page.addInitScript((action) => {
  12. window.__seedIpOperatorScenario?.('ready');
  13. localStorage.setItem('tiktok.currentTab', 'ip-operator');
  14. if (action) {
  15. sessionStorage.setItem('videoWorkflow.ipOperator.assistantAction', JSON.stringify(action));
  16. }
  17. }, assistantAction || null);
  18. }
  19. test('assistant medium-risk action enters confirmation queue', async ({ page }) => {
  20. await seedReadyScenario(page, {
  21. action: 'approve_publish_package',
  22. label: '批准发布包',
  23. reason: '会影响发布决策,需要人工确认。',
  24. });
  25. await page.goto('/');
  26. await expect(page.locator('.assistant-confirm-panel')).toBeVisible();
  27. await expect(page.locator('.assistant-confirm-panel')).toContainText('批准发布包');
  28. await expect(page.locator('.assistant-confirm-panel')).toContainText('确认执行');
  29. });
  30. test('assistant blocked automation action is rejected', async ({ page }) => {
  31. await seedReadyScenario(page, {
  32. action: 'auto_comment',
  33. label: '自动评论',
  34. reason: '涉及平台互动自动化。',
  35. });
  36. await page.goto('/');
  37. await expect(page.locator('.assistant-confirm-panel__blocked')).toBeVisible();
  38. await expect(page.locator('.assistant-confirm-panel__blocked')).toContainText('禁止执行');
  39. });
  40. test('matrix governance remains available while scheduled monitor placeholder is removed', async ({ page }) => {
  41. await seedReadyScenario(page);
  42. await page.goto('/');
  43. await expect(page.locator('.monitor-schedule-panel')).toHaveCount(0);
  44. await expect(page.locator('.legacy-plan-archive')).toHaveCount(0);
  45. await expect(page.locator('.account-manager-panel')).toContainText('运营账号生命周期');
  46. await expect(page.locator('.account-workbench')).toContainText('发布复盘');
  47. });