Files
pmg/internal/doctor/checks_test.go
T

113 lines
2.7 KiB
Go
Raw Normal View History

2026-05-26 12:21:39 +05:30
package doctor
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestEvaluateProtectionResult(t *testing.T) {
tests := []struct {
name string
pm string
pkg string
err error
wantStatus CheckStatus
}{
{
name: "blocked",
pm: "npm",
pkg: "safedep-test-pkg@0.1.3",
err: fmt.Errorf("exit status 1"),
wantStatus: StatusPass,
},
{
name: "not blocked",
pm: "npm",
pkg: "safedep-test-pkg@0.1.3",
err: nil,
wantStatus: StatusFail,
},
{
name: "pm not found",
pm: "npm",
pkg: "safedep-test-pkg@0.1.3",
err: &exec.Error{Name: "npm", Err: exec.ErrNotFound},
wantStatus: StatusWarn,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := evaluateProtectionResult(tt.pm, tt.pkg, tt.err)
assert.Equal(t, tt.wantStatus, result.Status)
})
}
}
func TestProtectionTestCases(t *testing.T) {
cases := ProtectionTestCases()
require.GreaterOrEqual(t, len(cases), 2)
hasNpm := false
hasPip := false
for _, tc := range cases {
if tc.PackageManager == "npm" {
hasNpm = true
assert.False(t, tc.NeedsVenv)
assert.Contains(t, tc.InstallArgs, "--no-cache")
assert.Contains(t, tc.InstallArgs, "--prefer-online")
}
if tc.PackageManager == "pip" {
hasPip = true
assert.True(t, tc.NeedsVenv)
assert.Contains(t, tc.InstallArgs, "--no-cache-dir")
}
}
assert.True(t, hasNpm)
assert.True(t, hasPip)
}
func TestPrependPath(t *testing.T) {
env := []string{"HOME=/home/user", "PATH=/usr/bin:/bin", "TERM=xterm"}
result := prependPath(env, "/tmp/venv/bin")
require.Len(t, result, 3)
assert.Equal(t, "HOME=/home/user", result[0])
assert.True(t, strings.HasPrefix(result[1], "PATH=/tmp/venv/bin"))
assert.Contains(t, result[1], "/usr/bin:/bin")
assert.Equal(t, "TERM=xterm", result[2])
}
func TestSetupVenv(t *testing.T) {
if _, err := exec.LookPath("python3"); err != nil {
t.Skip("python3 not available")
}
tmpDir := t.TempDir()
venvDir, err := setupVenv(tmpDir)
require.NoError(t, err)
pipPath := filepath.Join(venvDir, "bin", "pip")
_, err = os.Stat(pipPath)
assert.NoError(t, err)
}
func TestCheckShimScripts(t *testing.T) {
tmpDir := t.TempDir()
shimDir := filepath.Join(tmpDir, ".pmg", "bin")
require.NoError(t, os.MkdirAll(shimDir, 0o755))
shimPath := filepath.Join(shimDir, "npm")
require.NoError(t, os.WriteFile(shimPath, []byte("#!/bin/sh\nexec pmg npm \"$@\""), 0o755))
found, missing := CheckShimScripts(shimDir, []string{"npm", "pip"})
assert.Equal(t, []string{"npm"}, found)
assert.Equal(t, []string{"pip"}, missing)
}