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 }