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  }