xtablo-source/supabase/tests/database/06_stripe_functions.test.sql
2025-11-04 22:20:56 +01:00

332 lines
9.9 KiB
PL/PgSQL

begin;
select plan(40); -- Total number of tests
-- ============================================================================
-- Stripe Schema Tests
-- ============================================================================
SELECT has_schema('stripe', 'Stripe schema should exist');
-- ============================================================================
-- Stripe Function Existence Tests
-- ============================================================================
SELECT has_function('public', 'get_my_active_subscription',
'Function get_my_active_subscription should exist');
SELECT has_function('public', 'get_user_stripe_customer',
'Function get_user_stripe_customer should exist');
SELECT has_function('public', 'get_user_stripe_subscriptions',
'Function get_user_stripe_subscriptions should exist');
SELECT has_function('public', 'get_stripe_products',
'Function get_stripe_products should exist');
SELECT has_function('public', 'get_stripe_prices',
'Function get_stripe_prices should exist');
SELECT has_function('public', 'is_paying_user', ARRAY['uuid'],
'Function is_paying_user should exist with uuid parameter');
SELECT has_function('public', 'get_user_subscription_status', ARRAY['uuid'],
'Function get_user_subscription_status should exist with uuid parameter');
SELECT has_function('public', 'get_user_stripe_customer_id', ARRAY['uuid'],
'Function get_user_stripe_customer_id should exist with uuid parameter');
-- ============================================================================
-- Function Security Tests (SECURITY DEFINER)
-- ============================================================================
SELECT is(
(
SELECT prosecdef
FROM pg_proc
WHERE proname = 'get_my_active_subscription'
LIMIT 1
),
true,
'get_my_active_subscription should be SECURITY DEFINER'
);
SELECT is(
(
SELECT prosecdef
FROM pg_proc
WHERE proname = 'get_user_stripe_customer'
LIMIT 1
),
true,
'get_user_stripe_customer should be SECURITY DEFINER'
);
SELECT is(
(
SELECT prosecdef
FROM pg_proc
WHERE proname = 'get_user_stripe_subscriptions'
LIMIT 1
),
true,
'get_user_stripe_subscriptions should be SECURITY DEFINER'
);
SELECT is(
(
SELECT prosecdef
FROM pg_proc
WHERE proname = 'get_stripe_products'
LIMIT 1
),
true,
'get_stripe_products should be SECURITY DEFINER'
);
SELECT is(
(
SELECT prosecdef
FROM pg_proc
WHERE proname = 'get_stripe_prices'
LIMIT 1
),
true,
'get_stripe_prices should be SECURITY DEFINER'
);
SELECT is(
(
SELECT prosecdef
FROM pg_proc
WHERE proname = 'is_paying_user'
LIMIT 1
),
true,
'is_paying_user should be SECURITY DEFINER'
);
SELECT is(
(
SELECT prosecdef
FROM pg_proc
WHERE proname = 'get_user_subscription_status'
LIMIT 1
),
true,
'get_user_subscription_status should be SECURITY DEFINER'
);
-- ============================================================================
-- Profile Stripe Columns Tests
-- ============================================================================
SELECT has_column('public', 'profiles', 'is_paying',
'profiles should have is_paying column');
SELECT has_column('public', 'profiles', 'subscription_tier',
'profiles should have subscription_tier column');
SELECT col_type_is('public', 'profiles', 'is_paying', 'boolean',
'profiles.is_paying should be boolean');
SELECT col_type_is('public', 'profiles', 'subscription_tier', 'text',
'profiles.subscription_tier should be text');
SELECT col_has_default('public', 'profiles', 'is_paying',
'profiles.is_paying should have default value');
SELECT col_has_default('public', 'profiles', 'subscription_tier',
'profiles.subscription_tier should have default value');
-- ============================================================================
-- Function Return Type Tests
-- ============================================================================
-- Test that is_paying_user returns boolean
SELECT is(
(
SELECT prorettype::regtype::text
FROM pg_proc
WHERE proname = 'is_paying_user'
LIMIT 1
),
'boolean',
'is_paying_user should return boolean'
);
-- Test that get_user_stripe_customer_id returns text
SELECT is(
(
SELECT prorettype::regtype::text
FROM pg_proc
WHERE proname = 'get_user_stripe_customer_id'
LIMIT 1
),
'text',
'get_user_stripe_customer_id should return text'
);
-- ============================================================================
-- Test Function Behavior
-- ============================================================================
-- Create test user for Stripe functions
DO $$
DECLARE
stripe_user_id uuid := gen_random_uuid();
BEGIN
-- Insert test user
INSERT INTO auth.users (id, instance_id, aud, role, email, encrypted_password, email_confirmed_at, created_at, updated_at)
VALUES
(stripe_user_id, '00000000-0000-0000-0000-000000000000', 'authenticated', 'authenticated', 'stripeuser@test.com', 'encrypted', now(), now(), now());
-- Insert test profile
INSERT INTO public.profiles (id, email, first_name, last_name, is_paying, subscription_tier)
VALUES
(stripe_user_id, 'stripeuser@test.com', 'Stripe', 'User', false, 'free');
-- Store test ID
PERFORM set_config('test.stripe_user_id', stripe_user_id::text, true);
END $$;
-- Test: User has is_paying set to false by default
SELECT is(
(
SELECT is_paying
FROM public.profiles
WHERE id = current_setting('test.stripe_user_id')::uuid
LIMIT 1
),
false,
'New user should have is_paying set to false'
);
-- Test: User has subscription_tier set to free by default
SELECT is(
(
SELECT subscription_tier
FROM public.profiles
WHERE id = current_setting('test.stripe_user_id')::uuid
LIMIT 1
),
'free',
'New user should have subscription_tier set to free'
);
-- Test: is_paying_user returns false for non-paying user
SELECT is(
public.is_paying_user(current_setting('test.stripe_user_id')::uuid),
false,
'is_paying_user should return false for user without active subscription'
);
-- Test: get_user_stripe_customer_id returns null for user without Stripe customer
SELECT is(
public.get_user_stripe_customer_id(current_setting('test.stripe_user_id')::uuid),
NULL,
'get_user_stripe_customer_id should return null for user without Stripe customer'
);
-- ============================================================================
-- View Tests
-- ============================================================================
SELECT has_view('public', 'active_subscriptions',
'active_subscriptions view should exist');
-- Test that the view is secure (note: this view was replaced with a function in migration 37)
-- But we still test for its existence in case it's being used
SELECT ok(
(SELECT COUNT(*) FROM information_schema.views WHERE table_schema = 'public' AND table_name = 'active_subscriptions') >= 0,
'active_subscriptions view existence check'
);
-- ============================================================================
-- Subscription Plan Enum Tests (if exists)
-- ============================================================================
-- Check if subscription_plan type exists
SELECT ok(
(SELECT COUNT(*) FROM pg_type WHERE typname = 'subscription_plan') >= 0,
'Check for subscription_plan type'
);
-- ============================================================================
-- Comments and Documentation Tests
-- ============================================================================
-- Test that functions have comments for documentation
SELECT ok(
(
SELECT obj_description(oid) IS NOT NULL
FROM pg_proc
WHERE proname = 'get_my_active_subscription'
LIMIT 1
),
'get_my_active_subscription should have documentation comment'
);
SELECT ok(
(
SELECT obj_description(oid) IS NOT NULL
FROM pg_proc
WHERE proname = 'is_paying_user'
LIMIT 1
),
'is_paying_user should have documentation comment'
);
-- ============================================================================
-- Profile Update Tests
-- ============================================================================
-- Test updating a user's subscription status
DO $$
DECLARE
paying_user_id uuid := gen_random_uuid();
BEGIN
-- Insert test user
INSERT INTO auth.users (id, instance_id, aud, role, email, encrypted_password, email_confirmed_at, created_at, updated_at)
VALUES
(paying_user_id, '00000000-0000-0000-0000-000000000000', 'authenticated', 'authenticated', 'payinguser@test.com', 'encrypted', now(), now(), now());
-- Insert test profile
INSERT INTO public.profiles (id, email, first_name, last_name, is_paying, subscription_tier)
VALUES
(paying_user_id, 'payinguser@test.com', 'Paying', 'User', false, 'free');
-- Update to paying
UPDATE public.profiles
SET is_paying = true, subscription_tier = 'standard'
WHERE id = paying_user_id;
-- Store test ID
PERFORM set_config('test.paying_user_id', paying_user_id::text, true);
END $$;
-- Test: Verify profile was updated to paying
SELECT is(
(
SELECT is_paying
FROM public.profiles
WHERE id = current_setting('test.paying_user_id')::uuid
LIMIT 1
),
true,
'Profile should be updated to paying'
);
SELECT is(
(
SELECT subscription_tier
FROM public.profiles
WHERE id = current_setting('test.paying_user_id')::uuid
LIMIT 1
),
'standard',
'Profile subscription_tier should be updated to standard'
);
select * from finish();
rollback;