github.com/go-goxm/goxm@v0.4.4/codeartifact_test.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "context" 6 "fmt" 7 "io" 8 "os" 9 "testing" 10 11 "github.com/aws/aws-sdk-go-v2/aws" 12 "github.com/aws/aws-sdk-go-v2/service/codeartifact" 13 codeartifactTypes "github.com/aws/aws-sdk-go-v2/service/codeartifact/types" 14 "github.com/stretchr/testify/require" 15 "golang.org/x/exp/maps" 16 ) 17 18 type MockCodeArtifactClient struct { 19 ListPackageVersionsFunc func( 20 ctx context.Context, 21 params *codeartifact.ListPackageVersionsInput, 22 optFns ...func(*codeartifact.Options), 23 ) (*codeartifact.ListPackageVersionsOutput, error) 24 25 GetPackageVersionAssetFunc func( 26 ctx context.Context, 27 params *codeartifact.GetPackageVersionAssetInput, 28 optFns ...func(*codeartifact.Options), 29 ) (*codeartifact.GetPackageVersionAssetOutput, error) 30 31 PublishPackageVersionFunc func( 32 ctx context.Context, 33 params *codeartifact.PublishPackageVersionInput, 34 optFns ...func(*codeartifact.Options), 35 ) (*codeartifact.PublishPackageVersionOutput, error) 36 } 37 38 func (c *MockCodeArtifactClient) GetPackageVersionAsset( 39 ctx context.Context, 40 params *codeartifact.GetPackageVersionAssetInput, 41 optFns ...func(*codeartifact.Options), 42 ) (*codeartifact.GetPackageVersionAssetOutput, error) { 43 return c.GetPackageVersionAssetFunc(ctx, params, optFns...) 44 } 45 46 func (c *MockCodeArtifactClient) ListPackageVersions( 47 ctx context.Context, 48 params *codeartifact.ListPackageVersionsInput, 49 optFns ...func(*codeartifact.Options), 50 ) (*codeartifact.ListPackageVersionsOutput, error) { 51 return c.ListPackageVersionsFunc(ctx, params, optFns...) 52 } 53 54 func (c *MockCodeArtifactClient) PublishPackageVersion( 55 ctx context.Context, 56 params *codeartifact.PublishPackageVersionInput, 57 optFns ...func(*codeartifact.Options), 58 ) (*codeartifact.PublishPackageVersionOutput, error) { 59 return c.PublishPackageVersionFunc(ctx, params, optFns...) 60 } 61 62 func TestCodeArtifactModDownload(t *testing.T) { 63 t.Setenv("GOMODCACHE", t.TempDir()) 64 chdir(t, "./testdata/ca_module1") 65 66 config, err := LoadDefaultConfig() 67 require.Nilf(t, err, "Error loading default config: %v", err) 68 69 results := make(map[string][]*codeartifact.GetPackageVersionAssetInput) 70 71 for mre, repo := range config.Repos { 72 modRegExp := mre 73 74 repo := repo.(*CodeArtifactRepoConfig) 75 76 repo.client = &MockCodeArtifactClient{ 77 GetPackageVersionAssetFunc: func( 78 ctx context.Context, 79 params *codeartifact.GetPackageVersionAssetInput, 80 optFns ...func(*codeartifact.Options), 81 ) (*codeartifact.GetPackageVersionAssetOutput, error) { 82 results[modRegExp] = append(results[modRegExp], params) 83 return nil, fmt.Errorf("Mock Implementation") 84 }, 85 } 86 } 87 88 err = runWithConfig(context.Background(), config, []string{"mod", "download"}) 89 require.Error(t, err) 90 91 expectedResults := map[string][]*codeartifact.GetPackageVersionAssetInput{ 92 "golang.org/x/crypto": []*codeartifact.GetPackageVersionAssetInput{ 93 { 94 Asset: aws.String("v0.17.0.mod"), 95 Package: aws.String("golang.org+2Fx+2Fcrypto"), 96 PackageVersion: aws.String("v0.17.0"), 97 Namespace: aws.String("goxm"), 98 Repository: aws.String("TestRepo1"), 99 Domain: aws.String("TestDomain1"), 100 DomainOwner: aws.String("111111111111"), 101 Format: codeartifactTypes.PackageFormatGeneric, 102 }, 103 }, 104 "github.com/mattn/*": []*codeartifact.GetPackageVersionAssetInput{ 105 { 106 Asset: aws.String("v0.0.20.mod"), 107 Package: aws.String("github.com+2Fmattn+2Fgo-isatty"), 108 PackageVersion: aws.String("v0.0.20"), 109 Namespace: aws.String("Namespace2"), 110 Repository: aws.String("TestRepo2"), 111 Domain: aws.String("TestDomain2"), 112 DomainOwner: aws.String("222222222222"), 113 Format: codeartifactTypes.PackageFormatGeneric, 114 }, 115 { 116 Asset: aws.String("v0.1.13.mod"), 117 Package: aws.String("github.com+2Fmattn+2Fgo-colorable"), 118 PackageVersion: aws.String("v0.1.13"), 119 Namespace: aws.String("Namespace2"), 120 Repository: aws.String("TestRepo2"), 121 Domain: aws.String("TestDomain2"), 122 DomainOwner: aws.String("222222222222"), 123 Format: codeartifactTypes.PackageFormatGeneric, 124 }, 125 }, 126 } 127 128 require.ElementsMatch(t, maps.Keys(expectedResults), maps.Keys(results)) 129 for k, result := range results { 130 require.ElementsMatch(t, expectedResults[k], result) 131 } 132 } 133 134 func TestCodeArtifactGet(t *testing.T) { 135 t.Setenv("GOMODCACHE", t.TempDir()) 136 chdir(t, "./testdata/ca_module2") 137 138 config, err := LoadDefaultConfig() 139 require.Nilf(t, err, "Error loading default config: %v", err) 140 141 results := make(map[string][]*codeartifact.GetPackageVersionAssetInput) 142 143 for mre, repo := range config.Repos { 144 modRegExp := mre 145 146 repo := repo.(*CodeArtifactRepoConfig) 147 148 repo.client = &MockCodeArtifactClient{ 149 GetPackageVersionAssetFunc: func( 150 ctx context.Context, 151 params *codeartifact.GetPackageVersionAssetInput, 152 optFns ...func(*codeartifact.Options), 153 ) (*codeartifact.GetPackageVersionAssetOutput, error) { 154 results[modRegExp] = append(results[modRegExp], params) 155 return nil, fmt.Errorf("Mock Implementation") 156 }, 157 } 158 } 159 160 err = runWithConfig(context.Background(), config, []string{"get", "github.com/kelseyhightower/envconfig@v1.4.0"}) 161 require.Error(t, err) 162 163 expectedResults := map[string][]*codeartifact.GetPackageVersionAssetInput{ 164 "github.com/kelseyhightower/envconfig": []*codeartifact.GetPackageVersionAssetInput{ 165 { 166 Asset: aws.String("v1.4.0.info"), 167 Package: aws.String("github.com+2Fkelseyhightower+2Fenvconfig"), 168 PackageVersion: aws.String("v1.4.0"), 169 Namespace: aws.String("goxm"), 170 Repository: aws.String("TestRepo1"), 171 Domain: aws.String("TestDomain1"), 172 DomainOwner: aws.String("111111111111"), 173 Format: codeartifactTypes.PackageFormatGeneric, 174 }, 175 }, 176 } 177 178 require.ElementsMatch(t, maps.Keys(expectedResults), maps.Keys(results)) 179 for k, result := range results { 180 require.ElementsMatch(t, expectedResults[k], result) 181 } 182 } 183 184 func TestCodeArtifactBuild(t *testing.T) { 185 // Cache is created with read-write permissions 186 // to avoid error on temp directory cleanup 187 t.Setenv("GOFLAGS", "-modcacherw") 188 t.Setenv("GOMODCACHE", t.TempDir()) 189 chdir(t, "./testdata/ca_module3") 190 191 config, err := LoadDefaultConfig() 192 require.Nilf(t, err, "Error loading default config: %v", err) 193 194 results := make(map[string][]*codeartifact.GetPackageVersionAssetInput) 195 196 for mre, repo := range config.Repos { 197 modRegExp := mre 198 199 repo := repo.(*CodeArtifactRepoConfig) 200 201 repo.client = &MockCodeArtifactClient{ 202 GetPackageVersionAssetFunc: func( 203 ctx context.Context, 204 params *codeartifact.GetPackageVersionAssetInput, 205 optFns ...func(*codeartifact.Options), 206 ) (*codeartifact.GetPackageVersionAssetOutput, error) { 207 results[modRegExp] = append(results[modRegExp], params) 208 return &codeartifact.GetPackageVersionAssetOutput{ 209 Asset: io.NopCloser(fileToReader(t, "../ca_module1_assets/"+aws.ToString(params.Asset))), 210 }, nil 211 }, 212 } 213 } 214 215 buildOutputPath := t.TempDir() + "/ca_module3" 216 err = runWithConfig(context.Background(), config, []string{"build", "-o", buildOutputPath}) 217 require.Nil(t, err, err) 218 require.FileExists(t, buildOutputPath) 219 220 expectedResults := map[string][]*codeartifact.GetPackageVersionAssetInput{ 221 "github.com/go-goxm/ca_module1": []*codeartifact.GetPackageVersionAssetInput{ 222 { 223 Asset: aws.String("v0.1.0.zip"), 224 Package: aws.String("github.com+2Fgo-goxm+2Fca_module1"), 225 PackageVersion: aws.String("v0.1.0"), 226 Namespace: aws.String("goxm"), 227 Repository: aws.String("TestRepo2"), 228 Domain: aws.String("TestDomain2"), 229 DomainOwner: aws.String("222222222222"), 230 Format: codeartifactTypes.PackageFormatGeneric, 231 }, 232 { 233 Asset: aws.String("v0.1.0.mod"), 234 Package: aws.String("github.com+2Fgo-goxm+2Fca_module1"), 235 PackageVersion: aws.String("v0.1.0"), 236 Namespace: aws.String("goxm"), 237 Repository: aws.String("TestRepo2"), 238 Domain: aws.String("TestDomain2"), 239 DomainOwner: aws.String("222222222222"), 240 Format: codeartifactTypes.PackageFormatGeneric, 241 }, 242 { 243 Asset: aws.String("v0.1.0.info"), 244 Package: aws.String("github.com+2Fgo-goxm+2Fca_module1"), 245 PackageVersion: aws.String("v0.1.0"), 246 Namespace: aws.String("goxm"), 247 Repository: aws.String("TestRepo2"), 248 Domain: aws.String("TestDomain2"), 249 DomainOwner: aws.String("222222222222"), 250 Format: codeartifactTypes.PackageFormatGeneric, 251 }, 252 }, 253 } 254 255 require.ElementsMatch(t, maps.Keys(expectedResults), maps.Keys(results)) 256 for k, result := range results { 257 require.ElementsMatch(t, expectedResults[k], result) 258 } 259 } 260 261 func TestCodeArtifactPublish(t *testing.T) { 262 t.Setenv("GOMODCACHE", t.TempDir()) 263 chdir(t, "./testdata/ca_module1") 264 265 config, err := LoadDefaultConfig() 266 require.Nilf(t, err, "Error loading default config: %v", err) 267 268 results := make(map[string][]*codeartifact.PublishPackageVersionInput) 269 270 for mre, repo := range config.Repos { 271 modRegExp := mre 272 273 repo := repo.(*CodeArtifactRepoConfig) 274 275 repo.client = &MockCodeArtifactClient{ 276 PublishPackageVersionFunc: func( 277 ctx context.Context, 278 params *codeartifact.PublishPackageVersionInput, 279 optFns ...func(*codeartifact.Options), 280 ) (*codeartifact.PublishPackageVersionOutput, error) { 281 results[modRegExp] = append(results[modRegExp], params) 282 return &codeartifact.PublishPackageVersionOutput{}, nil 283 }, 284 } 285 } 286 287 err = runWithConfig(context.Background(), config, []string{"publish", "v0.1.0"}) 288 require.Nil(t, err, err) 289 290 expectedResults := map[string][]*codeartifact.PublishPackageVersionInput{ 291 "github.com/go-goxm/*": []*codeartifact.PublishPackageVersionInput{ 292 { 293 AssetName: aws.String("v0.1.0.info"), 294 AssetSHA256: aws.String("b24a728889e313df1de4f54573bc893a26ce7e2e15059524b6430996d56668a4"), 295 AssetContent: fileToReader(t, "../ca_module1_assets/v0.1.0.info"), 296 Package: aws.String("github.com+2Fgo-goxm+2Fca_module1"), 297 PackageVersion: aws.String("v0.1.0"), 298 Namespace: aws.String("goxm"), 299 Repository: aws.String("TestRepo1"), 300 Domain: aws.String("TestDomain1"), 301 DomainOwner: aws.String("111111111111"), 302 Format: codeartifactTypes.PackageFormatGeneric, 303 Unfinished: aws.Bool(true), 304 }, 305 { 306 AssetName: aws.String("v0.1.0.mod"), 307 AssetSHA256: aws.String("84ab8e2a063142265a796cb95446d794a61e0568f91b56f519fd84e11e23f0a7"), 308 AssetContent: fileToReader(t, "../ca_module1_assets/v0.1.0.mod"), 309 Package: aws.String("github.com+2Fgo-goxm+2Fca_module1"), 310 PackageVersion: aws.String("v0.1.0"), 311 Namespace: aws.String("goxm"), 312 Repository: aws.String("TestRepo1"), 313 Domain: aws.String("TestDomain1"), 314 DomainOwner: aws.String("111111111111"), 315 Format: codeartifactTypes.PackageFormatGeneric, 316 Unfinished: aws.Bool(true), 317 }, 318 { 319 AssetName: aws.String("v0.1.0.zip"), 320 AssetSHA256: aws.String("f3f283d638bd8e446d593aec7a6c5bf1e234ed9c91a611362a192fc3f508cf99"), 321 AssetContent: fileToReader(t, "../ca_module1_assets/v0.1.0.zip"), 322 Package: aws.String("github.com+2Fgo-goxm+2Fca_module1"), 323 PackageVersion: aws.String("v0.1.0"), 324 Namespace: aws.String("goxm"), 325 Repository: aws.String("TestRepo1"), 326 Domain: aws.String("TestDomain1"), 327 DomainOwner: aws.String("111111111111"), 328 Format: codeartifactTypes.PackageFormatGeneric, 329 Unfinished: aws.Bool(false), 330 }, 331 }, 332 } 333 334 require.ElementsMatch(t, maps.Keys(expectedResults), maps.Keys(results)) 335 for k, result := range results { 336 // // Use to write assets to directory 337 // for _, r := range result { 338 // readerToFile(t, r.AssetContent, "../ca_module1_assets/" + *r.AssetName) 339 // } 340 require.ElementsMatch(t, expectedResults[k], result) 341 } 342 } 343 344 func fileToReader(t *testing.T, p string) io.Reader { 345 f, err := os.Open(p) 346 require.Nil(t, err) 347 defer f.Close() 348 349 b, err := io.ReadAll(f) 350 require.Nil(t, err) 351 352 return bytes.NewReader(b) 353 } 354 355 func readerToFile(t *testing.T, r io.Reader, p string) { 356 f, err := os.Create(p) 357 require.Nil(t, err) 358 defer f.Close() 359 360 _, err = io.Copy(f, r) 361 require.Nil(t, err) 362 }