1
1
import "@test/mocks/logger-service.mock" ;
2
2
3
+ import { faker } from "@faker-js/faker" ;
4
+
5
+ import { UserWalletRepository } from "@src/billing/repositories" ;
3
6
import { BlockHttpService } from "@src/chain/services/block-http/block-http.service" ;
4
7
import { AutoTopUpDeployment , DeploymentSettingRepository } from "@src/deployment/repositories/deployment-setting/deployment-setting.repository" ;
5
8
import { LeaseRepository } from "@src/deployment/repositories/lease/lease.repository" ;
6
9
import { averageBlockCountInAnHour } from "@src/utils/constants" ;
10
+ import { DeploymentConfigService } from "../deployment-config/deployment-config.service" ;
7
11
import { DrainingDeploymentService } from "./draining-deployment.service" ;
8
12
9
- import { MockConfigService } from "@test/mocks/config-service.mock " ;
13
+ import { AkashAddressSeeder } from "@test/seeders/akash-address.seeder " ;
10
14
import { AutoTopUpDeploymentSeeder } from "@test/seeders/auto-top-up-deployment.seeder" ;
11
15
import { DrainingDeploymentSeeder } from "@test/seeders/draining-deployment.seeder" ;
16
+ import { UserWalletSeeder } from "@test/seeders/user-wallet.seeder" ;
12
17
13
18
jest . mock ( "@akashnetwork/logging" ) ;
14
19
15
- type DeploymentConfigValues = {
16
- AUTO_TOP_UP_JOB_INTERVAL_IN_H : number ;
17
- AUTO_TOP_UP_DEPLOYMENT_INTERVAL_IN_H : number ;
18
- } ;
19
-
20
20
describe ( DrainingDeploymentService . name , ( ) => {
21
21
let blockHttpService : jest . Mocked < BlockHttpService > ;
22
22
let leaseRepository : jest . Mocked < LeaseRepository > ;
23
+ let userWalletRepository : jest . Mocked < UserWalletRepository > ;
23
24
let deploymentSettingRepository : jest . Mocked < DeploymentSettingRepository > ;
24
25
let service : DrainingDeploymentService ;
25
- let config : MockConfigService < DeploymentConfigValues > ;
26
+ let config : jest . Mocked < DeploymentConfigService > ;
26
27
const CURRENT_BLOCK_HEIGHT = 7481457 ;
27
28
28
29
beforeEach ( ( ) => {
@@ -32,19 +33,29 @@ describe(DrainingDeploymentService.name, () => {
32
33
} as Partial < jest . Mocked < BlockHttpService > > as jest . Mocked < BlockHttpService > ;
33
34
34
35
leaseRepository = {
35
- findManyByDseqAndOwner : jest . fn ( )
36
+ findManyByDseqAndOwner : jest . fn ( ) ,
37
+ findOneByDseqAndOwner : jest . fn ( )
36
38
} as Partial < jest . Mocked < LeaseRepository > > as jest . Mocked < LeaseRepository > ;
37
39
40
+ userWalletRepository = {
41
+ findOneByUserId : jest . fn ( )
42
+ } as Partial < jest . Mocked < UserWalletRepository > > as jest . Mocked < UserWalletRepository > ;
43
+
38
44
deploymentSettingRepository = {
39
45
paginateAutoTopUpDeployments : jest . fn ( )
40
46
} as Partial < jest . Mocked < DeploymentSettingRepository > > as jest . Mocked < DeploymentSettingRepository > ;
41
47
42
- config = new MockConfigService < DeploymentConfigValues > ( {
48
+ const configValues = {
43
49
AUTO_TOP_UP_JOB_INTERVAL_IN_H : 1 ,
44
50
AUTO_TOP_UP_DEPLOYMENT_INTERVAL_IN_H : 3
45
- } ) ;
51
+ } ;
52
+
53
+ config = {
54
+ get : jest . fn ( ) . mockImplementation ( ( key : keyof typeof configValues ) => configValues [ key ] ) ,
55
+ config : configValues
56
+ } as unknown as jest . Mocked < DeploymentConfigService > ;
46
57
47
- service = new DrainingDeploymentService ( blockHttpService , leaseRepository , deploymentSettingRepository , config ) ;
58
+ service = new DrainingDeploymentService ( blockHttpService , leaseRepository , userWalletRepository , deploymentSettingRepository , config ) ;
48
59
} ) ;
49
60
50
61
describe ( "paginate" , ( ) => {
@@ -156,4 +167,51 @@ describe(DrainingDeploymentService.name, () => {
156
167
} ) ;
157
168
} ) ;
158
169
} ) ;
170
+
171
+ describe ( "calculateTopUpAmountForDseqAndUserId" , ( ) => {
172
+ const userId = faker . string . uuid ( ) ;
173
+ const dseq = faker . string . numeric ( 6 ) ;
174
+ const address = AkashAddressSeeder . create ( ) ;
175
+ const userWallet = UserWalletSeeder . create ( { address } ) ;
176
+ const expectedTopUpAmount = 100000 ;
177
+
178
+ beforeEach ( ( ) => {
179
+ userWalletRepository . findOneByUserId . mockResolvedValue ( userWallet ) ;
180
+ jest . spyOn ( service , "calculateTopUpAmount" ) . mockResolvedValue ( expectedTopUpAmount ) ;
181
+ } ) ;
182
+
183
+ it ( "should calculate top up amount for valid deployment" , async ( ) => {
184
+ const deployment = DrainingDeploymentSeeder . create ( ) ;
185
+ leaseRepository . findOneByDseqAndOwner . mockResolvedValue ( deployment ) ;
186
+
187
+ const amount = await service . calculateTopUpAmountForDseqAndUserId ( dseq , userId ) ;
188
+
189
+ expect ( userWalletRepository . findOneByUserId ) . toHaveBeenCalledWith ( userId ) ;
190
+ expect ( leaseRepository . findOneByDseqAndOwner ) . toHaveBeenCalledWith ( dseq , address ) ;
191
+ expect ( service . calculateTopUpAmount ) . toHaveBeenCalledWith ( deployment ) ;
192
+ expect ( amount ) . toBe ( expectedTopUpAmount ) ;
193
+ } ) ;
194
+
195
+ it ( "should return 0 if user wallet not found" , async ( ) => {
196
+ userWalletRepository . findOneByUserId . mockResolvedValue ( null ) ;
197
+
198
+ const amount = await service . calculateTopUpAmountForDseqAndUserId ( dseq , userId ) ;
199
+
200
+ expect ( userWalletRepository . findOneByUserId ) . toHaveBeenCalledWith ( userId ) ;
201
+ expect ( leaseRepository . findOneByDseqAndOwner ) . not . toHaveBeenCalled ( ) ;
202
+ expect ( service . calculateTopUpAmount ) . not . toHaveBeenCalled ( ) ;
203
+ expect ( amount ) . toBe ( 0 ) ;
204
+ } ) ;
205
+
206
+ it ( "should return 0 if lease not found" , async ( ) => {
207
+ leaseRepository . findOneByDseqAndOwner . mockResolvedValue ( null ) ;
208
+
209
+ const amount = await service . calculateTopUpAmountForDseqAndUserId ( dseq , userId ) ;
210
+
211
+ expect ( userWalletRepository . findOneByUserId ) . toHaveBeenCalledWith ( userId ) ;
212
+ expect ( leaseRepository . findOneByDseqAndOwner ) . toHaveBeenCalledWith ( dseq , address ) ;
213
+ expect ( service . calculateTopUpAmount ) . not . toHaveBeenCalled ( ) ;
214
+ expect ( amount ) . toBe ( 0 ) ;
215
+ } ) ;
216
+ } ) ;
159
217
} ) ;
0 commit comments