github.com/jbking/gohan@v0.0.0-20151217002006-b41ccf1c2a96/extension/otto/gohan_db_test.go (about) 1 // Copyright (C) 2015 NTT Innovation Institute, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 // implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 package otto_test 17 18 import ( 19 "errors" 20 21 "github.com/cloudwan/gohan/db/transaction" 22 "github.com/cloudwan/gohan/db/transaction/mocks" 23 "github.com/cloudwan/gohan/extension/otto" 24 "github.com/cloudwan/gohan/schema" 25 "github.com/cloudwan/gohan/server/middleware" 26 27 . "github.com/onsi/ginkgo" 28 . "github.com/onsi/gomega" 29 ) 30 31 var _ = Describe("GohanDb", func() { 32 33 Describe("gohan_db_state_fetch", func() { 34 Context("When valid parameters are given", func() { 35 It("returns a resource state object", func() { 36 extension, err := schema.NewExtension(map[string]interface{}{ 37 "id": "test_extension", 38 "code": ` 39 gohan_register_handler("test_event", function(context){ 40 var tx = context.transaction; 41 context.resp = gohan_db_state_fetch( 42 tx, 43 "test", 44 "resource_id", 45 "tenant0" 46 ); 47 });`, 48 "path": ".*", 49 }) 50 Expect(err).ToNot(HaveOccurred()) 51 extensions := []*schema.Extension{extension} 52 env := otto.NewEnvironment(testDB, &middleware.FakeIdentity{}) 53 Expect(env.LoadExtensionsForPath(extensions, "test_path")).To(Succeed()) 54 55 manager := schema.GetManager() 56 s, ok := manager.Schema("test") 57 Expect(ok).To(BeTrue()) 58 59 var fakeTx = new(mocks.Transaction) 60 fakeTx.On( 61 "StateFetch", s, "resource_id", []string{"tenant0"}, 62 ).Return( 63 transaction.ResourceState{ 64 ConfigVersion: 30, 65 StateVersion: 29, 66 Error: "e", 67 State: "s", 68 Monitoring: "m", 69 }, 70 nil, 71 ) 72 73 context := map[string]interface{}{ 74 "transaction": fakeTx, 75 } 76 Expect(env.HandleEvent("test_event", context)).To(Succeed()) 77 78 Expect(context["resp"]).To( 79 Equal( 80 map[string]interface{}{ 81 "config_version": int64(30), 82 "state_version": int64(29), 83 "error": "e", 84 "state": "s", 85 "monitoring": "m", 86 }, 87 ), 88 ) 89 }) 90 }) 91 }) 92 93 Describe("gohan_db_sql_make_columns", func() { 94 Context("when a valid schema ID is given", func() { 95 It("returns column names in Gohan DB compatible format", func() { 96 extension, err := schema.NewExtension(map[string]interface{}{ 97 "id": "test_extension", 98 "code": ` 99 gohan_register_handler("test_event", function(context){ 100 context.resp = gohan_db_sql_make_columns("test"); 101 });`, 102 "path": ".*", 103 }) 104 Expect(err).ToNot(HaveOccurred()) 105 extensions := []*schema.Extension{extension} 106 env := otto.NewEnvironment(testDB, &middleware.FakeIdentity{}) 107 Expect(env.LoadExtensionsForPath(extensions, "test_path")).To(Succeed()) 108 109 context := map[string]interface{}{} 110 Expect(env.HandleEvent("test_event", context)).To(Succeed()) 111 Expect(context["resp"]).To(ContainElement("tests.`id` as `tests__id`")) 112 Expect(context["resp"]).To(ContainElement("tests.`tenant_id` as `tests__tenant_id`")) 113 Expect(context["resp"]).To(ContainElement("tests.`test_string` as `tests__test_string`")) 114 }) 115 }) 116 117 Context("when an invalid schema ID is given", func() { 118 It("returns an error", func() { 119 extension, err := schema.NewExtension(map[string]interface{}{ 120 "id": "test_extension", 121 "code": ` 122 gohan_register_handler("test_event", function(context){ 123 context.resp = gohan_db_sql_make_columns("NOT EXIST"); 124 });`, 125 "path": ".*", 126 }) 127 Expect(err).ToNot(HaveOccurred()) 128 extensions := []*schema.Extension{extension} 129 env := otto.NewEnvironment(testDB, &middleware.FakeIdentity{}) 130 Expect(env.LoadExtensionsForPath(extensions, "test_path")).To(Succeed()) 131 132 context := map[string]interface{}{} 133 err = env.HandleEvent("test_event", context) 134 Expect(err).NotTo(BeNil()) 135 Expect(err.Error()).To(MatchRegexp("test_event: Unknown schema 'NOT EXIST'")) 136 }) 137 }) 138 139 }) 140 141 Describe("gohan_db_query", func() { 142 Context("when valid parameters are given", func() { 143 It("returns resources in db", func() { 144 extension, err := schema.NewExtension(map[string]interface{}{ 145 "id": "test_extension", 146 "code": ` 147 gohan_register_handler("test_event", function(context){ 148 var tx = context.transaction; 149 context.resp = gohan_db_query( 150 tx, 151 "test", 152 "SELECT DUMMY", 153 ["tenant0", "obj1"] 154 ); 155 });`, 156 "path": ".*", 157 }) 158 Expect(err).ToNot(HaveOccurred()) 159 extensions := []*schema.Extension{extension} 160 env := otto.NewEnvironment(testDB, &middleware.FakeIdentity{}) 161 Expect(env.LoadExtensionsForPath(extensions, "test_path")).To(Succeed()) 162 163 manager := schema.GetManager() 164 s, ok := manager.Schema("test") 165 Expect(ok).To(BeTrue()) 166 167 fakeResources := []map[string]interface{}{ 168 map[string]interface{}{"tenant_id": "t0", "test_string": "str0"}, 169 map[string]interface{}{"tenant_id": "t1", "test_string": "str1"}, 170 } 171 172 r0, err := schema.NewResource(s, fakeResources[0]) 173 Expect(err).ToNot(HaveOccurred()) 174 r1, err := schema.NewResource(s, fakeResources[1]) 175 Expect(err).ToNot(HaveOccurred()) 176 177 var fakeTx = new(mocks.Transaction) 178 fakeTx.On( 179 "Query", s, "SELECT DUMMY", []interface{}{"tenant0", "obj1"}, 180 ).Return( 181 []*schema.Resource{r0, r1}, nil, 182 ) 183 184 context := map[string]interface{}{ 185 "transaction": fakeTx, 186 } 187 Expect(env.HandleEvent("test_event", context)).To(Succeed()) 188 Expect(context["resp"]).To(Equal(fakeResources)) 189 }) 190 }) 191 192 Context("When an invalid schema ID is provided", func() { 193 It("fails and return an error", func() { 194 extension, err := schema.NewExtension(map[string]interface{}{ 195 "id": "test_extension", 196 "code": ` 197 gohan_register_handler("test_event", function(context){ 198 var tx = context.transaction; 199 context.resp = gohan_db_query( 200 tx, 201 "INVALID_SCHEMA_ID", 202 "SELECT DUMMY", 203 ["tenant0", "obj1"] 204 ); 205 });`, 206 "path": ".*", 207 }) 208 Expect(err).ToNot(HaveOccurred()) 209 extensions := []*schema.Extension{extension} 210 env := otto.NewEnvironment(testDB, &middleware.FakeIdentity{}) 211 Expect(env.LoadExtensionsForPath(extensions, "test_path")).To(Succeed()) 212 213 context := map[string]interface{}{ 214 "transaction": new(mocks.Transaction), 215 } 216 err = env.HandleEvent("test_event", context) 217 Expect(err).NotTo(BeNil()) 218 Expect(err.Error()).To(MatchRegexp("test_event: Unknown schema 'INVALID_SCHEMA_ID'")) 219 }) 220 }) 221 222 Context("When an invalid array is provided to arguments", func() { 223 It("fails and return an error", func() { 224 extension, err := schema.NewExtension(map[string]interface{}{ 225 "id": "test_extension", 226 "code": ` 227 gohan_register_handler("test_event", function(context){ 228 var tx = context.transaction; 229 context.resp = gohan_db_query( 230 tx, 231 "test", 232 "SELECT DUMMY", 233 "THIS IS NOT AN ARRAY" 234 ); 235 });`, 236 "path": ".*", 237 }) 238 Expect(err).ToNot(HaveOccurred()) 239 extensions := []*schema.Extension{extension} 240 env := otto.NewEnvironment(testDB, &middleware.FakeIdentity{}) 241 Expect(env.LoadExtensionsForPath(extensions, "test_path")).To(Succeed()) 242 243 context := map[string]interface{}{ 244 "transaction": new(mocks.Transaction), 245 } 246 err = env.HandleEvent("test_event", context) 247 Expect(err).NotTo(BeNil()) 248 Expect(err.Error()).To(MatchRegexp("test_event: Gievn arguments is not \\[\\]interface\\{\\}")) 249 }) 250 }) 251 252 Context("When an error occured while processing the query", func() { 253 It("fails and return an error", func() { 254 extension, err := schema.NewExtension(map[string]interface{}{ 255 "id": "test_extension", 256 "code": ` 257 gohan_register_handler("test_event", function(context){ 258 var tx = context.transaction; 259 context.resp = gohan_db_query( 260 tx, 261 "test", 262 "SELECT DUMMY", 263 [] 264 ); 265 });`, 266 "path": ".*", 267 }) 268 Expect(err).ToNot(HaveOccurred()) 269 extensions := []*schema.Extension{extension} 270 env := otto.NewEnvironment(testDB, &middleware.FakeIdentity{}) 271 Expect(env.LoadExtensionsForPath(extensions, "test_path")).To(Succeed()) 272 273 manager := schema.GetManager() 274 s, ok := manager.Schema("test") 275 Expect(ok).To(BeTrue()) 276 277 var fakeTx = new(mocks.Transaction) 278 fakeTx.On( 279 "Query", s, "SELECT DUMMY", []interface{}{}, 280 ).Return( 281 nil, errors.New("SOMETHING HAPPENED"), 282 ) 283 284 context := map[string]interface{}{ 285 "transaction": fakeTx, 286 } 287 err = env.HandleEvent("test_event", context) 288 Expect(err).NotTo(BeNil()) 289 Expect(err.Error()).To(MatchRegexp("test_event: Error during gohan_db_query: SOMETHING HAPPEN")) 290 }) 291 }) 292 293 }) 294 })