github.com/tompreston/snapd@v0.0.0-20210817193607-954edfcb9611/client/systems_test.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2019 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 client_test
    21  
    22  import (
    23  	"encoding/json"
    24  	"io/ioutil"
    25  
    26  	"gopkg.in/check.v1"
    27  
    28  	"github.com/snapcore/snapd/client"
    29  	"github.com/snapcore/snapd/snap"
    30  )
    31  
    32  func (cs *clientSuite) TestListSystemsSome(c *check.C) {
    33  	cs.rsp = `{
    34  	    "type": "sync",
    35  	    "status-code": 200,
    36  	    "result": {
    37  	        "systems": [
    38  	           {
    39  	                "current": true,
    40  	                "label": "20200101",
    41  	                "model": {
    42  	                    "model": "this-is-model-id",
    43  	                    "brand-id": "brand-id-1",
    44  	                    "display-name": "wonky model"
    45  	                },
    46  	                "brand": {
    47  	                    "id": "brand-id-1",
    48  	                    "username": "brand",
    49  	                    "display-name": "wonky publishing"
    50  	                },
    51  	                "actions": [
    52  	                    {"title": "recover", "mode": "recover"},
    53  	                    {"title": "reinstall", "mode": "install"}
    54  	                ]
    55  	           }, {
    56  	                "label": "20200311",
    57  	                "model": {
    58  	                    "model": "different-model-id",
    59  	                    "brand-id": "bulky-brand-id-1",
    60  	                    "display-name": "bulky model"
    61  	                },
    62  	                "brand": {
    63  	                    "id": "bulky-brand-id-1",
    64  	                    "username": "bulky-brand",
    65  	                    "display-name": "bulky publishing"
    66  	                },
    67  	                "actions": [
    68  	                    {"title": "factory-reset", "mode": "install"}
    69  	                ]
    70  	            }
    71  	        ]
    72  	    }
    73  	}`
    74  	systems, err := cs.cli.ListSystems()
    75  	c.Assert(err, check.IsNil)
    76  	c.Check(cs.req.Method, check.Equals, "GET")
    77  	c.Check(cs.req.URL.Path, check.Equals, "/v2/systems")
    78  	c.Check(systems, check.DeepEquals, []client.System{
    79  		{
    80  			Current: true,
    81  			Label:   "20200101",
    82  			Model: client.SystemModelData{
    83  				Model:       "this-is-model-id",
    84  				BrandID:     "brand-id-1",
    85  				DisplayName: "wonky model",
    86  			},
    87  			Brand: snap.StoreAccount{
    88  				ID:          "brand-id-1",
    89  				Username:    "brand",
    90  				DisplayName: "wonky publishing",
    91  			},
    92  			Actions: []client.SystemAction{
    93  				{Title: "recover", Mode: "recover"},
    94  				{Title: "reinstall", Mode: "install"},
    95  			},
    96  		}, {
    97  			Label: "20200311",
    98  			Model: client.SystemModelData{
    99  				Model:       "different-model-id",
   100  				BrandID:     "bulky-brand-id-1",
   101  				DisplayName: "bulky model",
   102  			},
   103  			Brand: snap.StoreAccount{
   104  				ID:          "bulky-brand-id-1",
   105  				Username:    "bulky-brand",
   106  				DisplayName: "bulky publishing",
   107  			},
   108  			Actions: []client.SystemAction{
   109  				{Title: "factory-reset", Mode: "install"},
   110  			},
   111  		},
   112  	})
   113  }
   114  
   115  func (cs *clientSuite) TestListSystemsNone(c *check.C) {
   116  	cs.rsp = `{
   117  	    "type": "sync",
   118  	    "status-code": 200,
   119  	    "result": {}
   120  	}`
   121  	systems, err := cs.cli.ListSystems()
   122  	c.Assert(err, check.IsNil)
   123  	c.Check(cs.req.Method, check.Equals, "GET")
   124  	c.Check(cs.req.URL.Path, check.Equals, "/v2/systems")
   125  	c.Check(systems, check.HasLen, 0)
   126  }
   127  
   128  func (cs *clientSuite) TestRequestSystemActionHappy(c *check.C) {
   129  	cs.rsp = `{
   130  	    "type": "sync",
   131  	    "status-code": 200,
   132  	    "result": {}
   133  	}`
   134  	err := cs.cli.DoSystemAction("1234", &client.SystemAction{
   135  		Title: "reinstall",
   136  		Mode:  "install",
   137  	})
   138  	c.Assert(err, check.IsNil)
   139  	c.Check(cs.req.Method, check.Equals, "POST")
   140  	c.Check(cs.req.URL.Path, check.Equals, "/v2/systems/1234")
   141  
   142  	body, err := ioutil.ReadAll(cs.req.Body)
   143  	c.Assert(err, check.IsNil)
   144  	var req map[string]interface{}
   145  	err = json.Unmarshal(body, &req)
   146  	c.Assert(err, check.IsNil)
   147  	c.Assert(req, check.DeepEquals, map[string]interface{}{
   148  		"action": "do",
   149  		"title":  "reinstall",
   150  		"mode":   "install",
   151  	})
   152  }
   153  
   154  func (cs *clientSuite) TestRequestSystemActionError(c *check.C) {
   155  	cs.rsp = `{
   156  	    "type": "error",
   157  	    "status-code": 500,
   158  	    "result": {"message": "failed"}
   159  	}`
   160  	err := cs.cli.DoSystemAction("1234", &client.SystemAction{Mode: "install"})
   161  	c.Assert(err, check.ErrorMatches, "cannot request system action: failed")
   162  	c.Check(cs.req.Method, check.Equals, "POST")
   163  	c.Check(cs.req.URL.Path, check.Equals, "/v2/systems/1234")
   164  }
   165  
   166  func (cs *clientSuite) TestRequestSystemActionInvalid(c *check.C) {
   167  	err := cs.cli.DoSystemAction("", &client.SystemAction{})
   168  	c.Assert(err, check.ErrorMatches, "cannot request an action without the system")
   169  	err = cs.cli.DoSystemAction("1234", nil)
   170  	c.Assert(err, check.ErrorMatches, "cannot request an action without one")
   171  }
   172  
   173  func (cs *clientSuite) TestRequestSystemRebootHappy(c *check.C) {
   174  	cs.rsp = `{
   175  	    "type": "sync",
   176  	    "status-code": 200,
   177  	    "result": {}
   178  	}`
   179  	err := cs.cli.RebootToSystem("20201212", "install")
   180  	c.Assert(err, check.IsNil)
   181  	c.Check(cs.req.Method, check.Equals, "POST")
   182  	c.Check(cs.req.URL.Path, check.Equals, "/v2/systems/20201212")
   183  
   184  	body, err := ioutil.ReadAll(cs.req.Body)
   185  	c.Assert(err, check.IsNil)
   186  	var req map[string]interface{}
   187  	err = json.Unmarshal(body, &req)
   188  	c.Assert(err, check.IsNil)
   189  	c.Assert(req, check.DeepEquals, map[string]interface{}{
   190  		"action": "reboot",
   191  		"mode":   "install",
   192  	})
   193  }
   194  
   195  func (cs *clientSuite) TestRequestSystemRebootErrorNoSystem(c *check.C) {
   196  	cs.rsp = `{
   197  	    "type": "error",
   198  	    "status-code": 500,
   199  	    "result": {"message": "failed"}
   200  	}`
   201  	err := cs.cli.RebootToSystem("", "install")
   202  	c.Assert(err, check.ErrorMatches, `cannot request system reboot: failed`)
   203  	c.Check(cs.req.Method, check.Equals, "POST")
   204  	c.Check(cs.req.URL.Path, check.Equals, "/v2/systems")
   205  }
   206  
   207  func (cs *clientSuite) TestRequestSystemRebootErrorWithSystem(c *check.C) {
   208  	cs.rsp = `{
   209  	    "type": "error",
   210  	    "status-code": 500,
   211  	    "result": {"message": "failed"}
   212  	}`
   213  	err := cs.cli.RebootToSystem("1234", "install")
   214  	c.Assert(err, check.ErrorMatches, `cannot request system reboot into "1234": failed`)
   215  	c.Check(cs.req.Method, check.Equals, "POST")
   216  	c.Check(cs.req.URL.Path, check.Equals, "/v2/systems/1234")
   217  }