github.com/kubri/kubri@v0.5.1-0.20240317001612-bda2aaef967e/internal/testsource/testsource.go (about) 1 // Package testsource is an in-memory simulator of a source for use in tests. 2 package testsource 3 4 import ( 5 "context" 6 7 "github.com/kubri/kubri/source" 8 ) 9 10 type testSource struct { 11 data []*source.Release 12 assets map[[2]string][]byte 13 } 14 15 func New(r []*source.Release) *source.Source { 16 return source.New(&testSource{r, map[[2]string][]byte{}}) 17 } 18 19 func (s *testSource) GetRelease(_ context.Context, version string) (*source.Release, error) { 20 for _, r := range s.data { 21 if r.Version == version { 22 return r, nil 23 } 24 } 25 return nil, source.ErrNoReleaseFound 26 } 27 28 func (s *testSource) ListReleases(context.Context) ([]*source.Release, error) { 29 return append([]*source.Release(nil), s.data...), nil 30 } 31 32 func (s *testSource) DownloadAsset(ctx context.Context, version, name string) ([]byte, error) { 33 r, err := s.GetRelease(ctx, version) 34 if err != nil { 35 return nil, err 36 } 37 38 if a := getAsset(r.Assets, name); a != nil { 39 if b := s.assets[[2]string{version, name}]; b != nil { 40 return b, nil 41 } 42 } 43 44 return nil, source.ErrAssetNotFound 45 } 46 47 func (s *testSource) UploadAsset(ctx context.Context, version, name string, data []byte) error { 48 r, err := s.GetRelease(ctx, version) 49 if err != nil { 50 return err 51 } 52 53 asset := &source.Asset{ 54 Name: name, 55 Size: len(data), 56 URL: "https://example.com/" + version + "/" + name, 57 } 58 59 if a := getAsset(r.Assets, name); a != nil { 60 *a = *asset 61 } else { 62 r.Assets = append(r.Assets, asset) 63 } 64 65 s.assets[[2]string{version, name}] = data 66 67 return nil 68 } 69 70 func getAsset(assets []*source.Asset, name string) *source.Asset { 71 for _, a := range assets { 72 if a.Name == name { 73 return a 74 } 75 } 76 return nil 77 }