Ctrl K
ComunidadGuías…

frontend/e2e/entity-online.test.ts

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/* 创作者在线视图:纯图片作者、页内筛选和详情返回,在两个视口下守住同一组行为。 */
import assert from 'node:assert/strict';
import { after, before, describe, it } from 'node:test';
import type { Browser } from 'playwright-core';
import { FIRST, openFollowFeed } from './follow-fixture.ts';
import { launch, layout, settle, VIEWPORTS } from './harness.ts';

describe('创作者在线视图', () => {
  let browser: Browser;
  before(async () => { browser = await launch() });
  after(async () => { await browser.close() });
  for (const viewport of VIEWPORTS) {
    it(`${viewport.name} 纯图片作者显示在线图片,详情返回保留筛选与滚动`, { timeout: 60_000 }, async () => {
      const opened = await openFollowFeed(browser, '/follow?media=images', viewport);
      const page = opened.page;
      try {
        const groups = FIRST.filter((group) => group.primary.media_kind === 'image');
        await page.route(/\/api\/entity\?/, (route) => route.fulfill({ json: {
          id: 8892, kind: 'creator', canonical_name: 'Online Author', aliases: [], display_aliases: [],
          user_aliases: [], asset_count: 0, tags: [], links: [], metadata: {},
          follow: { key: 'name:kou', n: groups.length, providers: ['Rule34.xxx'], avatar: '', avatar_fallback: '', held: [] },
        } }));
        await page.route(/\/api\/photos\?/, (route) => route.fulfill({ json: { items: [], total: 0, sets: [] } }));
        await page.route(/\/api\/items\?/, (route) => route.fulfill({ json: { items: [], total: 0 } }));
        await page.route((url) => url.pathname === '/api/follow' && !url.searchParams.has('item'), (route) =>
          route.fulfill({ json: { groups, sources: [], author_aliases: [], counts: { new: groups.length },
            author_facets: { providers: ['rule34xxx'], tags: [] }, offset: 0, has_more: false } }));
        await page.goto(new URL('/creators/Online%20Author', page.url()).href, { waitUntil: 'load' });
        await page.locator('[data-entity-online] [data-follow-item]').first().waitFor();
        await settle(page);
        assert.equal(await page.locator('[data-follow-wall]').count(), 1);
        assert.equal(await page.locator('[data-entity-online] [data-follow-item]').count(), groups.length);
        await page.locator('[data-entity-state="new"]').click();
        await settle(page);
        await page.evaluate(() => window.scrollTo(0, 150));
        const scroll = await page.evaluate(() => window.scrollY);
        await page.locator('[data-entity-online] [data-follow-open]').first().click();
        await page.locator('#stage[open] [data-follow-detail-side]').waitFor();
        await page.keyboard.press('Escape');
        await page.waitForFunction(() => location.pathname.startsWith('/creators/'));
        await settle(page);
        assert.equal(await page.locator('[data-entity-state="new"]').getAttribute('aria-pressed'), 'true');
        assert.equal(await page.evaluate(() => window.scrollY), scroll);
        const bounds = await layout(page);
        assert.equal(bounds.scrollWidth, bounds.viewportWidth);
        assert.deepEqual(bounds.offenders, []);
        assert.deepEqual(opened.problems, []);
      } finally { await opened.close() }
    });
  }
});