Skip to content

Commit 4897296

Browse files
committed
creates a new add-alias_test
1 parent 8dedaa6 commit 4897296

1 file changed

Lines changed: 314 additions & 0 deletions

File tree

internal/config/add-alias_test.go

Lines changed: 314 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,314 @@
1+
/*
2+
* Flow CLI
3+
*
4+
* Copyright Flow Foundation
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package config
20+
21+
import (
22+
"encoding/json"
23+
"testing"
24+
25+
"github.com/stretchr/testify/assert"
26+
"github.com/stretchr/testify/require"
27+
28+
"github.com/onflow/flowkit/v2/config"
29+
30+
"github.com/onflow/flow-cli/internal/command"
31+
"github.com/onflow/flow-cli/internal/util"
32+
)
33+
34+
func Test_AddAlias(t *testing.T) {
35+
t.Run("Success", func(t *testing.T) {
36+
srv, state, _ := util.TestMocks(t)
37+
38+
// Setup: Add a contract to the state first
39+
contract := config.Contract{
40+
Name: "MyContract",
41+
Location: "contracts/MyContract.cdc",
42+
}
43+
state.Contracts().AddOrUpdate(contract)
44+
45+
// Set flags
46+
addAliasFlags.Contract = "MyContract"
47+
addAliasFlags.Network = "testnet"
48+
addAliasFlags.Address = "0x1234567890abcdef"
49+
50+
// Call the function
51+
result, err := addAlias(
52+
[]string{},
53+
command.GlobalFlags{ConfigPaths: []string{"flow.json"}},
54+
util.NoLogger,
55+
srv.Mock,
56+
state,
57+
)
58+
59+
// Verify no errors
60+
require.NoError(t, err)
61+
assert.NotNil(t, result)
62+
assert.Contains(t, result.String(), "Alias for contract MyContract on network testnet added")
63+
64+
// Verify the state was modified correctly
65+
updatedContract, err := state.Contracts().ByName("MyContract")
66+
require.NoError(t, err)
67+
68+
// Verify the alias was added for the specified network
69+
alias := updatedContract.Aliases.ByNetwork("testnet")
70+
require.NotNil(t, alias)
71+
assert.Equal(t, "1234567890abcdef", alias.Address.String())
72+
73+
// Reset flags
74+
addAliasFlags = flagsAddAlias{}
75+
})
76+
77+
t.Run("Success with multiple aliases", func(t *testing.T) {
78+
srv, state, _ := util.TestMocks(t)
79+
80+
// Get the emulator service account address
81+
serviceAcc, err := state.EmulatorServiceAccount()
82+
require.NoError(t, err)
83+
84+
// Setup: Add a contract with an existing alias
85+
contract := config.Contract{
86+
Name: "MultiContract",
87+
Location: "contracts/MultiContract.cdc",
88+
Aliases: config.Aliases{{
89+
Network: "emulator",
90+
Address: serviceAcc.Address,
91+
}},
92+
}
93+
state.Contracts().AddOrUpdate(contract)
94+
95+
// Add testnet alias
96+
addAliasFlags.Contract = "MultiContract"
97+
addAliasFlags.Network = "testnet"
98+
addAliasFlags.Address = "0xabcdef1234567890"
99+
100+
result, err := addAlias(
101+
[]string{},
102+
command.GlobalFlags{ConfigPaths: []string{"flow.json"}},
103+
util.NoLogger,
104+
srv.Mock,
105+
state,
106+
)
107+
108+
require.NoError(t, err)
109+
assert.NotNil(t, result)
110+
111+
// Verify both aliases exist
112+
updatedContract, err := state.Contracts().ByName("MultiContract")
113+
require.NoError(t, err)
114+
115+
emulatorAlias := updatedContract.Aliases.ByNetwork("emulator")
116+
require.NotNil(t, emulatorAlias)
117+
assert.Equal(t, serviceAcc.Address.String(), emulatorAlias.Address.String())
118+
119+
testnetAlias := updatedContract.Aliases.ByNetwork("testnet")
120+
require.NotNil(t, testnetAlias)
121+
assert.Equal(t, "abcdef1234567890", testnetAlias.Address.String())
122+
123+
// Reset flags
124+
addAliasFlags = flagsAddAlias{}
125+
})
126+
127+
t.Run("Fail contract not found", func(t *testing.T) {
128+
srv, state, _ := util.TestMocks(t)
129+
130+
addAliasFlags.Contract = "NonExistentContract"
131+
addAliasFlags.Network = "testnet"
132+
addAliasFlags.Address = "0x1234567890abcdef"
133+
134+
result, err := addAlias(
135+
[]string{},
136+
command.GlobalFlags{ConfigPaths: []string{"flow.json"}},
137+
util.NoLogger,
138+
srv.Mock,
139+
state,
140+
)
141+
142+
assert.Nil(t, result)
143+
assert.ErrorContains(t, err, "contract NonExistentContract not found in configuration")
144+
145+
// Reset flags
146+
addAliasFlags = flagsAddAlias{}
147+
})
148+
149+
t.Run("Verify flow.json is modified correctly", func(t *testing.T) {
150+
srv, state, rw := util.TestMocks(t)
151+
152+
// Setup: Add a contract to the state
153+
contract := config.Contract{
154+
Name: "TestContract",
155+
Location: "contracts/TestContract.cdc",
156+
}
157+
state.Contracts().AddOrUpdate(contract)
158+
159+
// Set flags
160+
addAliasFlags.Contract = "TestContract"
161+
addAliasFlags.Network = "mainnet"
162+
addAliasFlags.Address = "0xabcdef1234567890"
163+
164+
// Call the function
165+
result, err := addAlias(
166+
[]string{},
167+
command.GlobalFlags{ConfigPaths: []string{"flow.json"}},
168+
util.NoLogger,
169+
srv.Mock,
170+
state,
171+
)
172+
173+
require.NoError(t, err)
174+
assert.NotNil(t, result)
175+
176+
// Read the flow.json file
177+
flowJSON, err := rw.ReadFile("flow.json")
178+
require.NoError(t, err)
179+
180+
// Unmarshal and verify the JSON structure
181+
var flowConfig map[string]interface{}
182+
err = json.Unmarshal(flowJSON, &flowConfig)
183+
require.NoError(t, err)
184+
185+
// Verify contracts section exists
186+
contracts, ok := flowConfig["contracts"].(map[string]interface{})
187+
require.True(t, ok, "contracts section should exist in flow.json")
188+
189+
// Verify TestContract exists
190+
testContract, ok := contracts["TestContract"].(map[string]interface{})
191+
require.True(t, ok, "TestContract should exist in flow.json")
192+
193+
// Verify aliases section exists in the contract
194+
aliases, ok := testContract["aliases"].(map[string]interface{})
195+
require.True(t, ok, "aliases section should exist in TestContract")
196+
197+
// Verify mainnet alias exists with correct address (stored without 0x prefix)
198+
mainnetAlias, ok := aliases["mainnet"].(string)
199+
require.True(t, ok, "mainnet alias should exist")
200+
assert.Equal(t, "abcdef1234567890", mainnetAlias)
201+
202+
// Reset flags
203+
addAliasFlags = flagsAddAlias{}
204+
})
205+
}
206+
207+
func Test_FlagsToAliasData(t *testing.T) {
208+
t.Run("Success with all flags", func(t *testing.T) {
209+
flags := flagsAddAlias{
210+
Contract: "TestContract",
211+
Network: "testnet",
212+
Address: "0x1234567890abcdef",
213+
}
214+
215+
data, flagsProvided, err := flagsToAliasData(flags)
216+
217+
require.NoError(t, err)
218+
assert.True(t, flagsProvided)
219+
assert.Equal(t, "TestContract", data.Contract)
220+
assert.Equal(t, "testnet", data.Network)
221+
assert.Equal(t, "0x1234567890abcdef", data.Address)
222+
})
223+
224+
t.Run("No flags provided", func(t *testing.T) {
225+
flags := flagsAddAlias{}
226+
227+
data, flagsProvided, err := flagsToAliasData(flags)
228+
229+
require.NoError(t, err)
230+
assert.False(t, flagsProvided)
231+
assert.Nil(t, data)
232+
})
233+
234+
t.Run("Fail missing contract name", func(t *testing.T) {
235+
flags := flagsAddAlias{
236+
Network: "testnet",
237+
Address: "0x1234567890abcdef",
238+
}
239+
240+
data, flagsProvided, err := flagsToAliasData(flags)
241+
242+
assert.Nil(t, data)
243+
assert.True(t, flagsProvided)
244+
assert.EqualError(t, err, "contract name must be provided")
245+
})
246+
247+
t.Run("Fail missing network", func(t *testing.T) {
248+
flags := flagsAddAlias{
249+
Contract: "TestContract",
250+
Address: "0x1234567890abcdef",
251+
}
252+
253+
data, flagsProvided, err := flagsToAliasData(flags)
254+
255+
assert.Nil(t, data)
256+
assert.True(t, flagsProvided)
257+
assert.EqualError(t, err, "network name must be provided")
258+
})
259+
260+
t.Run("Fail missing address", func(t *testing.T) {
261+
flags := flagsAddAlias{
262+
Contract: "TestContract",
263+
Network: "testnet",
264+
}
265+
266+
data, flagsProvided, err := flagsToAliasData(flags)
267+
268+
assert.Nil(t, data)
269+
assert.True(t, flagsProvided)
270+
assert.EqualError(t, err, "address must be provided")
271+
})
272+
273+
t.Run("Fail invalid address", func(t *testing.T) {
274+
flags := flagsAddAlias{
275+
Contract: "TestContract",
276+
Network: "testnet",
277+
Address: "invalid-address",
278+
}
279+
280+
data, flagsProvided, err := flagsToAliasData(flags)
281+
282+
assert.Nil(t, data)
283+
assert.True(t, flagsProvided)
284+
assert.EqualError(t, err, "invalid address")
285+
})
286+
287+
t.Run("Fail empty address", func(t *testing.T) {
288+
flags := flagsAddAlias{
289+
Contract: "TestContract",
290+
Network: "testnet",
291+
Address: "0x0000000000000000",
292+
}
293+
294+
data, flagsProvided, err := flagsToAliasData(flags)
295+
296+
assert.Nil(t, data)
297+
assert.True(t, flagsProvided)
298+
assert.EqualError(t, err, "invalid address")
299+
})
300+
301+
t.Run("Success with address without 0x prefix", func(t *testing.T) {
302+
flags := flagsAddAlias{
303+
Contract: "TestContract",
304+
Network: "testnet",
305+
Address: "1234567890abcdef",
306+
}
307+
308+
data, flagsProvided, err := flagsToAliasData(flags)
309+
310+
require.NoError(t, err)
311+
assert.True(t, flagsProvided)
312+
assert.Equal(t, "1234567890abcdef", data.Address)
313+
})
314+
}

0 commit comments

Comments
 (0)