github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/npm/publish_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package npm
     5  
     6  import (
     7  	"github.com/SAP/jenkins-library/pkg/mock"
     8  	"io"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/SAP/jenkins-library/pkg/piperutils"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  type npmMockUtilsBundleRelativeGlob struct {
    17  	*mock.FilesMockRelativeGlob
    18  	execRunner *mock.ExecMockRunner
    19  }
    20  
    21  func (u *npmMockUtilsBundleRelativeGlob) GetExecRunner() ExecRunner {
    22  	return u.execRunner
    23  }
    24  
    25  func newNpmMockUtilsBundleRelativeGlob() npmMockUtilsBundleRelativeGlob {
    26  	return npmMockUtilsBundleRelativeGlob{
    27  		FilesMockRelativeGlob: &mock.FilesMockRelativeGlob{FilesMock: &mock.FilesMock{}},
    28  		execRunner:            &mock.ExecMockRunner{},
    29  	}
    30  }
    31  
    32  func TestNpmPublish(t *testing.T) {
    33  	type wants struct {
    34  		publishConfigPath string
    35  		publishConfig     string
    36  
    37  		tarballPath string
    38  
    39  		err string
    40  	}
    41  
    42  	tt := []struct {
    43  		name string
    44  
    45  		files map[string]string
    46  
    47  		packageDescriptors []string
    48  		registryURL        string
    49  		registryUser       string
    50  		registryPassword   string
    51  		packBeforePublish  bool
    52  
    53  		wants wants
    54  	}{
    55  		// project in root folder
    56  		{
    57  			name: "success - single project, publish normal, unpacked package - target registry in npmrc",
    58  
    59  			files: map[string]string{
    60  				"package.json": `{"name": "piper-project", "version": "0.0.1"}`,
    61  				".piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
    62  			},
    63  
    64  			packageDescriptors: []string{"package.json"},
    65  
    66  			wants: wants{
    67  				publishConfigPath: `\.piperNpmrc`,
    68  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
    69  			},
    70  		},
    71  		{
    72  			name: "success - single project, publish normal, unpacked package - target registry from pipeline",
    73  
    74  			files: map[string]string{
    75  				"package.json": `{"name": "piper-project", "version": "0.0.1"}`,
    76  			},
    77  
    78  			packageDescriptors: []string{"package.json"},
    79  
    80  			registryURL:      "https://my.private.npm.registry/",
    81  			registryUser:     "ThisIsTheUser",
    82  			registryPassword: "AndHereIsThePassword",
    83  
    84  			wants: wants{
    85  				publishConfigPath: `\.piperNpmrc`,
    86  				publishConfig:     "registry=https://my.private.npm.registry/\n//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nalways-auth=true\n",
    87  			},
    88  		},
    89  		{
    90  			name: "success - single project, publish normal, unpacked package - target registry from pipeline (precedence over npmrc)",
    91  
    92  			files: map[string]string{
    93  				"package.json": `{"name": "piper-project", "version": "0.0.1"}`,
    94  				".piperNpmrc":  "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
    95  			},
    96  
    97  			packageDescriptors: []string{"package.json"},
    98  
    99  			registryURL:      "https://my.other.private.npm.registry/",
   100  			registryUser:     "ThisIsTheOtherUser",
   101  			registryPassword: "AndHereIsTheOtherPassword",
   102  
   103  			wants: wants{
   104  				publishConfigPath: `\.piperNpmrc`,
   105  				publishConfig:     "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.other.private.npm.registry/\n//my.other.private.npm.registry/:_auth=VGhpc0lzVGhlT3RoZXJVc2VyOkFuZEhlcmVJc1RoZU90aGVyUGFzc3dvcmQ=\nalways-auth=true\n",
   106  			},
   107  		},
   108  		{
   109  			name: "success - single project, publish normal, packed - target registry in npmrc",
   110  
   111  			files: map[string]string{
   112  				"package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   113  				".piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   114  			},
   115  
   116  			packageDescriptors: []string{"package.json"},
   117  
   118  			packBeforePublish: true,
   119  
   120  			wants: wants{
   121  				publishConfigPath: `\.piperNpmrc`,
   122  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   123  				tarballPath:       "/package.tgz",
   124  			},
   125  		},
   126  		{
   127  			name: "success - single project, publish normal, packed - target registry from pipeline",
   128  
   129  			files: map[string]string{
   130  				"package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   131  			},
   132  
   133  			packageDescriptors: []string{"package.json"},
   134  
   135  			packBeforePublish: true,
   136  
   137  			registryURL:      "https://my.private.npm.registry/",
   138  			registryUser:     "ThisIsTheUser",
   139  			registryPassword: "AndHereIsThePassword",
   140  
   141  			wants: wants{
   142  				publishConfigPath: `\.piperNpmrc`,
   143  				publishConfig:     "registry=https://my.private.npm.registry/\n//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nalways-auth=true\n",
   144  				tarballPath:       "/package.tgz",
   145  			},
   146  		},
   147  		{
   148  			name: "success - single project, publish normal, packed - target registry from pipeline (precedence over npmrc)",
   149  
   150  			files: map[string]string{
   151  				"package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   152  				".piperNpmrc":  "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   153  			},
   154  
   155  			packageDescriptors: []string{"package.json"},
   156  
   157  			packBeforePublish: true,
   158  
   159  			registryURL:      "https://my.other.private.npm.registry/",
   160  			registryUser:     "ThisIsTheOtherUser",
   161  			registryPassword: "AndHereIsTheOtherPassword",
   162  
   163  			wants: wants{
   164  				publishConfigPath: `\.piperNpmrc`,
   165  				publishConfig:     "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.other.private.npm.registry/\n//my.other.private.npm.registry/:_auth=VGhpc0lzVGhlT3RoZXJVc2VyOkFuZEhlcmVJc1RoZU90aGVyUGFzc3dvcmQ=\nalways-auth=true\n",
   166  				tarballPath:       "/package.tgz",
   167  			},
   168  		},
   169  		// scoped project
   170  		{
   171  			name: "success - single project, publish scoped, unpacked package - target registry in npmrc",
   172  
   173  			files: map[string]string{
   174  				"package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   175  				".piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n@piper:registry=https://my.private.npm.registry/\n",
   176  			},
   177  
   178  			packageDescriptors: []string{"package.json"},
   179  
   180  			wants: wants{
   181  				publishConfigPath: `\.piperNpmrc`,
   182  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n@piper:registry=https://my.private.npm.registry/\n",
   183  			},
   184  		},
   185  		{
   186  			name: "success - single project, publish scoped, unpacked package - target registry from pipeline",
   187  
   188  			files: map[string]string{
   189  				"package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   190  			},
   191  
   192  			packageDescriptors: []string{"package.json"},
   193  
   194  			registryURL:      "https://my.private.npm.registry/",
   195  			registryUser:     "ThisIsTheUser",
   196  			registryPassword: "AndHereIsThePassword",
   197  
   198  			wants: wants{
   199  				publishConfigPath: `\.piperNpmrc`,
   200  				publishConfig:     "registry=https://my.private.npm.registry/\n@piper:registry=https://my.private.npm.registry/\n//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nalways-auth=true\n",
   201  			},
   202  		},
   203  		{
   204  			name: "success - single project, publish scoped, unpacked package - target registry from pipeline (precedence over npmrc)",
   205  
   206  			files: map[string]string{
   207  				"package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   208  				".piperNpmrc":  "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   209  			},
   210  
   211  			packageDescriptors: []string{"package.json"},
   212  
   213  			registryURL:      "https://my.other.private.npm.registry/",
   214  			registryUser:     "ThisIsTheOtherUser",
   215  			registryPassword: "AndHereIsTheOtherPassword",
   216  
   217  			wants: wants{
   218  				publishConfigPath: `\.piperNpmrc`,
   219  				publishConfig:     "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.other.private.npm.registry/\n@piper:registry=https://my.other.private.npm.registry/\n//my.other.private.npm.registry/:_auth=VGhpc0lzVGhlT3RoZXJVc2VyOkFuZEhlcmVJc1RoZU90aGVyUGFzc3dvcmQ=\nalways-auth=true\n",
   220  			},
   221  		},
   222  		{
   223  			name: "success - single project, publish scoped, packed - target registry in npmrc",
   224  
   225  			files: map[string]string{
   226  				"package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   227  				".piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\n@piper:registry=https://my.private.npm.registry/\n",
   228  			},
   229  
   230  			packageDescriptors: []string{"package.json"},
   231  
   232  			packBeforePublish: true,
   233  
   234  			wants: wants{
   235  				publishConfigPath: `\.piperNpmrc`,
   236  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\n@piper:registry=https://my.private.npm.registry/\n",
   237  				tarballPath:       "/package.tgz",
   238  			},
   239  		},
   240  		{
   241  			name: "success - single project, publish scoped, packed - target registry from pipeline",
   242  
   243  			files: map[string]string{
   244  				"package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   245  			},
   246  
   247  			packageDescriptors: []string{"package.json"},
   248  
   249  			packBeforePublish: true,
   250  
   251  			registryURL:      "https://my.private.npm.registry/",
   252  			registryUser:     "ThisIsTheUser",
   253  			registryPassword: "AndHereIsThePassword",
   254  
   255  			wants: wants{
   256  				publishConfigPath: `\.piperNpmrc`,
   257  				publishConfig:     "registry=https://my.private.npm.registry/\n@piper:registry=https://my.private.npm.registry/\n//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nalways-auth=true\n",
   258  				tarballPath:       "/package.tgz",
   259  			},
   260  		},
   261  		{
   262  			name: "success - single project, publish scoped, packed - target registry from pipeline (precedence over npmrc)",
   263  
   264  			files: map[string]string{
   265  				"package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   266  				".piperNpmrc":  "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   267  			},
   268  
   269  			packageDescriptors: []string{"package.json"},
   270  
   271  			packBeforePublish: true,
   272  
   273  			registryURL:      "https://my.other.private.npm.registry/",
   274  			registryUser:     "ThisIsTheOtherUser",
   275  			registryPassword: "AndHereIsTheOtherPassword",
   276  
   277  			wants: wants{
   278  				publishConfigPath: `\.piperNpmrc`,
   279  				publishConfig:     "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.other.private.npm.registry/\n@piper:registry=https://my.other.private.npm.registry/\n//my.other.private.npm.registry/:_auth=VGhpc0lzVGhlT3RoZXJVc2VyOkFuZEhlcmVJc1RoZU90aGVyUGFzc3dvcmQ=\nalways-auth=true\n",
   280  				tarballPath:       "/package.tgz",
   281  			},
   282  		},
   283  		// project in a subfolder
   284  		{
   285  			name: "success - single project in subfolder, publish normal, unpacked package - target registry in npmrc",
   286  
   287  			files: map[string]string{
   288  				"sub/package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   289  				"sub/.piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   290  			},
   291  
   292  			packageDescriptors: []string{"sub/package.json"},
   293  
   294  			wants: wants{
   295  				publishConfigPath: `sub/\.piperNpmrc`,
   296  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   297  			},
   298  		},
   299  		{
   300  			name: "success - single project in subfolder, publish normal, unpacked package - target registry from pipeline",
   301  
   302  			files: map[string]string{
   303  				"sub/package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   304  			},
   305  
   306  			packageDescriptors: []string{"sub/package.json"},
   307  
   308  			registryURL:      "https://my.private.npm.registry/",
   309  			registryUser:     "ThisIsTheUser",
   310  			registryPassword: "AndHereIsThePassword",
   311  
   312  			wants: wants{
   313  				publishConfigPath: `sub/\.piperNpmrc`,
   314  				publishConfig:     "registry=https://my.private.npm.registry/\n//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nalways-auth=true\n",
   315  			},
   316  		},
   317  		{
   318  			name: "success - single project in subfolder, publish normal, unpacked package - target registry from pipeline (precedence over npmrc)",
   319  
   320  			files: map[string]string{
   321  				"sub/package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   322  				"sub/.piperNpmrc":  "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   323  			},
   324  
   325  			packageDescriptors: []string{"sub/package.json"},
   326  
   327  			registryURL:      "https://my.other.private.npm.registry/",
   328  			registryUser:     "ThisIsTheOtherUser",
   329  			registryPassword: "AndHereIsTheOtherPassword",
   330  
   331  			wants: wants{
   332  				publishConfigPath: `sub/\.piperNpmrc`,
   333  				publishConfig:     "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.other.private.npm.registry/\n//my.other.private.npm.registry/:_auth=VGhpc0lzVGhlT3RoZXJVc2VyOkFuZEhlcmVJc1RoZU90aGVyUGFzc3dvcmQ=\nalways-auth=true\n",
   334  			},
   335  		},
   336  		{
   337  			name: "success - single project in subfolder, publish normal, packed - target registry in npmrc",
   338  
   339  			files: map[string]string{
   340  				"sub/package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   341  				"sub/.piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   342  			},
   343  
   344  			packageDescriptors: []string{"sub/package.json"},
   345  
   346  			packBeforePublish: true,
   347  
   348  			wants: wants{
   349  				publishConfigPath: `\.piperNpmrc`,
   350  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   351  				tarballPath:       "/sub/package.tgz",
   352  			},
   353  		},
   354  		{
   355  			name: "success - single project in subfolder, publish normal, packed - target registry from pipeline",
   356  
   357  			files: map[string]string{
   358  				"sub/package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   359  			},
   360  
   361  			packageDescriptors: []string{"sub/package.json"},
   362  
   363  			packBeforePublish: true,
   364  
   365  			registryURL:      "https://my.private.npm.registry/",
   366  			registryUser:     "ThisIsTheUser",
   367  			registryPassword: "AndHereIsThePassword",
   368  
   369  			wants: wants{
   370  				publishConfigPath: `\.piperNpmrc`,
   371  				publishConfig:     "registry=https://my.private.npm.registry/\n//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nalways-auth=true\n",
   372  				tarballPath:       "/sub/package.tgz",
   373  			},
   374  		},
   375  		{
   376  			name: "success - single project in subfolder, publish normal, packed - target registry from pipeline (precedence over npmrc)",
   377  
   378  			files: map[string]string{
   379  				"sub/package.json": `{"name": "piper-project", "version": "0.0.1"}`,
   380  				"sub/.piperNpmrc":  "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   381  			},
   382  
   383  			packageDescriptors: []string{"sub/package.json"},
   384  
   385  			packBeforePublish: true,
   386  
   387  			registryURL:      "https://my.other.private.npm.registry/",
   388  			registryUser:     "ThisIsTheOtherUser",
   389  			registryPassword: "AndHereIsTheOtherPassword",
   390  
   391  			wants: wants{
   392  				publishConfigPath: `\.piperNpmrc`,
   393  				publishConfig:     "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.other.private.npm.registry/\n//my.other.private.npm.registry/:_auth=VGhpc0lzVGhlT3RoZXJVc2VyOkFuZEhlcmVJc1RoZU90aGVyUGFzc3dvcmQ=\nalways-auth=true\n",
   394  				tarballPath:       "/sub/package.tgz",
   395  			},
   396  		},
   397  		// scoped project in a subfolder
   398  		{
   399  			name: "success - single project in subfolder, publish scoped, unpacked package - target registry in npmrc",
   400  
   401  			files: map[string]string{
   402  				"sub/package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   403  				"sub/.piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n@piper:registry=https://my.private.npm.registry/\n",
   404  			},
   405  
   406  			packageDescriptors: []string{"sub/package.json"},
   407  
   408  			wants: wants{
   409  				publishConfigPath: `\.piperNpmrc`,
   410  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n@piper:registry=https://my.private.npm.registry/\n",
   411  			},
   412  		},
   413  		{
   414  			name: "success - single project in subfolder, publish scoped, unpacked package - target registry from pipeline",
   415  
   416  			files: map[string]string{
   417  				"sub/package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   418  			},
   419  
   420  			packageDescriptors: []string{"sub/package.json"},
   421  
   422  			registryURL:      "https://my.private.npm.registry/",
   423  			registryUser:     "ThisIsTheUser",
   424  			registryPassword: "AndHereIsThePassword",
   425  
   426  			wants: wants{
   427  				publishConfigPath: `\.piperNpmrc`,
   428  				publishConfig:     "registry=https://my.private.npm.registry/\n@piper:registry=https://my.private.npm.registry/\n//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nalways-auth=true\n",
   429  			},
   430  		},
   431  		{
   432  			name: "success - single project in subfolder, publish scoped, unpacked package - target registry from pipeline (precedence over npmrc)",
   433  
   434  			files: map[string]string{
   435  				"sub/package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   436  				"sub/.piperNpmrc":  "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   437  			},
   438  
   439  			packageDescriptors: []string{"sub/package.json"},
   440  
   441  			registryURL:      "https://my.other.private.npm.registry/",
   442  			registryUser:     "ThisIsTheOtherUser",
   443  			registryPassword: "AndHereIsTheOtherPassword",
   444  
   445  			wants: wants{
   446  				publishConfigPath: `\.piperNpmrc`,
   447  				publishConfig:     "//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.other.private.npm.registry/\n@piper:registry=https://my.other.private.npm.registry/\n//my.other.private.npm.registry/:_auth=VGhpc0lzVGhlT3RoZXJVc2VyOkFuZEhlcmVJc1RoZU90aGVyUGFzc3dvcmQ=\nalways-auth=true\n",
   448  			},
   449  		},
   450  		{
   451  			name: "success - single project in subfolder, publish scoped, packed - target registry in npmrc",
   452  
   453  			files: map[string]string{
   454  				"sub/package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   455  				"sub/.piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\n@piper:registry=https://my.private.npm.registry/\n",
   456  			},
   457  
   458  			packageDescriptors: []string{"sub/package.json"},
   459  
   460  			packBeforePublish: true,
   461  
   462  			wants: wants{
   463  				publishConfigPath: `\.piperNpmrc`,
   464  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\n@piper:registry=https://my.private.npm.registry/\n",
   465  				tarballPath:       "/sub/package.tgz",
   466  			},
   467  		},
   468  		{
   469  			name: "success - single project in subfolder, publish scoped, packed - target registry from pipeline",
   470  
   471  			files: map[string]string{
   472  				"sub/package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   473  			},
   474  
   475  			packageDescriptors: []string{"sub/package.json"},
   476  
   477  			packBeforePublish: true,
   478  
   479  			registryURL:      "https://my.private.npm.registry/",
   480  			registryUser:     "ThisIsTheUser",
   481  			registryPassword: "AndHereIsThePassword",
   482  
   483  			wants: wants{
   484  				publishConfigPath: `\.piperNpmrc`,
   485  				publishConfig:     "registry=https://my.private.npm.registry/\n@piper:registry=https://my.private.npm.registry/\n//my.private.npm.registry/:_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nalways-auth=true\n",
   486  				tarballPath:       "/sub/package.tgz",
   487  			},
   488  		},
   489  		{
   490  			name: "success - single project in subfolder, publish scoped, packed - target registry from pipeline (precedence over npmrc)",
   491  
   492  			files: map[string]string{
   493  				"sub/package.json": `{"name": "@piper/project", "version": "0.0.1"}`,
   494  				"sub/.piperNpmrc":  "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.private.npm.registry/\n",
   495  			},
   496  
   497  			packageDescriptors: []string{"sub/package.json"},
   498  
   499  			packBeforePublish: true,
   500  
   501  			registryURL:      "https://my.other.private.npm.registry/",
   502  			registryUser:     "ThisIsTheOtherUser",
   503  			registryPassword: "AndHereIsTheOtherPassword",
   504  
   505  			wants: wants{
   506  				publishConfigPath: `\.piperNpmrc`,
   507  				publishConfig:     "_auth=VGhpc0lzVGhlVXNlcjpBbmRIZXJlSXNUaGVQYXNzd29yZA==\nregistry=https://my.other.private.npm.registry/\n@piper:registry=https://my.other.private.npm.registry/\n//my.other.private.npm.registry/:_auth=VGhpc0lzVGhlT3RoZXJVc2VyOkFuZEhlcmVJc1RoZU90aGVyUGFzc3dvcmQ=\nalways-auth=true\n",
   508  				tarballPath:       "/sub/package.tgz",
   509  			},
   510  		},
   511  		// TODO multiple projects
   512  	}
   513  
   514  	for _, test := range tt {
   515  		t.Run(test.name, func(t *testing.T) {
   516  			utils := newNpmMockUtilsBundleRelativeGlob()
   517  			for path, content := range test.files {
   518  				utils.AddFile(path, []byte(content))
   519  			}
   520  			utils.Separator = string(filepath.Separator)
   521  
   522  			exec := &Execute{
   523  				Utils: &utils,
   524  			}
   525  
   526  			propertiesLoadFile = utils.FileRead
   527  			propertiesWriteFile = utils.FileWrite
   528  			writeIgnoreFile = utils.FileWrite
   529  
   530  			// This stub simulates the behavior of npm pack and puts a tgz into the requested
   531  			utils.execRunner.Stub = func(call string, stdoutReturn map[string]string, shouldFailOnCommand map[string]error, stdout io.Writer) error {
   532  				//tgzTargetPath := filepath.Dir(test.packageDescriptors[0])
   533  				utils.AddFile(filepath.Join(".", "package.tgz"), []byte("this is a tgz file"))
   534  				return nil
   535  			}
   536  
   537  			err := exec.PublishAllPackages(test.packageDescriptors, test.registryURL, test.registryUser, test.registryPassword, test.packBeforePublish)
   538  
   539  			if len(test.wants.err) == 0 && assert.NoError(t, err) {
   540  				if assert.NotEmpty(t, utils.execRunner.Calls) {
   541  					// last call is expected to be npm publish
   542  					publishCmd := utils.execRunner.Calls[len(utils.execRunner.Calls)-1]
   543  
   544  					assert.Equal(t, "npm", publishCmd.Exec)
   545  					assert.Equal(t, "publish", publishCmd.Params[0])
   546  
   547  					if len(test.wants.tarballPath) > 0 && assert.Contains(t, publishCmd.Params, "--tarball") {
   548  						tarballPath := publishCmd.Params[piperutils.FindString(publishCmd.Params, "--tarball")+1]
   549  						assert.Equal(t, test.wants.tarballPath, filepath.ToSlash(tarballPath))
   550  					}
   551  
   552  					if assert.Contains(t, publishCmd.Params, "--userconfig") {
   553  						effectivePublishConfigPath := publishCmd.Params[piperutils.FindString(publishCmd.Params, "--userconfig")+1]
   554  
   555  						assert.Regexp(t, test.wants.publishConfigPath, filepath.ToSlash(effectivePublishConfigPath))
   556  
   557  						if test.packBeforePublish {
   558  							subPath := filepath.Dir(test.packageDescriptors[0])
   559  							effectivePublishConfigPath = filepath.Join(subPath, effectivePublishConfigPath)
   560  						}
   561  
   562  						effectiveConfig, err := utils.FileRead(effectivePublishConfigPath)
   563  						if assert.NoError(t, err) {
   564  							assert.Equal(t, test.wants.publishConfig, string(effectiveConfig))
   565  						}
   566  					}
   567  				}
   568  			} else {
   569  				assert.EqualError(t, err, test.wants.err)
   570  			}
   571  		})
   572  	}
   573  }