test(e2e): freeze the four reproductions this work started from
Each was written first and watched fail first: - `view-lifecycle` — pressing `s` on Settings must not skip an album out of the Autotag queue, and on Autotag the same key must not also toggle shuffle. - `player-truth` — the elapsed clock tracks the backend through steady playback and four keyboard seeks (the measurement that failed by 30 s), a finished queue keeps the track on the bar at 0:00, and auto-advance skips a missing file and reaches the next track. - `offline-icons` — blocks every non-local request and asserts on the <svg> *inside* each icon's shadow root, since asserting the element exists would have passed before the fix too. Verified red: 24 empty icons. - `failure-voice` — induces a real binding failure through /__test/sql and asserts a sentence appears. Its first version renamed the decoy library to its own name, which the backend accepts: it failed at the right assertion while never inducing the failure, so it now picks the row by the seeded library's name from /__test/health. - `play-count` — a finished track does not refetch the library. The queue spec now opens the panel before asserting on its rows and waits for it to close again: the panel's width is animated and the transport slides with it, so a click issued during the close lands on whichever button moved under the pointer.
This commit is contained in:
@@ -89,6 +89,14 @@ test.describe('queue', () => {
|
||||
await longRow(app).dblclick();
|
||||
await waitForEvent(app, 'QueueChanged');
|
||||
|
||||
// The panel has to be open to have rows. A closed one is `width: 0`
|
||||
// and now renders no list at all (perf.m7) — before that it kept a
|
||||
// virtualizer measuring its window on every queue change, and this
|
||||
// assertion passed against a panel nobody could see.
|
||||
const queueToggle = app.getByRole('button', { name: 'Toggle queue' });
|
||||
|
||||
await queueToggle.click();
|
||||
|
||||
await expect(app.getByTestId('queue-row')).toHaveCount(1);
|
||||
|
||||
const state = await callBinding<{ tracks: unknown[] }>(
|
||||
@@ -97,6 +105,19 @@ test.describe('queue', () => {
|
||||
);
|
||||
|
||||
expect(state.tracks).toHaveLength(1);
|
||||
|
||||
// Shut it again, and wait until it really is shut. These specs
|
||||
// share one backend process in file order, the panel's width is
|
||||
// animated, and the transport slides while it closes — a click
|
||||
// issued during that lands on whichever button has moved under the
|
||||
// pointer, which for the very next test was Repeat rather than
|
||||
// Shuffle. Both emit QueueModeChanged, so it failed on the
|
||||
// assertion rather than on the wait, one run in two.
|
||||
//
|
||||
// Waiting on the row count rather than a timeout is also the m7
|
||||
// assertion: a closed panel renders no list at all.
|
||||
await queueToggle.click();
|
||||
await expect(app.getByTestId('queue-row')).toHaveCount(0);
|
||||
});
|
||||
|
||||
test('shuffle and repeat toggles report their state', async ({ app }) => {
|
||||
|
||||
Reference in New Issue
Block a user