package docker import ( "context" "net/http" "net/http/httptest" "strings" "testing" ) func TestListParsesContainers(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/containers/json" { http.NotFound(w, r) return } w.Write([]byte(`[ {"Id":"abcdef1234567890","Names":["/minecraft"],"Image":"itzg/minecraft-server","State":"running", "Ports":[{"PrivatePort":25565,"PublicPort":25565,"Type":"tcp"},{"PrivatePort":25565,"PublicPort":25565,"Type":"tcp"},{"PrivatePort":8123,"Type":"tcp"}], "NetworkSettings":{"Networks":{"bridge":{"IPAddress":"172.17.0.2"},"none":{"IPAddress":""}}}}, {"Id":"1111","Names":["/db"],"Image":"postgres","State":"running","Ports":[],"NetworkSettings":{"Networks":{}}} ]`)) })) defer srv.Close() t.Setenv("DOCKER_HOST", "tcp://"+strings.TrimPrefix(srv.URL, "http://")) got, err := List(context.Background()) if err != nil { t.Fatal(err) } if len(got) != 2 || got[0].Name != "db" || got[1].Name != "minecraft" { t.Fatalf("unexpected list: %+v", got) } mc := got[1] if mc.ID != "abcdef123456" || len(mc.Ports) != 2 || mc.Ports[0].Public != 25565 || mc.Ports[1].Public != 0 { t.Errorf("ports/id wrong: %+v", mc) } if mc.Networks["bridge"] != "172.17.0.2" || len(mc.Networks) != 1 { t.Errorf("networks wrong: %+v", mc.Networks) } } func TestListUnreachable(t *testing.T) { t.Setenv("DOCKER_HOST", "tcp://127.0.0.1:1") if _, err := List(context.Background()); err == nil { t.Fatal("expected an error when docker is not running") } }