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

     1  package local_test
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/google/go-cmp/cmp"
    13  	"github.com/google/go-cmp/cmp/cmpopts"
    14  
    15  	"github.com/kubri/kubri/source"
    16  	"github.com/kubri/kubri/source/local"
    17  )
    18  
    19  func TestLocal(t *testing.T) {
    20  	dir := t.TempDir()
    21  
    22  	tests := []struct {
    23  		name string
    24  		path string
    25  		want []*source.Release
    26  	}{
    27  		{
    28  			name: "Directory",
    29  			path: filepath.Join(dir, "dir"),
    30  			want: []*source.Release{
    31  				{
    32  					Name:    "v1.0.0",
    33  					Version: "v1.0.0",
    34  					Date:    time.Now(),
    35  					Assets: []*source.Asset{
    36  						{
    37  							Name: "test.dmg",
    38  							URL:  "file://" + filepath.Join(dir, "dir", "test.dmg"),
    39  							Size: 5,
    40  						},
    41  						{
    42  							Name: "test_32-bit.msi",
    43  							URL:  "file://" + filepath.Join(dir, "dir", "test_32-bit.msi"),
    44  							Size: 5,
    45  						},
    46  						{
    47  							Name: "test_64-bit.msi",
    48  							URL:  "file://" + filepath.Join(dir, "dir", "test_64-bit.msi"),
    49  							Size: 5,
    50  						},
    51  					},
    52  				},
    53  			},
    54  		},
    55  		{
    56  			name: "Glob",
    57  			path: filepath.Join(dir, "glob", "*", "*"),
    58  			want: []*source.Release{
    59  				{
    60  					Name:    "v1.0.0",
    61  					Version: "v1.0.0",
    62  					Date:    time.Now(),
    63  					Assets: []*source.Asset{
    64  						{
    65  							Name: "test.dmg",
    66  							URL:  "file://" + filepath.Join(dir, "glob", "darwin", "test.dmg"),
    67  							Size: 5,
    68  						},
    69  						{
    70  							Name: "test_32-bit.msi",
    71  							URL:  "file://" + filepath.Join(dir, "glob", "win32", "test_32-bit.msi"),
    72  							Size: 5,
    73  						},
    74  						{
    75  							Name: "test_64-bit.msi",
    76  							URL:  "file://" + filepath.Join(dir, "glob", "win64", "test_64-bit.msi"),
    77  							Size: 5,
    78  						},
    79  					},
    80  				},
    81  			},
    82  		},
    83  		{
    84  			name: "File",
    85  			path: filepath.Join(dir, "file", "test.dmg"),
    86  			want: []*source.Release{
    87  				{
    88  					Name:    "v1.0.0",
    89  					Version: "v1.0.0",
    90  					Date:    time.Now(),
    91  					Assets: []*source.Asset{
    92  						{
    93  							Name: "test.dmg",
    94  							URL:  "file://" + filepath.Join(dir, "file", "test.dmg"),
    95  							Size: 5,
    96  						},
    97  					},
    98  				},
    99  			},
   100  		},
   101  	}
   102  
   103  	data := []byte("test\n")
   104  	ctx := context.Background()
   105  
   106  	for _, test := range tests {
   107  		t.Run(test.name, func(t *testing.T) {
   108  			for _, release := range test.want {
   109  				for _, asset := range release.Assets {
   110  					path := strings.TrimPrefix(asset.URL, "file://")
   111  					os.MkdirAll(filepath.Dir(path), os.ModePerm)
   112  					os.WriteFile(path, data, os.ModePerm)
   113  				}
   114  			}
   115  
   116  			s, err := local.New(local.Config{Path: test.path, Version: "v1.0.0"})
   117  			if err != nil {
   118  				t.Fatal(err)
   119  			}
   120  
   121  			opt := cmpopts.EquateApproxTime(100 * time.Millisecond)
   122  
   123  			t.Run("ListReleases", func(t *testing.T) {
   124  				got, err := s.ListReleases(ctx, nil)
   125  				if err != nil {
   126  					t.Fatal(err)
   127  				}
   128  
   129  				if diff := cmp.Diff(test.want, got, opt); diff != "" {
   130  					t.Error(diff)
   131  				}
   132  			})
   133  
   134  			t.Run("GetRelease", func(t *testing.T) {
   135  				got, err := s.GetRelease(ctx, test.want[0].Version)
   136  				if err != nil {
   137  					t.Fatal(err)
   138  				}
   139  
   140  				if diff := cmp.Diff(test.want[0], got, opt); diff != "" {
   141  					t.Error(diff)
   142  				}
   143  			})
   144  
   145  			t.Run("UploadAsset", func(t *testing.T) {
   146  				err := s.UploadAsset(ctx, test.want[0].Version, "test.txt", data)
   147  				if err != nil {
   148  					t.Fatal(err)
   149  				}
   150  
   151  				path, _, _ := strings.Cut(test.path, "*")
   152  				if fi, _ := os.Stat(path); !fi.IsDir() {
   153  					path = filepath.Dir(path)
   154  				}
   155  
   156  				b, err := os.ReadFile(filepath.Join(path, "test.txt"))
   157  				if err != nil {
   158  					t.Fatal(err)
   159  				}
   160  
   161  				if !bytes.Equal(data, b) {
   162  					t.Error("should be equal")
   163  				}
   164  			})
   165  
   166  			t.Run("DownloadAsset", func(t *testing.T) {
   167  				b, err := s.DownloadAsset(ctx, test.want[0].Version, test.want[0].Assets[0].Name)
   168  				if err != nil {
   169  					t.Fatal(err)
   170  				}
   171  
   172  				if !bytes.Equal(data, b) {
   173  					t.Error("should be equal")
   174  				}
   175  			})
   176  		})
   177  	}
   178  }