package client import ( "net/http" "strings" "testing" cerrdefs "github.com/containerd/errdefs" "github.com/moby/moby/api/types/network" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) func TestNetworkInspect(t *testing.T) { const expectedURL = "/networks/network_id" client, err := New(WithMockClient(func(req *http.Request) (*http.Response, error) { if req.URL.Path == defaultAPIPath+"/networks/" { return errorMock(http.StatusInternalServerError, "client should not make a request for empty IDs")(req) } if strings.HasPrefix(req.URL.Path, defaultAPIPath+"/networks/unknown") { return errorMock(http.StatusNotFound, "Error: No such network: unknown")(req) } if strings.HasPrefix(req.URL.Path, defaultAPIPath+"/networks/test-500-response") { return errorMock(http.StatusInternalServerError, "Server error")(req) } // other test-cases all use "network_id" if err := assertRequest(req, http.MethodGet, expectedURL); err != nil { return nil, err } if strings.Contains(req.URL.RawQuery, "scope=global") { return errorMock(http.StatusNotFound, "Error: No such network: network_id")(req) } var resp network.Inspect if strings.Contains(req.URL.RawQuery, "verbose=true") { resp = network.Inspect{ Network: network.Network{Name: "mynetwork"}, Services: map[string]network.ServiceInfo{ "web": {}, }, } } else { resp = network.Inspect{ Network: network.Network{Name: "mynetwork"}, } } return mockJSONResponse(http.StatusOK, nil, resp)(req) })) assert.NilError(t, err) t.Run("empty ID", func(t *testing.T) { // verify that the client does not create a request if the network-ID/name is empty. _, err := client.NetworkInspect(t.Context(), "", NetworkInspectOptions{}) assert.Check(t, is.ErrorType(err, cerrdefs.IsInvalidArgument)) assert.Check(t, is.ErrorContains(err, "value is empty")) _, err = client.NetworkInspect(t.Context(), " ", NetworkInspectOptions{}) assert.Check(t, is.ErrorType(err, cerrdefs.IsInvalidArgument)) assert.Check(t, is.ErrorContains(err, "value is empty")) }) t.Run("no options", func(t *testing.T) { r, err := client.NetworkInspect(t.Context(), "network_id", NetworkInspectOptions{}) assert.NilError(t, err) assert.Check(t, is.Equal(r.Network.Name, "mynetwork")) }) t.Run("verbose", func(t *testing.T) { r, err := client.NetworkInspect(t.Context(), "network_id", NetworkInspectOptions{Verbose: true}) assert.NilError(t, err) assert.Check(t, is.Equal(r.Network.Name, "mynetwork")) _, ok := r.Network.Services["web"] assert.Check(t, ok, "expected service `web` missing in the verbose output") }) t.Run("global scope", func(t *testing.T) { _, err := client.NetworkInspect(t.Context(), "network_id", NetworkInspectOptions{Scope: "global"}) assert.Check(t, is.ErrorContains(err, "Error: No such network: network_id")) assert.Check(t, is.ErrorType(err, cerrdefs.IsNotFound)) }) t.Run("unknown network", func(t *testing.T) { _, err := client.NetworkInspect(t.Context(), "unknown", NetworkInspectOptions{}) assert.Check(t, is.ErrorContains(err, "Error: No such network: unknown")) assert.Check(t, is.ErrorType(err, cerrdefs.IsNotFound)) }) t.Run("server error", func(t *testing.T) { // Just testing that an internal server error is converted correctly by the client _, err := client.NetworkInspect(t.Context(), "test-500-response", NetworkInspectOptions{}) assert.Check(t, is.ErrorType(err, cerrdefs.IsInternal)) }) }