gopkg.in/rethinkdb/rethinkdb-go.v6@v6.2.2/mock_test.go (about) 1 package rethinkdb 2 3 import ( 4 "fmt" 5 "testing" 6 7 test "gopkg.in/check.v1" 8 "gopkg.in/rethinkdb/rethinkdb-go.v6/internal/integration/tests" 9 ) 10 11 // Hook up gocheck into the gotest runner. 12 func Test(t *testing.T) { test.TestingT(t) } 13 14 type MockSuite struct{} 15 16 var _ = test.Suite(&MockSuite{}) 17 18 func (s *MockSuite) TestMockExecSuccess(c *test.C) { 19 mock := NewMock() 20 mock.On(DB("test").Table("test").Insert(map[string]string{ 21 "id": "mocked", 22 })).Return(nil, nil) 23 24 err := DB("test").Table("test").Insert(map[string]string{ 25 "id": "mocked", 26 }).Exec(mock) 27 c.Assert(err, test.IsNil) 28 mock.AssertExpectations(c) 29 } 30 31 func (s *MockSuite) TestMockExecFail(c *test.C) { 32 mock := NewMock() 33 mock.On(DB("test").Table("test").Insert(map[string]string{ 34 "id": "mocked", 35 })).Return(nil, fmt.Errorf("Expected error")) 36 37 err := DB("test").Table("test").Insert(map[string]string{ 38 "id": "mocked", 39 }).Exec(mock) 40 c.Assert(err, test.NotNil) 41 mock.AssertExpectations(c) 42 } 43 44 func (s *MockSuite) TestMockRunSuccessSingleResult(c *test.C) { 45 mock := NewMock() 46 mock.On(DB("test").Table("test").Get("mocked")).Return(map[string]interface{}{ 47 "id": "mocked", 48 }, nil) 49 50 res, err := DB("test").Table("test").Get("mocked").Run(mock) 51 c.Assert(err, test.IsNil) 52 53 var response interface{} 54 err = res.One(&response) 55 56 c.Assert(err, test.IsNil) 57 c.Assert(response, tests.JsonEquals, map[string]interface{}{"id": "mocked"}) 58 mock.AssertExpectations(c) 59 } 60 61 func (s *MockSuite) TestMockRunSuccessMultipleResults(c *test.C) { 62 mock := NewMock() 63 mock.On(DB("test").Table("test")).Return([]interface{}{ 64 map[string]interface{}{"id": "mocked"}, 65 }, nil) 66 67 res, err := DB("test").Table("test").Run(mock) 68 c.Assert(err, test.IsNil) 69 70 var response []interface{} 71 err = res.All(&response) 72 73 c.Assert(err, test.IsNil) 74 c.Assert(response, tests.JsonEquals, []interface{}{map[string]interface{}{"id": "mocked"}}) 75 mock.AssertExpectations(c) 76 } 77 78 func (s *MockSuite) TestMockRunSuccessChannel(c *test.C) { 79 mock := NewMock() 80 ch := make(chan []interface{}) 81 mock.On(DB("test").Table("test")).Return(ch, nil) 82 go func() { 83 ch <- []interface{}{1, 2} 84 ch <- []interface{}{3} 85 ch <- []interface{}{4} 86 close(ch) 87 }() 88 res, err := DB("test").Table("test").Run(mock) 89 c.Assert(err, test.IsNil) 90 91 var response []interface{} 92 err = res.All(&response) 93 94 c.Assert(err, test.IsNil) 95 c.Assert(response, tests.JsonEquals, []interface{}{1, 2, 3, 4}) 96 mock.AssertExpectations(c) 97 } 98 99 func (s *MockSuite) TestMockRunSuccessFunction(c *test.C) { 100 mock := NewMock() 101 n := 0 102 f := func() []interface{} { 103 n++ 104 if n == 4 { 105 return nil 106 } 107 return []interface{}{n} 108 } 109 mock.On(DB("test").Table("test")).Return(f, nil) 110 res, err := DB("test").Table("test").Run(mock) 111 c.Assert(err, test.IsNil) 112 113 var response []interface{} 114 err = res.All(&response) 115 116 c.Assert(err, test.IsNil) 117 c.Assert(response, tests.JsonEquals, []interface{}{1, 2, 3}) 118 mock.AssertExpectations(c) 119 } 120 121 func (s *MockSuite) TestMockRunSuccessMultipleResults_type(c *test.C) { 122 type document struct { 123 Id string 124 } 125 126 mock := NewMock() 127 mock.On(DB("test").Table("test")).Return([]document{ 128 document{"mocked"}, 129 }, nil) 130 131 res, err := DB("test").Table("test").Run(mock) 132 c.Assert(err, test.IsNil) 133 134 var response []interface{} 135 err = res.All(&response) 136 137 c.Assert(err, test.IsNil) 138 c.Assert(response, tests.JsonEquals, []document{document{"mocked"}}) 139 mock.AssertExpectations(c) 140 141 res.Close() 142 } 143 144 func (s *MockSuite) TestMockRunMissingMock(c *test.C) { 145 mock := NewMock() 146 mock.On(DB("test").Table("test")).Return([]interface{}{ 147 map[string]interface{}{"id": "mocked"}, 148 }, nil).Once() 149 150 c.Assert(func() { 151 c.Assert(DB("test").Table("test").Exec(mock), test.IsNil) 152 c.Assert(DB("test").Table("test").Exec(mock), test.IsNil) 153 }, test.PanicMatches, ""+ 154 "rethinkdb: mock: This query was unexpected:(?s:.*)") 155 mock.AssertExpectations(c) 156 } 157 158 func (s *MockSuite) TestMockRunMissingQuery(c *test.C) { 159 mock := NewMock() 160 mock.On(DB("test").Table("test")).Return([]interface{}{ 161 map[string]interface{}{"id": "mocked"}, 162 }, nil).Twice() 163 164 c.Assert(DB("test").Table("test").Exec(mock), test.IsNil) 165 166 t := &simpleTestingT{} 167 mock.AssertExpectations(t) 168 169 c.Assert(t.Failed(), test.Equals, true) 170 } 171 172 func (s *MockSuite) TestMockRunMissingQuerySingle(c *test.C) { 173 mock := NewMock() 174 mock.On(DB("test").Table("test")).Return([]interface{}{ 175 map[string]interface{}{"id": "mocked"}, 176 }, nil).Once() 177 178 t := &simpleTestingT{} 179 mock.AssertExpectations(t) 180 181 c.Assert(t.Failed(), test.Equals, true) 182 } 183 184 func (s *MockSuite) TestMockRunMissingQueryMultiple(c *test.C) { 185 mock := NewMock() 186 mock.On(DB("test").Table("test")).Return([]interface{}{ 187 map[string]interface{}{"id": "mocked"}, 188 }, nil).Twice() 189 190 c.Assert(DB("test").Table("test").Exec(mock), test.IsNil) 191 192 t := &simpleTestingT{} 193 mock.AssertExpectations(t) 194 195 c.Assert(t.Failed(), test.Equals, true) 196 } 197 198 func (s *MockSuite) TestMockRunMutlipleQueries(c *test.C) { 199 mock := NewMock() 200 mock.On(DB("test").Table("test").Get("mocked1")).Return(map[string]interface{}{ 201 "id": "mocked1", 202 }, nil).Times(2) 203 mock.On(DB("test").Table("test").Get("mocked2")).Return(map[string]interface{}{ 204 "id": "mocked2", 205 }, nil).Times(1) 206 207 var response interface{} 208 209 // Query 1 210 res, err := DB("test").Table("test").Get("mocked1").Run(mock) 211 c.Assert(err, test.IsNil) 212 213 err = res.One(&response) 214 215 c.Assert(err, test.IsNil) 216 c.Assert(response, tests.JsonEquals, map[string]interface{}{"id": "mocked1"}) 217 218 // Query 2 219 res, err = DB("test").Table("test").Get("mocked1").Run(mock) 220 c.Assert(err, test.IsNil) 221 222 err = res.One(&response) 223 224 c.Assert(err, test.IsNil) 225 c.Assert(response, tests.JsonEquals, map[string]interface{}{"id": "mocked1"}) 226 227 // Query 3 228 res, err = DB("test").Table("test").Get("mocked2").Run(mock) 229 c.Assert(err, test.IsNil) 230 231 err = res.One(&response) 232 233 c.Assert(err, test.IsNil) 234 c.Assert(response, tests.JsonEquals, map[string]interface{}{"id": "mocked2"}) 235 236 mock.AssertExpectations(c) 237 } 238 239 func (s *MockSuite) TestMockQueriesWithFuncs(c *test.C) { 240 mock := NewMock() 241 mock.On(Expr([]int{2}).Map(func(row Term) interface{} { 242 return row.Add(1) 243 })).Return([]int{3}, nil).Times(2) 244 mock.On(Expr([]int{4}).Map(func(row1, row2 Term) interface{} { 245 return row1.Add(1) 246 })).Return([]int{5}, nil).Times(1) 247 mock.On(Expr([]int{9}).Map(func(row1, row2 Term) interface{} { 248 return row2.Add(1) 249 })).Return([]int{10}, nil).Times(1) 250 251 var response []int 252 253 // Query 1 254 res, err := Expr([]int{2}).Map(func(row Term) interface{} { 255 return row.Add(1) 256 }).Run(mock) 257 c.Assert(err, test.IsNil) 258 259 err = res.All(&response) 260 261 c.Assert(err, test.IsNil) 262 c.Assert(response, tests.JsonEquals, []int{3}) 263 264 // Query 2 265 res, err = Expr([]int{2}).Map(func(row Term) interface{} { 266 return row.Add(1) 267 }).Run(mock) 268 c.Assert(err, test.IsNil) 269 270 err = res.All(&response) 271 272 c.Assert(err, test.IsNil) 273 c.Assert(response, tests.JsonEquals, []int{3}) 274 275 // Query 3 276 res, err = Expr([]int{4}).Map(func(row1, row2 Term) interface{} { 277 return row1.Add(1) 278 }).Run(mock) 279 c.Assert(err, test.IsNil) 280 281 err = res.All(&response) 282 283 c.Assert(err, test.IsNil) 284 c.Assert(response, tests.JsonEquals, []int{5}) 285 286 // Query 5 287 res, err = Expr([]int{9}).Map(func(row1, row2 Term) interface{} { 288 return row2.Add(1) 289 }).Run(mock) 290 c.Assert(err, test.IsNil) 291 292 err = res.All(&response) 293 294 c.Assert(err, test.IsNil) 295 c.Assert(response, tests.JsonEquals, []int{10}) 296 297 mock.AssertExpectations(c) 298 } 299 300 func (s *MockSuite) TestMockAnything(c *test.C) { 301 mock := NewMock() 302 mock.On(MockAnything()).Return("okay", nil).Times(1) 303 mock.On(Table("test").MockAnything()).Return("okay2", nil).Times(1) 304 mock.On(Table("test").Insert(map[string]interface{}{ 305 "id": MockAnything(), 306 })).Return("okay3", nil).Times(1) 307 mock.On(Expr([]interface{}{1, 2, MockAnything()})).Return("okay4", nil).Times(1) 308 309 var response string 310 311 // Query 1 312 res, err := Expr("test_1").Run(mock) 313 c.Assert(err, test.IsNil) 314 315 err = res.One(&response) 316 317 c.Assert(err, test.IsNil) 318 c.Assert(response, tests.JsonEquals, "okay") 319 320 // Query 2 321 res, err = Table("test").Get("mocked1").Run(mock) 322 c.Assert(err, test.IsNil) 323 324 err = res.One(&response) 325 326 c.Assert(err, test.IsNil) 327 c.Assert(response, tests.JsonEquals, "okay2") 328 329 // Query 3 330 res, err = Table("test").Insert(map[string]interface{}{ 331 "id": "10ECE456-3C4D-4864-A843-879FCB0D133F", 332 }).Run(mock) 333 c.Assert(err, test.IsNil) 334 335 err = res.One(&response) 336 337 c.Assert(err, test.IsNil) 338 c.Assert(response, tests.JsonEquals, "okay3") 339 340 // Query 3 341 res, err = Expr([]interface{}{1, 2, 3}).Run(mock) 342 c.Assert(err, test.IsNil) 343 344 err = res.One(&response) 345 346 c.Assert(err, test.IsNil) 347 c.Assert(response, tests.JsonEquals, "okay4") 348 349 mock.AssertExpectations(c) 350 } 351 352 func (s *MockSuite) TestMockRethinkStructsRunWrite(c *test.C) { 353 mock := NewMock() 354 mock.On(DB("test").Table("test").Update(map[string]int{"val": 1})).Return(WriteResponse{ 355 Replaced: 1, 356 Changes: []ChangeResponse{ 357 {NewValue: map[string]interface{}{"val": 1}, OldValue: map[string]interface{}{"val": 0}}, 358 }, 359 }, nil) 360 361 res, err := DB("test").Table("test").Update(map[string]int{"val": 1}).RunWrite(mock) 362 c.Assert(err, test.IsNil) 363 364 c.Assert(res, tests.JsonEquals, WriteResponse{ 365 Replaced: 1, 366 Changes: []ChangeResponse{ 367 {NewValue: map[string]interface{}{"val": 1}, OldValue: map[string]interface{}{"val": 0}}, 368 }, 369 }) 370 mock.AssertExpectations(c) 371 } 372 373 func (s *MockSuite) TestMockMapSliceResultOk(c *test.C) { 374 type Some struct { 375 Id string 376 } 377 378 result := []map[string]interface{}{ 379 {"Id": "test1"}, 380 {"Id": "test2"}, 381 } 382 383 mock := NewMock() 384 q := DB("test").Table("test").GetAll() 385 mock.On(q).Return(result, nil) 386 res, err := q.Run(mock) 387 c.Assert(err, test.IsNil) 388 389 var casted []*Some 390 err = res.All(&casted) 391 c.Assert(err, test.IsNil) 392 393 c.Assert(casted[0].Id, test.Equals, "test1") 394 c.Assert(casted[1].Id, test.Equals, "test2") 395 } 396 397 func (s *MockSuite) TestMockPointerSliceResultOk(c *test.C) { 398 type Some struct { 399 Id string 400 } 401 402 result := []*Some{ 403 {Id: "test1"}, 404 {Id: "test2"}, 405 } 406 407 mock := NewMock() 408 q := DB("test").Table("test").GetAll() 409 mock.On(q).Return(result, nil) 410 res, err := q.Run(mock) 411 c.Assert(err, test.IsNil) 412 413 var casted []*Some 414 err = res.All(&casted) 415 c.Assert(err, test.IsNil) 416 417 c.Assert(casted[0].Id, test.Equals, "test1") 418 c.Assert(casted[1].Id, test.Equals, "test2") 419 } 420 421 type simpleTestingT struct { 422 failed bool 423 } 424 425 func (t *simpleTestingT) Logf(format string, args ...interface{}) { 426 } 427 func (t *simpleTestingT) Errorf(format string, args ...interface{}) { 428 t.failed = true 429 } 430 func (t *simpleTestingT) FailNow() { 431 t.failed = true 432 } 433 func (t *simpleTestingT) Failed() bool { 434 return t.failed 435 }