fix(workspace): scroll/diff-race/recovery/editor/mobile polish
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import { describe, expect, test } from 'vitest';
|
||||
|
||||
import {
|
||||
createRequestSequencer,
|
||||
isNearBottom,
|
||||
NEAR_BOTTOM_THRESHOLD,
|
||||
RECOVERY_THRESHOLD,
|
||||
shouldShowRecovery,
|
||||
} from '@/components/agent-workspace/workspace-helpers';
|
||||
|
||||
describe('createRequestSequencer', () => {
|
||||
test('only the latest issued token is considered current', () => {
|
||||
const sequencer = createRequestSequencer();
|
||||
const first = sequencer.next();
|
||||
const second = sequencer.next();
|
||||
|
||||
// Simulate the first (slower) request resolving after the second: it is
|
||||
// stale and must be dropped.
|
||||
expect(sequencer.isLatest(first)).toBe(false);
|
||||
// The newest request wins.
|
||||
expect(sequencer.isLatest(second)).toBe(true);
|
||||
});
|
||||
|
||||
test('a fresh request supersedes a previously latest one', () => {
|
||||
const sequencer = createRequestSequencer();
|
||||
const token = sequencer.next();
|
||||
expect(sequencer.isLatest(token)).toBe(true);
|
||||
sequencer.next();
|
||||
expect(sequencer.isLatest(token)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('shouldShowRecovery', () => {
|
||||
test('defaults to a threshold of 3 consecutive failures', () => {
|
||||
expect(RECOVERY_THRESHOLD).toBe(3);
|
||||
expect(shouldShowRecovery(0)).toBe(false);
|
||||
expect(shouldShowRecovery(1)).toBe(false);
|
||||
expect(shouldShowRecovery(2)).toBe(false);
|
||||
expect(shouldShowRecovery(3)).toBe(true);
|
||||
expect(shouldShowRecovery(4)).toBe(true);
|
||||
});
|
||||
|
||||
test('honours a custom threshold', () => {
|
||||
expect(shouldShowRecovery(1, 2)).toBe(false);
|
||||
expect(shouldShowRecovery(2, 2)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isNearBottom', () => {
|
||||
test('true when within the threshold band of the bottom', () => {
|
||||
expect(
|
||||
isNearBottom({ scrollHeight: 1000, scrollTop: 940, clientHeight: 100 }),
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
test('false when scrolled up beyond the threshold', () => {
|
||||
expect(
|
||||
isNearBottom({ scrollHeight: 1000, scrollTop: 200, clientHeight: 100 }),
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
test('uses NEAR_BOTTOM_THRESHOLD as the default band', () => {
|
||||
expect(NEAR_BOTTOM_THRESHOLD).toBe(80);
|
||||
// Exactly at the threshold is not "near" (strict less-than).
|
||||
expect(
|
||||
isNearBottom({ scrollHeight: 1000, scrollTop: 820, clientHeight: 100 }),
|
||||
).toBe(false);
|
||||
expect(
|
||||
isNearBottom({ scrollHeight: 1000, scrollTop: 821, clientHeight: 100 }),
|
||||
).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user