test(12.1-03): add RED tests for server freshness mapping
- cloudConnections: setBrowseState warning/refreshing/fresh states - cloudConnections: cached items remain during warning - cloudConnections: selectConnection clears browse state - cloudConnections: does_not_use_browser_clock_as_refresh_evidence - CloudFolderView: maps_server_warning_and_last_success - CloudFolderView: http_200_does_not_imply_fresh - CloudFolderView: does_not_use_browser_clock_as_refresh_evidence - CloudFolderView: cached_items_remain_visible_during_warning 3 new failures against unconditional fresh/new Date() behavior
This commit is contained in:
@@ -156,3 +156,83 @@ describe('useCloudConnectionsStore', () => {
|
||||
expect(stored.startsWith('{')).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
// ── Freshness state mapping ──────────────────────────────────────────────────
|
||||
|
||||
describe('setBrowseState freshness mapping', () => {
|
||||
it('setBrowseState with freshness=warning sets folderFreshness to "warning"', () => {
|
||||
const store = useCloudConnectionsStore()
|
||||
store.setBrowseState({ freshness: 'warning' })
|
||||
expect(store.folderFreshness).toBe('warning')
|
||||
})
|
||||
|
||||
it('setBrowseState with freshness=refreshing sets folderFreshness to "refreshing"', () => {
|
||||
const store = useCloudConnectionsStore()
|
||||
store.setBrowseState({ freshness: 'refreshing' })
|
||||
expect(store.folderFreshness).toBe('refreshing')
|
||||
})
|
||||
|
||||
it('setBrowseState with freshness=fresh sets folderFreshness to "fresh"', () => {
|
||||
const store = useCloudConnectionsStore()
|
||||
store.setBrowseState({ freshness: 'fresh' })
|
||||
expect(store.folderFreshness).toBe('fresh')
|
||||
})
|
||||
|
||||
it('maps_server_warning_and_last_success: server last_refreshed_at is preserved exactly', () => {
|
||||
const store = useCloudConnectionsStore()
|
||||
const serverTimestamp = '2026-06-15T10:30:00Z'
|
||||
store.setBrowseState({
|
||||
freshness: 'warning',
|
||||
refreshedAt: serverTimestamp,
|
||||
})
|
||||
expect(store.folderFreshness).toBe('warning')
|
||||
expect(store.lastRefreshedAt).toBe(serverTimestamp)
|
||||
})
|
||||
|
||||
it('selectConnection clears cloud browse state without persisting secrets', () => {
|
||||
const store = useCloudConnectionsStore()
|
||||
store.connections = [{ id: 'conn-1', provider: 'google_drive' }]
|
||||
// Set some browse state
|
||||
store.setBrowseState({
|
||||
items: [{ id: 'item-1', name: 'doc.pdf' }],
|
||||
caps: { share: true },
|
||||
freshness: 'fresh',
|
||||
refreshedAt: '2026-06-15T10:30:00Z',
|
||||
byteAvail: 'cached',
|
||||
err: null,
|
||||
})
|
||||
// Select a different connection — should clear state
|
||||
store.selectConnection('conn-1')
|
||||
expect(store.browseItems).toHaveLength(0)
|
||||
expect(store.folderFreshness).toBeNull()
|
||||
expect(store.lastRefreshedAt).toBeNull()
|
||||
expect(store.capabilities).toBeNull()
|
||||
expect(store.byteAvailability).toBeNull()
|
||||
// No tokens or credentials should be present
|
||||
expect(store.browseError).toBeNull()
|
||||
})
|
||||
|
||||
it('does_not_use_browser_clock_as_refresh_evidence: refreshedAt from server, not Date.now', () => {
|
||||
const store = useCloudConnectionsStore()
|
||||
// Store only accepts what is passed explicitly — no implicit Date()
|
||||
const SERVER_TS = '2026-06-10T08:00:00.000Z'
|
||||
store.setBrowseState({ freshness: 'fresh', refreshedAt: SERVER_TS })
|
||||
// lastRefreshedAt must equal exactly what was passed — not a new Date()
|
||||
expect(store.lastRefreshedAt).toBe(SERVER_TS)
|
||||
})
|
||||
|
||||
it('cached_items_remain_visible_during_warning: items not cleared on warning freshness', () => {
|
||||
const store = useCloudConnectionsStore()
|
||||
const cachedItems = [
|
||||
{ id: 'item-a', provider_item_id: 'pref-a', name: 'Cached Folder', kind: 'folder' },
|
||||
]
|
||||
// First, set fresh state with items
|
||||
store.setBrowseState({ items: cachedItems, freshness: 'fresh', refreshedAt: '2026-06-01T00:00:00Z' })
|
||||
expect(store.browseItems).toHaveLength(1)
|
||||
// Now simulate a warning without clearing items (only freshness changes)
|
||||
store.setBrowseState({ freshness: 'warning' })
|
||||
// Items must still be there — warning does not delete cached items
|
||||
expect(store.browseItems).toHaveLength(1)
|
||||
expect(store.browseItems[0].id).toBe('item-a')
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user