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 (#294)
* feat: Add support for per-project sandbox overlays * chore: Maintain consistency with TUI experience * fix: Code review fixes
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user