DockerCLI/cli/command/system/events_test.go

84 lines
1.9 KiB
Go
Raw Normal View History

cli/command/system: fix "docker events" not supporting --format=json Before this patch: docker events --format=json json json json ^C With this patch: docker events --format=json {"status":"create","id":"4ac3bba8abd68961e627540fed81ad16d55b88e45629d7cdb792126d09b6488d","from":"hello-world","Type":"container","Action":"create","Actor":{"ID":"4ac3bba8abd68961e627540fed81ad16d55b88e45629d7cdb792126d09b6488d","Attributes":{"image":"hello-world","name":"dreamy_goldstine"}},"scope":"local","time":1693168508,"timeNano":1693168508190136885} {"status":"attach","id":"4ac3bba8abd68961e627540fed81ad16d55b88e45629d7cdb792126d09b6488d","from":"hello-world","Type":"container","Action":"attach","Actor":{"ID":"4ac3bba8abd68961e627540fed81ad16d55b88e45629d7cdb792126d09b6488d","Attributes":{"image":"hello-world","name":"dreamy_goldstine"}},"scope":"local","time":1693168508,"timeNano":1693168508192851593} {"Type":"network","Action":"connect","Actor":{"ID":"c54920dd5074a73e28bea62007e0334d81cc040a90372be311cf16806403d350","Attributes":{"container":"4ac3bba8abd68961e627540fed81ad16d55b88e45629d7cdb792126d09b6488d","name":"bridge","type":"bridge"}},"scope":"local","time":1693168508,"timeNano":1693168508212398802} {"status":"start","id":"4ac3bba8abd68961e627540fed81ad16d55b88e45629d7cdb792126d09b6488d","from":"hello-world","Type":"container","Action":"start","Actor":{"ID":"4ac3bba8abd68961e627540fed81ad16d55b88e45629d7cdb792126d09b6488d","Attributes":{"image":"hello-world","name":"dreamy_goldstine"}},"scope":"local","time":1693168508,"timeNano":1693168508312969843} ^C Signed-off-by: Sebastiaan van Stijn <github@gone.nl> (cherry picked from commit 6dfdd1eae9e7bd1a44167fb541224e22d623570c) Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2023-08-27 19:28:11 -04:00
package system
import (
"context"
"fmt"
"io"
"strings"
"testing"
"time"
"github.com/docker/cli/internal/test"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/events"
"gotest.tools/v3/assert"
"gotest.tools/v3/golden"
)
func TestEventsFormat(t *testing.T) {
var evts []events.Message
for i, action := range []string{"create", "start", "attach", "die"} {
evts = append(evts, events.Message{
Status: action,
ID: "abc123",
From: "ubuntu:latest",
Type: events.ContainerEventType,
Action: action,
Actor: events.Actor{
ID: "abc123",
Attributes: map[string]string{"image": "ubuntu:latest"},
},
Scope: "local",
Time: int64(time.Second) * int64(i+1),
TimeNano: int64(time.Second) * int64(i+1),
})
}
tests := []struct {
name, format string
}{
{
name: "default",
},
{
name: "json",
format: "json",
},
{
name: "json template",
format: "{{ json . }}",
},
{
name: "json action",
format: "{{ json .Action }}",
},
}
for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
// Set to UTC timezone as timestamps in output are
// printed in the current timezone
t.Setenv("TZ", "UTC")
cli := test.NewFakeCli(&fakeClient{eventsFn: func(context.Context, types.EventsOptions) (<-chan events.Message, <-chan error) {
messages := make(chan events.Message)
errs := make(chan error, 1)
go func() {
for _, msg := range evts {
messages <- msg
}
errs <- io.EOF
}()
return messages, errs
}})
cmd := NewEventsCommand(cli)
if tc.format != "" {
cmd.Flags().Set("format", tc.format)
}
assert.Check(t, cmd.Execute())
out := cli.OutBuffer().String()
assert.Check(t, golden.String(out, fmt.Sprintf("docker-events-%s.golden", strings.ReplaceAll(tc.name, " ", "-"))))
cli.OutBuffer().Reset()
})
}
}