github.com/kubri/kubri@v0.5.1-0.20240317001612-bda2aaef967e/internal/test/source.go (about)

     1  package test
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"strings"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/google/go-cmp/cmp"
    11  	"github.com/google/go-cmp/cmp/cmpopts"
    12  
    13  	"github.com/kubri/kubri/source"
    14  )
    15  
    16  //nolint:funlen
    17  func Source(t *testing.T, s *source.Source, makeURL func(version, asset string) string) {
    18  	t.Helper()
    19  
    20  	data := []byte("test\n")
    21  	ctx := context.Background()
    22  	want := SourceWant()
    23  
    24  	for _, release := range want {
    25  		for _, asset := range release.Assets {
    26  			_ = s.UploadAsset(ctx, release.Version, asset.Name, data)
    27  			asset.URL = makeURL(release.Version, asset.Name)
    28  		}
    29  	}
    30  
    31  	opt := []cmp.Option{
    32  		cmpopts.EquateApproxTime(10 * time.Second),
    33  		cmpopts.SortSlices(func(a, b *source.Asset) bool { return a.Name < b.Name }),
    34  
    35  		// Ignore asset URL query.
    36  		cmp.FilterPath(
    37  			func(p cmp.Path) bool { return strings.HasPrefix(p.String(), "Assets.URL") },
    38  			cmp.Comparer(func(a, b string) bool {
    39  				a, _, _ = strings.Cut(a, "?")
    40  				b, _, _ = strings.Cut(b, "?")
    41  				return a == b
    42  			}),
    43  		),
    44  	}
    45  
    46  	t.Run("ListReleases", func(t *testing.T) {
    47  		t.Helper()
    48  
    49  		got, err := s.ListReleases(ctx, &source.ListOptions{Prerelease: true})
    50  		if err != nil {
    51  			t.Fatal(err)
    52  		}
    53  		if diff := cmp.Diff(want, got, opt...); diff != "" {
    54  			t.Error(diff)
    55  		}
    56  	})
    57  
    58  	t.Run("GetRelease", func(t *testing.T) {
    59  		t.Helper()
    60  
    61  		got, err := s.GetRelease(ctx, want[0].Version)
    62  		if err != nil {
    63  			t.Fatal(err)
    64  		}
    65  		if diff := cmp.Diff(want[0], got, opt...); diff != "" {
    66  			t.Error(diff)
    67  		}
    68  
    69  		_, err = s.GetRelease(ctx, "v0.0.0")
    70  		if err == nil {
    71  			t.Error("should return error")
    72  		}
    73  	})
    74  
    75  	t.Run("UploadAsset", func(t *testing.T) {
    76  		t.Helper()
    77  
    78  		err := s.UploadAsset(ctx, want[0].Version, "test.txt", data)
    79  		if err != nil {
    80  			t.Fatal(err)
    81  		}
    82  	})
    83  
    84  	t.Run("DownloadAsset", func(t *testing.T) {
    85  		t.Helper()
    86  
    87  		b, err := s.DownloadAsset(ctx, want[0].Version, "test.txt")
    88  		if err != nil {
    89  			t.Fatal(err)
    90  		}
    91  		if !bytes.Equal(data, b) {
    92  			t.Error("should be equal")
    93  		}
    94  
    95  		_, err = s.DownloadAsset(ctx, "v0.0.0", "test.txt")
    96  		if err == nil {
    97  			t.Error("should return error")
    98  		}
    99  
   100  		_, err = s.DownloadAsset(ctx, want[0].Version, "fail.txt")
   101  		if err == nil {
   102  			t.Error("should return error")
   103  		}
   104  	})
   105  }
   106  
   107  func SourceWant() []*source.Release {
   108  	return []*source.Release{
   109  		{
   110  			Name:    "v1.0.0",
   111  			Date:    time.Now().UTC(),
   112  			Version: "v1.0.0",
   113  			Assets: []*source.Asset{
   114  				{Name: "test.dmg", Size: 5},
   115  				{Name: "test_32-bit.msi", Size: 5},
   116  				{Name: "test_64-bit.msi", Size: 5},
   117  			},
   118  		},
   119  		{
   120  			Name:       "v1.0.0-alpha",
   121  			Date:       time.Now().UTC(),
   122  			Version:    "v1.0.0-alpha",
   123  			Prerelease: true,
   124  			Assets: []*source.Asset{
   125  				{Name: "test.dmg", Size: 5},
   126  				{Name: "test_32-bit.msi", Size: 5},
   127  				{Name: "test_64-bit.msi", Size: 5},
   128  			},
   129  		},
   130  		{
   131  			Name:       "v0.9.1",
   132  			Date:       time.Now().UTC(),
   133  			Version:    "v0.9.1",
   134  			Prerelease: false,
   135  			Assets: []*source.Asset{
   136  				{Name: "test.dmg", Size: 5},
   137  				{Name: "test_32-bit.msi", Size: 5},
   138  				{Name: "test_64-bit.msi", Size: 5},
   139  			},
   140  		},
   141  	}
   142  }