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  })