@onesub/server 0.7.3 → 0.9.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/dist/__tests__/apple-status-api.test.d.ts +14 -0
  2. package/dist/__tests__/apple-status-api.test.d.ts.map +1 -0
  3. package/dist/__tests__/apple-status-api.test.js +345 -0
  4. package/dist/__tests__/apple-status-api.test.js.map +1 -0
  5. package/dist/__tests__/fetch-hardening.test.d.ts +7 -0
  6. package/dist/__tests__/fetch-hardening.test.d.ts.map +1 -0
  7. package/dist/__tests__/fetch-hardening.test.js +192 -0
  8. package/dist/__tests__/fetch-hardening.test.js.map +1 -0
  9. package/dist/__tests__/google-paused.test.d.ts +10 -0
  10. package/dist/__tests__/google-paused.test.d.ts.map +1 -0
  11. package/dist/__tests__/google-paused.test.js +126 -0
  12. package/dist/__tests__/google-paused.test.js.map +1 -0
  13. package/dist/__tests__/google-price-change.test.d.ts +6 -0
  14. package/dist/__tests__/google-price-change.test.d.ts.map +1 -0
  15. package/dist/__tests__/google-price-change.test.js +186 -0
  16. package/dist/__tests__/google-price-change.test.js.map +1 -0
  17. package/dist/__tests__/google-subscriptions-v2.test.d.ts +13 -0
  18. package/dist/__tests__/google-subscriptions-v2.test.d.ts.map +1 -0
  19. package/dist/__tests__/google-subscriptions-v2.test.js +206 -0
  20. package/dist/__tests__/google-subscriptions-v2.test.js.map +1 -0
  21. package/dist/__tests__/lifecycle-states.test.d.ts +12 -0
  22. package/dist/__tests__/lifecycle-states.test.d.ts.map +1 -0
  23. package/dist/__tests__/lifecycle-states.test.js +423 -0
  24. package/dist/__tests__/lifecycle-states.test.js.map +1 -0
  25. package/dist/__tests__/linked-purchase-token.test.d.ts +9 -0
  26. package/dist/__tests__/linked-purchase-token.test.d.ts.map +1 -0
  27. package/dist/__tests__/linked-purchase-token.test.js +227 -0
  28. package/dist/__tests__/linked-purchase-token.test.js.map +1 -0
  29. package/dist/__tests__/paused-auto-resume.test.d.ts +7 -0
  30. package/dist/__tests__/paused-auto-resume.test.d.ts.map +1 -0
  31. package/dist/__tests__/paused-auto-resume.test.js +162 -0
  32. package/dist/__tests__/paused-auto-resume.test.js.map +1 -0
  33. package/dist/__tests__/providers.test.js +69 -9
  34. package/dist/__tests__/providers.test.js.map +1 -1
  35. package/dist/__tests__/refund-policy.test.d.ts +11 -0
  36. package/dist/__tests__/refund-policy.test.d.ts.map +1 -0
  37. package/dist/__tests__/refund-policy.test.js +317 -0
  38. package/dist/__tests__/refund-policy.test.js.map +1 -0
  39. package/dist/__tests__/schema.test.js +4 -0
  40. package/dist/__tests__/schema.test.js.map +1 -1
  41. package/dist/__tests__/store.test.js +17 -0
  42. package/dist/__tests__/store.test.js.map +1 -1
  43. package/dist/__tests__/test-utils.d.ts +20 -0
  44. package/dist/__tests__/test-utils.d.ts.map +1 -0
  45. package/dist/__tests__/test-utils.js +30 -0
  46. package/dist/__tests__/test-utils.js.map +1 -0
  47. package/dist/__tests__/webhook-refund.test.d.ts +13 -0
  48. package/dist/__tests__/webhook-refund.test.d.ts.map +1 -0
  49. package/dist/__tests__/webhook-refund.test.js +313 -0
  50. package/dist/__tests__/webhook-refund.test.js.map +1 -0
  51. package/dist/http.d.ts +17 -0
  52. package/dist/http.d.ts.map +1 -0
  53. package/dist/http.js +36 -0
  54. package/dist/http.js.map +1 -0
  55. package/dist/index.d.ts +1 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +2 -2
  58. package/dist/index.js.map +1 -1
  59. package/dist/providers/apple.d.ts +50 -2
  60. package/dist/providers/apple.d.ts.map +1 -1
  61. package/dist/providers/apple.js +235 -2
  62. package/dist/providers/apple.js.map +1 -1
  63. package/dist/providers/google.d.ts +71 -6
  64. package/dist/providers/google.d.ts.map +1 -1
  65. package/dist/providers/google.js +211 -36
  66. package/dist/providers/google.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 +14 -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 +7 -0
  90. package/dist/stores/schema.js.map +1 -1
  91. package/package.json +2 -2
  92. package/sql/schema.sql +7 -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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1D,IAAI,cAAsB,CAAC;AAE3B,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAW,CAAC;AACjF,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,KAA0D;IAC9E,OAAO;QACL,WAAW,EAAE,iBAAiB;QAC9B,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC;YAChC,YAAY,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,+BAA+B;YAClE,WAAW,EAAE,cAAc;YAC3B,SAAS,EAAE,qCAAqC;SACjD,CAAC;QACF,GAAG,KAAK;KACT,CAAC;AACJ,CAAC;AAcD,SAAS,UAAU,CAAC,IAAkD;IACpE,OAAO;QACL,SAAS,EAAE,sBAAsB;QACjC,iBAAiB,EAAE,2BAA2B;QAC9C,aAAa,EAAE,eAAe;QAC9B,SAAS,EAAE,CAAC;gBACV,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,YAAY;gBACzC,UAAU,EAAE,sBAAsB;gBAClC,gBAAgB,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;aAC7C,CAAC;QACF,GAAG,IAAI;KACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,YAAwB;IAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;IACnC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC/D,IAAI,cAAc,CAAC,GAAG,CAAC;YAAE,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,uBAAuB,EAAE,CAAC;YACrC,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBAC7D,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;aACT,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,KAAK,iCAAiC,EAAE,CAAC;YAC/C,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,YAAY;gBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;aACnC,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,WAAW,CAAC,UAAU,CAAC;YACrB,SAAS,EAAE,YAAY;YACvB,mBAAmB,EAAE,iBAAiB;SACvC,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;QAE3F,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,WAAW,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CAAE,yBAAyB;QAEjF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;QAEvF,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,aAAa,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAQH,SAAS,MAAM,CAAC,OAAwB;IACtC,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI;YACtB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,GAAG,IAAI,EAAE,EAAE;oBAC1D,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;iBAC3B,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,MAAM,GAAY,IAAI,CAAC;gBAC3B,IAAI,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBAC/D,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC/C,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAA0B;IAI7C,MAAM,KAAK,GAAG,IAAI,yBAAyB,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,yBAAyB,CAAC,aAAqB,EAAE,SAAS,GAAG,YAAY;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,iBAAiB;QAC9B,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,wBAAwB,EAAE;YACxB,OAAO,EAAE,KAAK;YACd,gBAAgB,EAAE,CAAC,EAAG,yBAAyB;YAC/C,aAAa;YACb,cAAc,EAAE,SAAS;SAC1B;KACF,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;QACvE,YAAY,EAAE,GAAG;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,SAAqC,EAAoB,EAAE,CAAC,CAAC;IAC9E,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,0BAA0B;IACrC,qBAAqB,EAAE,iBAAiB;IACxC,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,IAAI;IACf,GAAG,SAAS;CACb,CAAC,CAAC;AAEH,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAE9E,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,WAAW,CAAC,UAAU,CAAC;YACrB,SAAS,EAAE,YAAY;YACvB,aAAa,EAAE,sBAAsB;YACrC,mBAAmB,EAAE,iBAAiB;SACvC,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;YACpC,MAAM,EAAE,YAAY,EAAE;YACtB,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;SACtB,CAAC,CAAC;QACH,sDAAsD;QACtD,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QAE1E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACzG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;QACzE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAE,6BAA6B;QAC9E,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,WAAW,CAAC,UAAU,CAAC;YACrB,SAAS,EAAE,YAAY;YACvB,aAAa,EAAE,kBAAkB;YACjC,mBAAmB,EAAE,gBAAgB;SACtC,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;YACpC,MAAM,EAAE,YAAY,EAAE;YACtB,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;SACtB,CAAC,CAAC;QACH,4BAA4B;QAE5B,MAAM,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAE5F,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAE,8BAA8B;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC7G,WAAW,CAAC,UAAU,CAAC;YACrB,SAAS,EAAE,aAAa;YACxB,aAAa,EAAE,iBAAiB;SACjC,CAAC,CAAC,CAAC,CAAE,yBAAyB;QAE/B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;YACpC,MAAM,EAAE,YAAY,EAAE;YACtB,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;SACtB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC;QAE1G,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QACpE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,WAAW,CAAC,UAAU,CAAC;YACrB,SAAS,EAAE,YAAY;YACvB,aAAa,EAAE,oBAAoB;YACnC,mBAAmB,EAAE,cAAc;SACpC,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;YACpC,MAAM,EAAE,YAAY,EAAE;YACtB,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAE5F,MAAM,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAC;QAE1F,kEAAkE;QAClE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAChE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEhD,gEAAgE;QAChE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for SubscriptionInfo.autoResumeTime — Google paused subscriptions
3
+ * surface the auto-resume timestamp from v2 pausedStateContext, so host apps
4
+ * can render "재개 예정: YYYY-MM-DD" UX.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=paused-auto-resume.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paused-auto-resume.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/paused-auto-resume.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Tests for SubscriptionInfo.autoResumeTime — Google paused subscriptions
3
+ * surface the auto-resume timestamp from v2 pausedStateContext, so host apps
4
+ * can render "재개 예정: YYYY-MM-DD" UX.
5
+ */
6
+ import { describe, it, expect, beforeAll, beforeEach, vi } from 'vitest';
7
+ import express from 'express';
8
+ import { generateKeyPairSync } from 'crypto';
9
+ import { SUBSCRIPTION_STATUS } from '@onesub/shared';
10
+ import { validateGoogleReceipt } from '../providers/google.js';
11
+ import { createStatusRouter } from '../routes/status.js';
12
+ import { InMemorySubscriptionStore } from '../store.js';
13
+ import { isLocalhostUrl, urlHost } from './test-utils.js';
14
+ let testPrivateKey;
15
+ beforeAll(() => {
16
+ const { privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
17
+ testPrivateKey = privateKey.export({ type: 'pkcs8', format: 'pem' });
18
+ });
19
+ beforeEach(() => {
20
+ vi.restoreAllMocks();
21
+ });
22
+ function googleConfig() {
23
+ return {
24
+ packageName: 'com.example.app',
25
+ serviceAccountKey: JSON.stringify({
26
+ client_email: `test-${Math.random()}@test.iam.gserviceaccount.com`,
27
+ private_key: testPrivateKey,
28
+ token_uri: 'https://oauth2.googleapis.com/token',
29
+ }),
30
+ };
31
+ }
32
+ function v2Paused(opts) {
33
+ return {
34
+ startTime: '2026-01-01T00:00:00Z',
35
+ subscriptionState: 'SUBSCRIPTION_STATE_PAUSED',
36
+ latestOrderId: 'GPA.paused_order',
37
+ pausedStateContext: opts.autoResumeTime ? { autoResumeTime: opts.autoResumeTime } : undefined,
38
+ lineItems: [{
39
+ productId: opts.productId ?? 'pro_monthly',
40
+ expiryTime: '2027-01-01T00:00:00Z',
41
+ autoRenewingPlan: { autoRenewEnabled: true },
42
+ }],
43
+ };
44
+ }
45
+ function v2Active(productId = 'pro_monthly') {
46
+ return {
47
+ startTime: '2026-01-01T00:00:00Z',
48
+ subscriptionState: 'SUBSCRIPTION_STATE_ACTIVE',
49
+ latestOrderId: 'GPA.active_order',
50
+ lineItems: [{
51
+ productId,
52
+ expiryTime: '2027-01-01T00:00:00Z',
53
+ autoRenewingPlan: { autoRenewEnabled: true },
54
+ }],
55
+ };
56
+ }
57
+ function mockV2Fetch(responseBody) {
58
+ const originalFetch = global.fetch;
59
+ vi.spyOn(global, 'fetch').mockImplementation(async (url, init) => {
60
+ if (isLocalhostUrl(url))
61
+ return originalFetch(url, init);
62
+ const host = urlHost(url);
63
+ if (host === 'oauth2.googleapis.com') {
64
+ return {
65
+ ok: true,
66
+ json: async () => ({ access_token: 'tok', expires_in: 3600 }),
67
+ text: async () => '',
68
+ };
69
+ }
70
+ if (host === 'androidpublisher.googleapis.com') {
71
+ return {
72
+ ok: true,
73
+ json: async () => responseBody,
74
+ text: async () => JSON.stringify(responseBody),
75
+ };
76
+ }
77
+ throw new Error(`[test] Unexpected URL: ${String(url)}`);
78
+ });
79
+ }
80
+ // ── validateGoogleReceipt surfaces autoResumeTime ───────────────────────────
81
+ describe('validateGoogleReceipt — autoResumeTime passthrough', () => {
82
+ it('surfaces autoResumeTime when subscription is paused', async () => {
83
+ mockV2Fetch(v2Paused({ autoResumeTime: '2026-08-15T00:00:00Z' }));
84
+ const result = await validateGoogleReceipt('tok_paused', 'pro_monthly', googleConfig());
85
+ expect(result?.status).toBe(SUBSCRIPTION_STATUS.PAUSED);
86
+ expect(result?.autoResumeTime).toBe('2026-08-15T00:00:00Z');
87
+ });
88
+ it('autoResumeTime is undefined when paused but Google omits the timestamp', async () => {
89
+ // Google sometimes returns SUBSCRIPTION_STATE_PAUSED without
90
+ // pausedStateContext (rare, but the API allows it).
91
+ mockV2Fetch(v2Paused({}));
92
+ const result = await validateGoogleReceipt('tok_paused_no_ctx', 'pro_monthly', googleConfig());
93
+ expect(result?.status).toBe(SUBSCRIPTION_STATUS.PAUSED);
94
+ expect(result?.autoResumeTime).toBeUndefined();
95
+ });
96
+ it('autoResumeTime is undefined for active subscription (no pausedStateContext)', async () => {
97
+ mockV2Fetch(v2Active('pro_monthly'));
98
+ const result = await validateGoogleReceipt('tok_active', 'pro_monthly', googleConfig());
99
+ expect(result?.status).toBe(SUBSCRIPTION_STATUS.ACTIVE);
100
+ expect(result?.autoResumeTime).toBeUndefined();
101
+ });
102
+ it('autoResumeTime is undefined even if pausedStateContext appears on a non-paused state (defensive)', async () => {
103
+ // Google shouldn't send pausedStateContext for non-paused states, but if
104
+ // they ever do, we should not surface it as if the user were paused.
105
+ mockV2Fetch({
106
+ ...v2Active('pro_monthly'),
107
+ pausedStateContext: { autoResumeTime: '2099-01-01T00:00:00Z' },
108
+ });
109
+ const result = await validateGoogleReceipt('tok_defensive', 'pro_monthly', googleConfig());
110
+ expect(result?.status).toBe(SUBSCRIPTION_STATUS.ACTIVE);
111
+ expect(result?.autoResumeTime).toBeUndefined();
112
+ });
113
+ });
114
+ function spinUpStatus() {
115
+ const store = new InMemorySubscriptionStore();
116
+ const app = express();
117
+ app.use(express.json());
118
+ app.use(createStatusRouter(store));
119
+ return {
120
+ store,
121
+ server: {
122
+ async request(path) {
123
+ const httpServer = app.listen(0);
124
+ const address = httpServer.address();
125
+ const port = typeof address === 'object' && address ? address.port : 0;
126
+ try {
127
+ const resp = await fetch(`http://127.0.0.1:${port}${path}`);
128
+ const body = await resp.json();
129
+ return { status: resp.status, body };
130
+ }
131
+ finally {
132
+ await new Promise((resolve) => httpServer.close(() => resolve()));
133
+ }
134
+ },
135
+ },
136
+ };
137
+ }
138
+ const sampleSub = (overrides) => ({
139
+ userId: 'u_pause',
140
+ productId: 'pro_monthly',
141
+ platform: 'google',
142
+ status: 'paused',
143
+ expiresAt: '2099-01-01T00:00:00.000Z',
144
+ originalTransactionId: 'tok_p',
145
+ purchasedAt: '2026-01-01T00:00:00.000Z',
146
+ willRenew: true,
147
+ ...overrides,
148
+ });
149
+ describe('status route — autoResumeTime in subscription payload', () => {
150
+ it('returns the saved autoResumeTime so the host can show "재개 예정" UX', async () => {
151
+ const { store, server } = spinUpStatus();
152
+ await store.save(sampleSub({
153
+ userId: 'u_with_resume',
154
+ autoResumeTime: '2026-09-01T00:00:00.000Z',
155
+ }));
156
+ const resp = await server.request('/onesub/status?userId=u_with_resume');
157
+ const body = resp.body;
158
+ expect(body.active).toBe(false); // paused stays revoked
159
+ expect(body.subscription?.autoResumeTime).toBe('2026-09-01T00:00:00.000Z');
160
+ });
161
+ });
162
+ //# sourceMappingURL=paused-auto-resume.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paused-auto-resume.test.js","sourceRoot":"","sources":["../../src/__tests__/paused-auto-resume.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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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tests for OneSubServerConfig.refundPolicy.
3
+ *
4
+ * Covers:
5
+ * - Default ('immediate'): subscription REFUND/REVOKE/voided sets status=canceled
6
+ * - 'until_expiry': keeps status + expiresAt, only flips willRenew=false
7
+ * - IAP refund is unaffected by refundPolicy (always immediate)
8
+ * - status route's stale-record check (active && expiresAt > now)
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=refund-policy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refund-policy.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/refund-policy.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}