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  }