Files
docker-cli/cli/command/image/tree_test.go
Paweł Gronowski be9e6308f5 image/tree: Respect NO_COLOR env variable
Do not use the fancy colored output if NO_COLOR variable is set to 1
following the https://no-color.org/ convention.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
2025-11-13 14:56:27 +01:00

157 lines
3.0 KiB
Go

package image
import (
"strings"
"testing"
"github.com/docker/cli/internal/test"
"gotest.tools/v3/assert"
)
func TestPrintImageTreeAnsiTty(t *testing.T) {
testCases := []struct {
name string
stdinTty bool
stdoutTty bool
stderrTty bool
expectedAnsi bool
noColorEnv bool
}{
{
name: "non-terminal",
stdinTty: false,
stdoutTty: false,
stderrTty: false,
expectedAnsi: false,
},
{
name: "terminal",
stdinTty: true,
stdoutTty: true,
stderrTty: true,
expectedAnsi: true,
},
{
name: "stdout-tty-only",
stdinTty: false,
stdoutTty: true,
stderrTty: false,
expectedAnsi: true,
},
{
name: "stdin-stderr-tty-only",
stdinTty: true,
stdoutTty: false,
stderrTty: true,
expectedAnsi: false,
},
{
name: "stdout-stdin-tty",
stdinTty: true,
stdoutTty: true,
stderrTty: false,
expectedAnsi: true,
},
{
name: "stdout-stderr-tty",
stdinTty: false,
stdoutTty: true,
stderrTty: true,
expectedAnsi: true,
},
{
name: "stdin-tty-only",
stdinTty: true,
stdoutTty: false,
stderrTty: false,
expectedAnsi: false,
},
{
name: "stderr-tty-only",
stdinTty: false,
stdoutTty: false,
stderrTty: true,
expectedAnsi: false,
},
{
name: "no-color-env",
stdinTty: false,
stdoutTty: false,
stderrTty: false,
noColorEnv: true,
expectedAnsi: false,
},
{
name: "no-color-env-terminal",
stdinTty: true,
stdoutTty: true,
stderrTty: true,
noColorEnv: true,
expectedAnsi: false,
},
}
mockView := treeView{
images: []topImage{
{
Names: []string{"test-image:latest"},
Details: imageDetails{
ID: "sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
DiskUsage: "10.5 MB",
InUse: true,
ContentSize: "5.2 MB",
},
Children: []subImage{
{
Platform: "linux/amd64",
Available: true,
Details: imageDetails{
ID: "sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
DiskUsage: "5.1 MB",
InUse: false,
ContentSize: "2.5 MB",
},
},
},
},
},
imageSpacing: false,
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
cli := test.NewFakeCli(nil)
cli.In().SetIsTerminal(tc.stdinTty)
cli.Out().SetIsTerminal(tc.stdoutTty)
cli.Err().SetIsTerminal(tc.stderrTty)
if tc.noColorEnv {
t.Setenv("NO_COLOR", "1")
} else {
t.Setenv("NO_COLOR", "")
}
printImageTree(cli, mockView)
out := cli.OutBuffer().String()
assert.Check(t, len(out) > 0, "Output should not be empty")
hasAnsi := strings.Contains(out, "\x1b[")
if tc.expectedAnsi {
assert.Check(t, hasAnsi, "Output should contain ANSI escape codes, output: %s", out)
} else {
assert.Check(t, !hasAnsi, "Output should not contain ANSI escape codes, output: %s", out)
}
})
}
}