Adds an optional `imagen generate` post-step that opens a sibling tmux window running tmux-img --hold <path>. - internal/preview: Mode (auto|on|off), Resolve, and a Spawner that shells out to tmux new-window. Typed errors for missing tmux, missing tmux-img, and "preview forced on outside $TMUX". - cmd/imagen/generate: --preview / --no-preview flags plus $IMAGEN_PREVIEW. Resolution chain: config -> env -> flag. auto requires both stdout-is-tty and $TMUX. Failures are warnings - the image is already on disk. - internal/config: output.preview field, validated to auto|on|off, threaded into the sample. - Tests for ParseMode, Resolve, Spawn argv (incl. shell quoting of paths with apostrophes), missing-binary errors, and the CLI resolution table. - Docs (usage + architecture) updated. /imagine SKILL.md edit lives in dotfiles - deferred to coordinate with #4.
51 lines
1.8 KiB
Go
51 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"mgit.msbls.de/m/ImaGen/internal/config"
|
|
"mgit.msbls.de/m/ImaGen/internal/preview"
|
|
)
|
|
|
|
func TestResolvePreviewMode(t *testing.T) {
|
|
type tc struct {
|
|
name string
|
|
cfg *config.Config
|
|
flagOn bool
|
|
flagOff bool
|
|
env string
|
|
want preview.Mode
|
|
wantError bool
|
|
}
|
|
cases := []tc{
|
|
{name: "all-empty-defaults-to-auto", want: preview.ModeAuto},
|
|
{name: "config-on", cfg: &config.Config{Output: config.OutputConfig{Preview: "on"}}, want: preview.ModeOn},
|
|
{name: "config-off", cfg: &config.Config{Output: config.OutputConfig{Preview: "off"}}, want: preview.ModeOff},
|
|
{name: "config-auto-explicit", cfg: &config.Config{Output: config.OutputConfig{Preview: "auto"}}, want: preview.ModeAuto},
|
|
{name: "env-overrides-config", cfg: &config.Config{Output: config.OutputConfig{Preview: "on"}}, env: "off", want: preview.ModeOff},
|
|
{name: "flag-on-overrides-env-off", env: "off", flagOn: true, want: preview.ModeOn},
|
|
{name: "flag-off-overrides-env-on", env: "on", flagOff: true, want: preview.ModeOff},
|
|
{name: "flag-off-overrides-config-on", cfg: &config.Config{Output: config.OutputConfig{Preview: "on"}}, flagOff: true, want: preview.ModeOff},
|
|
{name: "both-flags-error", flagOn: true, flagOff: true, wantError: true},
|
|
{name: "bad-env-errors", env: "yes", wantError: true},
|
|
{name: "bad-config-errors", cfg: &config.Config{Output: config.OutputConfig{Preview: "yes"}}, wantError: true},
|
|
}
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
got, err := resolvePreviewMode(c.cfg, c.flagOn, c.flagOff, c.env)
|
|
if c.wantError {
|
|
if err == nil {
|
|
t.Fatalf("expected error, got mode %q", got)
|
|
}
|
|
return
|
|
}
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if got != c.want {
|
|
t.Errorf("mode = %q, want %q", got, c.want)
|
|
}
|
|
})
|
|
}
|
|
}
|