Files
snack/snap/snap_integration_test.go

174 lines
4.5 KiB
Go

//go:build integration
package snap_test
import (
"context"
"testing"
"github.com/gogrlx/snack"
"github.com/gogrlx/snack/snap"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestIntegration_Snap(t *testing.T) {
var mgr snack.Manager = snap.New()
if !mgr.Available() {
t.Skip("snap not available")
}
ctx := context.Background()
assert.Equal(t, "snap", mgr.Name())
caps := snack.GetCapabilities(mgr)
assert.True(t, caps.VersionQuery, "snap should support VersionQuery")
assert.False(t, caps.Hold)
assert.False(t, caps.Clean)
assert.False(t, caps.FileOwnership)
assert.False(t, caps.RepoManagement)
assert.False(t, caps.KeyManagement)
assert.False(t, caps.Groups)
assert.False(t, caps.NameNormalize)
t.Run("Update", func(t *testing.T) {
require.NoError(t, mgr.Update(ctx))
})
t.Run("Search", func(t *testing.T) {
pkgs, err := mgr.Search(ctx, "hello-world")
require.NoError(t, err)
require.NotEmpty(t, pkgs)
})
t.Run("Search_NoResults", func(t *testing.T) {
pkgs, err := mgr.Search(ctx, "xyznonexistentpackage999zzz")
require.NoError(t, err)
assert.Empty(t, pkgs)
})
t.Run("Info", func(t *testing.T) {
pkg, err := mgr.Info(ctx, "hello-world")
require.NoError(t, err)
require.NotNil(t, pkg)
assert.Equal(t, "hello-world", pkg.Name)
// Version may be empty for uninstalled snaps queried via snap info
})
t.Run("Info_NotFound", func(t *testing.T) {
_, err := mgr.Info(ctx, "xyznonexistentpackage999")
assert.Error(t, err)
})
t.Run("Install", func(t *testing.T) {
_, _ = mgr.Remove(ctx, snack.Targets("hello-world"), snack.WithSudo())
_, err := mgr.Install(ctx, snack.Targets("hello-world"), snack.WithSudo())
require.NoError(t, err)
})
t.Run("IsInstalled_True", func(t *testing.T) {
installed, err := mgr.IsInstalled(ctx, "hello-world")
require.NoError(t, err)
assert.True(t, installed)
})
t.Run("IsInstalled_False", func(t *testing.T) {
installed, err := mgr.IsInstalled(ctx, "xyznonexistentpackage999")
require.NoError(t, err)
assert.False(t, installed)
})
t.Run("Version_Installed", func(t *testing.T) {
ver, err := mgr.Version(ctx, "hello-world")
require.NoError(t, err)
assert.NotEmpty(t, ver)
t.Logf("hello-world version: %s", ver)
})
t.Run("Version_NotInstalled", func(t *testing.T) {
_, err := mgr.Version(ctx, "xyznonexistentpackage999")
assert.Error(t, err)
})
t.Run("List_ContainsInstalled", func(t *testing.T) {
pkgs, err := mgr.List(ctx)
require.NoError(t, err)
found := false
for _, p := range pkgs {
if p.Name == "hello-world" {
found = true
assert.NotEmpty(t, p.Version)
break
}
}
assert.True(t, found, "hello-world should be in installed list")
})
// --- VersionQuerier ---
t.Run("VersionQuerier", func(t *testing.T) {
vq, ok := mgr.(snack.VersionQuerier)
require.True(t, ok)
t.Run("LatestVersion", func(t *testing.T) {
ver, err := vq.LatestVersion(ctx, "hello-world")
require.NoError(t, err)
assert.NotEmpty(t, ver)
t.Logf("hello-world latest: %s", ver)
})
t.Run("LatestVersion_NotFound", func(t *testing.T) {
_, err := vq.LatestVersion(ctx, "xyznonexistentpackage999")
assert.Error(t, err)
})
t.Run("ListUpgrades", func(t *testing.T) {
pkgs, err := vq.ListUpgrades(ctx)
require.NoError(t, err)
t.Logf("upgradable snaps: %d", len(pkgs))
})
t.Run("UpgradeAvailable", func(t *testing.T) {
avail, err := vq.UpgradeAvailable(ctx, "hello-world")
require.NoError(t, err)
_ = avail
})
t.Run("VersionCmp", func(t *testing.T) {
tests := []struct {
v1, v2 string
want int
}{
{"1.0", "2.0", -1},
{"2.0", "1.0", 1},
{"1.0", "1.0", 0},
{"1.0.1", "1.0.0", 1},
}
for _, tt := range tests {
cmp, err := vq.VersionCmp(ctx, tt.v1, tt.v2)
require.NoError(t, err, "VersionCmp(%s, %s)", tt.v1, tt.v2)
assert.Equal(t, tt.want, cmp, "VersionCmp(%s, %s)", tt.v1, tt.v2)
}
})
})
t.Run("Remove", func(t *testing.T) {
_, err := mgr.Remove(ctx, snack.Targets("hello-world"), snack.WithSudo())
require.NoError(t, err)
installed, err := mgr.IsInstalled(ctx, "hello-world")
require.NoError(t, err)
assert.False(t, installed)
})
t.Run("Purge", func(t *testing.T) {
_, _ = mgr.Install(ctx, snack.Targets("hello-world"), snack.WithSudo())
err := mgr.Purge(ctx, snack.Targets("hello-world"), snack.WithSudo())
require.NoError(t, err)
})
t.Run("Upgrade", func(t *testing.T) {
err := mgr.Upgrade(ctx, snack.WithSudo())
require.NoError(t, err)
})
}