1+ import { HIRO_MAINNET_URL , HIRO_TESTNET_URL , createFetchFn } from '@stacks/common' ;
12import {
23 STACKS_DEVNET ,
34 STACKS_MAINNET ,
45 STACKS_MOCKNET ,
56 STACKS_TESTNET ,
7+ createNetwork ,
68 networkFromName ,
79} from '../src' ;
810
11+ // eslint-disable-next-line
12+ import fetchMock from 'jest-fetch-mock' ;
13+
914test ( networkFromName . name , ( ) => {
1015 expect ( networkFromName ( 'mainnet' ) ) . toEqual ( STACKS_MAINNET ) ;
1116 expect ( networkFromName ( 'testnet' ) ) . toEqual ( STACKS_TESTNET ) ;
@@ -14,3 +19,172 @@ test(networkFromName.name, () => {
1419
1520 expect ( STACKS_DEVNET ) . toEqual ( STACKS_MOCKNET ) ;
1621} ) ;
22+
23+ describe ( createNetwork . name , ( ) => {
24+ const TEST_API_KEY = 'test-api-key' ;
25+
26+ beforeEach ( ( ) => {
27+ fetchMock . resetMocks ( ) ;
28+ fetchMock . mockResponse ( JSON . stringify ( { result : 'ok' } ) ) ;
29+ } ) ;
30+
31+ test ( 'creates network from network name string' , ( ) => {
32+ const network = createNetwork ( 'mainnet' ) ;
33+ expect ( network . chainId ) . toEqual ( STACKS_MAINNET . chainId ) ;
34+ expect ( network . transactionVersion ) . toEqual ( STACKS_MAINNET . transactionVersion ) ;
35+ expect ( network . client . baseUrl ) . toEqual ( STACKS_MAINNET . client . baseUrl ) ;
36+ } ) ;
37+
38+ test ( 'creates network from network object' , ( ) => {
39+ const network = createNetwork ( STACKS_TESTNET ) ;
40+ expect ( network . chainId ) . toEqual ( STACKS_TESTNET . chainId ) ;
41+ expect ( network . transactionVersion ) . toEqual ( STACKS_TESTNET . transactionVersion ) ;
42+ expect ( network . client . baseUrl ) . toEqual ( STACKS_TESTNET . client . baseUrl ) ;
43+ expect ( network . client . fetch ) . toBeUndefined ( ) ;
44+ } ) ;
45+
46+ test ( 'creates network from network name string with API key' , async ( ) => {
47+ const network = createNetwork ( 'testnet' , TEST_API_KEY ) ;
48+ expect ( network . chainId ) . toEqual ( STACKS_TESTNET . chainId ) ;
49+ expect ( network . transactionVersion ) . toEqual ( STACKS_TESTNET . transactionVersion ) ;
50+ expect ( network . client . baseUrl ) . toEqual ( STACKS_TESTNET . client . baseUrl ) ;
51+ expect ( network . client . fetch ) . toBeDefined ( ) ;
52+
53+ // Test that API key is included in requests
54+ expect ( network . client . fetch ) . not . toBeUndefined ( ) ;
55+ if ( ! network . client . fetch ) throw 'Type error' ;
56+
57+ await network . client . fetch ( HIRO_TESTNET_URL ) ;
58+ expect ( fetchMock ) . toHaveBeenCalled ( ) ;
59+ const callHeaders = new Headers ( fetchMock . mock . calls [ 0 ] [ 1 ] ?. headers ) ;
60+ expect ( callHeaders . has ( 'x-api-key' ) ) . toBeTruthy ( ) ;
61+ expect ( callHeaders . get ( 'x-api-key' ) ) . toBe ( TEST_API_KEY ) ;
62+ } ) ;
63+
64+ test ( 'creates network from network object with API key' , async ( ) => {
65+ const network = createNetwork ( STACKS_MAINNET , TEST_API_KEY ) ;
66+ expect ( network . chainId ) . toEqual ( STACKS_MAINNET . chainId ) ;
67+ expect ( network . transactionVersion ) . toEqual ( STACKS_MAINNET . transactionVersion ) ;
68+ expect ( network . client . baseUrl ) . toEqual ( STACKS_MAINNET . client . baseUrl ) ;
69+ expect ( network . client . fetch ) . toBeDefined ( ) ;
70+
71+ // Test that API key is included in requests
72+ expect ( network . client . fetch ) . not . toBeUndefined ( ) ;
73+ if ( ! network . client . fetch ) throw 'Type error' ;
74+
75+ await network . client . fetch ( HIRO_TESTNET_URL ) ;
76+ expect ( fetchMock ) . toHaveBeenCalled ( ) ;
77+ const callHeaders = new Headers ( fetchMock . mock . calls [ 0 ] [ 1 ] ?. headers ) ;
78+ expect ( callHeaders . has ( 'x-api-key' ) ) . toBeTruthy ( ) ;
79+ expect ( callHeaders . get ( 'x-api-key' ) ) . toBe ( TEST_API_KEY ) ;
80+ } ) ;
81+
82+ test ( 'creates network from options object with network name and API key' , async ( ) => {
83+ const network = createNetwork ( {
84+ network : 'mainnet' ,
85+ apiKey : TEST_API_KEY ,
86+ } ) ;
87+ expect ( network . chainId ) . toEqual ( STACKS_MAINNET . chainId ) ;
88+ expect ( network . transactionVersion ) . toEqual ( STACKS_MAINNET . transactionVersion ) ;
89+ expect ( network . client . baseUrl ) . toEqual ( STACKS_MAINNET . client . baseUrl ) ;
90+ expect ( network . client . fetch ) . toBeDefined ( ) ;
91+
92+ // Test that API key is included in requests
93+ expect ( network . client . fetch ) . not . toBeUndefined ( ) ;
94+ if ( ! network . client . fetch ) throw 'Type error' ;
95+
96+ await network . client . fetch ( HIRO_MAINNET_URL ) ;
97+ expect ( fetchMock ) . toHaveBeenCalled ( ) ;
98+ const callHeaders = new Headers ( fetchMock . mock . calls [ 0 ] [ 1 ] ?. headers ) ;
99+ expect ( callHeaders . has ( 'x-api-key' ) ) . toBeTruthy ( ) ;
100+ expect ( callHeaders . get ( 'x-api-key' ) ) . toBe ( TEST_API_KEY ) ;
101+ } ) ;
102+
103+ test ( 'creates network from options object with network name, API key, and custom host' , async ( ) => {
104+ const network = createNetwork ( {
105+ network : 'devnet' ,
106+ apiKey : TEST_API_KEY ,
107+ host : / ^ / , // any host
108+ } ) ;
109+ expect ( network . chainId ) . toEqual ( STACKS_DEVNET . chainId ) ;
110+ expect ( network . transactionVersion ) . toEqual ( STACKS_DEVNET . transactionVersion ) ;
111+ expect ( network . client . baseUrl ) . toEqual ( STACKS_DEVNET . client . baseUrl ) ;
112+ expect ( network . client . fetch ) . toBeDefined ( ) ;
113+
114+ // Test that API key is included in requests
115+ expect ( network . client . fetch ) . not . toBeUndefined ( ) ;
116+ if ( ! network . client . fetch ) throw 'Type error' ;
117+
118+ await network . client . fetch ( 'https://example.com' ) ;
119+ expect ( fetchMock ) . toHaveBeenCalled ( ) ;
120+ const callHeaders = new Headers ( fetchMock . mock . calls [ 0 ] [ 1 ] ?. headers ) ;
121+ expect ( callHeaders . has ( 'x-api-key' ) ) . toBeTruthy ( ) ;
122+ expect ( callHeaders . get ( 'x-api-key' ) ) . toBe ( TEST_API_KEY ) ;
123+ } ) ;
124+
125+ test ( 'creates network from options object with network object and API key' , async ( ) => {
126+ const network = createNetwork ( {
127+ network : STACKS_MOCKNET ,
128+ apiKey : TEST_API_KEY ,
129+ } ) ;
130+ expect ( network . chainId ) . toEqual ( STACKS_MOCKNET . chainId ) ;
131+ expect ( network . transactionVersion ) . toEqual ( STACKS_MOCKNET . transactionVersion ) ;
132+ expect ( network . client . baseUrl ) . toEqual ( STACKS_MOCKNET . client . baseUrl ) ;
133+ expect ( network . client . fetch ) . toBeDefined ( ) ;
134+
135+ // Test that API key is included in requests
136+ expect ( network . client . fetch ) . not . toBeUndefined ( ) ;
137+ if ( ! network . client . fetch ) throw 'Type error' ;
138+
139+ await network . client . fetch ( HIRO_TESTNET_URL ) ;
140+ expect ( fetchMock ) . toHaveBeenCalled ( ) ;
141+ const callHeaders = new Headers ( fetchMock . mock . calls [ 0 ] [ 1 ] ?. headers ) ;
142+ expect ( callHeaders . has ( 'x-api-key' ) ) . toBeTruthy ( ) ;
143+ expect ( callHeaders . get ( 'x-api-key' ) ) . toBe ( TEST_API_KEY ) ;
144+ } ) ;
145+
146+ test ( 'creates network from options object with network name and custom client' , ( ) => {
147+ const customBaseUrl = 'https://custom-api.example.com' ;
148+ const customFetch = createFetchFn ( ) ;
149+
150+ const network = createNetwork ( {
151+ network : 'mainnet' ,
152+ client : {
153+ baseUrl : customBaseUrl ,
154+ fetch : customFetch ,
155+ } ,
156+ } ) ;
157+
158+ expect ( network . chainId ) . toEqual ( STACKS_MAINNET . chainId ) ;
159+ expect ( network . transactionVersion ) . toEqual ( STACKS_MAINNET . transactionVersion ) ;
160+ expect ( network . client . baseUrl ) . toEqual ( customBaseUrl ) ;
161+ expect ( network . client . fetch ) . toBe ( customFetch ) ;
162+ } ) ;
163+
164+ test ( 'creates network from options object with network object and custom client' , ( ) => {
165+ const customBaseUrl = 'https://custom-api.example.com' ;
166+ const customFetch = createFetchFn ( ) ;
167+
168+ const network = createNetwork ( {
169+ network : STACKS_TESTNET ,
170+ client : {
171+ baseUrl : customBaseUrl ,
172+ fetch : customFetch ,
173+ } ,
174+ } ) ;
175+
176+ expect ( network . chainId ) . toEqual ( STACKS_TESTNET . chainId ) ;
177+ expect ( network . transactionVersion ) . toEqual ( STACKS_TESTNET . transactionVersion ) ;
178+ expect ( network . client . baseUrl ) . toEqual ( customBaseUrl ) ;
179+ expect ( network . client . fetch ) . toBe ( customFetch ) ;
180+ } ) ;
181+
182+ test ( 'throws error with invalid arguments' , ( ) => {
183+ // @ts -expect-error Testing invalid argument
184+ expect ( ( ) => createNetwork ( ) ) . toThrow ( ) ;
185+ // @ts -expect-error Testing invalid argument
186+ expect ( ( ) => createNetwork ( null ) ) . toThrow ( ) ;
187+ // @ts -expect-error Testing invalid argument
188+ expect ( ( ) => createNetwork ( undefined , undefined ) ) . toThrow ( ) ;
189+ } ) ;
190+ } ) ;
0 commit comments