@onesub/server 0.7.2 → 0.8.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 (92) hide show
  1. package/README.md +1 -0
  2. package/dist/__tests__/apple-status-api.test.d.ts +14 -0
  3. package/dist/__tests__/apple-status-api.test.d.ts.map +1 -0
  4. package/dist/__tests__/apple-status-api.test.js +345 -0
  5. package/dist/__tests__/apple-status-api.test.js.map +1 -0
  6. package/dist/__tests__/error-codes.test.js +16 -0
  7. package/dist/__tests__/error-codes.test.js.map +1 -1
  8. package/dist/__tests__/google-paused.test.d.ts +10 -0
  9. package/dist/__tests__/google-paused.test.d.ts.map +1 -0
  10. package/dist/__tests__/google-paused.test.js +126 -0
  11. package/dist/__tests__/google-paused.test.js.map +1 -0
  12. package/dist/__tests__/google-price-change.test.d.ts +6 -0
  13. package/dist/__tests__/google-price-change.test.d.ts.map +1 -0
  14. package/dist/__tests__/google-price-change.test.js +186 -0
  15. package/dist/__tests__/google-price-change.test.js.map +1 -0
  16. package/dist/__tests__/google-subscriptions-v2.test.d.ts +13 -0
  17. package/dist/__tests__/google-subscriptions-v2.test.d.ts.map +1 -0
  18. package/dist/__tests__/google-subscriptions-v2.test.js +206 -0
  19. package/dist/__tests__/google-subscriptions-v2.test.js.map +1 -0
  20. package/dist/__tests__/lifecycle-states.test.d.ts +12 -0
  21. package/dist/__tests__/lifecycle-states.test.d.ts.map +1 -0
  22. package/dist/__tests__/lifecycle-states.test.js +423 -0
  23. package/dist/__tests__/lifecycle-states.test.js.map +1 -0
  24. package/dist/__tests__/linked-purchase-token.test.d.ts +9 -0
  25. package/dist/__tests__/linked-purchase-token.test.d.ts.map +1 -0
  26. package/dist/__tests__/linked-purchase-token.test.js +227 -0
  27. package/dist/__tests__/linked-purchase-token.test.js.map +1 -0
  28. package/dist/__tests__/mock-provider.test.d.ts +2 -0
  29. package/dist/__tests__/mock-provider.test.d.ts.map +1 -0
  30. package/dist/__tests__/mock-provider.test.js +188 -0
  31. package/dist/__tests__/mock-provider.test.js.map +1 -0
  32. package/dist/__tests__/providers.test.js +69 -9
  33. package/dist/__tests__/providers.test.js.map +1 -1
  34. package/dist/__tests__/refund-policy.test.d.ts +11 -0
  35. package/dist/__tests__/refund-policy.test.d.ts.map +1 -0
  36. package/dist/__tests__/refund-policy.test.js +317 -0
  37. package/dist/__tests__/refund-policy.test.js.map +1 -0
  38. package/dist/__tests__/store.test.js +17 -0
  39. package/dist/__tests__/store.test.js.map +1 -1
  40. package/dist/__tests__/test-utils.d.ts +20 -0
  41. package/dist/__tests__/test-utils.d.ts.map +1 -0
  42. package/dist/__tests__/test-utils.js +30 -0
  43. package/dist/__tests__/test-utils.js.map +1 -0
  44. package/dist/__tests__/webhook-refund.test.d.ts +13 -0
  45. package/dist/__tests__/webhook-refund.test.d.ts.map +1 -0
  46. package/dist/__tests__/webhook-refund.test.js +313 -0
  47. package/dist/__tests__/webhook-refund.test.js.map +1 -0
  48. package/dist/index.d.ts +1 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +9 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/providers/apple.d.ts +45 -2
  53. package/dist/providers/apple.d.ts.map +1 -1
  54. package/dist/providers/apple.js +202 -2
  55. package/dist/providers/apple.js.map +1 -1
  56. package/dist/providers/google.d.ts +71 -6
  57. package/dist/providers/google.d.ts.map +1 -1
  58. package/dist/providers/google.js +204 -32
  59. package/dist/providers/google.js.map +1 -1
  60. package/dist/providers/mock.d.ts +46 -0
  61. package/dist/providers/mock.d.ts.map +1 -0
  62. package/dist/providers/mock.js +93 -0
  63. package/dist/providers/mock.js.map +1 -0
  64. package/dist/routes/admin.d.ts.map +1 -1
  65. package/dist/routes/admin.js +4 -2
  66. package/dist/routes/admin.js.map +1 -1
  67. package/dist/routes/purchase.d.ts.map +1 -1
  68. package/dist/routes/purchase.js +15 -6
  69. package/dist/routes/purchase.js.map +1 -1
  70. package/dist/routes/status.d.ts.map +1 -1
  71. package/dist/routes/status.js +14 -1
  72. package/dist/routes/status.js.map +1 -1
  73. package/dist/routes/validate.d.ts.map +1 -1
  74. package/dist/routes/validate.js +7 -1
  75. package/dist/routes/validate.js.map +1 -1
  76. package/dist/routes/webhook.d.ts +2 -2
  77. package/dist/routes/webhook.d.ts.map +1 -1
  78. package/dist/routes/webhook.js +219 -27
  79. package/dist/routes/webhook.js.map +1 -1
  80. package/dist/store.d.ts +9 -0
  81. package/dist/store.d.ts.map +1 -1
  82. package/dist/store.js +12 -0
  83. package/dist/store.js.map +1 -1
  84. package/dist/stores/postgres.d.ts +1 -0
  85. package/dist/stores/postgres.d.ts.map +1 -1
  86. package/dist/stores/postgres.js +10 -2
  87. package/dist/stores/postgres.js.map +1 -1
  88. package/dist/stores/schema.d.ts.map +1 -1
  89. package/dist/stores/schema.js +5 -0
  90. package/dist/stores/schema.js.map +1 -1
  91. package/package.json +2 -2
  92. package/sql/schema.sql +5 -0
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Tests for Google linkedPurchaseToken upgrade/downgrade chain handling.
3
+ *
4
+ * - validateGoogleReceipt surfaces linkedPurchaseToken from v2 response
5
+ * - webhook for an unknown new token with linkedPurchaseToken inherits the
6
+ * userId from the previous record (continuity across plan changes)
7
+ */
8
+ import { describe, it, expect, beforeAll, beforeEach, vi } from 'vitest';
9
+ import express from 'express';
10
+ import { generateKeyPairSync } from 'crypto';
11
+ import { SUBSCRIPTION_STATUS } from '@onesub/shared';
12
+ import { validateGoogleReceipt } from '../providers/google.js';
13
+ import { createWebhookRouter } from '../routes/webhook.js';
14
+ import { InMemorySubscriptionStore, InMemoryPurchaseStore } from '../store.js';
15
+ import { isLocalhostUrl, urlHost } from './test-utils.js';
16
+ let testPrivateKey;
17
+ beforeAll(() => {
18
+ const { privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
19
+ testPrivateKey = privateKey.export({ type: 'pkcs8', format: 'pem' });
20
+ });
21
+ beforeEach(() => {
22
+ vi.restoreAllMocks();
23
+ });
24
+ function googleConfig(extra) {
25
+ return {
26
+ packageName: 'com.example.app',
27
+ serviceAccountKey: JSON.stringify({
28
+ client_email: `test-${Math.random()}@test.iam.gserviceaccount.com`,
29
+ private_key: testPrivateKey,
30
+ token_uri: 'https://oauth2.googleapis.com/token',
31
+ }),
32
+ ...extra,
33
+ };
34
+ }
35
+ function v2Response(opts) {
36
+ return {
37
+ startTime: '2026-01-01T00:00:00Z',
38
+ subscriptionState: 'SUBSCRIPTION_STATE_ACTIVE',
39
+ latestOrderId: 'GPA.new_order',
40
+ lineItems: [{
41
+ productId: opts.productId ?? 'pro_yearly',
42
+ expiryTime: '2027-01-01T00:00:00Z',
43
+ autoRenewingPlan: { autoRenewEnabled: true },
44
+ }],
45
+ ...opts,
46
+ };
47
+ }
48
+ function mockV2Fetch(responseBody) {
49
+ const originalFetch = global.fetch;
50
+ vi.spyOn(global, 'fetch').mockImplementation(async (url, init) => {
51
+ if (isLocalhostUrl(url))
52
+ return originalFetch(url, init);
53
+ const host = urlHost(url);
54
+ if (host === 'oauth2.googleapis.com') {
55
+ return {
56
+ ok: true,
57
+ json: async () => ({ access_token: 'tok', expires_in: 3600 }),
58
+ text: async () => '',
59
+ };
60
+ }
61
+ if (host === 'androidpublisher.googleapis.com') {
62
+ return {
63
+ ok: true,
64
+ json: async () => responseBody,
65
+ text: async () => JSON.stringify(responseBody),
66
+ };
67
+ }
68
+ throw new Error(`[test] Unexpected URL: ${String(url)}`);
69
+ });
70
+ }
71
+ // ── validateGoogleReceipt surfaces linkedPurchaseToken ──────────────────────
72
+ describe('validateGoogleReceipt — linkedPurchaseToken passthrough', () => {
73
+ it('returns linkedPurchaseToken from the v2 response', async () => {
74
+ mockV2Fetch(v2Response({
75
+ productId: 'pro_yearly',
76
+ linkedPurchaseToken: 'tok_old_monthly',
77
+ }));
78
+ const result = await validateGoogleReceipt('tok_new_yearly', 'pro_yearly', googleConfig());
79
+ expect(result?.linkedPurchaseToken).toBe('tok_old_monthly');
80
+ });
81
+ it('returns undefined linkedPurchaseToken for first-purchase (no chain)', async () => {
82
+ mockV2Fetch(v2Response({ productId: 'pro_monthly' })); // no linkedPurchaseToken
83
+ const result = await validateGoogleReceipt('tok_first', 'pro_monthly', googleConfig());
84
+ expect(result?.linkedPurchaseToken).toBeUndefined();
85
+ });
86
+ });
87
+ function spinUp(handler) {
88
+ return {
89
+ async request(path, body) {
90
+ const httpServer = handler.listen(0);
91
+ const address = httpServer.address();
92
+ const port = typeof address === 'object' && address ? address.port : 0;
93
+ try {
94
+ const resp = await fetch(`http://127.0.0.1:${port}${path}`, {
95
+ method: 'POST',
96
+ headers: { 'Content-Type': 'application/json' },
97
+ body: JSON.stringify(body),
98
+ });
99
+ const text = await resp.text();
100
+ let parsed = text;
101
+ try {
102
+ parsed = JSON.parse(text);
103
+ }
104
+ catch { /* keep as text */ }
105
+ return { status: resp.status, body: parsed };
106
+ }
107
+ finally {
108
+ await new Promise((resolve) => httpServer.close(() => resolve()));
109
+ }
110
+ },
111
+ };
112
+ }
113
+ function buildServer(config) {
114
+ const store = new InMemorySubscriptionStore();
115
+ const purchaseStore = new InMemoryPurchaseStore();
116
+ const app = express();
117
+ app.use(express.json());
118
+ app.use(createWebhookRouter(config, store, purchaseStore));
119
+ return { store, server: spinUp(app) };
120
+ }
121
+ function purchasedNotificationBody(purchaseToken, productId = 'pro_yearly') {
122
+ const json = JSON.stringify({
123
+ version: '1.0',
124
+ packageName: 'com.example.app',
125
+ eventTimeMillis: String(Date.now()),
126
+ subscriptionNotification: {
127
+ version: '1.0',
128
+ notificationType: 4, // SUBSCRIPTION_PURCHASED
129
+ purchaseToken,
130
+ subscriptionId: productId,
131
+ },
132
+ });
133
+ return {
134
+ message: { data: Buffer.from(json).toString('base64'), messageId: '1' },
135
+ subscription: 's',
136
+ };
137
+ }
138
+ const sampleSub = (overrides) => ({
139
+ userId: 'real_user_42',
140
+ productId: 'pro_monthly',
141
+ platform: 'google',
142
+ status: 'active',
143
+ expiresAt: '2026-12-01T00:00:00.000Z',
144
+ originalTransactionId: 'tok_old_monthly',
145
+ purchasedAt: '2026-01-01T00:00:00.000Z',
146
+ willRenew: true,
147
+ ...overrides,
148
+ });
149
+ // Note: webhook saves the new record indexed by fresh.originalTransactionId
150
+ // (= v2 response's latestOrderId), not by purchaseToken. So the assertions
151
+ // look up new records via the latestOrderId from the mocked v2 response.
152
+ //
153
+ // History assertions (previous record) use the previous original_transaction_id
154
+ // (= the linkedPurchaseToken value, which is itself the prior latestOrderId).
155
+ describe('Google webhook — linkedPurchaseToken userId inheritance', () => {
156
+ it('inherits userId from the previous (linked) record on plan change', async () => {
157
+ mockV2Fetch(v2Response({
158
+ productId: 'pro_yearly',
159
+ latestOrderId: 'GPA.new_yearly_order',
160
+ linkedPurchaseToken: 'tok_old_monthly',
161
+ }));
162
+ const { store, server } = buildServer({
163
+ google: googleConfig(),
164
+ database: { url: '' },
165
+ });
166
+ // Previous monthly subscription owned by real_user_42
167
+ await store.save(sampleSub({ originalTransactionId: 'tok_old_monthly' }));
168
+ const resp = await server.request('/onesub/webhook/google', purchasedNotificationBody('tok_new_yearly'));
169
+ expect(resp.status).toBe(200);
170
+ const newRecord = await store.getByTransactionId('GPA.new_yearly_order');
171
+ expect(newRecord).not.toBeNull();
172
+ expect(newRecord?.userId).toBe('real_user_42'); // inherited, not placeholder
173
+ expect(newRecord?.productId).toBe('pro_yearly');
174
+ expect(newRecord?.linkedPurchaseToken).toBe('tok_old_monthly');
175
+ expect(newRecord?.status).toBe(SUBSCRIPTION_STATUS.ACTIVE);
176
+ });
177
+ it('falls back to placeholder userId when linkedPurchaseToken record is unknown', async () => {
178
+ mockV2Fetch(v2Response({
179
+ productId: 'pro_yearly',
180
+ latestOrderId: 'GPA.orphan_order',
181
+ linkedPurchaseToken: 'tok_never_seen',
182
+ }));
183
+ const { store, server } = buildServer({
184
+ google: googleConfig(),
185
+ database: { url: '' },
186
+ });
187
+ // No previous record exists
188
+ await server.request('/onesub/webhook/google', purchasedNotificationBody('tok_new_orphan'));
189
+ const newRecord = await store.getByTransactionId('GPA.orphan_order');
190
+ expect(newRecord?.userId).toBe('tok_new_orphan'); // placeholder = purchaseToken
191
+ });
192
+ it('uses placeholder userId when the new subscription has no linkedPurchaseToken (first purchase)', async () => {
193
+ mockV2Fetch(v2Response({
194
+ productId: 'pro_monthly',
195
+ latestOrderId: 'GPA.first_order',
196
+ })); // no linkedPurchaseToken
197
+ const { store, server } = buildServer({
198
+ google: googleConfig(),
199
+ database: { url: '' },
200
+ });
201
+ await server.request('/onesub/webhook/google', purchasedNotificationBody('tok_first_buy', 'pro_monthly'));
202
+ const newRecord = await store.getByTransactionId('GPA.first_order');
203
+ expect(newRecord?.userId).toBe('tok_first_buy');
204
+ });
205
+ it('preserves the previous record (history) when issuing the new one', async () => {
206
+ mockV2Fetch(v2Response({
207
+ productId: 'pro_yearly',
208
+ latestOrderId: 'GPA.keep_new_order',
209
+ linkedPurchaseToken: 'tok_old_keep',
210
+ }));
211
+ const { store, server } = buildServer({
212
+ google: googleConfig(),
213
+ database: { url: '' },
214
+ });
215
+ await store.save(sampleSub({ originalTransactionId: 'tok_old_keep', userId: 'user_keep' }));
216
+ await server.request('/onesub/webhook/google', purchasedNotificationBody('tok_new_keep'));
217
+ // Previous record still findable by its own originalTransactionId
218
+ const previous = await store.getByTransactionId('tok_old_keep');
219
+ expect(previous?.userId).toBe('user_keep');
220
+ expect(previous?.productId).toBe('pro_monthly');
221
+ // New record carries the inherited userId AND the link backward
222
+ const next = await store.getByTransactionId('GPA.keep_new_order');
223
+ expect(next?.userId).toBe('user_keep');
224
+ expect(next?.linkedPurchaseToken).toBe('tok_old_keep');
225
+ });
226
+ });
227
+ //# sourceMappingURL=linked-purchase-token.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linked-purchase-token.test.js","sourceRoot":"","sources":["../../src/__tests__/linked-purchase-token.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mock-provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-provider.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mock-provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,188 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import request from 'supertest';
3
+ import express from 'express';
4
+ import { ONESUB_ERROR_CODE, SUBSCRIPTION_STATUS, MOCK_RECEIPT_PREFIX } from '@onesub/shared';
5
+ import { createOneSubMiddleware } from '../index.js';
6
+ import { InMemorySubscriptionStore, InMemoryPurchaseStore } from '../store.js';
7
+ import { classifyMockReceipt, mockValidateAppleSubscription, mockValidateAppleProduct, mockValidateGoogleSubscription, mockValidateGoogleProduct, } from '../providers/mock.js';
8
+ // ---------------------------------------------------------------------------
9
+ // Pure classifier
10
+ // ---------------------------------------------------------------------------
11
+ describe('classifyMockReceipt', () => {
12
+ const cases = [
13
+ [`${MOCK_RECEIPT_PREFIX.REVOKED}_tx1`, 'revoked'],
14
+ [`${MOCK_RECEIPT_PREFIX.EXPIRED}_tx1`, 'expired'],
15
+ [`${MOCK_RECEIPT_PREFIX.INVALID}_tx1`, 'invalid'],
16
+ [`${MOCK_RECEIPT_PREFIX.BAD_SIG}_tx1`, 'invalid'],
17
+ [`${MOCK_RECEIPT_PREFIX.NETWORK_ERROR}_tx1`, 'network-error'],
18
+ [`${MOCK_RECEIPT_PREFIX.SANDBOX}_tx1`, 'sandbox'],
19
+ ['MOCK_anything_else', 'valid'],
20
+ ['not_even_a_mock_prefix', 'valid'],
21
+ ];
22
+ for (const [receipt, expected] of cases) {
23
+ it(`classifies ${receipt} as ${expected}`, () => {
24
+ expect(classifyMockReceipt(receipt).kind).toBe(expected);
25
+ });
26
+ }
27
+ });
28
+ // ---------------------------------------------------------------------------
29
+ // Pure mock provider functions
30
+ // ---------------------------------------------------------------------------
31
+ describe('mockValidateAppleSubscription', () => {
32
+ it('returns ACTIVE subscription for valid receipt', () => {
33
+ const sub = mockValidateAppleSubscription('MOCK_VALID_sub_1');
34
+ expect(sub).toMatchObject({
35
+ platform: 'apple',
36
+ status: SUBSCRIPTION_STATUS.ACTIVE,
37
+ willRenew: true,
38
+ });
39
+ expect(sub?.originalTransactionId).toContain('mock_apple_orig_');
40
+ });
41
+ it('returns null for MOCK_REVOKED', () => {
42
+ expect(mockValidateAppleSubscription('MOCK_REVOKED_x')).toBeNull();
43
+ });
44
+ it('throws for MOCK_NETWORK_ERROR', () => {
45
+ expect(() => mockValidateAppleSubscription('MOCK_NETWORK_ERROR_x')).toThrow(/network error/);
46
+ });
47
+ it('produces deterministic transactionIds', () => {
48
+ const a = mockValidateAppleSubscription('MOCK_VALID_same');
49
+ const b = mockValidateAppleSubscription('MOCK_VALID_same');
50
+ expect(a?.originalTransactionId).toBe(b?.originalTransactionId);
51
+ });
52
+ it('sandbox receipts get shorter expiry (~1h)', () => {
53
+ const sub = mockValidateAppleSubscription('MOCK_SANDBOX_x');
54
+ const expiry = Date.parse(sub.expiresAt);
55
+ const ageMs = expiry - Date.now();
56
+ expect(ageMs).toBeGreaterThan(30 * 60 * 1000); // > 30 min
57
+ expect(ageMs).toBeLessThan(2 * 60 * 60 * 1000); // < 2 h
58
+ });
59
+ });
60
+ describe('mockValidateAppleProduct', () => {
61
+ it('returns product result with productId for valid receipt', () => {
62
+ const result = mockValidateAppleProduct('MOCK_VALID_x', 'premium');
63
+ expect(result).toMatchObject({ productId: 'premium' });
64
+ expect(result?.transactionId).toContain('mock_apple_premium_');
65
+ });
66
+ it('returns null for MOCK_EXPIRED', () => {
67
+ expect(mockValidateAppleProduct('MOCK_EXPIRED_x', 'premium')).toBeNull();
68
+ });
69
+ });
70
+ describe('mockValidateGoogleSubscription', () => {
71
+ it('returns ACTIVE subscription for valid token', () => {
72
+ const sub = mockValidateGoogleSubscription('MOCK_VALID_x', 'pro_monthly');
73
+ expect(sub).toMatchObject({
74
+ platform: 'google',
75
+ productId: 'pro_monthly',
76
+ status: SUBSCRIPTION_STATUS.ACTIVE,
77
+ });
78
+ });
79
+ it('throws for MOCK_NETWORK_ERROR', () => {
80
+ expect(() => mockValidateGoogleSubscription('MOCK_NETWORK_ERROR_x', 'pro'))
81
+ .toThrow(/network error/);
82
+ });
83
+ });
84
+ describe('mockValidateGoogleProduct', () => {
85
+ it('returns product result for valid token', () => {
86
+ const result = mockValidateGoogleProduct('MOCK_VALID_x', 'credits_100');
87
+ expect(result?.transactionId).toContain('mock_google_credits_100_');
88
+ });
89
+ it('returns null for MOCK_INVALID', () => {
90
+ expect(mockValidateGoogleProduct('MOCK_INVALID_x', 'credits_100')).toBeNull();
91
+ });
92
+ });
93
+ // ---------------------------------------------------------------------------
94
+ // HTTP integration — full onesub server with mockMode on both platforms.
95
+ // This is the key demo: a server standing up without real Apple / Google
96
+ // credentials, yet the full purchase flow completes end-to-end.
97
+ // ---------------------------------------------------------------------------
98
+ describe('full server in mockMode', () => {
99
+ function mockApp() {
100
+ const config = {
101
+ database: { url: '' },
102
+ apple: { bundleId: 'com.test.mock', mockMode: true },
103
+ google: { packageName: 'com.test.mock', mockMode: true },
104
+ };
105
+ const app = express();
106
+ app.use(createOneSubMiddleware({
107
+ ...config,
108
+ store: new InMemorySubscriptionStore(),
109
+ purchaseStore: new InMemoryPurchaseStore(),
110
+ }));
111
+ return app;
112
+ }
113
+ it('validates an Apple subscription without any real credentials', async () => {
114
+ const app = mockApp();
115
+ const res = await request(app).post('/onesub/validate').send({
116
+ platform: 'apple',
117
+ receipt: 'MOCK_VALID_apple_sub_1',
118
+ userId: 'user_1',
119
+ productId: 'pro_monthly',
120
+ });
121
+ expect(res.status).toBe(200);
122
+ expect(res.body.valid).toBe(true);
123
+ expect(res.body.subscription.status).toBe('active');
124
+ });
125
+ it('validates a Google non-consumable purchase without credentials', async () => {
126
+ const app = mockApp();
127
+ const res = await request(app).post('/onesub/purchase/validate').send({
128
+ platform: 'google',
129
+ receipt: 'MOCK_VALID_google_product_1',
130
+ userId: 'user_1',
131
+ productId: 'premium',
132
+ type: 'non_consumable',
133
+ });
134
+ expect(res.status).toBe(200);
135
+ expect(res.body.valid).toBe(true);
136
+ expect(res.body.action).toBe('new');
137
+ });
138
+ it('MOCK_REVOKED returns RECEIPT_VALIDATION_FAILED via normal error path', async () => {
139
+ const app = mockApp();
140
+ const res = await request(app).post('/onesub/purchase/validate').send({
141
+ platform: 'apple',
142
+ receipt: 'MOCK_REVOKED_x',
143
+ userId: 'user_1',
144
+ productId: 'premium',
145
+ type: 'non_consumable',
146
+ });
147
+ expect(res.status).toBe(422);
148
+ expect(res.body.errorCode).toBe(ONESUB_ERROR_CODE.RECEIPT_VALIDATION_FAILED);
149
+ });
150
+ it('throws when NODE_ENV=production + mockMode is set (fraud guard)', () => {
151
+ const original = process.env['NODE_ENV'];
152
+ process.env['NODE_ENV'] = 'production';
153
+ try {
154
+ expect(() => createOneSubMiddleware({
155
+ database: { url: '' },
156
+ apple: { bundleId: 'com.test', mockMode: true },
157
+ store: new InMemorySubscriptionStore(),
158
+ purchaseStore: new InMemoryPurchaseStore(),
159
+ })).toThrow(/mockMode cannot be enabled when NODE_ENV=production/);
160
+ }
161
+ finally {
162
+ if (original === undefined)
163
+ delete process.env['NODE_ENV'];
164
+ else
165
+ process.env['NODE_ENV'] = original;
166
+ }
167
+ });
168
+ it('replaying the same receipt returns action:restored (server idempotency)', async () => {
169
+ const app = mockApp();
170
+ const body = {
171
+ platform: 'apple',
172
+ receipt: 'MOCK_VALID_replay_test',
173
+ userId: 'user_1',
174
+ productId: 'premium',
175
+ type: 'non_consumable',
176
+ };
177
+ const first = await request(app).post('/onesub/purchase/validate').send(body);
178
+ expect(first.body.action).toBe('new');
179
+ // Wipe the user's record so hasPurchased() is false (NON_CONSUMABLE_ALREADY_OWNED
180
+ // would short-circuit otherwise). Use a different userId to hit the same
181
+ // transactionId path.
182
+ const second = await request(app).post('/onesub/purchase/validate').send({ ...body, userId: 'user_2' });
183
+ // non-consumable with same transactionId but different userId → auto-reassigned (0.6.1+)
184
+ expect(second.body.valid).toBe(true);
185
+ expect(second.body.action).toBe('restored');
186
+ });
187
+ });
188
+ //# sourceMappingURL=mock-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/mock-provider.test.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,8 @@
5
5
  import { describe, it, expect, vi, beforeAll, beforeEach } from 'vitest';
6
6
  import { generateKeyPairSync } from 'crypto';
7
7
  import { validateAppleConsumableReceipt } from '../providers/apple.js';
8
- import { validateGoogleProductReceipt } from '../providers/google.js';
8
+ import { validateGoogleProductReceipt, acknowledgeGoogleSubscription, acknowledgeGoogleProduct, } from '../providers/google.js';
9
+ import { urlHost } from './test-utils.js';
9
10
  // ── Apple helpers ──────────────────────────────────────────────────────────
10
11
  /**
11
12
  * Build a minimal JWS token whose payload is the given object.
@@ -32,8 +33,8 @@ function validApplePayload(overrides) {
32
33
  let testPrivateKey;
33
34
  beforeAll(() => {
34
35
  // Generate a real RSA key pair once — needed for the JWT assertion in getAccessToken().
35
- // 1024-bit is sufficient for tests (not production).
36
- const { privateKey } = generateKeyPairSync('rsa', { modulusLength: 1024 });
36
+ // 2048-bit (CodeQL minimum); generated once per suite so test-time cost is negligible.
37
+ const { privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
37
38
  testPrivateKey = privateKey.export({ type: 'pkcs8', format: 'pem' });
38
39
  });
39
40
  beforeEach(() => {
@@ -61,22 +62,22 @@ function makeGoogleConfig() {
61
62
  */
62
63
  function mockGoogleFetch(productPurchase) {
63
64
  vi.spyOn(global, 'fetch').mockImplementation(async (url) => {
64
- const urlStr = String(url);
65
- if (urlStr.includes('oauth2.googleapis.com')) {
65
+ const host = urlHost(url);
66
+ if (host === 'oauth2.googleapis.com') {
66
67
  return {
67
68
  ok: true,
68
69
  json: async () => ({ access_token: 'test_access_token', expires_in: 3600 }),
69
70
  text: async () => '',
70
71
  };
71
72
  }
72
- if (urlStr.includes('androidpublisher.googleapis.com')) {
73
+ if (host === 'androidpublisher.googleapis.com') {
73
74
  return {
74
75
  ok: true,
75
76
  json: async () => productPurchase,
76
77
  text: async () => JSON.stringify(productPurchase),
77
78
  };
78
79
  }
79
- throw new Error(`[test] Unexpected fetch URL: ${urlStr}`);
80
+ throw new Error(`[test] Unexpected fetch URL: ${String(url)}`);
80
81
  });
81
82
  }
82
83
  // ============================================================================
@@ -244,8 +245,7 @@ describe('validateGoogleProductReceipt', () => {
244
245
  });
245
246
  it('returns null when Play API returns an error response', async () => {
246
247
  vi.spyOn(global, 'fetch').mockImplementation(async (url) => {
247
- const urlStr = String(url);
248
- if (urlStr.includes('oauth2.googleapis.com')) {
248
+ if (urlHost(url) === 'oauth2.googleapis.com') {
249
249
  return {
250
250
  ok: true,
251
251
  json: async () => ({ access_token: 'tok', expires_in: 3600 }),
@@ -258,4 +258,64 @@ describe('validateGoogleProductReceipt', () => {
258
258
  expect(result).toBeNull();
259
259
  });
260
260
  });
261
+ // ============================================================================
262
+ // acknowledgeGoogleSubscription / acknowledgeGoogleProduct
263
+ // ============================================================================
264
+ describe('acknowledgeGoogleSubscription', () => {
265
+ it('POSTs to subscriptions/:acknowledge with empty body', async () => {
266
+ const calls = [];
267
+ vi.spyOn(global, 'fetch').mockImplementation(async (url, init) => {
268
+ calls.push({ url: String(url), method: init?.method, body: init?.body });
269
+ if (urlHost(url) === 'oauth2.googleapis.com') {
270
+ return { ok: true, json: async () => ({ access_token: 'tok', expires_in: 3600 }), text: async () => '' };
271
+ }
272
+ return { ok: true, json: async () => ({}), text: async () => '' };
273
+ });
274
+ await acknowledgeGoogleSubscription('purchase_token_xyz', 'pro_monthly', makeGoogleConfig());
275
+ const ackCall = calls.find((c) => c.url.includes(':acknowledge'));
276
+ expect(ackCall).toBeDefined();
277
+ expect(ackCall?.url).toContain('/purchases/subscriptions/pro_monthly/tokens/purchase_token_xyz:acknowledge');
278
+ expect(ackCall?.method).toBe('POST');
279
+ expect(ackCall?.body).toBe('{}');
280
+ });
281
+ it('does not throw when Play API returns an error (fire-and-forget)', async () => {
282
+ vi.spyOn(global, 'fetch').mockImplementation(async (url) => {
283
+ if (urlHost(url) === 'oauth2.googleapis.com') {
284
+ return { ok: true, json: async () => ({ access_token: 'tok', expires_in: 3600 }), text: async () => '' };
285
+ }
286
+ return { ok: false, status: 500, json: async () => ({}), text: async () => 'oops' };
287
+ });
288
+ await expect(acknowledgeGoogleSubscription('tok', 'pro_monthly', makeGoogleConfig())).resolves.toBeUndefined();
289
+ });
290
+ it('skips when serviceAccountKey is missing', async () => {
291
+ const fetchSpy = vi.spyOn(global, 'fetch');
292
+ await acknowledgeGoogleSubscription('tok', 'pro', { packageName: 'com.example.app' });
293
+ expect(fetchSpy).not.toHaveBeenCalled();
294
+ });
295
+ it('skips when mockMode is true', async () => {
296
+ const fetchSpy = vi.spyOn(global, 'fetch');
297
+ await acknowledgeGoogleSubscription('tok', 'pro', { ...makeGoogleConfig(), mockMode: true });
298
+ expect(fetchSpy).not.toHaveBeenCalled();
299
+ });
300
+ });
301
+ describe('acknowledgeGoogleProduct', () => {
302
+ it('POSTs to products/:acknowledge with empty body', async () => {
303
+ const calls = [];
304
+ vi.spyOn(global, 'fetch').mockImplementation(async (url) => {
305
+ calls.push({ url: String(url) });
306
+ if (urlHost(url) === 'oauth2.googleapis.com') {
307
+ return { ok: true, json: async () => ({ access_token: 'tok', expires_in: 3600 }), text: async () => '' };
308
+ }
309
+ return { ok: true, json: async () => ({}), text: async () => '' };
310
+ });
311
+ await acknowledgeGoogleProduct('tok_nc', 'premium_unlock', makeGoogleConfig());
312
+ const ackCall = calls.find((c) => c.url.includes(':acknowledge'));
313
+ expect(ackCall?.url).toContain('/purchases/products/premium_unlock/tokens/tok_nc:acknowledge');
314
+ });
315
+ it('skips when serviceAccountKey is missing', async () => {
316
+ const fetchSpy = vi.spyOn(global, 'fetch');
317
+ await acknowledgeGoogleProduct('tok', 'p', { packageName: 'com.example.app' });
318
+ expect(fetchSpy).not.toHaveBeenCalled();
319
+ });
320
+ });
261
321
  //# sourceMappingURL=providers.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"providers.test.js","sourceRoot":"","sources":["../../src/__tests__/providers.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providers.test.js","sourceRoot":"","sources":["../../src/__tests__/providers.test.ts"],"names":[],"mappings":"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"}