gopkg.in/rethinkdb/rethinkdb-go.v6@v6.2.2/internal/integration/tests/query_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"sync"
     7  	"testing"
     8  	"time"
     9  
    10  	test "gopkg.in/check.v1"
    11  	r "gopkg.in/rethinkdb/rethinkdb-go.v6"
    12  )
    13  
    14  func (s *RethinkSuite) TestQueryRun(c *test.C) {
    15  	var response string
    16  
    17  	res, err := r.Expr("Test").Run(session)
    18  	c.Assert(err, test.IsNil)
    19  
    20  	err = res.One(&response)
    21  
    22  	c.Assert(err, test.IsNil)
    23  	c.Assert(response, test.Equals, "Test")
    24  }
    25  
    26  func (s *RethinkSuite) TestQueryReadOne(c *test.C) {
    27  	var response string
    28  
    29  	err := r.Expr("Test").ReadOne(&response, session)
    30  	c.Assert(err, test.IsNil)
    31  	c.Assert(response, test.Equals, "Test")
    32  }
    33  
    34  func (s *RethinkSuite) TestQueryReadAll(c *test.C) {
    35  	var response []int
    36  
    37  	err := r.Expr([]int{1, 2, 3}).ReadAll(&response, session)
    38  	c.Assert(err, test.IsNil)
    39  	c.Assert(response, test.HasLen, 3)
    40  	c.Assert(response, test.DeepEquals, []int{1, 2, 3})
    41  }
    42  
    43  func (s *RethinkSuite) TestQueryExec(c *test.C) {
    44  	err := r.Expr("Test").Exec(session)
    45  	c.Assert(err, test.IsNil)
    46  }
    47  
    48  func (s *RethinkSuite) TestQueryRunWrite(c *test.C) {
    49  	r.DBDrop("test_runwrite").Exec(session)
    50  	err := r.DBCreate("test_runwrite").Exec(session)
    51  	c.Assert(err, test.IsNil)
    52  	err = r.DB("test_runwrite").TableCreate("test_runwrite").Exec(session)
    53  	c.Assert(err, test.IsNil)
    54  	err = r.DB("test_runwrite").Table("test_runwrite").Wait().Exec(session)
    55  	c.Assert(err, test.IsNil)
    56  
    57  	query := r.DB("test_runwrite").Table("test_runwrite").Insert([]interface{}{
    58  		map[string]interface{}{"num": 1},
    59  		map[string]interface{}{"num": 2},
    60  	}, r.InsertOpts{ReturnChanges: true})
    61  	res, err := query.RunWrite(session)
    62  	c.Assert(err, test.IsNil)
    63  	c.Assert(res.Inserted, test.Equals, 2)
    64  	c.Assert(len(res.Changes), test.Equals, 2)
    65  }
    66  
    67  func (s *RethinkSuite) TestQueryProfile(c *test.C) {
    68  	var response string
    69  
    70  	res, err := r.Expr("Test").Run(session, r.RunOpts{
    71  		Profile: true,
    72  	})
    73  	c.Assert(err, test.IsNil)
    74  
    75  	err = res.One(&response)
    76  
    77  	c.Assert(err, test.IsNil)
    78  	c.Assert(res.Profile(), test.NotNil)
    79  	c.Assert(response, test.Equals, "Test")
    80  }
    81  
    82  func (s *RethinkSuite) TestQueryRunRawTime(c *test.C) {
    83  	var response map[string]interface{}
    84  
    85  	res, err := r.Now().Run(session, r.RunOpts{
    86  		TimeFormat: "raw",
    87  	})
    88  	c.Assert(err, test.IsNil)
    89  
    90  	err = res.One(&response)
    91  
    92  	c.Assert(err, test.IsNil)
    93  	c.Assert(response["$reql_type$"], test.NotNil)
    94  	c.Assert(response["$reql_type$"], test.Equals, "TIME")
    95  }
    96  
    97  func (s *RethinkSuite) TestQueryRunNil(c *test.C) {
    98  	res, err := r.Expr("Test").Run(nil)
    99  	c.Assert(res, test.IsNil)
   100  	c.Assert(err, test.NotNil)
   101  	c.Assert(err, test.Equals, r.ErrConnectionClosed)
   102  }
   103  
   104  func (s *RethinkSuite) TestQueryRunNotConnected(c *test.C) {
   105  	res, err := r.Expr("Test").Run(&r.Session{})
   106  	c.Assert(res, test.IsNil)
   107  	c.Assert(err, test.NotNil)
   108  	c.Assert(err, test.Equals, r.ErrConnectionClosed)
   109  }
   110  
   111  func (s *RethinkSuite) TestControlExprNil(c *test.C) {
   112  	var response interface{}
   113  	query := r.Expr(nil)
   114  	res, err := query.Run(session)
   115  	c.Assert(err, test.IsNil)
   116  
   117  	err = res.One(&response)
   118  
   119  	c.Assert(err, test.Equals, r.ErrEmptyResult)
   120  	c.Assert(response, test.Equals, nil)
   121  }
   122  
   123  func (s *RethinkSuite) TestControlExprSimple(c *test.C) {
   124  	var response int
   125  	query := r.Expr(1)
   126  	res, err := query.Run(session)
   127  	c.Assert(err, test.IsNil)
   128  
   129  	err = res.One(&response)
   130  
   131  	c.Assert(err, test.IsNil)
   132  	c.Assert(response, test.Equals, 1)
   133  }
   134  
   135  func (s *RethinkSuite) TestControlExprList(c *test.C) {
   136  	var response []interface{}
   137  	query := r.Expr(narr)
   138  	res, err := query.Run(session)
   139  	c.Assert(err, test.IsNil)
   140  
   141  	err = res.All(&response)
   142  
   143  	c.Assert(err, test.IsNil)
   144  	c.Assert(response, JsonEquals, []interface{}{
   145  		1, 2, 3, 4, 5, 6, []interface{}{
   146  			7.1, 7.2, 7.3,
   147  		},
   148  	})
   149  }
   150  
   151  func (s *RethinkSuite) TestControlExprObj(c *test.C) {
   152  	var response map[string]interface{}
   153  	query := r.Expr(nobj)
   154  	res, err := query.Run(session)
   155  	c.Assert(err, test.IsNil)
   156  
   157  	err = res.One(&response)
   158  
   159  	c.Assert(err, test.IsNil)
   160  	c.Assert(response, JsonEquals, map[string]interface{}{
   161  		"A": 1,
   162  		"B": 2,
   163  		"C": map[string]interface{}{
   164  			"1": 3,
   165  			"2": 4,
   166  		},
   167  	})
   168  }
   169  
   170  func (s *RethinkSuite) TestControlStruct(c *test.C) {
   171  	var response map[string]interface{}
   172  	query := r.Expr(str)
   173  	res, err := query.Run(session)
   174  	c.Assert(err, test.IsNil)
   175  
   176  	err = res.One(&response)
   177  
   178  	c.Assert(err, test.IsNil)
   179  	c.Assert(response, JsonEquals, map[string]interface{}{
   180  		"id": "A",
   181  		"B":  1,
   182  		"D":  map[string]interface{}{"D2": "2", "D1": 1},
   183  		"E":  []interface{}{"E1", "E2", "E3", 4},
   184  		"F": map[string]interface{}{
   185  			"XA": 2,
   186  			"XB": "B",
   187  			"XC": []interface{}{"XC1", "XC2"},
   188  			"XD": map[string]interface{}{
   189  				"YA": 3,
   190  				"YB": map[string]interface{}{
   191  					"1": "1",
   192  					"2": "2",
   193  					"3": 3,
   194  				},
   195  				"YC": map[string]interface{}{
   196  					"YC1": "YC1",
   197  				},
   198  				"YD": map[string]interface{}{
   199  					"YD1": "YD1",
   200  				},
   201  			},
   202  			"XE": "XE",
   203  			"XF": []interface{}{"XE1", "XE2"},
   204  		},
   205  	})
   206  }
   207  
   208  func (s *RethinkSuite) TestControlStructTags(c *test.C) {
   209  	r.SetTags("rethinkdb", "json")
   210  	defer r.SetTags()
   211  
   212  	var response map[string]interface{}
   213  	query := r.Expr(TagsTest{"1", "2", "3"})
   214  	res, err := query.Run(session)
   215  	c.Assert(err, test.IsNil)
   216  
   217  	err = res.One(&response)
   218  
   219  	c.Assert(err, test.IsNil)
   220  	c.Assert(response, JsonEquals, map[string]interface{}{
   221  		"a": "1", "b": "2", "c1": "3",
   222  	})
   223  
   224  }
   225  
   226  func (s *RethinkSuite) TestControlMapTypeAlias(c *test.C) {
   227  	var response TMap
   228  	query := r.Expr(TMap{"A": 1, "B": 2})
   229  	res, err := query.Run(session)
   230  	c.Assert(err, test.IsNil)
   231  
   232  	err = res.One(&response)
   233  
   234  	c.Assert(err, test.IsNil)
   235  	c.Assert(response, JsonEquals, TMap{"A": 1, "B": 2})
   236  }
   237  
   238  func (s *RethinkSuite) TestControlStringTypeAlias(c *test.C) {
   239  	var response TStr
   240  	query := r.Expr(TStr("Hello"))
   241  	res, err := query.Run(session)
   242  	c.Assert(err, test.IsNil)
   243  
   244  	err = res.One(&response)
   245  
   246  	c.Assert(err, test.IsNil)
   247  	c.Assert(response, JsonEquals, TStr("Hello"))
   248  }
   249  
   250  func (s *RethinkSuite) TestControlExprTypes(c *test.C) {
   251  	var response []interface{}
   252  	query := r.Expr([]interface{}{int64(1), uint64(1), float64(1.0), int32(1), uint32(1), float32(1), "1", true, false})
   253  	res, err := query.Run(session)
   254  	c.Assert(err, test.IsNil)
   255  
   256  	err = res.All(&response)
   257  
   258  	c.Assert(err, test.IsNil)
   259  	c.Assert(response, JsonEquals, []interface{}{int64(1), uint64(1), float64(1.0), int32(1), uint32(1), float32(1), "1", true, false})
   260  }
   261  
   262  func (s *RethinkSuite) TestControlJs(c *test.C) {
   263  	var response int
   264  	query := r.JS("1;")
   265  	res, err := query.Run(session)
   266  	c.Assert(err, test.IsNil)
   267  
   268  	err = res.One(&response)
   269  
   270  	c.Assert(err, test.IsNil)
   271  	c.Assert(response, test.Equals, 1)
   272  }
   273  
   274  func (s *RethinkSuite) TestControlHttp(c *test.C) {
   275  	if testing.Short() {
   276  		c.Skip("-short set")
   277  	}
   278  
   279  	var response map[string]interface{}
   280  	query := r.HTTP("httpbin.org/get?data=1")
   281  	res, err := query.Run(session)
   282  	c.Assert(err, test.IsNil)
   283  
   284  	err = res.One(&response)
   285  
   286  	c.Assert(err, test.IsNil)
   287  	c.Assert(response["args"], JsonEquals, map[string]interface{}{
   288  		"data": "1",
   289  	})
   290  }
   291  
   292  func (s *RethinkSuite) TestControlError(c *test.C) {
   293  	query := r.Error("An error occurred")
   294  	err := query.Exec(session)
   295  	c.Assert(err, test.NotNil)
   296  
   297  	c.Assert(err, test.NotNil)
   298  	c.Assert(err, test.FitsTypeOf, r.RQLUserError{})
   299  
   300  	c.Assert(err.Error(), test.Equals, "rethinkdb: An error occurred in:\nr.Error(\"An error occurred\")")
   301  }
   302  
   303  func (s *RethinkSuite) TestControlDoNothing(c *test.C) {
   304  	var response []interface{}
   305  	query := r.Do([]interface{}{map[string]interface{}{"a": 1}, map[string]interface{}{"a": 2}, map[string]interface{}{"a": 3}})
   306  	res, err := query.Run(session)
   307  	c.Assert(err, test.IsNil)
   308  
   309  	err = res.All(&response)
   310  
   311  	c.Assert(err, test.IsNil)
   312  	c.Assert(response, JsonEquals, []interface{}{map[string]interface{}{"a": 1}, map[string]interface{}{"a": 2}, map[string]interface{}{"a": 3}})
   313  }
   314  
   315  func (s *RethinkSuite) TestControlArgs(c *test.C) {
   316  	var response time.Time
   317  	query := r.Time(r.Args(r.Expr([]interface{}{2014, 7, 12, "Z"})))
   318  	res, err := query.Run(session)
   319  	c.Assert(err, test.IsNil)
   320  
   321  	err = res.One(&response)
   322  	c.Assert(err, test.IsNil)
   323  	c.Assert(response.Unix(), test.Equals, int64(1405123200))
   324  }
   325  
   326  func (s *RethinkSuite) TestControlBinaryByteArray(c *test.C) {
   327  	var response []byte
   328  
   329  	query := r.Binary([]byte("Hello World"))
   330  	res, err := query.Run(session)
   331  	c.Assert(err, test.IsNil)
   332  
   333  	err = res.One(&response)
   334  	c.Assert(err, test.IsNil)
   335  	c.Assert(bytes.Equal(response, []byte("Hello World")), test.Equals, true)
   336  }
   337  
   338  type byteArray []byte
   339  
   340  func (s *RethinkSuite) TestControlBinaryByteArrayAlias(c *test.C) {
   341  	var response []byte
   342  
   343  	query := r.Binary(byteArray("Hello World"))
   344  	res, err := query.Run(session)
   345  	c.Assert(err, test.IsNil)
   346  
   347  	err = res.One(&response)
   348  	c.Assert(err, test.IsNil)
   349  	c.Assert(bytes.Equal(response, []byte("Hello World")), test.Equals, true)
   350  }
   351  
   352  func (s *RethinkSuite) TestControlBinaryByteSlice(c *test.C) {
   353  	var response [5]byte
   354  
   355  	query := r.Binary([5]byte{'h', 'e', 'l', 'l', 'o'})
   356  	res, err := query.Run(session)
   357  	c.Assert(err, test.IsNil)
   358  
   359  	err = res.One(&response)
   360  	c.Assert(err, test.IsNil)
   361  	c.Assert(response, test.Equals, [5]byte{'h', 'e', 'l', 'l', 'o'})
   362  }
   363  
   364  func (s *RethinkSuite) TestControlBinaryExpr(c *test.C) {
   365  	var response []byte
   366  
   367  	query := r.Expr([]byte("Hello World"))
   368  	res, err := query.Run(session)
   369  	c.Assert(err, test.IsNil)
   370  
   371  	err = res.One(&response)
   372  	c.Assert(err, test.IsNil)
   373  	c.Assert(bytes.Equal(response, []byte("Hello World")), test.Equals, true)
   374  }
   375  
   376  func (s *RethinkSuite) TestControlBinaryExprAlias(c *test.C) {
   377  	var response []byte
   378  
   379  	query := r.Expr(byteArray("Hello World"))
   380  	res, err := query.Run(session)
   381  	c.Assert(err, test.IsNil)
   382  
   383  	err = res.One(&response)
   384  	c.Assert(err, test.IsNil)
   385  	c.Assert(bytes.Equal(response, []byte("Hello World")), test.Equals, true)
   386  }
   387  
   388  func (s *RethinkSuite) TestControlBinaryTerm(c *test.C) {
   389  	var response []byte
   390  
   391  	query := r.Binary(r.Expr([]byte("Hello World")))
   392  	res, err := query.Run(session)
   393  	c.Assert(err, test.IsNil)
   394  
   395  	err = res.One(&response)
   396  	c.Assert(err, test.IsNil)
   397  	c.Assert(bytes.Equal(response, []byte("Hello World")), test.Equals, true)
   398  }
   399  
   400  func (s *RethinkSuite) TestControlBinaryElemTerm(c *test.C) {
   401  	var response map[string]interface{}
   402  
   403  	query := r.Expr(map[string]interface{}{
   404  		"bytes": []byte("Hello World"),
   405  	})
   406  	res, err := query.Run(session)
   407  	c.Assert(err, test.IsNil)
   408  
   409  	err = res.One(&response)
   410  	c.Assert(err, test.IsNil)
   411  	c.Assert(bytes.Equal(response["bytes"].([]byte), []byte("Hello World")), test.Equals, true)
   412  }
   413  
   414  func (s *RethinkSuite) TestExprInvalidType(c *test.C) {
   415  	query := r.Expr(map[struct{ string }]string{})
   416  	_, err := query.Run(session)
   417  	c.Assert(err, test.NotNil)
   418  }
   419  
   420  func (s *RethinkSuite) TestRawQuery(c *test.C) {
   421  	var response int
   422  	query := r.RawQuery([]byte(`1`))
   423  	res, err := query.Run(session)
   424  	c.Assert(err, test.IsNil)
   425  
   426  	err = res.One(&response)
   427  
   428  	c.Assert(err, test.IsNil)
   429  	c.Assert(response, test.Equals, 1)
   430  }
   431  
   432  func (s *RethinkSuite) TestRawQuery_advanced(c *test.C) {
   433  	var response []int
   434  	// r.expr([1,2,3]).map(function(v) { return v.add(1)})
   435  	query := r.RawQuery([]byte(`[38,[[2,[1,2,3]],[69,[[2,[25]],[24,[[10,[25]],1]]]]]]`))
   436  	res, err := query.Run(session)
   437  	c.Assert(err, test.IsNil)
   438  
   439  	err = res.All(&response)
   440  
   441  	c.Assert(err, test.IsNil)
   442  	c.Assert(response, JsonEquals, []int{2, 3, 4})
   443  }
   444  
   445  func (s *RethinkSuite) TestTableChanges(c *test.C) {
   446  	r.DB("test").TableDrop("changes1").Exec(session)
   447  	r.DB("test").TableCreate("changes1").Exec(session)
   448  	r.DB("test").Table("changes1").Wait().Exec(session)
   449  
   450  	var n int
   451  
   452  	res, err := r.DB("test").Table("changes1").Changes().Run(session)
   453  	if err != nil {
   454  		c.Fatal(err.Error())
   455  	}
   456  	c.Assert(res.Type(), test.Equals, "Feed")
   457  
   458  	wg := &sync.WaitGroup{}
   459  	wg.Add(1)
   460  
   461  	// Use goroutine to wait for changes. Prints the first 10 results
   462  	go func() {
   463  		var response interface{}
   464  		for n < 10 && res.Next(&response) {
   465  			n++
   466  		}
   467  
   468  		defer wg.Done()
   469  		if res.Err() != nil {
   470  			c.Fatal(res.Err())
   471  		}
   472  	}()
   473  
   474  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 1}).Exec(session)
   475  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 2}).Exec(session)
   476  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 3}).Exec(session)
   477  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 4}).Exec(session)
   478  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 5}).Exec(session)
   479  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 6}).Exec(session)
   480  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 7}).Exec(session)
   481  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 8}).Exec(session)
   482  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 9}).Exec(session)
   483  	r.DB("test").Table("changes1").Insert(map[string]interface{}{"n": 10}).Exec(session)
   484  
   485  	wg.Wait()
   486  
   487  	c.Assert(n, test.Equals, 10)
   488  }
   489  
   490  func (s *RethinkSuite) TestTableChangesExit(c *test.C) {
   491  	r.DB("test").TableDrop("changes2").Exec(session)
   492  	r.DB("test").TableCreate("changes2").Exec(session)
   493  	r.DB("test").Table("changes2").Wait().Exec(session)
   494  
   495  	var n int
   496  
   497  	res, err := r.DB("test").Table("changes2").Changes().Run(session)
   498  	if err != nil {
   499  		c.Fatal(err.Error())
   500  	}
   501  	c.Assert(res.Type(), test.Equals, "Feed")
   502  
   503  	change := make(chan r.ChangeResponse)
   504  
   505  	// Close cursor after one second
   506  	go func() {
   507  		<-time.After(time.Second)
   508  		res.Close()
   509  	}()
   510  
   511  	// Insert 5 docs
   512  	r.DB("test").Table("changes2").Insert(map[string]interface{}{"n": 1}).Exec(session)
   513  	r.DB("test").Table("changes2").Insert(map[string]interface{}{"n": 2}).Exec(session)
   514  	r.DB("test").Table("changes2").Insert(map[string]interface{}{"n": 3}).Exec(session)
   515  	r.DB("test").Table("changes2").Insert(map[string]interface{}{"n": 4}).Exec(session)
   516  	r.DB("test").Table("changes2").Insert(map[string]interface{}{"n": 5}).Exec(session)
   517  
   518  	// Listen for changes
   519  	res.Listen(change)
   520  	for _ = range change {
   521  		n++
   522  	}
   523  
   524  	c.Assert(n, test.Equals, 5)
   525  }
   526  
   527  func (s *RethinkSuite) TestTableChangesExitNoResults(c *test.C) {
   528  	r.DB("test").TableDrop("changes3").Exec(session)
   529  	r.DB("test").TableCreate("changes3").Exec(session)
   530  	r.DB("test").Table("changes3").Wait().Exec(session)
   531  
   532  	var n int
   533  
   534  	res, err := r.DB("test").Table("changes3").Changes().Run(session)
   535  	if err != nil {
   536  		c.Fatal(err.Error())
   537  	}
   538  	c.Assert(res.Type(), test.Equals, "Feed")
   539  
   540  	change := make(chan r.ChangeResponse)
   541  
   542  	// Close cursor after one second
   543  	go func() {
   544  		<-time.After(time.Second)
   545  		res.Close()
   546  	}()
   547  
   548  	// Listen for changes
   549  	res.Listen(change)
   550  	for _ = range change {
   551  		n++
   552  	}
   553  
   554  	c.Assert(n, test.Equals, 0)
   555  }
   556  
   557  func (s *RethinkSuite) TestTableChangesIncludeInitial(c *test.C) {
   558  	r.DB("test").TableDrop("changes4").Exec(session)
   559  	r.DB("test").TableCreate("changes4").Exec(session)
   560  	r.DB("test").Table("changes4").Wait().Exec(session)
   561  
   562  	// Insert 5 documents to table initially
   563  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 1}).Exec(session)
   564  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 2}).Exec(session)
   565  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 3}).Exec(session)
   566  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 4}).Exec(session)
   567  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 5}).Exec(session)
   568  
   569  	var n int
   570  
   571  	res, err := r.DB("test").Table("changes4").Changes(r.ChangesOpts{IncludeInitial: true}).Run(session)
   572  	if err != nil {
   573  		c.Fatal(err.Error())
   574  	}
   575  	c.Assert(res.Type(), test.Equals, "Feed")
   576  
   577  	wg := &sync.WaitGroup{}
   578  	wg.Add(1)
   579  
   580  	// Use goroutine to wait for changes. Prints the first 10 results
   581  	go func() {
   582  		var response interface{}
   583  		for n < 10 && res.Next(&response) {
   584  			n++
   585  		}
   586  
   587  		defer wg.Done()
   588  		if res.Err() != nil {
   589  			c.Fatal(res.Err())
   590  		}
   591  	}()
   592  
   593  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 6}).Exec(session)
   594  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 7}).Exec(session)
   595  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 8}).Exec(session)
   596  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 9}).Exec(session)
   597  	r.DB("test").Table("changes4").Insert(map[string]interface{}{"n": 10}).Exec(session)
   598  
   599  	wg.Wait()
   600  
   601  	c.Assert(n, test.Equals, 10)
   602  }
   603  
   604  func (s *RethinkSuite) TestWriteReference(c *test.C) {
   605  	author := Author{
   606  		ID:   "1",
   607  		Name: "JRR Tolkien",
   608  	}
   609  
   610  	book := Book{
   611  		ID:     "1",
   612  		Title:  "The Lord of the Rings",
   613  		Author: author,
   614  	}
   615  
   616  	r.DB("test").TableDrop("authors").Exec(session)
   617  	r.DB("test").TableDrop("books").Exec(session)
   618  	r.DB("test").TableCreate("authors").Exec(session)
   619  	r.DB("test").TableCreate("books").Exec(session)
   620  	r.DB("test").Table("authors").Wait().Exec(session)
   621  	r.DB("test").Table("books").Wait().Exec(session)
   622  
   623  	_, err := r.DB("test").Table("authors").Insert(author).RunWrite(session)
   624  	c.Assert(err, test.IsNil)
   625  
   626  	_, err = r.DB("test").Table("books").Insert(book).RunWrite(session)
   627  	c.Assert(err, test.IsNil)
   628  
   629  	// Read back book + author and check result
   630  	cursor, err := r.DB("test").Table("books").Get("1").Merge(func(p r.Term) interface{} {
   631  		return map[string]interface{}{
   632  			"author_id": r.DB("test").Table("authors").Get(p.Field("author_id")),
   633  		}
   634  	}).Run(session)
   635  	c.Assert(err, test.IsNil)
   636  
   637  	var out Book
   638  	err = cursor.One(&out)
   639  	c.Assert(err, test.IsNil)
   640  
   641  	c.Assert(out.Title, test.Equals, "The Lord of the Rings")
   642  	c.Assert(out.Author.Name, test.Equals, "JRR Tolkien")
   643  }
   644  
   645  func (s *RethinkSuite) TestWriteConflict(c *test.C) {
   646  	r.DB("test").TableDrop("test_write_conf").Exec(session)
   647  	r.DB("test").TableCreate("test_write_conf").Exec(session)
   648  	r.DB("test").Table("test_write_conf").Wait().Exec(session)
   649  
   650  	query := r.DB("test").Table("test_write_conf").Insert(map[string]interface{}{"id": "a"})
   651  	_, err := query.RunWrite(session)
   652  	c.Assert(err, test.IsNil)
   653  
   654  	query = r.DB("test").Table("test_write_conf").Insert(map[string]interface{}{"id": "a"})
   655  	_, err = query.RunWrite(session)
   656  	c.Assert(r.IsConflictErr(err), test.Equals, true)
   657  }
   658  
   659  func (s *RethinkSuite) TestTimeTime(c *test.C) {
   660  	var response time.Time
   661  	res, err := r.Time(1986, 11, 3, 12, 30, 15, "Z").Run(session)
   662  	c.Assert(err, test.IsNil)
   663  
   664  	err = res.One(&response)
   665  	c.Assert(err, test.IsNil)
   666  	c.Assert(response.Equal(time.Date(1986, 11, 3, 12, 30, 15, 0, time.UTC)), test.Equals, true)
   667  }
   668  
   669  func (s *RethinkSuite) TestTimeExpr(c *test.C) {
   670  	var response time.Time
   671  	t := time.Unix(531360000, 0)
   672  	res, err := r.Expr(r.Expr(t)).Run(session)
   673  	c.Assert(err, test.IsNil)
   674  
   675  	err = res.One(&response)
   676  	c.Assert(err, test.IsNil)
   677  }
   678  
   679  func (s *RethinkSuite) TestTimeExprMillisecond(c *test.C) {
   680  	var response time.Time
   681  	t := time.Unix(531360000, 679000000)
   682  	res, err := r.Expr(t).Run(session)
   683  	c.Assert(err, test.IsNil)
   684  
   685  	err = res.One(&response)
   686  	c.Assert(err, test.IsNil)
   687  	c.Assert(float64(response.UnixNano()), test.Equals, float64(t.UnixNano()))
   688  }
   689  
   690  func (s *RethinkSuite) TestTimeISO8601(c *test.C) {
   691  	var t1, t2 time.Time
   692  	t2, _ = time.Parse("2006-01-02T15:04:05-07:00", "1986-11-03T08:30:00-07:00")
   693  	res, err := r.ISO8601("1986-11-03T08:30:00-07:00").Run(session)
   694  	c.Assert(err, test.IsNil)
   695  
   696  	err = res.One(&t1)
   697  	c.Assert(err, test.IsNil)
   698  	c.Assert(t1.Equal(t2), test.Equals, true)
   699  }
   700  
   701  func (s *RethinkSuite) TestTimeInTimezone(c *test.C) {
   702  	var response []time.Time
   703  	res, err := r.Expr([]interface{}{r.Now(), r.Now().InTimezone("-07:00")}).Run(session)
   704  	c.Assert(err, test.IsNil)
   705  
   706  	err = res.All(&response)
   707  	c.Assert(err, test.IsNil)
   708  	c.Assert(response[1].Equal(response[0]), test.Equals, true)
   709  }
   710  
   711  func (s *RethinkSuite) TestSelectJSONNumbers(c *test.C) {
   712  	session, err := r.Connect(r.ConnectOpts{
   713  		Address:       url,
   714  		UseJSONNumber: true,
   715  	})
   716  	c.Assert(err, test.IsNil)
   717  	defer session.Close()
   718  	// Ensure table + database exist
   719  	r.DBCreate("test_jnum").Exec(session)
   720  	r.DB("test_jnum").TableCreate("table_test_query_jsonnum").Exec(session)
   721  	r.DB("test_jnum").Table("table_test_query_jsonnum").Wait().Exec(session)
   722  
   723  	// Insert rows
   724  	r.DB("test_jnum").Table("table_test_query_jsonnum").Insert(objList).Exec(session)
   725  
   726  	// Test query
   727  	var response interface{}
   728  	query := r.DB("test_jnum").Table("table_test_query_jsonnum").Get(6)
   729  	res, err := query.Run(session)
   730  	c.Assert(err, test.IsNil)
   731  
   732  	err = res.One(&response)
   733  
   734  	c.Assert(err, test.IsNil)
   735  	c.Assert(response, JsonEquals, map[string]interface{}{"id": json.Number("6"), "g1": json.Number("1"), "g2": json.Number("1"), "num": json.Number("15")})
   736  
   737  	res.Close()
   738  }
   739  
   740  func (s *RethinkSuite) TestSelectManyRows(c *test.C) {
   741  	// Ensure table + database exist
   742  	r.DBCreate("test_sm").Exec(session)
   743  	r.DB("test_sm").TableCreate("table_test_query_many").Exec(session)
   744  	r.DB("test_sm").Table("table_test_query_many").Wait().Exec(session)
   745  	r.DB("test_sm").Table("table_test_query_many").Delete().Exec(session)
   746  
   747  	// Insert rows
   748  	for i := 0; i < 100; i++ {
   749  		data := []interface{}{}
   750  
   751  		for j := 0; j < 100; j++ {
   752  			data = append(data, map[string]interface{}{
   753  				"i": i,
   754  				"j": j,
   755  			})
   756  		}
   757  
   758  		r.DB("test_sm").Table("table_test_query_many").Insert(data).Exec(session)
   759  	}
   760  
   761  	// Test query
   762  	res, err := r.DB("test_sm").Table("table_test_query_many").Run(session, r.RunOpts{
   763  		MaxBatchRows: 1,
   764  	})
   765  	c.Assert(err, test.IsNil)
   766  
   767  	var n int
   768  	var response map[string]interface{}
   769  	for res.Next(&response) {
   770  		n++
   771  	}
   772  
   773  	c.Assert(res.Err(), test.IsNil)
   774  	c.Assert(n, test.Equals, 10000)
   775  
   776  	res.Close()
   777  }