2026-03-06 14:55:40 +08:00
|
|
|
import { describe, expect, it } from 'vitest';
|
2026-03-06 19:24:49 +08:00
|
|
|
import { formatQuoteNumber, getQuoteTargetAvailability, isUnavailableQuoteTarget, shouldShowFloatingQuotePreview } from '../quote-link-utils';
|
2026-03-06 14:55:40 +08:00
|
|
|
|
|
|
|
|
describe('quote-link-utils', () => {
|
|
|
|
|
it('formats quote numbers with the expected prefix', () => {
|
|
|
|
|
expect(formatQuoteNumber(123)).toBe('>>123');
|
|
|
|
|
expect(formatQuoteNumber()).toBe('>>?');
|
|
|
|
|
});
|
|
|
|
|
|
2026-03-06 19:24:49 +08:00
|
|
|
it('distinguishes unresolved and unavailable quote targets', () => {
|
|
|
|
|
expect(getQuoteTargetAvailability(undefined)).toBe('unresolved');
|
|
|
|
|
expect(getQuoteTargetAvailability({ deleted: true, removed: false })).toBe('unavailable');
|
|
|
|
|
expect(getQuoteTargetAvailability({ deleted: false, removed: true })).toBe('unavailable');
|
2026-03-07 13:52:48 +08:00
|
|
|
expect(getQuoteTargetAvailability({ deleted: false, removed: false, commentModeration: { purged: true } })).toBe('unavailable');
|
2026-03-06 19:24:49 +08:00
|
|
|
expect(getQuoteTargetAvailability({ deleted: false, removed: false })).toBe('available');
|
|
|
|
|
});
|
|
|
|
|
|
2026-03-07 13:52:48 +08:00
|
|
|
it('marks deleted, removed, and purged comments as unavailable quote targets', () => {
|
2026-03-06 14:55:40 +08:00
|
|
|
expect(isUnavailableQuoteTarget(undefined)).toBe(false);
|
|
|
|
|
expect(isUnavailableQuoteTarget({ deleted: true, removed: false })).toBe(true);
|
|
|
|
|
expect(isUnavailableQuoteTarget({ deleted: false, removed: true })).toBe(true);
|
2026-03-07 13:52:48 +08:00
|
|
|
expect(isUnavailableQuoteTarget({ deleted: false, removed: false, commentModeration: { purged: true } })).toBe(true);
|
2026-03-06 14:55:40 +08:00
|
|
|
expect(isUnavailableQuoteTarget({ deleted: false, removed: false })).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('only shows floating previews for available targets that are hovered out of view', () => {
|
|
|
|
|
expect(
|
|
|
|
|
shouldShowFloatingQuotePreview({
|
|
|
|
|
hoveredCid: 'cid-1',
|
|
|
|
|
outOfViewCid: 'cid-1',
|
|
|
|
|
quoteCid: 'cid-1',
|
|
|
|
|
isUnavailable: false,
|
|
|
|
|
}),
|
|
|
|
|
).toBe(true);
|
|
|
|
|
|
|
|
|
|
expect(
|
|
|
|
|
shouldShowFloatingQuotePreview({
|
|
|
|
|
hoveredCid: 'cid-1',
|
|
|
|
|
outOfViewCid: 'cid-1',
|
|
|
|
|
quoteCid: 'cid-1',
|
|
|
|
|
isUnavailable: true,
|
|
|
|
|
}),
|
|
|
|
|
).toBe(false);
|
|
|
|
|
|
|
|
|
|
expect(
|
|
|
|
|
shouldShowFloatingQuotePreview({
|
|
|
|
|
hoveredCid: 'cid-1',
|
|
|
|
|
outOfViewCid: 'cid-2',
|
|
|
|
|
quoteCid: 'cid-1',
|
|
|
|
|
isUnavailable: false,
|
|
|
|
|
}),
|
|
|
|
|
).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
});
|