github.com/rigado/snapd@v2.42.5-go-mod+incompatible/cmd/snap/cmd_list_test.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2016 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package main_test
    21  
    22  import (
    23  	"fmt"
    24  	"net/http"
    25  
    26  	"gopkg.in/check.v1"
    27  
    28  	snap "github.com/snapcore/snapd/cmd/snap"
    29  )
    30  
    31  func (s *SnapSuite) TestListHelp(c *check.C) {
    32  	msg := `Usage:
    33    snap.test list [list-OPTIONS] [<snap>...]
    34  
    35  The list command displays a summary of snaps installed in the current system.
    36  
    37  A green check mark (given color and unicode support) after a publisher name
    38  indicates that the publisher has been verified.
    39  
    40  [list command options]
    41        --all                           Show all revisions
    42        --color=[auto|never|always]     Use a little bit of color to highlight
    43                                        some things. (default: auto)
    44        --unicode=[auto|never|always]   Use a little bit of Unicode to improve
    45                                        legibility. (default: auto)
    46  `
    47  	s.testSubCommandHelp(c, "list", msg)
    48  }
    49  
    50  func (s *SnapSuite) TestList(c *check.C) {
    51  	n := 0
    52  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
    53  		switch n {
    54  		case 0:
    55  			c.Check(r.Method, check.Equals, "GET")
    56  			c.Check(r.URL.Path, check.Equals, "/v2/snaps")
    57  			c.Check(r.URL.RawQuery, check.Equals, "")
    58  			fmt.Fprintln(w, `{"type": "sync", "result": [
    59  {
    60    "name": "foo",
    61    "status": "active",
    62    "version": "4.2",
    63    "developer": "bar",
    64    "publisher": {"id": "bar-id", "username": "bar", "display-name": "Bar", "validation": "unproven"},
    65    "health": {"status": "blocked"},
    66    "revision": 17,
    67    "tracking-channel": "potatoes"
    68  }]}`)
    69  		default:
    70  			c.Fatalf("expected to get 1 requests, now on %d", n+1)
    71  		}
    72  
    73  		n++
    74  	})
    75  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"list"})
    76  	c.Assert(err, check.IsNil)
    77  	c.Assert(rest, check.DeepEquals, []string{})
    78  	c.Check(s.Stdout(), check.Equals, `
    79  Name  Version  Rev  Tracking  Publisher  Notes
    80  foo   4.2      17   potatoes  bar        blocked
    81  `[1:])
    82  	c.Check(s.Stderr(), check.Equals, "")
    83  }
    84  
    85  func (s *SnapSuite) TestListAll(c *check.C) {
    86  	n := 0
    87  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
    88  		switch n {
    89  		case 0:
    90  			c.Check(r.Method, check.Equals, "GET")
    91  			c.Check(r.URL.Path, check.Equals, "/v2/snaps")
    92  			c.Check(r.URL.RawQuery, check.Equals, "select=all")
    93  			fmt.Fprintln(w, `{"type": "sync", "result": [{"name": "foo", "status": "active", "version": "4.2", "developer": "bar", "publisher": {"id": "bar-id", "username": "bar", "display-name": "Bar", "validation": "unproven"}, "revision":17, "tracking-channel": "stable"}]}`)
    94  		default:
    95  			c.Fatalf("expected to get 1 requests, now on %d", n+1)
    96  		}
    97  
    98  		n++
    99  	})
   100  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"list", "--all"})
   101  	c.Assert(err, check.IsNil)
   102  	c.Assert(rest, check.DeepEquals, []string{})
   103  	c.Check(s.Stdout(), check.Matches, `Name +Version +Rev +Tracking +Publisher +Notes
   104  foo +4.2 +17 +stable +bar +-
   105  `)
   106  	c.Check(s.Stderr(), check.Equals, "")
   107  }
   108  
   109  func (s *SnapSuite) TestListEmpty(c *check.C) {
   110  	n := 0
   111  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
   112  		switch n {
   113  		case 0:
   114  			c.Check(r.Method, check.Equals, "GET")
   115  			c.Check(r.URL.Path, check.Equals, "/v2/snaps")
   116  			fmt.Fprintln(w, `{"type": "sync", "result": []}`)
   117  		default:
   118  			c.Fatalf("expected to get 1 requests, now on %d", n+1)
   119  		}
   120  
   121  		n++
   122  	})
   123  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"list"})
   124  	c.Assert(err, check.IsNil)
   125  	c.Assert(rest, check.DeepEquals, []string{})
   126  	c.Check(s.Stdout(), check.Equals, "")
   127  	c.Check(s.Stderr(), check.Equals, "No snaps are installed yet. Try 'snap install hello-world'.\n")
   128  }
   129  
   130  func (s *SnapSuite) TestListEmptyWithQuery(c *check.C) {
   131  	n := 0
   132  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
   133  		switch n {
   134  		case 0:
   135  			c.Check(r.Method, check.Equals, "GET")
   136  			c.Check(r.URL.Path, check.Equals, "/v2/snaps")
   137  			fmt.Fprintln(w, `{"type": "sync", "result": []}`)
   138  		default:
   139  			c.Fatalf("expected to get 1 requests, now on %d", n+1)
   140  		}
   141  
   142  		n++
   143  	})
   144  	_, err := snap.Parser(snap.Client()).ParseArgs([]string{"list", "quux"})
   145  	c.Assert(err, check.ErrorMatches, `no matching snaps installed`)
   146  }
   147  
   148  func (s *SnapSuite) TestListWithNoMatchingQuery(c *check.C) {
   149  	n := 0
   150  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
   151  		switch n {
   152  		case 0:
   153  			c.Check(r.Method, check.Equals, "GET")
   154  			c.Check(r.URL.Path, check.Equals, "/v2/snaps")
   155  			c.Check(r.URL.Query().Get("snaps"), check.Equals, "quux")
   156  			fmt.Fprintln(w, `{"type": "sync", "result": []}`)
   157  		default:
   158  			c.Fatalf("expected to get 1 requests, now on %d", n+1)
   159  		}
   160  
   161  		n++
   162  	})
   163  	_, err := snap.Parser(snap.Client()).ParseArgs([]string{"list", "quux"})
   164  	c.Assert(err, check.ErrorMatches, "no matching snaps installed")
   165  }
   166  
   167  func (s *SnapSuite) TestListWithQuery(c *check.C) {
   168  	n := 0
   169  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
   170  		switch n {
   171  		case 0:
   172  			c.Check(r.Method, check.Equals, "GET")
   173  			c.Check(r.URL.Path, check.Equals, "/v2/snaps")
   174  			c.Check(r.URL.Query().Get("snaps"), check.Equals, "foo")
   175  			fmt.Fprintln(w, `{"type": "sync", "result": [{"name": "foo", "status": "active", "version": "4.2", "developer": "bar", "publisher": {"id": "bar-id", "username": "bar", "display-name": "Bar", "validation": "unproven"}, "revision":17, "tracking-channel": "1.10/stable/fix1234"}]}`)
   176  		default:
   177  			c.Fatalf("expected to get 1 requests, now on %d", n+1)
   178  		}
   179  
   180  		n++
   181  	})
   182  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"list", "foo"})
   183  	c.Assert(err, check.IsNil)
   184  	c.Assert(rest, check.DeepEquals, []string{})
   185  	c.Check(s.Stdout(), check.Matches, `Name +Version +Rev +Tracking +Publisher +Notes
   186  foo +4.2 +17 +1\.10/stable/… +bar +-
   187  `)
   188  	c.Check(s.Stderr(), check.Equals, "")
   189  	// ensure that the fake server api was actually hit
   190  	c.Check(n, check.Equals, 1)
   191  }
   192  
   193  func (s *SnapSuite) TestListWithNotes(c *check.C) {
   194  	n := 0
   195  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
   196  		switch n {
   197  		case 0:
   198  			c.Check(r.Method, check.Equals, "GET")
   199  			c.Check(r.URL.Path, check.Equals, "/v2/snaps")
   200  			fmt.Fprintln(w, `{"type": "sync", "result": [
   201  {"name": "foo", "status": "active", "version": "4.2", "developer": "bar", "publisher": {"id": "bar-id", "username": "bar", "display-name": "Bar", "validation": "unproven"}, "revision":17, "trymode": true}
   202  ,{"name": "dm1", "status": "active", "version": "5", "revision":1, "devmode": true, "confinement": "devmode"}
   203  ,{"name": "dm2", "status": "active", "version": "5", "revision":1, "devmode": true, "confinement": "strict"}
   204  ,{"name": "cf1", "status": "active", "version": "6", "revision":2, "confinement": "devmode", "jailmode": true}
   205  ]}`)
   206  		default:
   207  			c.Fatalf("expected to get 1 requests, now on %d", n+1)
   208  		}
   209  
   210  		n++
   211  	})
   212  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"list"})
   213  	c.Assert(err, check.IsNil)
   214  	c.Assert(rest, check.DeepEquals, []string{})
   215  	c.Check(s.Stdout(), check.Matches, `(?ms)^Name +Version +Rev +Tracking +Publisher +Notes$`)
   216  	c.Check(s.Stdout(), check.Matches, `(?ms).*^foo +4.2 +17 +- +bar +try$`)
   217  	c.Check(s.Stdout(), check.Matches, `(?ms).*^dm1 +.* +devmode$`)
   218  	c.Check(s.Stdout(), check.Matches, `(?ms).*^dm2 +.* +devmode$`)
   219  	c.Check(s.Stdout(), check.Matches, `(?ms).*^cf1 +.* +jailmode$`)
   220  	c.Check(s.Stderr(), check.Equals, "")
   221  }
   222  
   223  func (s *SnapSuite) TestFormatChannel(c *check.C) {
   224  	type tableT struct {
   225  		channel  string
   226  		expected string
   227  	}
   228  	for _, t := range []tableT{
   229  		{"", "-"},
   230  		{"stable", "stable"},
   231  		{"edge", "edge"},
   232  		{"foo/stable", "foo"},
   233  		{"foo/edge", "foo/edge"},
   234  		{"foo", "foo"},
   235  		{"foo/stable/bar", "foo/stable/…"},
   236  		{"foo/edge/bar", "foo/edge/…"},
   237  		{"stable/bar", "stable/…"},
   238  		{"edge/bar", "edge/…"},
   239  	} {
   240  		c.Check(snap.FormatChannel(t.channel), check.Equals, t.expected, check.Commentf(t.channel))
   241  	}
   242  
   243  	// and some SISO tests just to check it doesn't panic nor return empty string
   244  	// (the former would break scripts)
   245  	for _, ch := range []string{
   246  		"",
   247  		"\x00",
   248  		"/",
   249  		"//",
   250  		"///",
   251  		"////",
   252  		"a/",
   253  		"/b",
   254  		"a//b",
   255  		"/stable",
   256  		"/edge",
   257  	} {
   258  		c.Check(snap.FormatChannel(ch), check.Not(check.Equals), "", check.Commentf(ch))
   259  	}
   260  }