github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/model/exportbundle_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for info.
     3  
     4  package model_test
     5  
     6  import (
     7  	"fmt"
     8  	"io/ioutil"
     9  	"os"
    10  	"path/filepath"
    11  
    12  	"github.com/juju/cmd/cmdtesting"
    13  	jujutesting "github.com/juju/testing"
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/cmd/juju/model"
    18  	coremodel "github.com/juju/juju/core/model"
    19  	"github.com/juju/juju/jujuclient"
    20  	"github.com/juju/juju/testing"
    21  )
    22  
    23  type ExportBundleCommandSuite struct {
    24  	testing.FakeJujuXDGDataHomeSuite
    25  	fake  *fakeExportBundleClient
    26  	stub  *jujutesting.Stub
    27  	store *jujuclient.MemStore
    28  }
    29  
    30  var _ = gc.Suite(&ExportBundleCommandSuite{})
    31  
    32  func (s *ExportBundleCommandSuite) SetUpTest(c *gc.C) {
    33  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    34  	s.stub = &jujutesting.Stub{}
    35  	s.fake = &fakeExportBundleClient{
    36  		Stub: s.stub,
    37  	}
    38  	s.store = jujuclient.NewMemStore()
    39  	s.store.CurrentControllerName = "testing"
    40  	s.store.Controllers["testing"] = jujuclient.ControllerDetails{}
    41  	s.store.Accounts["testing"] = jujuclient.AccountDetails{
    42  		User: "admin",
    43  	}
    44  	err := s.store.UpdateModel("testing", "admin/mymodel", jujuclient.ModelDetails{
    45  		ModelUUID: testing.ModelTag.Id(),
    46  		ModelType: coremodel.IAAS,
    47  	})
    48  	c.Assert(err, jc.ErrorIsNil)
    49  	s.store.Models["testing"].CurrentModel = "admin/mymodel"
    50  }
    51  
    52  func (s *ExportBundleCommandSuite) TearDownTest(c *gc.C) {
    53  	if s.fake.filename != "" {
    54  		err := os.Remove(s.fake.filename + ".yaml")
    55  		if !os.IsNotExist(err) {
    56  			c.Check(err, jc.ErrorIsNil)
    57  		}
    58  		err = os.Remove(s.fake.filename)
    59  		if !os.IsNotExist(err) {
    60  			c.Check(err, jc.ErrorIsNil)
    61  		}
    62  	}
    63  
    64  	s.FakeJujuXDGDataHomeSuite.TearDownTest(c)
    65  }
    66  
    67  func (s *ExportBundleCommandSuite) TestExportBundleSuccessNoFilename(c *gc.C) {
    68  	s.fake.result = "applications:\n" +
    69  		"  mysql:\n" +
    70  		"    charm: \"\"\n" +
    71  		"    num_units: 1\n" +
    72  		"    to:\n" +
    73  		"    - \"0\"\n" +
    74  		"  wordpress:\n" +
    75  		"    charm: \"\"\n" +
    76  		"    num_units: 2\n" +
    77  		"    to:\n" +
    78  		"    - \"0\"\n" +
    79  		"    - \"1\"\n" +
    80  		"machines:\n" +
    81  		"  \"0\": {}\n" +
    82  		"  \"1\": {}\n" +
    83  		"series: xenial\n" +
    84  		"relations:\n" +
    85  		"- - wordpress:db\n" +
    86  		"  - mysql:mysql\n"
    87  
    88  	ctx, err := cmdtesting.RunCommand(c, model.NewExportBundleCommandForTest(s.fake, s.store))
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	s.fake.CheckCalls(c, []jujutesting.StubCall{
    91  		{"ExportBundle", nil},
    92  	})
    93  
    94  	out := cmdtesting.Stdout(ctx)
    95  	c.Assert(out, gc.Equals, ""+
    96  		"applications:\n"+
    97  		"  mysql:\n"+
    98  		"    charm: \"\"\n"+
    99  		"    num_units: 1\n"+
   100  		"    to:\n"+
   101  		"    - \"0\"\n"+
   102  		"  wordpress:\n"+
   103  		"    charm: \"\"\n"+
   104  		"    num_units: 2\n"+
   105  		"    to:\n"+
   106  		"    - \"0\"\n"+
   107  		"    - \"1\"\n"+
   108  		"machines:\n"+
   109  		"  \"0\": {}\n"+
   110  		"  \"1\": {}\n"+
   111  		"series: xenial\n"+
   112  		"relations:\n"+
   113  		"- - wordpress:db\n"+
   114  		"  - mysql:mysql\n")
   115  }
   116  
   117  func (s *ExportBundleCommandSuite) TestExportBundleSuccessFilename(c *gc.C) {
   118  	s.fake.filename = filepath.Join(c.MkDir(), "mymodel")
   119  	s.fake.result = "applications:\n" +
   120  		"  magic:\n" +
   121  		"    charm: cs:zesty/magic\n" +
   122  		"    series: zesty\n" +
   123  		"    expose: true\n" +
   124  		"    options:\n" +
   125  		"      key: value\n" +
   126  		"    bindings:\n" +
   127  		"      rel-name: some-space\n" +
   128  		"series: xenial\n" +
   129  		"relations:\n" +
   130  		"- []\n"
   131  	ctx, err := cmdtesting.RunCommand(c, model.NewExportBundleCommandForTest(s.fake, s.store), "--filename", s.fake.filename)
   132  	c.Assert(err, jc.ErrorIsNil)
   133  	s.fake.CheckCalls(c, []jujutesting.StubCall{
   134  		{"ExportBundle", nil},
   135  	})
   136  
   137  	out := cmdtesting.Stdout(ctx)
   138  	c.Assert(out, gc.Equals, fmt.Sprintf("Bundle successfully exported to %s\n", s.fake.filename))
   139  	output, err := ioutil.ReadFile(s.fake.filename)
   140  	c.Check(err, jc.ErrorIsNil)
   141  	c.Assert(string(output), gc.Equals, "applications:\n"+
   142  		"  magic:\n"+
   143  		"    charm: cs:zesty/magic\n"+
   144  		"    series: zesty\n"+
   145  		"    expose: true\n"+
   146  		"    options:\n"+
   147  		"      key: value\n"+
   148  		"    bindings:\n"+
   149  		"      rel-name: some-space\n"+
   150  		"series: xenial\n"+
   151  		"relations:\n"+
   152  		"- []\n")
   153  }
   154  
   155  func (s *ExportBundleCommandSuite) TestExportBundleFailNoFilename(c *gc.C) {
   156  	_, err := cmdtesting.RunCommand(c, model.NewExportBundleCommandForTest(s.fake, s.store), "--filename")
   157  	c.Assert(err, gc.NotNil)
   158  
   159  	c.Assert(err.Error(), gc.Equals, "option needs an argument: --filename")
   160  }
   161  
   162  func (s *ExportBundleCommandSuite) TestExportBundleSuccesssOverwriteFilename(c *gc.C) {
   163  	s.fake.filename = filepath.Join(c.MkDir(), "mymodel")
   164  	s.fake.result = "fake-data"
   165  	ctx, err := cmdtesting.RunCommand(c, model.NewExportBundleCommandForTest(s.fake, s.store), "--filename", s.fake.filename)
   166  	c.Assert(err, jc.ErrorIsNil)
   167  	s.fake.CheckCalls(c, []jujutesting.StubCall{
   168  		{"ExportBundle", nil},
   169  	})
   170  
   171  	out := cmdtesting.Stdout(ctx)
   172  	c.Assert(out, gc.Equals, fmt.Sprintf("Bundle successfully exported to %s\n", s.fake.filename))
   173  	output, err := ioutil.ReadFile(s.fake.filename)
   174  	c.Check(err, jc.ErrorIsNil)
   175  	c.Assert(string(output), gc.Equals, "fake-data")
   176  }
   177  
   178  func (f *fakeExportBundleClient) Close() error { return nil }
   179  
   180  func (f *fakeExportBundleClient) ExportBundle() (string, error) {
   181  	f.MethodCall(f, "ExportBundle")
   182  	if err := f.NextErr(); err != nil {
   183  		return "", err
   184  	}
   185  
   186  	return f.result, f.NextErr()
   187  }
   188  
   189  type fakeExportBundleClient struct {
   190  	*jujutesting.Stub
   191  	result   string
   192  	filename string
   193  }