-
Notifications
You must be signed in to change notification settings - Fork 212
/
Copy pathuser-manager.js
127 lines (116 loc) · 4.01 KB
/
user-manager.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';
const sinon = require('sinon');
const { assert } = require('chai');
const { default: Container } = require('typedi');
const { mockLog } = require('../../../../mocks');
const {
UserManager,
} = require('../../../../../lib/payments/iap/google-play/user-manager');
const { AuthLogger } = require('../../../../../lib/types');
const {
SubscriptionPurchase,
} = require('../../../../../lib/payments/iap/google-play/subscription-purchase');
const {
PurchaseQueryError,
} = require('../../../../../lib/payments/iap/google-play/types');
const USER_ID = 'testUser';
const VALID_SUB_API_RESPONSE = {
kind: 'androidpublisher#subscriptionPurchase',
startTimeMillis: `${Date.now() - 10000}`, // some time in the past
expiryTimeMillis: `${Date.now() + 10000}`, // some time in the future
autoRenewing: true,
priceCurrencyCode: 'JPY',
priceAmountMicros: '99000000',
countryCode: 'JP',
developerPayload: '',
paymentState: 1,
orderId: 'GPA.3313-5503-3858-32549',
};
describe('UserManager', () => {
let log;
let mockCollRef;
let mockPurchaseManager;
let userManager;
let queryResult;
beforeEach(() => {
log = mockLog();
queryResult = {
docs: [],
};
mockCollRef = {
where: () => mockCollRef,
get: sinon.fake.resolves(queryResult),
};
mockPurchaseManager = {};
Container.set(AuthLogger, log);
userManager = new UserManager(mockCollRef, mockPurchaseManager);
});
afterEach(() => {
Container.reset();
});
describe('queryCurrentSubscriptions', () => {
it('returns the current subscriptions', async () => {
const subscriptionPurchase = SubscriptionPurchase.fromApiResponse(
VALID_SUB_API_RESPONSE,
'testPackage',
'testToken',
'testSku',
Date.now()
);
const subscriptionSnapshot = {
data: sinon.fake.returns(subscriptionPurchase.toFirestoreObject()),
};
queryResult.docs.push(subscriptionSnapshot);
const result = await userManager.queryCurrentSubscriptions(USER_ID);
assert.deepEqual(result, [subscriptionPurchase]);
sinon.assert.calledOnce(mockCollRef.get);
});
it('queries expired subscription purchases', async () => {
const subscriptionPurchase = SubscriptionPurchase.fromApiResponse(
VALID_SUB_API_RESPONSE,
'testPackage',
'testToken',
'testSku',
Date.now()
);
subscriptionPurchase.expiryTimeMillis = Date.now() - 10000;
subscriptionPurchase.autoRenewing = false;
const subscriptionSnapshot = {
data: sinon.fake.returns(subscriptionPurchase.toFirestoreObject()),
};
queryResult.docs.push(subscriptionSnapshot);
mockPurchaseManager.querySubscriptionPurchase =
sinon.fake.resolves(subscriptionPurchase);
const result = await userManager.queryCurrentSubscriptions(USER_ID);
assert.deepEqual(result, []);
sinon.assert.calledOnce(mockPurchaseManager.querySubscriptionPurchase);
});
it('throws library error on failure', async () => {
const subscriptionPurchase = SubscriptionPurchase.fromApiResponse(
VALID_SUB_API_RESPONSE,
'testPackage',
'testToken',
'testSku',
Date.now()
);
subscriptionPurchase.expiryTimeMillis = Date.now() - 10000;
subscriptionPurchase.autoRenewing = false;
const subscriptionSnapshot = {
data: sinon.fake.returns(subscriptionPurchase.toFirestoreObject()),
};
queryResult.docs.push(subscriptionSnapshot);
mockPurchaseManager.querySubscriptionPurchase = sinon.fake.rejects(
new Error('oops')
);
try {
await userManager.queryCurrentSubscriptions(USER_ID);
assert.fail('should have thrown');
} catch (err) {
assert.strictEqual(err.name, PurchaseQueryError.OTHER_ERROR);
}
});
});
});