github.com/robgonnella/ardi/v2@v2.4.5-0.20230102052001-11a49de978c3/commands/add_test.go (about) 1 package commands_test 2 3 import ( 4 "errors" 5 "path" 6 "testing" 7 8 rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1" 9 "github.com/golang/mock/gomock" 10 "github.com/robgonnella/ardi/v2/testutil" 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func TestAddPlatformCommand(t *testing.T) { 15 pkg := "pkg" 16 arch := "arch" 17 version := "1.3.5" 18 platform := pkg + ":" + arch + "@" + version 19 20 instance := &rpc.Instance{Id: 1} 21 22 installReq := &rpc.PlatformInstallRequest{ 23 Instance: instance, 24 PlatformPackage: pkg, 25 Architecture: arch, 26 Version: version, 27 } 28 29 platformReq := &rpc.PlatformListRequest{ 30 Instance: instance, 31 } 32 33 indexReq := &rpc.UpdateIndexRequest{ 34 Instance: instance, 35 } 36 37 testutil.RunMockIntegrationTest("errors if project not initialized", t, func(env *testutil.MockIntegrationTestEnv) { 38 args := []string{"add", "platforms", "arduino:avr"} 39 err := env.Execute(args) 40 assert.Error(env.T, err) 41 }) 42 43 testutil.RunMockIntegrationTest("adds platform", t, func(env *testutil.MockIntegrationTestEnv) { 44 err := env.RunProjectInit() 45 assert.NoError(env.T, err) 46 47 env.ArduinoCli.EXPECT().CreateInstance().Return(instance) 48 env.ArduinoCli.EXPECT().UpdateIndex(gomock.Any(), indexReq, gomock.Any()) 49 env.ArduinoCli.EXPECT().GetPlatforms(platformReq) 50 env.ArduinoCli.EXPECT().PlatformInstall(gomock.Any(), installReq, gomock.Any(), gomock.Any()) 51 52 args := []string{"add", "platform", platform} 53 err = env.Execute(args) 54 assert.NoError(env.T, err) 55 }) 56 57 testutil.RunMockIntegrationTest("returns add platform error", t, func(env *testutil.MockIntegrationTestEnv) { 58 err := env.RunProjectInit() 59 assert.NoError(env.T, err) 60 61 dummyErr := errors.New("dummy error") 62 63 env.ArduinoCli.EXPECT().CreateInstance().Return(instance) 64 env.ArduinoCli.EXPECT().UpdateIndex(gomock.Any(), indexReq, gomock.Any()) 65 env.ArduinoCli.EXPECT().PlatformInstall(gomock.Any(), installReq, gomock.Any(), gomock.Any()).Return(nil, dummyErr) 66 67 args := []string{"add", "platform", platform} 68 err = env.Execute(args) 69 assert.Error(env.T, err) 70 assert.ErrorIs(env.T, err, dummyErr) 71 }) 72 } 73 74 func TestAddLibraryCommand(t *testing.T) { 75 instance := &rpc.Instance{Id: 1} 76 library := "Some_Fancy_Library" 77 version := "1.2.3" 78 libStr := library + "@" + version 79 80 installReq := &rpc.LibraryInstallRequest{ 81 Instance: instance, 82 Name: library, 83 Version: version, 84 } 85 86 listReq := &rpc.LibraryListRequest{ 87 Instance: instance, 88 } 89 90 indexReq := &rpc.UpdateLibrariesIndexRequest{ 91 Instance: instance, 92 } 93 94 testutil.RunMockIntegrationTest("errors if project not initialized", t, func(env *testutil.MockIntegrationTestEnv) { 95 args := []string{"add", "lib", "Some Lib"} 96 err := env.Execute(args) 97 assert.Error(env.T, err) 98 }) 99 100 testutil.RunMockIntegrationTest("adds library", t, func(env *testutil.MockIntegrationTestEnv) { 101 err := env.RunProjectInit() 102 assert.NoError(env.T, err) 103 104 env.ArduinoCli.EXPECT().CreateInstance().Return(instance) 105 env.ArduinoCli.EXPECT().UpdateLibrariesIndex(gomock.Any(), indexReq, gomock.Any()) 106 env.ArduinoCli.EXPECT().LibraryList(gomock.Any(), listReq) 107 env.ArduinoCli.EXPECT().LibraryInstall(gomock.Any(), installReq, gomock.Any(), gomock.Any()) 108 109 args := []string{"add", "lib", libStr} 110 err = env.Execute(args) 111 assert.NoError(env.T, err) 112 }) 113 114 testutil.RunMockIntegrationTest("returns add library error", t, func(env *testutil.MockIntegrationTestEnv) { 115 err := env.RunProjectInit() 116 assert.NoError(env.T, err) 117 118 dummyErr := errors.New("dummy error") 119 120 env.ArduinoCli.EXPECT().CreateInstance().Return(instance) 121 env.ArduinoCli.EXPECT().UpdateLibrariesIndex(gomock.Any(), indexReq, gomock.Any()) 122 env.ArduinoCli.EXPECT().LibraryInstall(gomock.Any(), installReq, gomock.Any(), gomock.Any()).Return(dummyErr) 123 124 args := []string{"add", "lib", libStr} 125 err = env.Execute(args) 126 assert.Error(env.T, err) 127 assert.ErrorIs(env.T, err, dummyErr) 128 }) 129 } 130 131 func TestAddBuildCommand(t *testing.T) { 132 build := "cool" 133 fqbn := "super:cool:fqbn" 134 sketchDir := testutil.BlinkProjectDir() 135 sketch := path.Join(sketchDir, "blink.ino") 136 137 testutil.RunMockIntegrationTest("errors if project not initialized", t, func(env *testutil.MockIntegrationTestEnv) { 138 args := []string{"add", "build", "-n", "default", "-f", "some:f:qbn", "-s", "sketch.ino"} 139 err := env.Execute(args) 140 assert.Error(env.T, err) 141 }) 142 143 testutil.RunMockIntegrationTest("adds build", t, func(env *testutil.MockIntegrationTestEnv) { 144 err := env.RunProjectInit() 145 assert.NoError(env.T, err) 146 147 args := []string{"add", "build", "-n", build, "-f", fqbn, "-s", sketch} 148 err = env.Execute(args) 149 assert.NoError(env.T, err) 150 151 builds := env.ArdiCore.Config.GetBuilds() 152 b, ok := builds[build] 153 154 assert.True(env.T, ok) 155 assert.Equal(env.T, b.FQBN, fqbn) 156 assert.Equal(env.T, b.Sketch, sketch) 157 assert.Equal(env.T, b.Directory, sketchDir) 158 }) 159 160 testutil.RunMockIntegrationTest("return error if sketch not found", t, func(env *testutil.MockIntegrationTestEnv) { 161 err := env.RunProjectInit() 162 assert.NoError(env.T, err) 163 164 args := []string{"add", "build", "-n", build, "-f", fqbn, "-s", "noop.ino"} 165 err = env.Execute(args) 166 assert.Error(env.T, err) 167 168 builds := env.ArdiCore.Config.GetBuilds() 169 b, ok := builds[build] 170 171 assert.False(env.T, ok) 172 assert.Empty(env.T, b.FQBN) 173 assert.Empty(env.T, b.Sketch) 174 assert.Empty(env.T, b.Directory) 175 }) 176 } 177 178 func TestAddBoardURLCommand(t *testing.T) { 179 testutil.RunMockIntegrationTest("errors if project not initialized", t, func(env *testutil.MockIntegrationTestEnv) { 180 args := []string{"add", "board-url", "https://someboardurl.com"} 181 err := env.Execute(args) 182 assert.Error(env.T, err) 183 }) 184 185 testutil.RunMockIntegrationTest("adds board url", t, func(env *testutil.MockIntegrationTestEnv) { 186 err := env.RunProjectInit() 187 assert.NoError(env.T, err) 188 189 url := "https://somefancyboardurl.com" 190 args := []string{"add", "board-url", url} 191 err = env.Execute(args) 192 assert.NoError(env.T, err) 193 194 urls := env.ArdiCore.CliConfig.Config.BoardManager.AdditionalUrls 195 196 assert.NotEmpty(env.T, urls) 197 assert.Contains(env.T, urls, url) 198 }) 199 200 testutil.RunMockIntegrationTest("adds multiple board url", t, func(env *testutil.MockIntegrationTestEnv) { 201 err := env.RunProjectInit() 202 assert.NoError(env.T, err) 203 204 url1 := "https://somefancyboardurl.com" 205 url2 := "https://anotherfancyboardurl.com" 206 207 args := []string{"add", "board-url", url1} 208 err = env.Execute(args) 209 assert.NoError(env.T, err) 210 211 args = []string{"add", "board-url", url2} 212 err = env.Execute(args) 213 assert.NoError(env.T, err) 214 215 urls := env.ArdiCore.CliConfig.Config.BoardManager.AdditionalUrls 216 217 assert.NotEmpty(env.T, urls) 218 assert.Contains(env.T, urls, url1) 219 assert.Contains(env.T, urls, url2) 220 }) 221 222 testutil.RunMockIntegrationTest("does not error if board url already added", t, func(env *testutil.MockIntegrationTestEnv) { 223 err := env.RunProjectInit() 224 assert.NoError(env.T, err) 225 226 url := "https://somefancyboardurl.com" 227 228 args := []string{"add", "board-url", url} 229 err = env.Execute(args) 230 assert.NoError(env.T, err) 231 232 args = []string{"add", "board-url", url} 233 err = env.Execute(args) 234 assert.NoError(env.T, err) 235 236 urls := env.ArdiCore.CliConfig.Config.BoardManager.AdditionalUrls 237 238 assert.NotEmpty(env.T, urls) 239 assert.Contains(env.T, urls, url) 240 assert.Equal(env.T, len(urls), 1) 241 }) 242 }