github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/application/fakeapplication_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package application_test 5 6 import ( 7 "fmt" 8 9 "github.com/juju/collections/set" 10 "github.com/juju/errors" 11 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/core/model" 14 ) 15 16 // fakeApplicationAPI is the fake application API for testing the application 17 // update command. 18 type fakeApplicationAPI struct { 19 generation model.GenerationVersion 20 name string 21 charmName string 22 charmValues map[string]interface{} 23 appValues map[string]interface{} 24 config string 25 err error 26 version int 27 } 28 29 func (f *fakeApplicationAPI) Update(args params.ApplicationUpdate) error { 30 if f.err != nil { 31 return f.err 32 } 33 34 if args.ApplicationName != f.name { 35 return errors.NotFoundf("application %q", args.ApplicationName) 36 } 37 38 f.config = args.SettingsYAML 39 return nil 40 } 41 42 func (f *fakeApplicationAPI) BestAPIVersion() int { 43 return f.version 44 } 45 46 func (f *fakeApplicationAPI) Close() error { 47 return nil 48 } 49 50 func (f *fakeApplicationAPI) Get( 51 generation model.GenerationVersion, application string, 52 ) (*params.ApplicationGetResults, error) { 53 if generation != f.generation { 54 return nil, errors.Errorf("expected generation %q, got %q", f.generation, generation) 55 } 56 57 if application != f.name { 58 return nil, errors.NotFoundf("application %q", application) 59 } 60 61 charmConfigInfo := make(map[string]interface{}) 62 for k, v := range f.charmValues { 63 charmConfigInfo[k] = map[string]interface{}{ 64 "description": fmt.Sprintf("Specifies %s", k), 65 "type": fmt.Sprintf("%T", v), 66 "value": v, 67 } 68 } 69 appConfigInfo := make(map[string]interface{}) 70 for k, v := range f.appValues { 71 appConfigInfo[k] = map[string]interface{}{ 72 "description": fmt.Sprintf("Specifies %s", k), 73 "type": fmt.Sprintf("%T", v), 74 "value": v, 75 } 76 } 77 78 return ¶ms.ApplicationGetResults{ 79 Application: f.name, 80 Charm: f.charmName, 81 CharmConfig: charmConfigInfo, 82 ApplicationConfig: appConfigInfo, 83 }, nil 84 } 85 86 func (f *fakeApplicationAPI) Set(application string, options map[string]string) error { 87 if f.err != nil { 88 return f.err 89 } 90 91 if application != f.name { 92 return errors.NotFoundf("application %q", application) 93 } 94 95 charmKeys := set.NewStrings("title", "skill-level", "username", "outlook") 96 if f.charmValues == nil { 97 f.charmValues = make(map[string]interface{}) 98 } 99 for k, v := range options { 100 if charmKeys.Contains(k) { 101 f.charmValues[k] = v 102 } else { 103 f.appValues[k] = v 104 } 105 } 106 107 return nil 108 } 109 110 func (f *fakeApplicationAPI) SetApplicationConfig( 111 generation model.GenerationVersion, application string, config map[string]string, 112 ) error { 113 if generation != f.generation { 114 return errors.Errorf("expected generation %q, got %q", f.generation, generation) 115 } 116 return f.Set(application, config) 117 } 118 119 func (f *fakeApplicationAPI) Unset(application string, options []string) error { 120 if f.err != nil { 121 return f.err 122 } 123 124 if application != f.name { 125 return errors.NotFoundf("application %q", application) 126 } 127 128 // Verify all options before unsetting any of them. 129 for _, name := range options { 130 if _, ok := f.appValues[name]; ok { 131 continue 132 } 133 if _, ok := f.charmValues[name]; !ok { 134 return errors.Errorf("unknown option %q", name) 135 } 136 } 137 138 for _, name := range options { 139 delete(f.charmValues, name) 140 delete(f.appValues, name) 141 } 142 143 return nil 144 } 145 146 func (f *fakeApplicationAPI) UnsetApplicationConfig( 147 generation model.GenerationVersion, application string, options []string, 148 ) error { 149 if generation != f.generation { 150 return errors.Errorf("expected generation %q, got %q", f.generation, generation) 151 } 152 return f.Unset(application, options) 153 }