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 }