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 }