mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
* feat: Add support for per-project sandbox overlays * chore: Maintain consistency with TUI experience * fix: Code review fixes
84 lines
2.3 KiB
Go
84 lines
2.3 KiB
Go
package sandbox
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/safedep/pmg/config"
|
|
pmgsandbox "github.com/safedep/pmg/sandbox"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func execProjectList(t *testing.T, overlayDir string, args ...string) (string, string, error) {
|
|
t.Helper()
|
|
cmd := newProjectListCommand(projectDeps{
|
|
overlayDir: func() string { return overlayDir },
|
|
})
|
|
var stdout, stderr bytes.Buffer
|
|
cmd.SetOut(&stdout)
|
|
cmd.SetErr(&stderr)
|
|
cmd.SetArgs(args)
|
|
err := cmd.Execute()
|
|
return stdout.String(), stderr.String(), err
|
|
}
|
|
|
|
func TestProjectList_Empty(t *testing.T) {
|
|
dir := t.TempDir()
|
|
stdout, _, err := execProjectList(t, dir)
|
|
require.NoError(t, err)
|
|
assert.Contains(t, stdout, "No project overlays")
|
|
}
|
|
|
|
func TestProjectList_Human(t *testing.T) {
|
|
dir := t.TempDir()
|
|
for _, repo := range []string{"/repo/a", "/repo/b"} {
|
|
_, err := pmgsandbox.SaveOverlay(dir, repo, &pmgsandbox.Overlay{
|
|
Allow: []pmgsandbox.OverlayAllow{{Type: config.SandboxAllowExec, Value: "/bin/x"}},
|
|
})
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
stdout, _, err := execProjectList(t, dir)
|
|
require.NoError(t, err)
|
|
assert.Contains(t, stdout, "/repo/a")
|
|
assert.Contains(t, stdout, "/repo/b")
|
|
}
|
|
|
|
func TestProjectList_JSON(t *testing.T) {
|
|
dir := t.TempDir()
|
|
for _, repo := range []string{"/repo/a", "/repo/b"} {
|
|
_, err := pmgsandbox.SaveOverlay(dir, repo, &pmgsandbox.Overlay{
|
|
Allow: []pmgsandbox.OverlayAllow{{Type: config.SandboxAllowExec, Value: "/bin/x"}},
|
|
})
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
stdout, _, err := execProjectList(t, dir, "--json")
|
|
require.NoError(t, err)
|
|
var payload struct {
|
|
Entries []struct {
|
|
RepoRoot string `json:"repo_root"`
|
|
Entries int `json:"entries"`
|
|
Path string `json:"path"`
|
|
} `json:"entries"`
|
|
}
|
|
require.NoError(t, json.Unmarshal([]byte(stdout), &payload))
|
|
require.Len(t, payload.Entries, 2)
|
|
assert.Equal(t, "/repo/a", payload.Entries[0].RepoRoot)
|
|
assert.Equal(t, 1, payload.Entries[0].Entries)
|
|
}
|
|
|
|
func TestProjectList_JSONEmpty(t *testing.T) {
|
|
dir := t.TempDir()
|
|
stdout, _, err := execProjectList(t, dir, "--json")
|
|
require.NoError(t, err)
|
|
var payload struct {
|
|
Entries []any `json:"entries"`
|
|
}
|
|
require.NoError(t, json.Unmarshal([]byte(stdout), &payload))
|
|
assert.NotNil(t, payload.Entries)
|
|
assert.Empty(t, payload.Entries)
|
|
}
|