package packagequery import ( "context" "errors" "fmt" "io" "os" "path/filepath" "runtime" "strings" "testing" "time" "gitgud.io/mike/mpv-manager/internal/process" "gitgud.io/mike/mpv-manager/pkg/constants" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // The copied test executable acts as a native package-manager fixture. Its // normal package arguments do not pass through the Go test flag parser. func init() { mode := os.Getenv("MPV_MANAGER_PACKAGE_PROBE_TEST_HELPER") if mode == "" { return } if os.Getenv("LC_ALL") != "C" { fmt.Fprintln(os.Stderr, "fixture expected LC_ALL=C") os.Exit(2) } switch mode { case "installed": fmt.Println("Version: 0.41.0") os.Exit(0) case "missing": fmt.Fprintln(os.Stderr, "error: application is not installed") os.Exit(1) case "hang": fmt.Fprintln(os.Stderr, "not installed") time.Sleep(time.Minute) case "oversize": fmt.Fprintln(os.Stderr, "not installed"+strings.Repeat("x", 2<<20)) os.Exit(1) } os.Exit(2) } func installProbeFixture(t *testing.T) { t.Helper() path, err := os.Executable() require.NoError(t, err) source, err := os.Open(path) require.NoError(t, err) defer source.Close() dir := t.TempDir() name := "flatpak" if runtime.GOOS == "windows" { name += ".exe" } dest, err := os.OpenFile(filepath.Join(dir, name), os.O_CREATE|os.O_WRONLY, 0755) require.NoError(t, err) _, err = io.Copy(dest, source) require.NoError(t, err) require.NoError(t, dest.Close()) t.Setenv("PATH", dir+string(os.PathListSeparator)+os.Getenv("PATH")) t.Setenv("LC_ALL", "fr_FR.UTF-8") } func TestNativePackageProbeOutcomes(t *testing.T) { installProbeFixture(t) t.Run("locale and parsed installed version", func(t *testing.T) { t.Setenv("MPV_MANAGER_PACKAGE_PROBE_TEST_HELPER", "installed") value, err := Installed(context.Background(), constants.MethodMPVFlatpak) require.NoError(t, err) assert.Equal(t, "0.41.0", value) }) t.Run("definitive stderr absence", func(t *testing.T) { t.Setenv("MPV_MANAGER_PACKAGE_PROBE_TEST_HELPER", "missing") _, err := Installed(context.Background(), constants.MethodMPVFlatpak) require.ErrorIs(t, err, ErrNotInstalled) }) t.Run("partial timeout output stays unknown", func(t *testing.T) { t.Setenv("MPV_MANAGER_PACKAGE_PROBE_TEST_HELPER", "hang") ctx, cancel := context.WithTimeout(context.Background(), 150*time.Millisecond) defer cancel() start := time.Now() _, err := Installed(ctx, constants.MethodMPVFlatpak) require.ErrorIs(t, err, context.DeadlineExceeded) assert.False(t, errors.Is(err, ErrNotInstalled)) assert.Less(t, time.Since(start), 3*time.Second) }) t.Run("oversized diagnostic stays unknown", func(t *testing.T) { t.Setenv("MPV_MANAGER_PACKAGE_PROBE_TEST_HELPER", "oversize") _, err := Installed(context.Background(), constants.MethodMPVFlatpak) require.ErrorIs(t, err, process.ErrOutputLimit) assert.False(t, errors.Is(err, ErrNotInstalled)) }) }