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 }