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  }