1
+ /* eslint-disable sonarjs/no-duplicate-string */
1
2
// cSpell:ignore kora subhandles
2
3
/* eslint-disable no-magic-numbers */
3
4
/* eslint-disable camelcase */
4
5
import { Cardano , HandleResolution } from '@cardano-sdk/core' ;
5
6
import { KoraLabsHandleProvider } from '@cardano-sdk/cardano-services-client' ;
7
+ import MockAdapter from 'axios-mock-adapter' ;
8
+ import axios from 'axios' ;
6
9
7
10
const handlePolicyId = 'f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a' ;
8
11
@@ -11,6 +14,180 @@ const config = {
11
14
serverUrl : 'https://preprod.api.handle.me/'
12
15
} ;
13
16
17
+ const test_handle_1 = {
18
+ bg_asset : 'e517b38693b633f1bc0dd3eb69cb1ad0f0c198c67188405901ae63a3001bc28068616e646c65735f6e61747572652d6c616b65' ,
19
+ bg_image : 'ipfs://zdj7Wjfr1dZz7Kao2ADZSF3xttBm7AJewWH5sARvG6XkmaprT' ,
20
+ characters : 'letters,numbers,special' ,
21
+ created_slot_number : 35_479_476 ,
22
+ default_in_wallet : 'cde' ,
23
+ handle_type : 'handle' ,
24
+ has_datum : false ,
25
+ hex : '000de140746573745f68616e646c655f31' ,
26
+ holder : 'stake_test1uract9p2rvczsaxzdmvhlplj4ngduhfztdsru0hvegazldgrtgynh' ,
27
+ holder_type : 'wallet' ,
28
+ image : 'ipfs://zb2rheiGzwihXcW7FSnFUmCeGdRMJrVtynMYy3o9xKSr2myD8' ,
29
+ image_hash : '26321fc1f9aac61c950c08c5fd7299e36173002e6f6b8ab7f748068879796ba3' ,
30
+ last_update_address :
31
+ '0x00e8fc28480c73486d288074c5ac7660ad0611ae5ce505de194353466961ea70af1de71795df52e62d1c0f2c8817f13b5cd4b40e04cab5ad6a' ,
32
+ length : 13 ,
33
+ name : 'test_handle_1' ,
34
+ numeric_modifiers : '' ,
35
+ og_number : 0 ,
36
+ payment_key_hash : 'cf1b5fe70c1ab3b1da0bcbb18267502ec5fdfb0522eb0de359151ce8' ,
37
+ pfp_image : '' ,
38
+ policy : 'f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a' ,
39
+ pz_enabled : false ,
40
+ rarity : 'basic' ,
41
+ resolved_addresses : {
42
+ ada : 'addr_test1qr83khl8psdt8vw6p09mrqn82qhvtl0mq53wkr0rty23e68msk2z5xes9p6vymke07rl9txsmewjykmq8clwej36976s2ay8ev'
43
+ } ,
44
+ standard_image : 'ipfs://zb2rheiGzwihXcW7FSnFUmCeGdRMJrVtynMYy3o9xKSr2myD8' ,
45
+ standard_image_hash :
46
+ '37376533393939366463353066643131353033376536636234373661343933653930666161396362356531633536323939306361383764346236383531613666' ,
47
+ svg_version : '1.13.0' ,
48
+ updated_slot_number : 80_137_815 ,
49
+ utxo : '47a95080175d8dad8480d0cb052b88fbb18382b1186aec3564088866b95ce269#0' ,
50
+ version : 1
51
+ } ;
52
+
53
+ const test_handle_2 = {
54
+ bg_image : '' ,
55
+ characters : 'letters,numbers,special' ,
56
+ created_slot_number : 36_089_789 ,
57
+ default_in_wallet : 'cde' ,
58
+ handle_type : 'handle' ,
59
+ has_datum : false ,
60
+ hex : '000de140746573745f68616e646c655f32' ,
61
+ holder : 'stake_test1uract9p2rvczsaxzdmvhlplj4ngduhfztdsru0hvegazldgrtgynh' ,
62
+ holder_type : 'wallet' ,
63
+ image : 'ipfs://zb2rhaLNcs1bRDyTaKFUZ1BcseBj45JUgo5HzezdBC2BFzYdw' ,
64
+ image_hash : '740a3916076b375e39f3bf6a7bb482bc652958fb59c59c8244c0b38fa48e5b06' ,
65
+ last_update_address :
66
+ '0x00a6801d5bbd8405ac0c6d8e4fd56eb573df3e5d567d22a8c5601dd5b6156eea2a4aa7717720f50abaf8baa341124dbf18b43ee2e349d83af4' ,
67
+ length : 13 ,
68
+ name : 'test_handle_2' ,
69
+ numeric_modifiers : '' ,
70
+ og_number : 0 ,
71
+ payment_key_hash : 'cf1b5fe70c1ab3b1da0bcbb18267502ec5fdfb0522eb0de359151ce8' ,
72
+ pfp_image : '' ,
73
+ policy : 'f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a' ,
74
+ pz_enabled : false ,
75
+ rarity : 'basic' ,
76
+ resolved_addresses : {
77
+ ada : 'addr_test1qr83khl8psdt8vw6p09mrqn82qhvtl0mq53wkr0rty23e68msk2z5xes9p6vymke07rl9txsmewjykmq8clwej36976s2ay8ev'
78
+ } ,
79
+ standard_image : 'ipfs://zb2rhaLNcs1bRDyTaKFUZ1BcseBj45JUgo5HzezdBC2BFzYdw' ,
80
+ standard_image_hash :
81
+ '33366438366439656366383236656637393366386439393335363330666266303565393033643934653430323139353463376662336438353663663361393832' ,
82
+ svg_version : '3.0.0' ,
83
+ updated_slot_number : 80_137_815 ,
84
+ utxo : '47a95080175d8dad8480d0cb052b88fbb18382b1186aec3564088866b95ce269#0' ,
85
+ version : 1
86
+ } ;
87
+
88
+ const handle_ = {
89
+ characters : 'letters' ,
90
+ created_slot_number : 66_464_780 ,
91
+ default_in_wallet : '1925' ,
92
+ handle_type : 'handle' ,
93
+ has_datum : false ,
94
+ hex : '000de14068616e646c65' ,
95
+ holder : 'stake_test1urcs5pxwju0eex77jftma9hetf8avkdqwftlkc57fr4ataqcvgpaz' ,
96
+ holder_type : 'wallet' ,
97
+ image : 'ipfs://zb2rhmoP92QisWdhs76eUYsLbH85cfs4mkJzYm69eA1EPZYWS' ,
98
+ image_hash : 'e134411636b3a147dde4763cff01d651aacd1a5a397c11736810020cf95cf307' ,
99
+ last_update_address :
100
+ '0x0022b74d2e789358eddd5ac9441477583eae01af674b2226faa92ec44ef10a04ce971f9c9bde9257be96f95a4fd659a07257fb629e48ebd5f4' ,
101
+ length : 6 ,
102
+ name : 'handle' ,
103
+ numeric_modifiers : '' ,
104
+ og_number : 0 ,
105
+ payment_key_hash : '22b74d2e789358eddd5ac9441477583eae01af674b2226faa92ec44e' ,
106
+ policy : 'f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a' ,
107
+ pz_enabled : false ,
108
+ rarity : 'common' ,
109
+ resolved_addresses : {
110
+ ada : 'addr_test1qq3twnfw0zf43mwatty5g9rhtql2uqd0va9jyfh64yhvgnh3pgzva9clnjdaayjhh6t0jkj06ev6qujhld3fuj8t6h6q9a037y'
111
+ } ,
112
+ standard_image : 'ipfs://zb2rhmoP92QisWdhs76eUYsLbH85cfs4mkJzYm69eA1EPZYWS' ,
113
+ standard_image_hash : 'e134411636b3a147dde4763cff01d651aacd1a5a397c11736810020cf95cf307' ,
114
+ svg_version : '3.0.8' ,
115
+ updated_slot_number : 66_464_780 ,
116
+ utxo : 'daf2b0025ce52ce5b14aed06d3c8a65a2a5ce04184a2bc1bd5e66413d476f536#2' ,
117
+ version : 1
118
+ } ;
119
+
120
+ const ada_handle = {
121
+ bg_image : '' ,
122
+ characters : 'letters,special' ,
123
+ created_slot_number : 69_795_802 ,
124
+ default_in_wallet : 'goodgood' ,
125
+ handle_type : 'handle' ,
126
+ has_datum : false ,
127
+ hex : '000de1406164612e68616e646c65' ,
128
+ holder : 'stake_test1uqv7h4p9uegkxp86h4c9lp8egxzul7y9skn6j7uv2kscqrqvs9fuh' ,
129
+ holder_type : 'wallet' ,
130
+ image : 'ipfs://zb2rhkzJM1xbi4Wd3fMEXpmzNWd8s9a45yYUzckHFPmUrDjDu' ,
131
+ image_hash : 'd5248957460ebe56fe1b776dc7c97e2166088bb558f6a449881d2a9bb96c88a4' ,
132
+ last_update_address :
133
+ '0x0059af3b60893002498bd0fc84bd64f8487eecb0df845ad9e60932aa8674eb22ead1bf6ec66d107e916772585f1bc8390b76498fbe0a05365e' ,
134
+ length : 10 ,
135
+ name : 'ada.handle' ,
136
+ numeric_modifiers : '' ,
137
+ og_number : 0 ,
138
+ payment_key_hash : '5246584e62db5939298f453ded5061229381b06e3d9fdf107b4e1e9d' ,
139
+ pfp_image : '' ,
140
+ policy : 'f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a' ,
141
+ pz_enabled : true ,
142
+ rarity : 'basic' ,
143
+ resolved_addresses : {
144
+ ada : 'addr_test1qpfyvkzwvtd4jwff3aznmm2svy3f8qdsdc7elhcs0d8pa8gea02ztej3vvz040tst7z0jsv9elugtpd849acc4dpsqxqx9746k'
145
+ } ,
146
+ standard_image : 'ipfs://zb2rhkzJM1xbi4Wd3fMEXpmzNWd8s9a45yYUzckHFPmUrDjDu' ,
147
+ standard_image_hash : 'd5248957460ebe56fe1b776dc7c97e2166088bb558f6a449881d2a9bb96c88a4' ,
148
+ svg_version : '3.0.8' ,
149
+ updated_slot_number : 69_863_096 ,
150
+ utxo : 'dcc7317400344786509aa8f5f8ac1feaee40aed7eddf4b51df54ba89d80730b3#0' ,
151
+ version : 1
152
+ } ;
153
+
154
+ const space_ada_handle = {
155
+ characters : 'letters,special' ,
156
+ created_slot_number : 69_871_820 ,
157
+ default_in_wallet : 'conraddit' ,
158
+ handle_type : 'virtual_subhandle' ,
159
+ has_datum : false ,
160
+ hex : '000000007370616365406164612e68616e646c65' ,
161
+ holder : 'stake_test1up6wkgh26xlka3ndzplfzemjtp03hjpepdmynra7pgznvhsycsez9' ,
162
+ holder_type : 'wallet' ,
163
+ image : 'ipfs://zb2rhkzJM1xbi4Wd3fMEXpmzNWd8s9a45yYUzckHFPmUrDjDu' ,
164
+ image_hash : '26fe10e21dd178888ab41ab8c2c3b5bba08e58a4aec1108aafa7d5d4ce12276a' ,
165
+ last_update_address :
166
+ '0x005246584e62db5939298f453ded5061229381b06e3d9fdf107b4e1e9d19ebd425e6516304fabd705f84f94185cff88585a7a97b8c55a1800c' ,
167
+ length : 16 ,
168
+
169
+ numeric_modifiers : '' ,
170
+ og_number : 0 ,
171
+ payment_key_hash : '59af3b60893002498bd0fc84bd64f8487eecb0df845ad9e60932aa86' ,
172
+ policy : 'f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a' ,
173
+ pz_enabled : true ,
174
+ rarity : 'basic' ,
175
+ resolved_addresses : {
176
+ ada : 'addr_test1qpv67wmq3ycqyjvt6r7gf0tylpy8am9sm7z94k0xpye24pn5av3w45dldmrx6yr7j9nhykzlr0yrjzmkfx8muzs9xe0q9vuv59'
177
+ } ,
178
+ standard_image : '' ,
179
+ standard_image_hash : '26fe10e21dd178888ab41ab8c2c3b5bba08e58a4aec1108aafa7d5d4ce12276a' ,
180
+ sub_characters : 'letters' ,
181
+ sub_length : 5 ,
182
+ sub_numeric_modifiers : '' ,
183
+ sub_rarity : 'common' ,
184
+ svg_version : '3.0.8' ,
185
+ updated_slot_number : 69_871_820 ,
186
+ utxo : '94b18568d8b1b7d02530bf83e8c83f21437a9ef4aebabb6ccdd1e1fec0638039#2' ,
187
+ version : 0 ,
188
+ virtual : { expires_time : 1_757_091_000_789 , public_mint : false }
189
+ } ;
190
+
14
191
const checkHandleResolution = ( source : string , result : unknown ) => {
15
192
expect ( typeof result ) . toBe ( 'object' ) ;
16
193
@@ -27,34 +204,58 @@ const checkHandleResolution = (source: string, result: unknown) => {
27
204
} ;
28
205
29
206
describe ( 'KoraLabsHandleProvider' , ( ) => {
207
+ let axiosMock : MockAdapter ;
30
208
let provider : KoraLabsHandleProvider ;
31
209
32
210
beforeAll ( ( ) => {
211
+ axiosMock = new MockAdapter ( axios ) ;
33
212
provider = new KoraLabsHandleProvider ( config ) ;
34
213
} ) ;
35
214
215
+ afterEach ( ( ) => {
216
+ axiosMock . reset ( ) ;
217
+ } ) ;
218
+
219
+ afterAll ( ( ) => {
220
+ axiosMock . restore ( ) ;
221
+ } ) ;
222
+
36
223
describe ( 'resolveHandles' , ( ) => {
37
224
test ( 'HandleProvider should resolve a single handle' , async ( ) => {
225
+ axiosMock . onGet ( ) . replyOnce ( 200 , test_handle_1 ) ;
226
+
38
227
const [ result ] = await provider . resolveHandles ( { handles : [ 'test_handle_1' ] } ) ;
39
228
40
229
checkHandleResolution ( 'test_handle_1' , result ) ;
41
230
} ) ;
42
231
43
232
test ( 'HandleProvider should resolve multiple handles' , async ( ) => {
44
- const [ result2 , result3 ] = await provider . resolveHandles ( { handles : [ 'test_handle_2' , 'test_handle_3' ] } ) ;
233
+ axiosMock . onGet ( ) . replyOnce ( 200 , test_handle_1 ) . onGet ( ) . replyOnce ( 200 , test_handle_2 ) ;
45
234
235
+ const [ result1 , result2 ] = await provider . resolveHandles ( { handles : [ 'test_handle_1' , 'test_handle_2' ] } ) ;
236
+
237
+ checkHandleResolution ( 'test_handle_1' , result1 ) ;
46
238
checkHandleResolution ( 'test_handle_2' , result2 ) ;
47
- checkHandleResolution ( 'test_handle_3' , result3 ) ;
48
239
} ) ;
49
240
50
241
test ( 'HandleProvider should return null for for not found handle' , async ( ) => {
242
+ axiosMock . onGet ( ) . replyOnce ( 404 ) . onGet ( ) . replyOnce ( 200 , test_handle_1 ) ;
243
+
51
244
const [ resultN , result1 ] = await provider . resolveHandles ( { handles : [ 'does_not_exists' , 'test_handle_1' ] } ) ;
52
245
53
246
expect ( resultN ) . toBe ( null ) ;
54
247
checkHandleResolution ( 'test_handle_1' , result1 ) ;
55
248
} ) ;
56
249
57
250
test ( 'HandleProvider should resolve handle, subhandles and virtual subhandles' , async ( ) => {
251
+ axiosMock
252
+ . onGet ( )
253
+ . replyOnce ( 200 , handle_ )
254
+ . onGet ( )
255
+ . replyOnce ( 200 , ada_handle )
256
+ . onGet ( )
257
+ . replyOnce ( 200 , space_ada_handle ) ;
258
+
58
259
const [ result1 , result2 , result3 ] = await provider . resolveHandles ( {
59
260
handles :
[ 'handle' , 'ada.handle' , '[email protected] ' ]
60
261
} ) ;
@@ -67,6 +268,8 @@ describe('KoraLabsHandleProvider', () => {
67
268
68
269
describe ( 'health checks' , ( ) => {
69
270
test ( 'HandleProvider should get ok health check' , async ( ) => {
271
+ axiosMock . onGet ( ) . replyOnce ( 200 ) ;
272
+
70
273
const result = await provider . healthCheck ( ) ;
71
274
72
275
expect ( result . ok ) . toEqual ( true ) ;
0 commit comments