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  }