feat: implement Save & Taste flow in CameraCapture

This commit is contained in:
2025-12-18 11:49:40 +01:00
parent 2685176992
commit 5f757d7b56
9 changed files with 244 additions and 19 deletions

View File

@@ -0,0 +1,83 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { saveTasting } from '../save-tasting';
import { createServerActionClient } from '@supabase/auth-helpers-nextjs';
// Mock Supabase
vi.mock('@supabase/auth-helpers-nextjs', () => ({
createServerActionClient: vi.fn(),
}));
// Mock next/headers
vi.mock('next/headers', () => ({
cookies: vi.fn(),
}));
// Mock next/cache
vi.mock('next/cache', () => ({
revalidatePath: vi.fn(),
}));
describe('saveTasting', () => {
const mockInsert = vi.fn();
const mockSelect = vi.fn();
const mockSingle = vi.fn();
const mockGetSession = vi.fn();
beforeEach(() => {
vi.clearAllMocks();
const mockSupabase = {
auth: {
getSession: mockGetSession,
},
from: vi.fn().mockReturnValue({
insert: mockInsert,
select: mockSelect,
eq: vi.fn(),
}),
};
mockInsert.mockReturnValue({ select: mockSelect });
mockSelect.mockReturnValue({ single: mockSingle });
(createServerActionClient as any).mockReturnValue(mockSupabase);
});
it('should save a tasting note and tags', async () => {
mockGetSession.mockResolvedValue({
data: { session: { user: { id: 'user-123' } } },
});
mockSingle.mockResolvedValue({
data: { id: 'tasting-456' },
error: null,
});
// Mock the second insert for tags
const mockTagInsert = vi.fn().mockResolvedValue({ error: null });
(createServerActionClient({ cookies: {} as any }).from as any).mockImplementation((table: string) => {
if (table === 'tastings') {
return { insert: mockInsert, select: mockSelect };
}
return { insert: mockTagInsert };
});
const result = await saveTasting({
bottle_id: 'bottle-789',
rating: 90,
buddy_ids: ['buddy-1', 'buddy-2'],
});
expect(result.success).toBe(true);
expect(mockInsert).toHaveBeenCalledWith(expect.objectContaining({
bottle_id: 'bottle-789',
rating: 90,
}));
// Check tags were inserted with user_id (the fix for recursion)
expect(mockTagInsert).toHaveBeenCalledWith(expect.arrayContaining([
expect.objectContaining({ buddy_id: 'buddy-1', user_id: 'user-123' }),
expect.objectContaining({ buddy_id: 'buddy-2', user_id: 'user-123' }),
]));
});
});