UNPKG

saas-subscription-helper

Version:

A helper package for integrating Stripe Payment Links with Supabase in SaaS applications.

148 lines (143 loc) 4.47 kB
// Mock Supabase client with proper data structure const mockSupabase = { from: jest.fn(() => ({ select: jest.fn(() => ({ eq: jest.fn(() => ({ single: jest.fn(() => Promise.resolve({ data: { id: 1, email: 'test@example.com', subscription_status: 'active', stripe_price_id: 'price_basic' }, error: null })) })) })), update: jest.fn(() => ({ eq: jest.fn(() => ({ select: jest.fn(() => Promise.resolve({ data: [{ id: 1, email: 'test@example.com', subscription_status: 'active', stripe_price_id: 'price_basic' }], error: null })) })) })), insert: jest.fn(() => ({ select: jest.fn(() => ({ single: jest.fn(() => Promise.resolve({ data: { id: 1, email: 'test@example.com', subscription_status: 'active', stripe_price_id: 'price_basic' }, error: null })) })) })) })) }; // Mock Stripe client with complete subscription data const mockStripe = { customers: { list: jest.fn(() => Promise.resolve({ data: [{ id: 'cus_123', email: 'test@example.com' }] })), search: jest.fn(() => Promise.resolve({ data: [{ id: 'cus_123', email: 'test@example.com' }] })), retrieve: jest.fn() }, prices: { retrieve: jest.fn((priceId) => Promise.resolve({ id: priceId, unit_amount: priceId === 'price_premium' ? 2000 : 1000, currency: 'usd', recurring: { interval: 'month' } })) }, webhooks: { constructEvent: jest.fn(), signature: { verifyHeader: jest.fn() } }, subscriptions: { list: jest.fn(() => Promise.resolve({ data: [{ id: 'sub_123', status: 'active', customer: 'cus_123', items: { data: [{ id: 'si_123', price: { id: 'price_basic' } }] }, current_period_end: 1703980799, cancel_at_period_end: false }] })), update: jest.fn(() => Promise.resolve({ id: 'sub_123', status: 'active', items: { data: [{ price: { id: 'price_new' } }] } })), cancel: jest.fn() } }; // Mock module imports jest.mock('@supabase/supabase-js', () => ({ createClient: jest.fn(() => mockSupabase) })); jest.mock('stripe', () => jest.fn(() => mockStripe)); // Export mocks module.exports = { mockSupabase, mockStripe, // Helper to simulate different Supabase responses mockSupabaseResponse: (data = null, error = null) => { mockSupabase.from.mockImplementation(() => ({ select: jest.fn().mockReturnValue({ eq: jest.fn().mockReturnValue({ single: jest.fn().mockResolvedValue({ data, error }) }) }), update: jest.fn().mockReturnValue({ eq: jest.fn().mockReturnValue({ select: jest.fn().mockResolvedValue({ data: data ? [data] : null, error }) }) }), insert: jest.fn().mockReturnValue({ select: jest.fn().mockReturnValue({ single: jest.fn().mockResolvedValue({ data, error }) }) }) })); return mockSupabase; } }; mockStripe.webhooks.constructEvent.mockImplementation((rawBody, signature, secret) => { console.log('Mock received:', { rawBody, signature, secret }); // Debug log // ... rest of mock });