forked from flexprice/flexprice
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinvoice_test.csv
More file actions
We can make this file beautiful and searchable if this error is corrected: It looks like row 6 should actually have 8 columns, instead of 7 in line 5.
56 lines (56 loc) 路 9.38 KB
/
Copy pathinvoice_test.csv
File metadata and controls
56 lines (56 loc) 路 9.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Category,Test Case,Input Description,Expected Invoice Status,Expected Payment Status,Expected Amount,Expected Line Items,Key Assertions
One-Off,Basic one-off invoice with line items,CustomerID + 2 line items (unit prices $10 and $20) + currency USD,Finalized,Pending,30.00,2,"Invoice number assigned; BillingReason=manual; InvoiceType=one_off; webhook published"
One-Off,One-off invoice zero-dollar,CustomerID + 1 line item amount $0,Skipped,Pending,0.00,0,"Status=SKIPPED; No invoice number; No finalization; No webhook"
One-Off,One-off invoice idempotency - duplicate call,Same CustomerID + same period_start/end called twice,Finalized,Pending,30.00,2,"Second call returns same invoice ID as first; no duplicate created"
One-Off,One-off invoice without idempotency key - two calls create two invoices,Same CustomerID + no period but different timestamps,Finalized,Pending,30.00,2,"Two different invoice IDs returned (timestamp in idempotency key)"
One-Off,One-off invoice negative amount_due for non-credit type,InvoiceType=one_off + AmountDue=-10,Error,,,"Validation error: amount_due must be non-negative for non-credit invoices"
One-Off,One-off invoice missing customer_id,No CustomerID,Error,,,"Validation error: customer_id required"
One-Off,One-off invoice missing currency,No Currency,Error,,,"Validation error: currency required"
One-Off + Coupons,One-off with percentage coupon (10%),1 line item $100 + 10% coupon,Finalized,Pending,90.00,1,"TotalDiscount=10; Total=90; Coupon applied before credits"
One-Off + Coupons,One-off with fixed amount coupon ($25),1 line item $100 + $25 fixed coupon,Finalized,Pending,75.00,1,"TotalDiscount=25; Total=75"
One-Off + Coupons,One-off with coupon exceeding subtotal,1 line item $10 + $25 fixed coupon,Finalized,Succeeded,0.00,1,"Total floored at 0; PaymentStatus=Succeeded (zero total auto-paid)"
One-Off + Coupons,One-off with invalid coupon ID,1 line item $100 + nonexistent coupon ID,Finalized,Pending,100.00,1,"Invalid coupon silently skipped; invoice created without discount"
One-Off + Coupons,One-off with line-item-level coupon,2 line items $50 each + coupon on item 1 only,Finalized,Pending,75.00,2,"Only first line item discounted; second at full price"
One-Off + Taxes,One-off with percentage tax (10%),1 line item $100 + 10% tax rate,Finalized,Pending,110.00,1,"TotalTax=10; Total=100+10=110"
One-Off + Taxes,One-off with fixed tax,1 line item $100 + $5 fixed tax,Finalized,Pending,105.00,1,"TotalTax=5; Total=100+5=105"
One-Off + Taxes,One-off with multiple tax rates,1 line item $100 + 10% state + 5% local tax,Finalized,Pending,115.00,1,"TotalTax=15; taxes are additive not compounding"
One-Off + Coupons + Taxes,One-off with coupon then tax,1 line item $100 + $20 coupon + 10% tax,Finalized,Pending,88.00,1,"Discount first: 100-20=80; Tax on discounted: 80*10%=8; Total=80+8=88"
One-Off + Coupons + Taxes,One-off with coupon reducing to zero then tax,1 line item $100 + $100 coupon + 10% tax,Finalized,Succeeded,0.00,1,"Discount: 100-100=0; Tax on 0=0; Total=0; auto-paid"
One-Off + Credits,One-off with wallet credits available,$100 invoice + customer has $30 wallet,Finalized,Pending,70.00,1,"TotalPrepaidCreditsApplied=30; AmountDue=70; AmountRemaining=70"
One-Off + Credits,One-off with credits exceeding total,$50 invoice + customer has $100 wallet,Finalized,Succeeded,0.00,1,"Credits capped at invoice total; TotalPrepaidCreditsApplied=50; Total=0; auto-paid"
One-Off + Credits + Coupons,One-off with coupon then credits,$100 invoice + $20 coupon + $30 wallet credits,Finalized,Pending,50.00,1,"Coupon first: 100-20=80; Credits: 80-30=50; AmountDue=50"
Credit,Basic credit invoice,InvoiceType=credit + negative AmountDue=-50,Finalized,Pending,-50.00,1,"InvoiceType=credit; negative amounts allowed"
Credit,Credit invoice with zero amount,InvoiceType=credit + AmountDue=0,Skipped,Pending,0.00,0,"Zero-dollar credit invoice becomes SKIPPED"
Subscription - Create,Subscription creation with advance charge,New subscription + flat-fee price $50/month,Finalized,Pending,50.00,1,"BillingReason=subscription_create; BillingSequence=1; ReferencePoint=period_start"
Subscription - Create,Subscription creation with usage-based price,New subscription + usage meter price (no usage yet),Skipped,,0.00,0,"Returns nil invoice (zero usage = zero subtotal = SKIPPED)"
Subscription - Create,Subscription creation with mixed prices,Flat $50 advance + usage meter (no usage),Finalized,Pending,50.00,1,"Only advance charge line item; usage line item excluded (zero amount)"
Subscription - Create,Subscription creation idempotency - same period,Same subscriptionID + same period called twice,Finalized,Pending,50.00,1,"Returns same invoice on second call; no duplicate"
Subscription - Create,Subscription creation - already finalized for period,Create invoice for period that already has finalized invoice,Error,,,"ErrAlreadyExists: invoice already exists for this period"
Subscription - Create,Subscription creation - draft subscription rejected,SubscriptionStatus=draft + isDraftSubscription=false,Error,,,"Validation error: cannot create invoice for draft subscription"
Subscription - Create,Subscription creation - draft subscription allowed,SubscriptionStatus=draft + isDraftSubscription=true,Finalized,Pending,50.00,1,"Invoice created successfully for draft subscription"
Subscription - Renewal,Subscription renewal with usage charges,Subscription + usage events in period + period_end reference,Finalized,Pending,varies,varies,"BillingReason=subscription_cycle; BillingSequence incremented; usage charges computed from events"
Subscription - Renewal,Subscription renewal zero usage,Subscription + no events in period,Skipped,,0.00,0,"Returns nil (zero subtotal = SKIPPED); no invoice created"
Subscription - Renewal,Subscription renewal with advance + arrear charges,Flat $50 advance + metered usage $25,Finalized,Pending,75.00,2,"Two line items: one advance one usage; total=75"
Subscription - Cancel,Cancellation with proration invoice,CancelImmediatelyInvoicePolicy=GenerateInvoice + mid-period cancel,Finalized,Pending,varies,varies,"BillingReason=proration; ReferencePoint=cancel; PeriodEnd=cancellation date"
Subscription - Cancel,Cancellation without proration invoice,CancelImmediatelyInvoicePolicy=Skip,No invoice,,,"No invoice created; cancellation proceeds without final invoice"
Subscription - Cancel,End-of-period cancellation,CancellationType=EndOfPeriod,No invoice,,,"No immediate invoice; normal renewal invoice at period end"
Subscription - Cancel,Cancellation with zero prorated amount,Cancel at start of period (0 days used),Skipped,,0.00,0,"Zero prorated amount = SKIPPED"
Draft Flow,CreateEmptyDraftInvoice creates shell,Valid request,Draft,Pending,0.00,0,"No invoice number; no line items; all amounts zero; LastComputedAt=nil"
Draft Flow,ComputeInvoice populates draft,Draft invoice + subscription with prices,Draft,-,varies,varies,"LastComputedAt set; line items populated; amounts calculated; still DRAFT"
Draft Flow,ComputeInvoice re-run replaces line items,Already-computed draft + re-compute,Draft,-,varies,varies,"Old line items removed; new inserted; amounts recalculated; LastComputedAt updated"
Draft Flow,ComputeInvoice on non-draft is no-op,Finalized invoice ID,No change,-,-,-,"Returns skipped=false err=nil; invoice unchanged"
Draft Flow,ComputeInvoice on skipped invoice,Skipped invoice ID,No change,-,-,-,"Returns skipped=true err=nil; invoice unchanged"
Draft Flow,ProcessDraftInvoice requires computed,Draft invoice with LastComputedAt=nil,Error,,,"Validation error: invoice has not been computed"
Draft Flow,ProcessDraftInvoice requires draft status,Finalized invoice ID,Error,,,"Validation error: invoice is not in draft status"
Draft Flow,FinalizeInvoice assigns number and seals,Computed draft invoice,Finalized,Pending,varies,varies,"InvoiceNumber assigned; FinalizedAt set; InvoiceStatus=Finalized; webhook published"
Draft Flow,FinalizeInvoice idempotent on already-finalized,Finalized invoice ID,Error,,,"Validation error: invoice is not in draft status"
Draft Flow,FinalizeInvoice on zero-total draft,Draft with Total=0 (after discounts),Finalized,Succeeded,0.00,varies,"PaymentStatus auto-set to Succeeded; invoice finalized normally"
Draft Flow,FinalizeInvoice on skipped invoice is no-op,Skipped invoice ID,Skipped,,0.00,,"Returns nil (no-op); invoice stays SKIPPED"
Finalization Delay,IsFinalizationDue - no delay configured,Draft invoice + FinalizationDelaySeconds=0,true,,,"Returns true; finalize immediately"
Finalization Delay,IsFinalizationDue - delay not elapsed,Draft invoice + delay=3600s + created 10min ago,false,,,"Returns false; too early to finalize"
Finalization Delay,IsFinalizationDue - delay elapsed,Draft invoice + delay=3600s + created 2hrs ago,true,,,"Returns true; delay has passed"
Finalization Delay,IsFinalizationDue - settings error defaults to finalize,Draft invoice + settings service error,true,,,"Fails open; returns true (finalize now)"
Finalization Delay,IsFinalizationDue - non-draft invoice,Finalized invoice,false,,,"Returns false; only draft invoices can be finalized"
Billing Sequence,First invoice gets sequence 1,New subscription first invoice,Finalized,Pending,varies,varies,"BillingSequence=1; BillingReason=subscription_create"
Billing Sequence,Second invoice gets sequence 2,Same subscription second period,Finalized,Pending,varies,varies,"BillingSequence=2; BillingReason=subscription_cycle"
Billing Sequence,Billing sequence increments correctly,3 renewal invoices in sequence,Finalized,Pending,varies,varies,"Sequences are 1 2 3 respectively"