@skillsmith/core 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +16 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/api/client.d.ts.map +1 -1
  5. package/dist/src/api/client.events.d.ts.map +1 -1
  6. package/dist/src/api/client.events.js +10 -1
  7. package/dist/src/api/client.events.js.map +1 -1
  8. package/dist/src/api/client.health.d.ts.map +1 -1
  9. package/dist/src/api/client.health.js +7 -1
  10. package/dist/src/api/client.health.js.map +1 -1
  11. package/dist/src/api/client.js +11 -1
  12. package/dist/src/api/client.js.map +1 -1
  13. package/dist/src/api/utils.d.ts +14 -3
  14. package/dist/src/api/utils.d.ts.map +1 -1
  15. package/dist/src/api/utils.js +14 -4
  16. package/dist/src/api/utils.js.map +1 -1
  17. package/dist/src/db/createDatabase.d.ts.map +1 -1
  18. package/dist/src/db/createDatabase.js +18 -2
  19. package/dist/src/db/createDatabase.js.map +1 -1
  20. package/dist/src/db/drivers/betterSqlite3Driver.d.ts +7 -0
  21. package/dist/src/db/drivers/betterSqlite3Driver.d.ts.map +1 -1
  22. package/dist/src/db/drivers/betterSqlite3Driver.js +21 -1
  23. package/dist/src/db/drivers/betterSqlite3Driver.js.map +1 -1
  24. package/dist/src/db/drivers/corruption.d.ts +31 -0
  25. package/dist/src/db/drivers/corruption.d.ts.map +1 -0
  26. package/dist/src/db/drivers/corruption.js +57 -0
  27. package/dist/src/db/drivers/corruption.js.map +1 -0
  28. package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
  29. package/dist/src/db/drivers/sqljsDriver.js +48 -7
  30. package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
  31. package/dist/src/exports/services.d.ts +0 -1
  32. package/dist/src/exports/services.d.ts.map +1 -1
  33. package/dist/src/exports/services.js +14 -3
  34. package/dist/src/exports/services.js.map +1 -1
  35. package/dist/src/index.d.ts +4 -1
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js +8 -1
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/indexer/meta-list-filter.d.ts +55 -0
  40. package/dist/src/indexer/meta-list-filter.d.ts.map +1 -0
  41. package/dist/src/indexer/meta-list-filter.js +65 -0
  42. package/dist/src/indexer/meta-list-filter.js.map +1 -0
  43. package/dist/src/indexer/meta-list-filter.test.d.ts +7 -0
  44. package/dist/src/indexer/meta-list-filter.test.d.ts.map +1 -0
  45. package/dist/src/indexer/meta-list-filter.test.js +139 -0
  46. package/dist/src/indexer/meta-list-filter.test.js.map +1 -0
  47. package/dist/src/types.d.ts +12 -0
  48. package/dist/src/types.d.ts.map +1 -1
  49. package/dist/tests/api/client.auth.test.js +50 -0
  50. package/dist/tests/api/client.auth.test.js.map +1 -1
  51. package/dist/tests/api/utils.test.js +7 -3
  52. package/dist/tests/api/utils.test.js.map +1 -1
  53. package/dist/tests/db/corruption.test.d.ts +11 -0
  54. package/dist/tests/db/corruption.test.d.ts.map +1 -0
  55. package/dist/tests/db/corruption.test.js +109 -0
  56. package/dist/tests/db/corruption.test.js.map +1 -0
  57. package/dist/tests/{billing/stripe-validators.test.d.ts → security/sanitization-stripe-ids.test.d.ts} +1 -1
  58. package/dist/tests/security/sanitization-stripe-ids.test.d.ts.map +1 -0
  59. package/dist/tests/{billing/stripe-validators.test.js → security/sanitization-stripe-ids.test.js} +1 -1
  60. package/dist/tests/security/sanitization-stripe-ids.test.js.map +1 -0
  61. package/dist/tests/shared.test.js.map +1 -1
  62. package/dist/tests/skill-scanner/allowlist.test.js +5 -1
  63. package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
  64. package/package.json +2 -7
  65. package/dist/src/billing/BillingService.d.ts +0 -101
  66. package/dist/src/billing/BillingService.d.ts.map +0 -1
  67. package/dist/src/billing/BillingService.helpers.d.ts +0 -15
  68. package/dist/src/billing/BillingService.helpers.d.ts.map +0 -1
  69. package/dist/src/billing/BillingService.helpers.js +0 -45
  70. package/dist/src/billing/BillingService.helpers.js.map +0 -1
  71. package/dist/src/billing/BillingService.js +0 -263
  72. package/dist/src/billing/BillingService.js.map +0 -1
  73. package/dist/src/billing/BillingService.types.d.ts +0 -52
  74. package/dist/src/billing/BillingService.types.d.ts.map +0 -1
  75. package/dist/src/billing/BillingService.types.js +0 -6
  76. package/dist/src/billing/BillingService.types.js.map +0 -1
  77. package/dist/src/billing/GDPRComplianceService.d.ts +0 -81
  78. package/dist/src/billing/GDPRComplianceService.d.ts.map +0 -1
  79. package/dist/src/billing/GDPRComplianceService.js +0 -361
  80. package/dist/src/billing/GDPRComplianceService.js.map +0 -1
  81. package/dist/src/billing/StripeClient.d.ts +0 -119
  82. package/dist/src/billing/StripeClient.d.ts.map +0 -1
  83. package/dist/src/billing/StripeClient.js +0 -405
  84. package/dist/src/billing/StripeClient.js.map +0 -1
  85. package/dist/src/billing/StripeReconciliationJob.d.ts +0 -50
  86. package/dist/src/billing/StripeReconciliationJob.d.ts.map +0 -1
  87. package/dist/src/billing/StripeReconciliationJob.js +0 -365
  88. package/dist/src/billing/StripeReconciliationJob.js.map +0 -1
  89. package/dist/src/billing/StripeWebhookHandler.d.ts +0 -49
  90. package/dist/src/billing/StripeWebhookHandler.d.ts.map +0 -1
  91. package/dist/src/billing/StripeWebhookHandler.js +0 -162
  92. package/dist/src/billing/StripeWebhookHandler.js.map +0 -1
  93. package/dist/src/billing/gdpr-types.d.ts +0 -103
  94. package/dist/src/billing/gdpr-types.d.ts.map +0 -1
  95. package/dist/src/billing/gdpr-types.js +0 -7
  96. package/dist/src/billing/gdpr-types.js.map +0 -1
  97. package/dist/src/billing/index.d.ts +0 -18
  98. package/dist/src/billing/index.d.ts.map +0 -1
  99. package/dist/src/billing/index.js +0 -19
  100. package/dist/src/billing/index.js.map +0 -1
  101. package/dist/src/billing/reconciliation-helpers.d.ts +0 -16
  102. package/dist/src/billing/reconciliation-helpers.d.ts.map +0 -1
  103. package/dist/src/billing/reconciliation-helpers.js +0 -53
  104. package/dist/src/billing/reconciliation-helpers.js.map +0 -1
  105. package/dist/src/billing/reconciliation-types.d.ts +0 -71
  106. package/dist/src/billing/reconciliation-types.d.ts.map +0 -1
  107. package/dist/src/billing/reconciliation-types.js +0 -7
  108. package/dist/src/billing/reconciliation-types.js.map +0 -1
  109. package/dist/src/billing/stripe-client-types.d.ts +0 -45
  110. package/dist/src/billing/stripe-client-types.d.ts.map +0 -1
  111. package/dist/src/billing/stripe-client-types.js +0 -7
  112. package/dist/src/billing/stripe-client-types.js.map +0 -1
  113. package/dist/src/billing/stripe-helpers.d.ts +0 -17
  114. package/dist/src/billing/stripe-helpers.d.ts.map +0 -1
  115. package/dist/src/billing/stripe-helpers.js +0 -50
  116. package/dist/src/billing/stripe-helpers.js.map +0 -1
  117. package/dist/src/billing/types.d.ts +0 -266
  118. package/dist/src/billing/types.d.ts.map +0 -1
  119. package/dist/src/billing/types.js +0 -23
  120. package/dist/src/billing/types.js.map +0 -1
  121. package/dist/src/billing/webhook-handlers.d.ts +0 -56
  122. package/dist/src/billing/webhook-handlers.d.ts.map +0 -1
  123. package/dist/src/billing/webhook-handlers.js +0 -303
  124. package/dist/src/billing/webhook-handlers.js.map +0 -1
  125. package/dist/src/billing/webhook-types.d.ts +0 -42
  126. package/dist/src/billing/webhook-types.d.ts.map +0 -1
  127. package/dist/src/billing/webhook-types.js +0 -7
  128. package/dist/src/billing/webhook-types.js.map +0 -1
  129. package/dist/tests/billing/BillingService.test.d.ts +0 -7
  130. package/dist/tests/billing/BillingService.test.d.ts.map +0 -1
  131. package/dist/tests/billing/BillingService.test.js +0 -168
  132. package/dist/tests/billing/BillingService.test.js.map +0 -1
  133. package/dist/tests/billing/GDPRCompliance.test.d.ts +0 -7
  134. package/dist/tests/billing/GDPRCompliance.test.d.ts.map +0 -1
  135. package/dist/tests/billing/GDPRCompliance.test.js +0 -380
  136. package/dist/tests/billing/GDPRCompliance.test.js.map +0 -1
  137. package/dist/tests/billing/StripeClient.test.d.ts +0 -18
  138. package/dist/tests/billing/StripeClient.test.d.ts.map +0 -1
  139. package/dist/tests/billing/StripeClient.test.js +0 -566
  140. package/dist/tests/billing/StripeClient.test.js.map +0 -1
  141. package/dist/tests/billing/StripeReconciliation.test.d.ts +0 -7
  142. package/dist/tests/billing/StripeReconciliation.test.d.ts.map +0 -1
  143. package/dist/tests/billing/StripeReconciliation.test.js +0 -266
  144. package/dist/tests/billing/StripeReconciliation.test.js.map +0 -1
  145. package/dist/tests/billing/StripeWebhookHandler.test.d.ts +0 -16
  146. package/dist/tests/billing/StripeWebhookHandler.test.d.ts.map +0 -1
  147. package/dist/tests/billing/StripeWebhookHandler.test.js +0 -240
  148. package/dist/tests/billing/StripeWebhookHandler.test.js.map +0 -1
  149. package/dist/tests/billing/stripe-helpers.test.d.ts +0 -7
  150. package/dist/tests/billing/stripe-helpers.test.d.ts.map +0 -1
  151. package/dist/tests/billing/stripe-helpers.test.js +0 -91
  152. package/dist/tests/billing/stripe-helpers.test.js.map +0 -1
  153. package/dist/tests/billing/stripe-validators.test.d.ts.map +0 -1
  154. package/dist/tests/billing/stripe-validators.test.js.map +0 -1
  155. package/dist/tests/billing/webhook-handlers.test.d.ts +0 -16
  156. package/dist/tests/billing/webhook-handlers.test.d.ts.map +0 -1
  157. package/dist/tests/billing/webhook-handlers.test.js +0 -519
  158. package/dist/tests/billing/webhook-handlers.test.js.map +0 -1
@@ -1,266 +0,0 @@
1
- /**
2
- * SMI-1069: Stripe Reconciliation Job Tests
3
- *
4
- * Tests for data reconciliation between local database and Stripe.
5
- */
6
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
- import { createDatabaseSync } from '../../src/db/createDatabase.js';
8
- import { StripeReconciliationJob } from '../../src/billing/StripeReconciliationJob.js';
9
- import { initializeAnalyticsSchema } from '../../src/analytics/schema.js';
10
- import { randomUUID } from 'crypto';
11
- // Mock StripeClient
12
- function createMockStripeClient() {
13
- return {
14
- getSubscription: vi.fn().mockResolvedValue({
15
- id: 'sub_test123',
16
- status: 'active',
17
- metadata: { tier: 'team' },
18
- items: {
19
- data: [{ quantity: 5 }],
20
- },
21
- current_period_start: 1704067200,
22
- current_period_end: 1706745600,
23
- }),
24
- getInvoice: vi.fn().mockResolvedValue({
25
- id: 'in_test123',
26
- status: 'paid',
27
- amount_paid: 2500,
28
- amount_due: 2500,
29
- }),
30
- getStripeInstance: vi.fn(),
31
- };
32
- }
33
- describe('StripeReconciliationJob', () => {
34
- let db;
35
- let mockStripeClient;
36
- beforeEach(() => {
37
- // Create in-memory database
38
- db = createDatabaseSync(':memory:');
39
- initializeAnalyticsSchema(db);
40
- mockStripeClient = createMockStripeClient();
41
- });
42
- afterEach(() => {
43
- db.close();
44
- vi.restoreAllMocks();
45
- });
46
- // Helper to create test subscription
47
- function createTestSubscription(customerId, options = {}) {
48
- const id = randomUUID();
49
- const now = new Date().toISOString();
50
- db.prepare(`INSERT INTO user_subscriptions (
51
- id, customer_id, email, stripe_customer_id, stripe_subscription_id,
52
- stripe_price_id, tier, status, seat_count,
53
- current_period_start, current_period_end, created_at, updated_at
54
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, customerId, 'test@example.com', `cus_${customerId}`, options.stripeSubscriptionId ?? `sub_${customerId}`, 'price_test', options.tier ?? 'team', options.status ?? 'active', options.seatCount ?? 5, now, now, now, now);
55
- return id;
56
- }
57
- // Helper to create test invoice
58
- function createTestInvoice(customerId, options = {}) {
59
- const id = randomUUID();
60
- const now = new Date().toISOString();
61
- db.prepare(`INSERT INTO invoices (
62
- id, customer_id, stripe_invoice_id, amount_cents, currency, status, created_at
63
- ) VALUES (?, ?, ?, ?, ?, ?, ?)`).run(id, customerId, options.stripeInvoiceId ?? `in_${customerId}`, options.amountCents ?? 2500, 'usd', options.status ?? 'paid', now);
64
- return id;
65
- }
66
- describe('Basic Operation', () => {
67
- it('should run reconciliation job successfully', async () => {
68
- const job = new StripeReconciliationJob({
69
- stripeClient: mockStripeClient,
70
- db,
71
- });
72
- const result = await job.run();
73
- expect(result.success).toBe(true);
74
- expect(result.startedAt).toBeDefined();
75
- expect(result.completedAt).toBeDefined();
76
- expect(result.durationMs).toBeGreaterThanOrEqual(0);
77
- });
78
- it('should report subscription counts', async () => {
79
- createTestSubscription('customer1');
80
- createTestSubscription('customer2');
81
- const job = new StripeReconciliationJob({
82
- stripeClient: mockStripeClient,
83
- db,
84
- });
85
- const result = await job.run();
86
- expect(result.stats.subscriptionsChecked).toBe(2);
87
- });
88
- it('should report invoice counts', async () => {
89
- createTestInvoice('customer1');
90
- createTestInvoice('customer2');
91
- createTestInvoice('customer3');
92
- const job = new StripeReconciliationJob({
93
- stripeClient: mockStripeClient,
94
- db,
95
- });
96
- const result = await job.run();
97
- expect(result.stats.invoicesChecked).toBe(3);
98
- });
99
- });
100
- describe('Subscription Discrepancy Detection', () => {
101
- it('should detect status mismatch', async () => {
102
- createTestSubscription('customer1', { status: 'past_due' });
103
- const job = new StripeReconciliationJob({
104
- stripeClient: mockStripeClient,
105
- db,
106
- });
107
- const result = await job.run();
108
- expect(result.discrepancies).toHaveLength(1);
109
- expect(result.discrepancies[0].type).toBe('status_mismatch');
110
- expect(result.discrepancies[0].localValue).toBe('past_due');
111
- expect(result.discrepancies[0].stripeValue).toBe('active');
112
- });
113
- it('should detect tier mismatch', async () => {
114
- createTestSubscription('customer1', { tier: 'individual' });
115
- const job = new StripeReconciliationJob({
116
- stripeClient: mockStripeClient,
117
- db,
118
- });
119
- const result = await job.run();
120
- const tierMismatch = result.discrepancies.find((d) => d.type === 'tier_mismatch');
121
- expect(tierMismatch).toBeDefined();
122
- expect(tierMismatch?.localValue).toBe('individual');
123
- expect(tierMismatch?.stripeValue).toBe('team');
124
- });
125
- it('should detect seat count mismatch', async () => {
126
- createTestSubscription('customer1', { seatCount: 10 });
127
- const job = new StripeReconciliationJob({
128
- stripeClient: mockStripeClient,
129
- db,
130
- });
131
- const result = await job.run();
132
- const seatMismatch = result.discrepancies.find((d) => d.type === 'seat_count_mismatch');
133
- expect(seatMismatch).toBeDefined();
134
- expect(seatMismatch?.localValue).toBe(10);
135
- expect(seatMismatch?.stripeValue).toBe(5);
136
- });
137
- it('should detect missing Stripe subscription', async () => {
138
- createTestSubscription('customer1');
139
- // Mock Stripe returning null (subscription not found)
140
- vi.mocked(mockStripeClient.getSubscription).mockResolvedValue(null);
141
- const job = new StripeReconciliationJob({
142
- stripeClient: mockStripeClient,
143
- db,
144
- });
145
- const result = await job.run();
146
- expect(result.discrepancies).toHaveLength(1);
147
- expect(result.discrepancies[0].type).toBe('missing_stripe');
148
- });
149
- });
150
- describe('Invoice Discrepancy Detection', () => {
151
- it('should detect invoice status mismatch', async () => {
152
- createTestInvoice('customer1', { status: 'open' });
153
- const job = new StripeReconciliationJob({
154
- stripeClient: mockStripeClient,
155
- db,
156
- });
157
- const result = await job.run();
158
- const statusMismatch = result.discrepancies.find((d) => d.type === 'invoice_status_mismatch');
159
- expect(statusMismatch).toBeDefined();
160
- expect(statusMismatch?.localValue).toBe('open');
161
- expect(statusMismatch?.stripeValue).toBe('paid');
162
- });
163
- it('should detect invoice amount mismatch', async () => {
164
- createTestInvoice('customer1', { amountCents: 5000 });
165
- const job = new StripeReconciliationJob({
166
- stripeClient: mockStripeClient,
167
- db,
168
- });
169
- const result = await job.run();
170
- const amountMismatch = result.discrepancies.find((d) => d.type === 'invoice_amount_mismatch');
171
- expect(amountMismatch).toBeDefined();
172
- expect(amountMismatch?.localValue).toBe(5000);
173
- expect(amountMismatch?.stripeValue).toBe(2500);
174
- });
175
- });
176
- describe('Auto-Fix', () => {
177
- it('should fix status mismatch when autoFix is enabled', async () => {
178
- const subscriptionId = createTestSubscription('customer1', { status: 'past_due' });
179
- const job = new StripeReconciliationJob({
180
- stripeClient: mockStripeClient,
181
- db,
182
- autoFix: true,
183
- });
184
- const result = await job.run();
185
- expect(result.stats.discrepanciesFixed).toBe(1);
186
- expect(result.discrepancies[0].fixed).toBe(true);
187
- // Verify the fix was applied
188
- const updated = db
189
- .prepare(`SELECT status FROM user_subscriptions WHERE id = ?`)
190
- .get(subscriptionId);
191
- expect(updated.status).toBe('active');
192
- });
193
- it('should not fix discrepancies when autoFix is disabled', async () => {
194
- createTestSubscription('customer1', { status: 'past_due' });
195
- const job = new StripeReconciliationJob({
196
- stripeClient: mockStripeClient,
197
- db,
198
- autoFix: false,
199
- });
200
- const result = await job.run();
201
- expect(result.stats.discrepanciesFixed).toBe(0);
202
- expect(result.discrepancies[0].fixed).toBe(false);
203
- });
204
- it('should fix invoice status mismatch', async () => {
205
- const invoiceId = createTestInvoice('customer1', { status: 'open' });
206
- const job = new StripeReconciliationJob({
207
- stripeClient: mockStripeClient,
208
- db,
209
- autoFix: true,
210
- });
211
- await job.run();
212
- // Verify the fix was applied
213
- const updated = db.prepare(`SELECT status FROM invoices WHERE id = ?`).get(invoiceId);
214
- expect(updated.status).toBe('paid');
215
- });
216
- });
217
- describe('Error Handling', () => {
218
- it('should handle Stripe API errors gracefully', async () => {
219
- createTestSubscription('customer1');
220
- vi.mocked(mockStripeClient.getSubscription).mockRejectedValue(new Error('Stripe API error'));
221
- const job = new StripeReconciliationJob({
222
- stripeClient: mockStripeClient,
223
- db,
224
- });
225
- const result = await job.run();
226
- expect(result.errors).toHaveLength(1);
227
- expect(result.errors[0]).toContain('Stripe API error');
228
- });
229
- it('should continue processing after individual errors', async () => {
230
- createTestSubscription('customer1');
231
- createTestSubscription('customer2');
232
- // First call fails, second succeeds
233
- vi.mocked(mockStripeClient.getSubscription)
234
- .mockRejectedValueOnce(new Error('API error'))
235
- .mockResolvedValueOnce({
236
- id: 'sub_test123',
237
- status: 'active',
238
- metadata: { tier: 'team' },
239
- items: { data: [{ quantity: 5 }] },
240
- });
241
- const job = new StripeReconciliationJob({
242
- stripeClient: mockStripeClient,
243
- db,
244
- });
245
- const result = await job.run();
246
- expect(result.stats.subscriptionsChecked).toBe(2);
247
- expect(result.errors).toHaveLength(1);
248
- });
249
- });
250
- describe('Batch Size', () => {
251
- it('should respect batch size limit', async () => {
252
- // Create more subscriptions than batch size
253
- for (let i = 0; i < 10; i++) {
254
- createTestSubscription(`customer${i}`);
255
- }
256
- const job = new StripeReconciliationJob({
257
- stripeClient: mockStripeClient,
258
- db,
259
- batchSize: 3,
260
- });
261
- const result = await job.run();
262
- expect(result.stats.subscriptionsChecked).toBe(3);
263
- });
264
- });
265
- });
266
- //# sourceMappingURL=StripeReconciliation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StripeReconciliation.test.js","sourceRoot":"","sources":["../../../tests/billing/StripeReconciliation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAGnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAA;AAEtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,oBAAoB;AACpB,SAAS,sBAAsB;IAC7B,OAAO;QACL,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACzC,EAAE,EAAE,aAAa;YACjB,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YAC1B,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;aACxB;YACD,oBAAoB,EAAE,UAAU;YAChC,kBAAkB,EAAE,UAAU;SAC/B,CAAC;QACF,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACpC,EAAE,EAAE,YAAY;YAChB,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,IAAI;SACjB,CAAC;QACF,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;KACA,CAAA;AAC9B,CAAC;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,EAAY,CAAA;IAChB,IAAI,gBAA8B,CAAA;IAElC,UAAU,CAAC,GAAG,EAAE;QACd,4BAA4B;QAC5B,EAAE,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;QACnC,yBAAyB,CAAC,EAAE,CAAC,CAAA;QAC7B,gBAAgB,GAAG,sBAAsB,EAAE,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAA;QACV,EAAE,CAAC,eAAe,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,qCAAqC;IACrC,SAAS,sBAAsB,CAC7B,UAAkB,EAClB,UAKK,EAAE;QAEP,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;QACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAEpC,EAAE,CAAC,OAAO,CACR;;;;uDAIiD,CAClD,CAAC,GAAG,CACH,EAAE,EACF,UAAU,EACV,kBAAkB,EAClB,OAAO,UAAU,EAAE,EACnB,OAAO,CAAC,oBAAoB,IAAI,OAAO,UAAU,EAAE,EACnD,YAAY,EACZ,OAAO,CAAC,IAAI,IAAI,MAAM,EACtB,OAAO,CAAC,MAAM,IAAI,QAAQ,EAC1B,OAAO,CAAC,SAAS,IAAI,CAAC,EACtB,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,CACJ,CAAA;QAED,OAAO,EAAE,CAAA;IACX,CAAC;IAED,gCAAgC;IAChC,SAAS,iBAAiB,CACxB,UAAkB,EAClB,UAIK,EAAE;QAEP,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;QACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAEpC,EAAE,CAAC,OAAO,CACR;;qCAE+B,CAChC,CAAC,GAAG,CACH,EAAE,EACF,UAAU,EACV,OAAO,CAAC,eAAe,IAAI,MAAM,UAAU,EAAE,EAC7C,OAAO,CAAC,WAAW,IAAI,IAAI,EAC3B,KAAK,EACL,OAAO,CAAC,MAAM,IAAI,MAAM,EACxB,GAAG,CACJ,CAAA;QAED,OAAO,EAAE,CAAA;IACX,CAAC;IAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;YACtC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACxC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,sBAAsB,CAAC,WAAW,CAAC,CAAA;YACnC,sBAAsB,CAAC,WAAW,CAAC,CAAA;YAEnC,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,iBAAiB,CAAC,WAAW,CAAC,CAAA;YAC9B,iBAAiB,CAAC,WAAW,CAAC,CAAA;YAC9B,iBAAiB,CAAC,WAAW,CAAC,CAAA;YAE9B,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,sBAAsB,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;YAE3D,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC5C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC3D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,sBAAsB,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;YAE3D,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAA;YACjF,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;YAClC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YACnD,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,sBAAsB,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;YAEtD,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAA;YACvF,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;YAClC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACzC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,sBAAsB,CAAC,WAAW,CAAC,CAAA;YAEnC,sDAAsD;YACtD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;YAEnE,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC5C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,iBAAiB,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;YAElD,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,yBAAyB,CAAC,CAAA;YAC7F,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAA;YACpC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,iBAAiB,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;YAErD,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,yBAAyB,CAAC,CAAA;YAC7F,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAA;YACpC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,cAAc,GAAG,sBAAsB,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;YAElF,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;gBACF,OAAO,EAAE,IAAI;aACd,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC/C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEhD,6BAA6B;YAC7B,MAAM,OAAO,GAAG,EAAE;iBACf,OAAO,CAAC,oDAAoD,CAAC;iBAC7D,GAAG,CAAC,cAAc,CAAuB,CAAA;YAC5C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,sBAAsB,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;YAE3D,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;gBACF,OAAO,EAAE,KAAK;aACf,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC/C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;YAEpE,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;gBACF,OAAO,EAAE,IAAI;aACd,CAAC,CAAA;YAEF,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAEf,6BAA6B;YAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,SAAS,CAEnF,CAAA;YACD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,sBAAsB,CAAC,WAAW,CAAC,CAAA;YAEnC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAA;YAE5F,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,sBAAsB,CAAC,WAAW,CAAC,CAAA;YACnC,sBAAsB,CAAC,WAAW,CAAC,CAAA;YAEnC,oCAAoC;YACpC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC;iBACxC,qBAAqB,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;iBAC7C,qBAAqB,CAAC;gBACrB,EAAE,EAAE,aAAa;gBACjB,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE;aACD,CAAC,CAAA;YAEtC,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;aACH,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,4CAA4C;YAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,sBAAsB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;YACxC,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC;gBACtC,YAAY,EAAE,gBAAgB;gBAC9B,EAAE;gBACF,SAAS,EAAE,CAAC;aACb,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,16 +0,0 @@
1
- /**
2
- * SMI-3415: StripeWebhookHandler Tests
3
- *
4
- * Tests for the webhook handler dispatch/routing layer:
5
- * - Signature verification (success + failure)
6
- * - Idempotent duplicate detection
7
- * - Event routing to correct handlers
8
- * - Success/failure recording
9
- * - Error handling and result shape
10
- *
11
- * Boundary: This tests StripeWebhookHandler (dispatch/routing).
12
- * BillingService.test.ts tests the service layer.
13
- * webhook-handlers.test.ts tests individual event handler logic.
14
- */
15
- export {};
16
- //# sourceMappingURL=StripeWebhookHandler.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StripeWebhookHandler.test.d.ts","sourceRoot":"","sources":["../../../tests/billing/StripeWebhookHandler.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -1,240 +0,0 @@
1
- /**
2
- * SMI-3415: StripeWebhookHandler Tests
3
- *
4
- * Tests for the webhook handler dispatch/routing layer:
5
- * - Signature verification (success + failure)
6
- * - Idempotent duplicate detection
7
- * - Event routing to correct handlers
8
- * - Success/failure recording
9
- * - Error handling and result shape
10
- *
11
- * Boundary: This tests StripeWebhookHandler (dispatch/routing).
12
- * BillingService.test.ts tests the service layer.
13
- * webhook-handlers.test.ts tests individual event handler logic.
14
- */
15
- import { describe, it, expect, vi, beforeEach } from 'vitest';
16
- import { StripeWebhookHandler } from '../../src/billing/StripeWebhookHandler.js';
17
- import { BillingError } from '../../src/billing/types.js';
18
- // ============================================================================
19
- // Mock individual webhook handlers to isolate routing logic
20
- // ============================================================================
21
- vi.mock('../../src/billing/webhook-handlers.js', () => ({
22
- handleSubscriptionCreated: vi.fn().mockResolvedValue(undefined),
23
- handleSubscriptionUpdated: vi.fn().mockResolvedValue(undefined),
24
- handleSubscriptionDeleted: vi.fn().mockResolvedValue(undefined),
25
- handleInvoicePaymentSucceeded: vi.fn().mockResolvedValue(undefined),
26
- handleInvoicePaymentFailed: vi.fn().mockResolvedValue(undefined),
27
- handleCheckoutSessionCompleted: vi.fn(),
28
- }));
29
- import { handleSubscriptionCreated, handleSubscriptionUpdated, handleSubscriptionDeleted, handleInvoicePaymentSucceeded, handleInvoicePaymentFailed, handleCheckoutSessionCompleted, } from '../../src/billing/webhook-handlers.js';
30
- // ============================================================================
31
- // Test Fixtures
32
- // ============================================================================
33
- function createMockStripeClient() {
34
- return {
35
- verifyWebhookSignature: vi.fn(),
36
- getCustomer: vi.fn(),
37
- };
38
- }
39
- function createMockBillingService() {
40
- return {
41
- isEventProcessed: vi.fn().mockReturnValue(false),
42
- recordWebhookEvent: vi.fn(),
43
- upsertSubscription: vi.fn(),
44
- getSubscriptionByStripeId: vi.fn(),
45
- updateSubscriptionStatus: vi.fn(),
46
- storeInvoice: vi.fn(),
47
- };
48
- }
49
- function createMockDb() {
50
- return {
51
- prepare: vi.fn().mockReturnValue({ run: vi.fn(), get: vi.fn(), all: vi.fn() }),
52
- };
53
- }
54
- function makeStripeEvent(type, data = {}) {
55
- return {
56
- id: 'evt_test_123',
57
- type,
58
- data: { object: data },
59
- };
60
- }
61
- // ============================================================================
62
- // Tests
63
- // ============================================================================
64
- describe('StripeWebhookHandler', () => {
65
- let handler;
66
- let mockStripe;
67
- let mockBilling;
68
- let mockDb;
69
- beforeEach(() => {
70
- vi.clearAllMocks();
71
- mockStripe = createMockStripeClient();
72
- mockBilling = createMockBillingService();
73
- mockDb = createMockDb();
74
- handler = new StripeWebhookHandler({
75
- stripeClient: mockStripe,
76
- billingService: mockBilling,
77
- db: mockDb,
78
- });
79
- });
80
- // --------------------------------------------------------------------------
81
- // Signature Verification
82
- // --------------------------------------------------------------------------
83
- describe('signature verification', () => {
84
- it('should return failure result when signature is invalid', async () => {
85
- vi.mocked(mockStripe.verifyWebhookSignature).mockImplementation(() => {
86
- throw new BillingError('Invalid webhook signature', 'WEBHOOK_SIGNATURE_INVALID');
87
- });
88
- const result = await handler.handleWebhook('payload', 'bad_sig');
89
- expect(result.success).toBe(false);
90
- expect(result.message).toBe('Signature verification failed');
91
- expect(result.processed).toBe(false);
92
- expect(result.eventId).toBe('');
93
- });
94
- it('should proceed when signature is valid', async () => {
95
- const event = makeStripeEvent('checkout.session.completed', { id: 'cs_1' });
96
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
97
- const result = await handler.handleWebhook('payload', 'valid_sig');
98
- expect(result.success).toBe(true);
99
- expect(result.processed).toBe(true);
100
- });
101
- });
102
- // --------------------------------------------------------------------------
103
- // Idempotency / Duplicate Detection
104
- // --------------------------------------------------------------------------
105
- describe('idempotency', () => {
106
- it('should skip already-processed events', async () => {
107
- const event = makeStripeEvent('customer.subscription.created', { id: 'sub_1' });
108
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
109
- vi.mocked(mockBilling.isEventProcessed).mockReturnValue(true);
110
- const result = await handler.handleWebhook('payload', 'sig');
111
- expect(result.success).toBe(true);
112
- expect(result.processed).toBe(false);
113
- expect(result.message).toBe('Event already processed');
114
- expect(handleSubscriptionCreated).not.toHaveBeenCalled();
115
- });
116
- });
117
- // --------------------------------------------------------------------------
118
- // Event Routing
119
- // --------------------------------------------------------------------------
120
- describe('event routing', () => {
121
- it('should route customer.subscription.created', async () => {
122
- const sub = { id: 'sub_1', customer: 'cus_1', status: 'active' };
123
- const event = makeStripeEvent('customer.subscription.created', sub);
124
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
125
- const result = await handler.handleWebhook('payload', 'sig');
126
- expect(result.success).toBe(true);
127
- expect(result.processed).toBe(true);
128
- expect(handleSubscriptionCreated).toHaveBeenCalledWith(expect.objectContaining({ stripe: mockStripe, billing: mockBilling }), sub);
129
- });
130
- it('should route customer.subscription.updated', async () => {
131
- const sub = { id: 'sub_1', status: 'past_due' };
132
- const event = makeStripeEvent('customer.subscription.updated', sub);
133
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
134
- await handler.handleWebhook('payload', 'sig');
135
- expect(handleSubscriptionUpdated).toHaveBeenCalledWith(expect.objectContaining({ stripe: mockStripe }), sub);
136
- });
137
- it('should route customer.subscription.deleted', async () => {
138
- const sub = { id: 'sub_1' };
139
- const event = makeStripeEvent('customer.subscription.deleted', sub);
140
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
141
- await handler.handleWebhook('payload', 'sig');
142
- expect(handleSubscriptionDeleted).toHaveBeenCalledWith(expect.objectContaining({ stripe: mockStripe }), sub);
143
- });
144
- it('should route invoice.payment_succeeded', async () => {
145
- const invoice = { id: 'in_1', customer: 'cus_1', amount_paid: 999 };
146
- const event = makeStripeEvent('invoice.payment_succeeded', invoice);
147
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
148
- await handler.handleWebhook('payload', 'sig');
149
- expect(handleInvoicePaymentSucceeded).toHaveBeenCalledWith(expect.objectContaining({ billing: mockBilling }), invoice);
150
- });
151
- it('should route invoice.payment_failed', async () => {
152
- const invoice = { id: 'in_2', customer: 'cus_1', amount_due: 999 };
153
- const event = makeStripeEvent('invoice.payment_failed', invoice);
154
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
155
- await handler.handleWebhook('payload', 'sig');
156
- expect(handleInvoicePaymentFailed).toHaveBeenCalledWith(expect.objectContaining({ billing: mockBilling }), invoice);
157
- });
158
- it('should route checkout.session.completed', async () => {
159
- const session = { id: 'cs_1', customer: 'cus_1' };
160
- const event = makeStripeEvent('checkout.session.completed', session);
161
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
162
- await handler.handleWebhook('payload', 'sig');
163
- expect(handleCheckoutSessionCompleted).toHaveBeenCalledWith(session);
164
- });
165
- it('should handle unrecognized event types gracefully', async () => {
166
- const event = makeStripeEvent('unknown.event.type', {});
167
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
168
- const result = await handler.handleWebhook('payload', 'sig');
169
- expect(result.success).toBe(true);
170
- expect(result.processed).toBe(true);
171
- expect(result.message).toBe('Processed unknown.event.type');
172
- });
173
- });
174
- // --------------------------------------------------------------------------
175
- // Event Recording
176
- // --------------------------------------------------------------------------
177
- describe('event recording', () => {
178
- it('should record successful event processing', async () => {
179
- const event = makeStripeEvent('checkout.session.completed', { id: 'cs_1' });
180
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
181
- await handler.handleWebhook('the_payload', 'sig');
182
- expect(mockBilling.recordWebhookEvent).toHaveBeenCalledWith({
183
- stripeEventId: 'evt_test_123',
184
- eventType: 'checkout.session.completed',
185
- payload: 'the_payload',
186
- success: true,
187
- });
188
- });
189
- it('should record failed event processing', async () => {
190
- const event = makeStripeEvent('customer.subscription.created', { id: 'sub_1' });
191
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
192
- vi.mocked(handleSubscriptionCreated).mockRejectedValueOnce(new Error('Handler boom'));
193
- const result = await handler.handleWebhook('the_payload', 'sig');
194
- expect(result.success).toBe(false);
195
- expect(result.error).toBe('Handler boom');
196
- expect(mockBilling.recordWebhookEvent).toHaveBeenCalledWith(expect.objectContaining({
197
- stripeEventId: 'evt_test_123',
198
- success: false,
199
- errorMessage: 'Handler boom',
200
- }));
201
- });
202
- });
203
- // --------------------------------------------------------------------------
204
- // Result Shape
205
- // --------------------------------------------------------------------------
206
- describe('result shape', () => {
207
- it('should include eventId in success result', async () => {
208
- const event = makeStripeEvent('checkout.session.completed', {});
209
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
210
- const result = await handler.handleWebhook('payload', 'sig');
211
- expect(result.eventId).toBe('evt_test_123');
212
- expect(result.success).toBe(true);
213
- expect(result.processed).toBe(true);
214
- });
215
- });
216
- // --------------------------------------------------------------------------
217
- // Callbacks
218
- // --------------------------------------------------------------------------
219
- describe('callbacks', () => {
220
- it('should pass onLicenseKeyNeeded to handler context', async () => {
221
- const onLicense = vi.fn();
222
- const onEmail = vi.fn();
223
- const handlerWithCallbacks = new StripeWebhookHandler({
224
- stripeClient: mockStripe,
225
- billingService: mockBilling,
226
- db: mockDb,
227
- onLicenseKeyNeeded: onLicense,
228
- onEmailNeeded: onEmail,
229
- });
230
- const event = makeStripeEvent('customer.subscription.created', { id: 'sub_1' });
231
- vi.mocked(mockStripe.verifyWebhookSignature).mockReturnValue(event);
232
- await handlerWithCallbacks.handleWebhook('payload', 'sig');
233
- expect(handleSubscriptionCreated).toHaveBeenCalledWith(expect.objectContaining({
234
- onLicenseKeyNeeded: onLicense,
235
- onEmailNeeded: onEmail,
236
- }), expect.anything());
237
- });
238
- });
239
- });
240
- //# sourceMappingURL=StripeWebhookHandler.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StripeWebhookHandler.test.js","sourceRoot":"","sources":["../../../tests/billing/StripeWebhookHandler.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * SMI-3415: Stripe Helper Functions Tests
3
- *
4
- * Tests for mapSubscriptionStatus and getPriceIdForTier utilities.
5
- */
6
- export {};
7
- //# sourceMappingURL=stripe-helpers.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stripe-helpers.test.d.ts","sourceRoot":"","sources":["../../../tests/billing/stripe-helpers.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}