import { describe, it, expect, vi, afterEach } from 'vitest' import type { SessionShare } from '@/types' import { buildSessionShareUrl, filterSharesForSession, getLatestActiveShareForSession } from './sessionShare' function makeMockShare(overrides: Partial = {}): SessionShare { return { id: 'share-1', session_id: 'session-1', account_id: 'account-1', share_token: 'abc123', share_name: null, visibility: 'public', created_by: 'user-1', created_at: '2026-02-14T10:00:00Z', updated_at: '2026-02-14T10:00:00Z', expires_at: null, view_count: 0, last_viewed_at: null, is_active: true, share_url: null, ...overrides, } } afterEach(() => { vi.unstubAllGlobals() }) describe('buildSessionShareUrl', () => { it('returns share_url when present', () => { const share = makeMockShare({ share_url: 'https://resolutionflow.com/share/abc123' }) expect(buildSessionShareUrl(share)).toBe('https://resolutionflow.com/share/abc123') }) it('constructs URL from token when share_url is null', () => { vi.stubGlobal('location', { origin: 'http://localhost:5173' }) const share = makeMockShare({ share_token: 'tok-xyz', share_url: null }) expect(buildSessionShareUrl(share)).toBe('http://localhost:5173/share/tok-xyz') }) }) describe('filterSharesForSession', () => { it('filters to matching session_id and active shares', () => { const shares = [ makeMockShare({ id: 's1', session_id: 'sess-A', is_active: true }), makeMockShare({ id: 's2', session_id: 'sess-B', is_active: true }), makeMockShare({ id: 's3', session_id: 'sess-A', is_active: true }), ] const result = filterSharesForSession(shares, 'sess-A') expect(result).toHaveLength(2) expect(result.map(s => s.id)).toEqual(['s1', 's3']) }) it('excludes inactive shares', () => { const shares = [ makeMockShare({ id: 's1', session_id: 'sess-A', is_active: true }), makeMockShare({ id: 's2', session_id: 'sess-A', is_active: false }), ] const result = filterSharesForSession(shares, 'sess-A') expect(result).toHaveLength(1) expect(result[0].id).toBe('s1') }) }) describe('getLatestActiveShareForSession', () => { it('returns the most recently created share', () => { const shares = [ makeMockShare({ id: 'old', session_id: 'sess-A', created_at: '2026-02-10T10:00:00Z', is_active: true }), makeMockShare({ id: 'newest', session_id: 'sess-A', created_at: '2026-02-14T12:00:00Z', is_active: true }), makeMockShare({ id: 'mid', session_id: 'sess-A', created_at: '2026-02-12T10:00:00Z', is_active: true }), ] const result = getLatestActiveShareForSession(shares, 'sess-A') expect(result).not.toBeNull() expect(result!.id).toBe('newest') }) it('returns null when no shares match', () => { const shares = [ makeMockShare({ session_id: 'sess-B', is_active: true }), makeMockShare({ session_id: 'sess-A', is_active: false }), ] const result = getLatestActiveShareForSession(shares, 'sess-A') expect(result).toBeNull() }) })