github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/cli/command/formatter/network_test.go (about)

     1  package formatter
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"strings"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/docker/docker/api/types"
    11  	"github.com/docker/docker/pkg/stringid"
    12  	"github.com/docker/docker/pkg/testutil/assert"
    13  )
    14  
    15  func TestNetworkContext(t *testing.T) {
    16  	networkID := stringid.GenerateRandomID()
    17  
    18  	var ctx networkContext
    19  	cases := []struct {
    20  		networkCtx networkContext
    21  		expValue   string
    22  		expHeader  string
    23  		call       func() string
    24  	}{
    25  		{networkContext{
    26  			n:     types.NetworkResource{ID: networkID},
    27  			trunc: false,
    28  		}, networkID, networkIDHeader, ctx.ID},
    29  		{networkContext{
    30  			n:     types.NetworkResource{ID: networkID},
    31  			trunc: true,
    32  		}, stringid.TruncateID(networkID), networkIDHeader, ctx.ID},
    33  		{networkContext{
    34  			n: types.NetworkResource{Name: "network_name"},
    35  		}, "network_name", nameHeader, ctx.Name},
    36  		{networkContext{
    37  			n: types.NetworkResource{Driver: "driver_name"},
    38  		}, "driver_name", driverHeader, ctx.Driver},
    39  		{networkContext{
    40  			n: types.NetworkResource{EnableIPv6: true},
    41  		}, "true", ipv6Header, ctx.IPv6},
    42  		{networkContext{
    43  			n: types.NetworkResource{EnableIPv6: false},
    44  		}, "false", ipv6Header, ctx.IPv6},
    45  		{networkContext{
    46  			n: types.NetworkResource{Internal: true},
    47  		}, "true", internalHeader, ctx.Internal},
    48  		{networkContext{
    49  			n: types.NetworkResource{Internal: false},
    50  		}, "false", internalHeader, ctx.Internal},
    51  		{networkContext{
    52  			n: types.NetworkResource{},
    53  		}, "", labelsHeader, ctx.Labels},
    54  		{networkContext{
    55  			n: types.NetworkResource{Labels: map[string]string{"label1": "value1", "label2": "value2"}},
    56  		}, "label1=value1,label2=value2", labelsHeader, ctx.Labels},
    57  	}
    58  
    59  	for _, c := range cases {
    60  		ctx = c.networkCtx
    61  		v := c.call()
    62  		if strings.Contains(v, ",") {
    63  			compareMultipleValues(t, v, c.expValue)
    64  		} else if v != c.expValue {
    65  			t.Fatalf("Expected %s, was %s\n", c.expValue, v)
    66  		}
    67  
    68  		h := ctx.FullHeader()
    69  		if h != c.expHeader {
    70  			t.Fatalf("Expected %s, was %s\n", c.expHeader, h)
    71  		}
    72  	}
    73  }
    74  
    75  func TestNetworkContextWrite(t *testing.T) {
    76  	cases := []struct {
    77  		context  Context
    78  		expected string
    79  	}{
    80  
    81  		// Errors
    82  		{
    83  			Context{Format: "{{InvalidFunction}}"},
    84  			`Template parsing error: template: :1: function "InvalidFunction" not defined
    85  `,
    86  		},
    87  		{
    88  			Context{Format: "{{nil}}"},
    89  			`Template parsing error: template: :1:2: executing "" at <nil>: nil is not a command
    90  `,
    91  		},
    92  		// Table format
    93  		{
    94  			Context{Format: NewNetworkFormat("table", false)},
    95  			`NETWORK ID          NAME                DRIVER              SCOPE
    96  networkID1          foobar_baz          foo                 local
    97  networkID2          foobar_bar          bar                 local
    98  `,
    99  		},
   100  		{
   101  			Context{Format: NewNetworkFormat("table", true)},
   102  			`networkID1
   103  networkID2
   104  `,
   105  		},
   106  		{
   107  			Context{Format: NewNetworkFormat("table {{.Name}}", false)},
   108  			`NAME
   109  foobar_baz
   110  foobar_bar
   111  `,
   112  		},
   113  		{
   114  			Context{Format: NewNetworkFormat("table {{.Name}}", true)},
   115  			`NAME
   116  foobar_baz
   117  foobar_bar
   118  `,
   119  		},
   120  		// Raw Format
   121  		{
   122  			Context{Format: NewNetworkFormat("raw", false)},
   123  			`network_id: networkID1
   124  name: foobar_baz
   125  driver: foo
   126  scope: local
   127  
   128  network_id: networkID2
   129  name: foobar_bar
   130  driver: bar
   131  scope: local
   132  
   133  `,
   134  		},
   135  		{
   136  			Context{Format: NewNetworkFormat("raw", true)},
   137  			`network_id: networkID1
   138  network_id: networkID2
   139  `,
   140  		},
   141  		// Custom Format
   142  		{
   143  			Context{Format: NewNetworkFormat("{{.Name}}", false)},
   144  			`foobar_baz
   145  foobar_bar
   146  `,
   147  		},
   148  		// Custom Format with CreatedAt
   149  		{
   150  			Context{Format: NewNetworkFormat("{{.Name}} {{.CreatedAt}}", false)},
   151  			`foobar_baz 2016-01-01 00:00:00 +0000 UTC
   152  foobar_bar 2017-01-01 00:00:00 +0000 UTC
   153  `,
   154  		},
   155  	}
   156  
   157  	timestamp1, _ := time.Parse("2006-01-02", "2016-01-01")
   158  	timestamp2, _ := time.Parse("2006-01-02", "2017-01-01")
   159  
   160  	for _, testcase := range cases {
   161  		networks := []types.NetworkResource{
   162  			{ID: "networkID1", Name: "foobar_baz", Driver: "foo", Scope: "local", Created: timestamp1},
   163  			{ID: "networkID2", Name: "foobar_bar", Driver: "bar", Scope: "local", Created: timestamp2},
   164  		}
   165  		out := bytes.NewBufferString("")
   166  		testcase.context.Output = out
   167  		err := NetworkWrite(testcase.context, networks)
   168  		if err != nil {
   169  			assert.Error(t, err, testcase.expected)
   170  		} else {
   171  			assert.Equal(t, out.String(), testcase.expected)
   172  		}
   173  	}
   174  }
   175  
   176  func TestNetworkContextWriteJSON(t *testing.T) {
   177  	networks := []types.NetworkResource{
   178  		{ID: "networkID1", Name: "foobar_baz"},
   179  		{ID: "networkID2", Name: "foobar_bar"},
   180  	}
   181  	expectedJSONs := []map[string]interface{}{
   182  		{"Driver": "", "ID": "networkID1", "IPv6": "false", "Internal": "false", "Labels": "", "Name": "foobar_baz", "Scope": "", "CreatedAt": "0001-01-01 00:00:00 +0000 UTC"},
   183  		{"Driver": "", "ID": "networkID2", "IPv6": "false", "Internal": "false", "Labels": "", "Name": "foobar_bar", "Scope": "", "CreatedAt": "0001-01-01 00:00:00 +0000 UTC"},
   184  	}
   185  
   186  	out := bytes.NewBufferString("")
   187  	err := NetworkWrite(Context{Format: "{{json .}}", Output: out}, networks)
   188  	if err != nil {
   189  		t.Fatal(err)
   190  	}
   191  	for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
   192  		t.Logf("Output: line %d: %s", i, line)
   193  		var m map[string]interface{}
   194  		if err := json.Unmarshal([]byte(line), &m); err != nil {
   195  			t.Fatal(err)
   196  		}
   197  		assert.DeepEqual(t, m, expectedJSONs[i])
   198  	}
   199  }
   200  
   201  func TestNetworkContextWriteJSONField(t *testing.T) {
   202  	networks := []types.NetworkResource{
   203  		{ID: "networkID1", Name: "foobar_baz"},
   204  		{ID: "networkID2", Name: "foobar_bar"},
   205  	}
   206  	out := bytes.NewBufferString("")
   207  	err := NetworkWrite(Context{Format: "{{json .ID}}", Output: out}, networks)
   208  	if err != nil {
   209  		t.Fatal(err)
   210  	}
   211  	for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") {
   212  		t.Logf("Output: line %d: %s", i, line)
   213  		var s string
   214  		if err := json.Unmarshal([]byte(line), &s); err != nil {
   215  			t.Fatal(err)
   216  		}
   217  		assert.Equal(t, s, networks[i].ID)
   218  	}
   219  }