github.com/jfrog/jfrog-cli-core/v2@v2.51.0/artifactory/commands/dotnet/dotnetcommand_test.go (about) 1 package dotnet 2 3 import ( 4 "os" 5 "path/filepath" 6 "reflect" 7 "strings" 8 "testing" 9 "time" 10 11 "github.com/jfrog/build-info-go/build" 12 "github.com/jfrog/build-info-go/build/utils/dotnet" 13 "github.com/jfrog/gofrog/io" 14 buildUtils "github.com/jfrog/jfrog-cli-core/v2/common/build" 15 "github.com/jfrog/jfrog-cli-core/v2/utils/config" 16 "github.com/jfrog/jfrog-client-go/utils/io/fileutils" 17 testsutils "github.com/jfrog/jfrog-client-go/utils/tests" 18 "github.com/stretchr/testify/assert" 19 ) 20 21 func TestGetFlagValueExists(t *testing.T) { 22 tests := []struct { 23 name string 24 currentConfigPath string 25 createConfig bool 26 expectErr bool 27 cmdFlags []string 28 expectedCmdFlags []string 29 }{ 30 {"simple", "file.config", true, false, 31 []string{"-configFile", "file.config"}, []string{"-configFile", "file.config"}}, 32 33 {"simple2", "file.config", true, false, 34 []string{"-before", "-configFile", "file.config", "after"}, []string{"-before", "-configFile", "file.config", "after"}}, 35 36 {"err", "file.config", false, true, 37 []string{"-before", "-configFile"}, []string{"-before", "-configFile"}}, 38 39 {"err2", "file.config", false, true, 40 []string{"-configFile"}, []string{"-configFile"}}, 41 } 42 for _, test := range tests { 43 t.Run(test.name, func(t *testing.T) { 44 if test.createConfig { 45 _, err := io.CreateRandFile(test.currentConfigPath, 0) 46 if err != nil { 47 t.Error(err) 48 } 49 defer testsutils.RemoveAndAssert(t, test.currentConfigPath) 50 } 51 _, err := getFlagValueIfExists("-configfile", test.cmdFlags) 52 if err != nil && !test.expectErr { 53 t.Error(err) 54 } 55 if err == nil && test.expectErr { 56 t.Errorf("Expecting: error, Got: nil") 57 } 58 if !reflect.DeepEqual(test.cmdFlags, test.expectedCmdFlags) { 59 t.Errorf("Expecting: %s, Got: %s", test.expectedCmdFlags, test.cmdFlags) 60 } 61 }) 62 } 63 } 64 65 func TestInitNewConfig(t *testing.T) { 66 tmpDir, err := fileutils.CreateTempDir() 67 assert.NoError(t, err) 68 defer func() { 69 assert.NoError(t, fileutils.RemoveTempDir(tmpDir)) 70 }() 71 repoName := "test-repo" 72 server := &config.ServerDetails{ 73 ArtifactoryUrl: "https://server.com/artifactory", 74 User: "user", 75 Password: "pass", 76 } 77 configFile, err := InitNewConfig(tmpDir, repoName, server, false) 78 assert.NoError(t, err) 79 f, err := os.Open(configFile.Name()) 80 assert.NoError(t, err) 81 defer func() { 82 assert.NoError(t, f.Close()) 83 }() 84 buf := make([]byte, 1024) 85 n, err := f.Read(buf) 86 assert.NoError(t, err) 87 assert.Equal(t, `<?xml version="1.0" encoding="utf-8"?> 88 <configuration> 89 <packageSources> 90 <add key="JFrogCli" value="https://server.com/artifactory/api/nuget/v3/test-repo" protocolVersion="3" /> 91 </packageSources> 92 <packageSourceCredentials> 93 <JFrogCli> 94 <add key="Username" value="user" /> 95 <add key="ClearTextPassword" value="pass" /> 96 </JFrogCli> 97 </packageSourceCredentials> 98 </configuration>`, string(buf[:n])) 99 server.Password = "" 100 server.AccessToken = "abc123" 101 configFile, err = InitNewConfig(tmpDir, repoName, server, true) 102 assert.NoError(t, err) 103 updatedConfigFile, err := os.Open(configFile.Name()) 104 assert.NoError(t, err) 105 defer func() { 106 assert.NoError(t, updatedConfigFile.Close()) 107 }() 108 buf = make([]byte, 1024) 109 n, err = updatedConfigFile.Read(buf) 110 assert.NoError(t, err) 111 assert.Equal(t, `<?xml version="1.0" encoding="utf-8"?> 112 <configuration> 113 <packageSources> 114 <add key="JFrogCli" value="https://server.com/artifactory/api/nuget/test-repo" protocolVersion="2" /> 115 </packageSources> 116 <packageSourceCredentials> 117 <JFrogCli> 118 <add key="Username" value="user" /> 119 <add key="ClearTextPassword" value="abc123" /> 120 </JFrogCli> 121 </packageSourceCredentials> 122 </configuration>`, string(buf[:n])) 123 } 124 125 func TestGetSourceDetails(t *testing.T) { 126 server := &config.ServerDetails{ 127 ArtifactoryUrl: "https://server.com/artifactory", 128 User: "user", 129 Password: "pass", 130 } 131 repoName := "repo-name" 132 url, user, pass, err := getSourceDetails(server, repoName, false) 133 assert.NoError(t, err) 134 assert.Equal(t, "user", user) 135 assert.Equal(t, "pass", pass) 136 assert.Equal(t, "https://server.com/artifactory/api/nuget/v3/repo-name", url) 137 server.Password = "" 138 server.AccessToken = "abc123" 139 url, user, pass, err = getSourceDetails(server, repoName, true) 140 assert.Equal(t, "user", user) 141 assert.Equal(t, "abc123", pass) 142 assert.NoError(t, err) 143 assert.Equal(t, "https://server.com/artifactory/api/nuget/repo-name", url) 144 } 145 146 func TestPrepareDotnetBuildInfoModule(t *testing.T) { 147 t.Run("generated config file", func(t *testing.T) { testPrepareDotnetBuildInfoModule(t, "restore", []string{}, true) }) 148 t.Run("existing with configfile flag", func(t *testing.T) { 149 testPrepareDotnetBuildInfoModule(t, "restore", []string{"--configfile", "/path/to/config/file"}, false) 150 }) 151 t.Run("existing with source flag", func(t *testing.T) { 152 testPrepareDotnetBuildInfoModule(t, "restore", []string{"--source", "/path/to/source"}, false) 153 }) 154 t.Run("dotnet test", func(t *testing.T) { 155 testPrepareDotnetBuildInfoModule(t, "test", []string{}, false) 156 }) 157 } 158 159 func testPrepareDotnetBuildInfoModule(t *testing.T, subCommand string, flags []string, expectedGeneratedConfigFile bool) { 160 tmpDir, err := fileutils.CreateTempDir() 161 assert.NoError(t, err) 162 defer func() { 163 assert.NoError(t, fileutils.RemoveTempDir(tmpDir)) 164 }() 165 module := createNewDotnetModule(t, tmpDir) 166 cmd := DotnetCommand{ 167 toolchainType: dotnet.DotnetCore, 168 subCommand: subCommand, 169 argAndFlags: flags, 170 buildConfiguration: buildUtils.NewBuildConfiguration("", "", "mod", ""), 171 serverDetails: &config.ServerDetails{ArtifactoryUrl: "https://my-instance.jfrog.io"}, 172 } 173 callbackFunc, err := cmd.prepareDotnetBuildInfoModule(module) 174 if !assert.NoError(t, err) { 175 return 176 } 177 assert.Equal(t, cmd.toolchainType, module.GetToolchainType()) 178 assert.Equal(t, cmd.subCommand, module.GetSubcommand()) 179 assert.Equal(t, cmd.buildConfiguration.GetModule(), module.GetName()) 180 181 if !expectedGeneratedConfigFile { 182 assertConfigFileNotGenerated(t, cmd, module, tmpDir) 183 return 184 } 185 assertConfigFileGenerated(t, module, callbackFunc) 186 } 187 188 func assertConfigFileNotGenerated(t *testing.T, cmd DotnetCommand, module *build.DotnetModule, tmpDir string) { 189 assert.Equal(t, cmd.argAndFlags, module.GetArgAndFlags()) 190 if cmd.subCommand == "test" { 191 assert.True(t, cmd.isDotnetTestCommand()) 192 assert.Contains(t, cmd.argAndFlags, noRestoreFlag) 193 } 194 // Temp dir should remain empty if config file was not generated. 195 contents, err := os.ReadDir(tmpDir) 196 assert.NoError(t, err) 197 assert.Empty(t, contents) 198 } 199 200 func assertConfigFileGenerated(t *testing.T, module *build.DotnetModule, callbackFunc func() error) { 201 // Assert config file was generated and added to the flags passed to the module. 202 assert.Len(t, module.GetArgAndFlags(), 2) 203 configFilePath, err := getFlagValueIfExists("--configfile", module.GetArgAndFlags()) 204 assert.NoError(t, err) 205 assertFileExists(t, configFilePath, true) 206 assert.True(t, strings.HasPrefix(filepath.Base(configFilePath), configFilePattern)) 207 208 // Assert config file is removed when calling the callback function. 209 assert.NoError(t, callbackFunc()) 210 assertFileExists(t, configFilePath, false) 211 } 212 213 func assertFileExists(t *testing.T, path string, expected bool) { 214 exists, err := fileutils.IsFileExists(path, false) 215 assert.NoError(t, err) 216 assert.Equal(t, expected, exists) 217 } 218 219 func createNewDotnetModule(t *testing.T, tmpDir string) *build.DotnetModule { 220 dotnetBuild := build.NewBuild("", "", time.Now(), "", tmpDir, nil) 221 module, err := dotnetBuild.AddDotnetModules("") 222 assert.NoError(t, err) 223 return module 224 }