mirror of
https://github.com/webinstall/webi-installers.git
synced 2026-08-20 04:26:25 +00:00
Rewrites the Node.js release classification pipeline in Go. webicached fetches upstream releases (GitHub, Gitea, GitLab, HashiCorp, custom sources), classifies assets by OS/arch/variant, and writes legacy-format JSON caches compatible with the existing webinstall.dev API. Git-clone packages emit git_tag and git_commit_hash from real repo clones — no fabricated refs.
139 lines
3.0 KiB
Go
139 lines
3.0 KiB
Go
package fsstore_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/webinstall/webi-installers/internal/storage"
|
|
"github.com/webinstall/webi-installers/internal/storage/fsstore"
|
|
)
|
|
|
|
func TestRoundTrip(t *testing.T) {
|
|
dir := t.TempDir()
|
|
s, err := fsstore.New(dir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ctx := context.Background()
|
|
|
|
// Initially empty.
|
|
pd, err := s.Load(ctx, "bat")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if pd != nil {
|
|
t.Fatal("expected nil for uncached package")
|
|
}
|
|
|
|
// Write some assets.
|
|
tx, err := s.BeginRefresh(ctx, "bat")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
tx.Put([]storage.Asset{
|
|
{
|
|
Filename: "bat-v0.26.1-aarch64-apple-darwin.tar.gz",
|
|
Version: "0.26.1",
|
|
Channel: "stable",
|
|
Date: "2025-12-02",
|
|
OS: "darwin",
|
|
Arch: "aarch64",
|
|
Format: ".tar.gz",
|
|
Download: "https://github.com/sharkdp/bat/releases/download/v0.26.1/bat-v0.26.1-aarch64-apple-darwin.tar.gz",
|
|
},
|
|
{
|
|
Filename: "bat-v0.26.1-x86_64-unknown-linux-gnu.tar.gz",
|
|
Version: "0.26.1",
|
|
Channel: "stable",
|
|
Date: "2025-12-02",
|
|
OS: "linux",
|
|
Arch: "x86_64",
|
|
Libc: "gnu",
|
|
Format: ".tar.gz",
|
|
Download: "https://github.com/sharkdp/bat/releases/download/v0.26.1/bat-v0.26.1-x86_64-unknown-linux-gnu.tar.gz",
|
|
},
|
|
})
|
|
if err := tx.Commit(ctx); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Read back.
|
|
pd, err = s.Load(ctx, "bat")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if pd == nil {
|
|
t.Fatal("expected data after write")
|
|
}
|
|
if len(pd.Assets) != 2 {
|
|
t.Fatalf("got %d assets, want 2", len(pd.Assets))
|
|
}
|
|
if pd.Assets[0].Filename != "bat-v0.26.1-aarch64-apple-darwin.tar.gz" {
|
|
t.Errorf("asset[0].Filename = %q", pd.Assets[0].Filename)
|
|
}
|
|
if pd.Assets[1].OS != "linux" {
|
|
t.Errorf("asset[1].OS = %q", pd.Assets[1].OS)
|
|
}
|
|
if pd.UpdatedAt.IsZero() {
|
|
t.Error("UpdatedAt should be set")
|
|
}
|
|
}
|
|
|
|
func TestRollback(t *testing.T) {
|
|
dir := t.TempDir()
|
|
s, err := fsstore.New(dir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ctx := context.Background()
|
|
|
|
tx, err := s.BeginRefresh(ctx, "bat")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
tx.Put([]storage.Asset{{Filename: "test", Version: "1.0"}})
|
|
tx.Rollback()
|
|
|
|
pd, err := s.Load(ctx, "bat")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if pd != nil {
|
|
t.Fatal("expected nil after rollback")
|
|
}
|
|
}
|
|
|
|
func TestReadLegacyFormat(t *testing.T) {
|
|
dir := t.TempDir()
|
|
s, err := fsstore.New(dir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ctx := context.Background()
|
|
|
|
// Write assets and read back — the JSON uses "releases" key
|
|
// and "name"/"ext" field names for Node.js compat.
|
|
tx, _ := s.BeginRefresh(ctx, "aliasman")
|
|
tx.Put([]storage.Asset{
|
|
{
|
|
Filename: "BeyondCodeBootcamp-aliasman-v1.1.2-0-g0e5e1c1.tar.gz",
|
|
Version: "v1.1.2",
|
|
Channel: "stable",
|
|
Date: "2023-02-23",
|
|
OS: "posix_2017",
|
|
Arch: "*",
|
|
Format: "",
|
|
Download: "https://codeload.github.com/BeyondCodeBootcamp/aliasman/legacy.tar.gz/refs/tags/v1.1.2",
|
|
},
|
|
})
|
|
tx.Commit(ctx)
|
|
|
|
pd, err := s.Load(ctx, "aliasman")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if pd.Assets[0].OS != "posix_2017" {
|
|
t.Errorf("OS = %q, want posix_2017", pd.Assets[0].OS)
|
|
}
|
|
}
|