187 lines
5 KiB
TypeScript
187 lines
5 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
buildLeadSessionDetailRequestKey,
|
|
deriveLeadContextButtonLabel,
|
|
shouldFetchLeadSessionDetail,
|
|
shouldLoadLeadSessionDetail,
|
|
} from '@renderer/components/team/leadContextLoadGuards';
|
|
|
|
describe('leadContextLoadGuards', () => {
|
|
describe('shouldLoadLeadSessionDetail', () => {
|
|
it('does not load when disabled', () => {
|
|
expect(
|
|
shouldLoadLeadSessionDetail({
|
|
enabled: false,
|
|
tabId: 'tab-1',
|
|
projectId: 'project-1',
|
|
leadSessionId: 'lead-1',
|
|
})
|
|
).toBe(false);
|
|
});
|
|
|
|
it('requires all identifiers', () => {
|
|
expect(
|
|
shouldLoadLeadSessionDetail({
|
|
enabled: true,
|
|
tabId: null,
|
|
projectId: 'project-1',
|
|
leadSessionId: 'lead-1',
|
|
})
|
|
).toBe(false);
|
|
expect(
|
|
shouldLoadLeadSessionDetail({
|
|
enabled: true,
|
|
tabId: 'tab-1',
|
|
projectId: null,
|
|
leadSessionId: 'lead-1',
|
|
})
|
|
).toBe(false);
|
|
expect(
|
|
shouldLoadLeadSessionDetail({
|
|
enabled: true,
|
|
tabId: 'tab-1',
|
|
projectId: 'project-1',
|
|
leadSessionId: null,
|
|
})
|
|
).toBe(false);
|
|
});
|
|
|
|
it('loads only when enabled and identifiers are valid', () => {
|
|
expect(
|
|
shouldLoadLeadSessionDetail({
|
|
enabled: true,
|
|
tabId: 'tab-1',
|
|
projectId: 'project-1',
|
|
leadSessionId: 'lead-1',
|
|
})
|
|
).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('buildLeadSessionDetailRequestKey', () => {
|
|
it('builds a stable per-tab request key', () => {
|
|
expect(
|
|
buildLeadSessionDetailRequestKey({
|
|
tabId: 'tab-1',
|
|
projectId: 'project-1',
|
|
leadSessionId: 'lead-1',
|
|
})
|
|
).toBe('tab-1:project-1:lead-1');
|
|
});
|
|
});
|
|
|
|
describe('shouldFetchLeadSessionDetail', () => {
|
|
it('does not fetch without a requested session', () => {
|
|
expect(
|
|
shouldFetchLeadSessionDetail({
|
|
requestedSessionId: null,
|
|
loadedSessionId: null,
|
|
loading: false,
|
|
inFlightOrAttemptedRequestKey: null,
|
|
nextRequestKey: null,
|
|
})
|
|
).toBe(false);
|
|
});
|
|
|
|
it('does not fetch while loading', () => {
|
|
expect(
|
|
shouldFetchLeadSessionDetail({
|
|
requestedSessionId: 'lead-1',
|
|
loadedSessionId: null,
|
|
loading: true,
|
|
inFlightOrAttemptedRequestKey: null,
|
|
nextRequestKey: 'tab-1:project-1:lead-1',
|
|
})
|
|
).toBe(false);
|
|
});
|
|
|
|
it('does not fetch an already loaded session', () => {
|
|
expect(
|
|
shouldFetchLeadSessionDetail({
|
|
requestedSessionId: 'lead-1',
|
|
loadedSessionId: 'lead-1',
|
|
loading: false,
|
|
inFlightOrAttemptedRequestKey: null,
|
|
nextRequestKey: 'tab-1:project-1:lead-1',
|
|
})
|
|
).toBe(false);
|
|
});
|
|
|
|
it('does not refetch the same attempted request key', () => {
|
|
expect(
|
|
shouldFetchLeadSessionDetail({
|
|
requestedSessionId: 'lead-1',
|
|
loadedSessionId: null,
|
|
loading: false,
|
|
inFlightOrAttemptedRequestKey: 'tab-1:project-1:lead-1',
|
|
nextRequestKey: 'tab-1:project-1:lead-1',
|
|
})
|
|
).toBe(false);
|
|
});
|
|
|
|
it('fetches when the requested session is unloaded and not already attempted', () => {
|
|
expect(
|
|
shouldFetchLeadSessionDetail({
|
|
requestedSessionId: 'lead-2',
|
|
loadedSessionId: 'lead-1',
|
|
loading: false,
|
|
inFlightOrAttemptedRequestKey: null,
|
|
nextRequestKey: 'tab-1:project-1:lead-2',
|
|
})
|
|
).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('deriveLeadContextButtonLabel', () => {
|
|
it('uses live percent while the panel is closed', () => {
|
|
expect(
|
|
deriveLeadContextButtonLabel({
|
|
liveContextUsedPercent: 25,
|
|
fullContextUsedPercent: 90,
|
|
contextPanelOpen: false,
|
|
})
|
|
).toBe('25.0%');
|
|
});
|
|
|
|
it('prefers full percent while the panel is open', () => {
|
|
expect(
|
|
deriveLeadContextButtonLabel({
|
|
liveContextUsedPercent: 25,
|
|
fullContextUsedPercent: 90,
|
|
contextPanelOpen: true,
|
|
})
|
|
).toBe('90.0%');
|
|
});
|
|
|
|
it('falls back to live percent while open when full percent is unavailable', () => {
|
|
expect(
|
|
deriveLeadContextButtonLabel({
|
|
liveContextUsedPercent: 25,
|
|
fullContextUsedPercent: null,
|
|
contextPanelOpen: true,
|
|
})
|
|
).toBe('25.0%');
|
|
});
|
|
|
|
it('falls back to Context when no percent is available', () => {
|
|
expect(
|
|
deriveLeadContextButtonLabel({
|
|
liveContextUsedPercent: null,
|
|
fullContextUsedPercent: null,
|
|
contextPanelOpen: false,
|
|
})
|
|
).toBe('Context');
|
|
});
|
|
|
|
it('does not clamp full percent values', () => {
|
|
expect(
|
|
deriveLeadContextButtonLabel({
|
|
liveContextUsedPercent: null,
|
|
fullContextUsedPercent: 125.5,
|
|
contextPanelOpen: true,
|
|
})
|
|
).toBe('125.5%');
|
|
});
|
|
});
|
|
});
|