| import { describe, it, expect, vi } from 'vitest'; |
| import { distributeCampaignBudget } from './distributionEngine'; |
|
|
| |
| vi.mock('./supabase', () => ({ |
| supabase: { |
| from: vi.fn((table: string) => { |
| if (table === 'distribution_rules') { |
| return { |
| select: vi.fn(() => ({ |
| eq: vi.fn(() => ({ |
| maybeSingle: vi.fn(() => Promise.resolve({ |
| data: { |
| id: 'rule-001', |
| campaign_id: 'camp-123', |
| citizen_reward_ratio: 0.70, |
| sme_donation_ratio: 0.20, |
| platform_fee_ratio: 0.10, |
| rule_type: 'CUSTOM', |
| description: 'ํ
์คํธ์ฉ ๋์ ๋น์จ' |
| }, |
| error: null |
| })) |
| })) |
| })) |
| }; |
| } |
|
|
| |
| return { |
| select: vi.fn(() => ({ |
| eq: vi.fn(() => ({ |
| gt: vi.fn(() => Promise.resolve({ |
| data: [ |
| { user_id: 'user_1', display_name: '์ฐธ์ฌ์A', co2_grams: 600 }, |
| { user_id: 'user_2', display_name: '์ฐธ์ฌ์B', co2_grams: 400 }, |
| ], |
| error: null |
| })) |
| })) |
| })) |
| }; |
| }) |
| } |
| })); |
|
|
| |
| vi.mock('./ledger', () => ({ |
| appendLedgerEntry: vi.fn(() => Promise.resolve({ transactionId: 'test-tx-id' })) |
| })); |
|
|
| describe('Distribution Engine v1.2 Unit Tests', () => { |
| it('1์ฐจ ๋ถ๋ฐฐ (๊ณ ์ ํ๋ผ๋ฏธํฐ): ์์๋ฃ 10% ์ ์ธ ํ ๊ธฐ์ฌ๋(6:4)์ ๋ฐ๋ผ ํฌ์ธํธ๊ฐ ๋ฐฐ๋ถ๋์ด์ผ ํ๋ค', async () => { |
| const params = { |
| campaignId: 'camp-123', |
| budgetAmount: 100000, |
| platformFeeRate: 0.1, |
| }; |
|
|
| const result = await distributeCampaignBudget(params); |
|
|
| |
| expect(result.platformFee).toBe(10000); |
| |
| |
| expect(result.totalDistributed).toBe(70000); |
| expect(result.recipientCount).toBe(2); |
| }); |
|
|
| it('1์ฐจ ๋ถ๋ฐฐ (๋์ ๋น์จ): DB distribution_rules์ ์ ์๋ ์๋ฏผ ์ง๋ถ(70%)๊ณผ ํ๋ซํผ ์ง๋ถ(10%)์ด ์ ์ ๋ฐ์๋์ด์ผ ํ๋ค', async () => { |
| const params = { |
| campaignId: 'camp-123', |
| budgetAmount: 100000, |
| }; |
|
|
| const result = await distributeCampaignBudget(params); |
|
|
| |
| expect(result.platformFee).toBe(10000); |
| |
| |
| expect(result.totalDistributed).toBe(70000); |
| expect(result.recipientCount).toBe(2); |
| }); |
| }); |
|
|