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  }