func Test_client_Delete(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"is_deleted": true, "revision": 346, "rev": "15a1441bd38", "thumb_exists": false, "bytes": 0, "modified": "Sun, 29 Sep 2013 18:04:57 +0000", "client_mtime": "Wed, 31 Dec 1969 23:59:59 +0000", "path": "/hello-file", "is_dir": false, "icon": "page_white", "root": "app_folder", "mime_type": "application/octet-stream", "size": "0 bytes"}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		c := client{}
		stat, err := c.Delete("hello-file")
		assert.NoError(t, err)
		assert.Equal(t, stat.Rev, "15a1441bd38")
		assert.True(t, stat.IsDeleted)
		assert.False(t, stat.ThumbExists)
		assert.Equal(t, stat.Bytes, 0)
		assert.Equal(t, stat.Modified, "Sun, 29 Sep 2013 18:04:57 +0000")
		assert.Equal(t, stat.ClientMtime, "Wed, 31 Dec 1969 23:59:59 +0000")
		assert.Equal(t, stat.Path, "/hello-file")
		assert.False(t, stat.IsDir)
		assert.Equal(t, stat.Icon, "page_white")
		assert.Equal(t, stat.Root, "app_folder")
		assert.Equal(t, stat.MimeType, "application/octet-stream")
		assert.Equal(t, stat.Size, "0 bytes")
	})
}
func Test_client_Stat_File(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"revision": 363, "rev": "16b1441bd38", "thumb_exists": false, "bytes": 13, "modified": "Sun, 29 Sep 2013 18:58:40 +0000", "client_mtime": "Sun, 29 Sep 2013 18:58:40 +0000", "path": "/hello-file", "is_dir": false, "icon": "page_white", "root": "app_folder", "mime_type": "application/octet-stream", "size": "13 bytes"}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		c := client{}
		stat, err := c.Stat("hello-directory/foobar", nil)
		assert.NoError(t, err)
		assert.Equal(t, stat.Rev, "16b1441bd38")
		assert.Equal(t, stat.Bytes, 13)
		assert.Equal(t, stat.Modified, "Sun, 29 Sep 2013 18:58:40 +0000")
		assert.Equal(t, stat.ClientMtime, "Sun, 29 Sep 2013 18:58:40 +0000")
		assert.Equal(t, stat.Path, "/hello-file")
		assert.Equal(t, stat.Root, "app_folder")
		assert.False(t, stat.IsDir)
		assert.False(t, stat.IsDeleted)
		assert.Equal(t, stat.Icon, "page_white")
		assert.Equal(t, stat.Size, "13 bytes")
		assert.False(t, stat.ThumbExists)
		assert.Equal(t, stat.MimeType, "application/octet-stream")
	})
}
func Test_client_Stat_Dir(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"hash": "30c75756a82043e6837af4a63be09d05", "revision": 365, "rev": "16d1441bd38", "thumb_exists": false, "bytes": 0, "modified": "Sun, 29 Sep 2013 19:06:01 +0000", "path": "/hello-directory", "is_dir": true, "icon": "folder", "root": "app_folder", "contents": [{"revision": 366, "rev": "16e1441bd38", "thumb_exists": false, "bytes": 0, "modified": "Sun, 29 Sep 2013 19:06:01 +0000", "path": "/hello-directory/foobar", "is_dir": true, "icon": "folder", "root": "dropbox", "size": "0 bytes"}], "size": "0 bytes"}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		c := client{}
		stat, err := c.Stat("hello-directory", nil)
		assert.NoError(t, err)
		assert.Equal(t, stat.Rev, "16d1441bd38")
		assert.Equal(t, stat.Hash, "30c75756a82043e6837af4a63be09d05")
		assert.Equal(t, stat.Revision, 365)
		assert.False(t, stat.ThumbExists)
		assert.Equal(t, stat.Bytes, 0)
		assert.Equal(t, stat.Modified, "Sun, 29 Sep 2013 19:06:01 +0000")
		assert.Equal(t, stat.ClientMtime, "")
		assert.Equal(t, stat.Path, "/hello-directory")
		assert.Equal(t, stat.Root, "app_folder")
		assert.True(t, stat.IsDir)
		assert.Equal(t, stat.IsDeleted, false)
		assert.Equal(t, stat.Icon, "folder")
		assert.Equal(t, stat.Size, "0 bytes")
		assert.Equal(t, stat.ThumbExists, false)
	})
}
func Test_client_Move(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"hash": "2b277c1fe6420488dd5bd0db40ed7753", "revision": 394, "rev": "18a1441bd38", "thumb_exists": false, "bytes": 0, "modified": "Sun, 20 Oct 2013 15:17:47 +0000", "path": "/experiments/client/move/bar", "is_dir": true, "icon": "folder", "root": "app_folder", "contents": [], "size": "0 bytes"}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		c := client{}
		stat, err := c.Move("foo", "bar")
		assert.NoError(t, err)
		assert.Equal(t, stat.Rev, "18a1441bd38")
		assert.Equal(t, stat.Hash, "2b277c1fe6420488dd5bd0db40ed7753")
		assert.Equal(t, stat.Revision, 394)
		assert.False(t, stat.ThumbExists)
		assert.Equal(t, stat.Bytes, 0)
		assert.Equal(t, stat.Modified, "Sun, 20 Oct 2013 15:17:47 +0000")
		assert.Equal(t, stat.ClientMtime, "")
		assert.Equal(t, stat.Path, "/experiments/client/move/bar")
		assert.Equal(t, stat.Root, "app_folder")
		assert.True(t, stat.IsDir)
		assert.Equal(t, stat.IsDeleted, false)
		assert.Equal(t, stat.Icon, "folder")
		assert.Equal(t, stat.Size, "0 bytes")
		assert.Equal(t, stat.ThumbExists, false)
	})
}
func Test_datastore_getSnapshot(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"rows": [{"tid": "tasks", "data": {"taskname": "mow the lawn", "completed": false, "created": {"T": "1379279475645"}}, "rowid": "_176ea3j26i8_js_7ycGk"}, {"tid": "tasks", "data": {"taskname": "do the laundry", "completed": true, "created": {"T": "1379277915417"}}, "rowid": "_176e8l33qd8_js_cjDMS"}, {"tid": "tasks", "data": {"taskname": "do the dishes", "completed": false, "created": {"T": "1379430400763"}}, "rowid": "_176imlgfa30_js_FCHyT"}, {"tid": "tasks", "data": {"taskname": "wash clothes", "completed": false, "created": {"T": "1379277963243"}}, "rowid": "_176e8mgnbfo_js_INijK"}], "rev": 22}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		ds := datastore{}

		snap, err := ds.getSnapshot()
		assert.NoError(t, err)

		assert.Equal(t, snap.Rev, 22)
		assert.Equal(t, len(snap.Rows), 4)

		for i, _ := range snap.Rows {
			r := snap.Rows[i].toRow()
			d := r.Data

			switch i {

			case 0:
				assert.Equal(t, r.TableKey, "tasks")
				assert.Equal(t, r.RowKey, "_176ea3j26i8_js_7ycGk")
				assert.Equal(t, len(d), 3)
				assert.Equal(t, d["taskname"], "mow the lawn")
				assert.Equal(t, d["completed"], false)
				assert.Equal(t, d["created"], time.Unix(0, 1379279475645*1000000))

			case 1:
				assert.Equal(t, r.TableKey, "tasks")
				assert.Equal(t, r.RowKey, "_176e8l33qd8_js_cjDMS")
				assert.Equal(t, len(d), 3)
				assert.Equal(t, d["taskname"], "do the laundry")
				assert.Equal(t, d["completed"], true)
				assert.Equal(t, d["created"], time.Unix(0, 1379277915417*1000000))

			case 2:
				assert.Equal(t, r.TableKey, "tasks")
				assert.Equal(t, r.RowKey, "_176imlgfa30_js_FCHyT")
				assert.Equal(t, len(d), 3)
				assert.Equal(t, d["taskname"], "do the dishes")
				assert.Equal(t, d["completed"], false)
				assert.Equal(t, d["created"], time.Unix(0, 1379430400763*1000000))

			case 3:
				assert.Equal(t, r.TableKey, "tasks")
				assert.Equal(t, r.RowKey, "_176e8mgnbfo_js_INijK")
				assert.Equal(t, len(d), 3)
				assert.Equal(t, d["taskname"], "wash clothes")
				assert.Equal(t, d["completed"], false)
				assert.Equal(t, d["created"], time.Unix(0, 1379277963243*1000000))

			}
		}
	})
}
func Test_dsm_getDatastoreInfo_ErrorPath(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		http.Error(w, "BadRequest", http.StatusBadRequest)
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		dsm := datastoreManager{}
		_, e := dsm.getDatastoreInfo("some_datastore_id")
		assert.Error(t, e)
	})
}
func Test_client_FindByName(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `[{"revision": 485, "rev": "1e51441bd38", "thumb_exists": false, "bytes": 0, "modified": "Sun, 20 Oct 2013 17:26:59 +0000", "path": "/experiments/client/find_by_name/fooA", "is_dir": true, "icon": "folder", "root": "dropbox", "size": "0 bytes"}, {"revision": 486, "rev": "1e61441bd38", "thumb_exists": false, "bytes": 0, "modified": "Sun, 20 Oct 2013 17:26:59 +0000", "path": "/experiments/client/find_by_name/fooB", "is_dir": true, "icon": "folder", "root": "dropbox", "size": "0 bytes"}]`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		c := client{}
		stats, err := c.FindByName("foo", "bar", nil)
		assert.NoError(t, err)
		assert.Equal(t, len(stats), 2)
	})
}
func Test_dsm_OpenDefaultDatastore(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"handle": "bbb", "rev": 33, "created": false}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		dsm := datastoreManager{}
		ds, err := dsm.OpenDefaultDatastore()
		assert.NoError(t, err)
		assert.Equal(t, ds.GetId(), "default")
	})
}
func Test_client_MakeURL(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"url": "https://db.tt/f9akEL4H", "expires": "Tue, 01 Jan 2030 00:00:00 +0000"}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		c := client{}
		share, err := c.MakeURL("foobar/binbaz", nil)
		assert.NoError(t, err)
		assert.Equal(t, share.URL.Path, "/f9akEL4H")
		assert.Equal(t, share.Expires.Year(), 2030)
	})
}
func Test_client_requestJSON_HappyPath(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte(`{ "hello": "world" }`))
	})
	defer server.Close()

	req, err := http.NewRequest("GET", server.URL, nil)
	assert.NoError(t, err)

	var foo struct{ Hello string }

	c := client{}
	c.requestJSON(req, &foo)

	assert.Equal(t, foo.Hello, "world")
}
func Test_dsm_getDatastoreInfo_HappyPath(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"handle": "lzBkwO43xw9mrUX5BGdjxIzCmsmdCK", "rev": 0}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		dsm := datastoreManager{}

		info, e := dsm.getDatastoreInfo("some_datastore_id")
		assert.NoError(t, e)
		assert.Equal(t, info.Id, "some_datastore_id")
		assert.Equal(t, info.Handle, "lzBkwO43xw9mrUX5BGdjxIzCmsmdCK")
		assert.Equal(t, info.Rev, 0)
	})
}
func Test_dsm_getOrCreateDatastore_Created_True(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"handle": "bbb", "rev": 10, "created": true}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		dsm := datastoreManager{}
		info, err := dsm.getOrCreateDatastore("binbar")
		assert.NoError(t, err)
		assert.Equal(t, info.Id, "binbar")
		assert.True(t, info.Created)
		assert.Equal(t, info.Handle, "bbb")
		assert.Equal(t, info.Rev, 10)
	})
}
func Test_client_requestBody_ErrorPath(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		http.Error(w, "BadRequest", http.StatusBadRequest)
	})
	defer server.Close()

	req, err := http.NewRequest("GET", server.URL, nil)
	assert.NoError(t, err)

	c := client{
		options: ClientOptions{
			Token: "init__token",
		}}

	_, err = c.requestBody(req)
	assert.Error(t, err)
}
func Test_client_requestBody_HappyPath(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("x"))
	})
	defer server.Close()

	req, err := http.NewRequest("GET", server.URL, nil)
	assert.NoError(t, err)

	c := client{
		options: ClientOptions{
			Token: "init__token",
		}}

	body, err := c.requestBody(req)
	assert.NoError(t, err)
	assert.Equal(t, body, []byte("x"))
}
func Test_dsm_createDatastore(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"handle": "KB0Pxo49ejanvbwfnn6dYYDbr5BmFf", "rev": 0, "created": true}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		dsm := datastoreManager{}

		info, e := dsm.createDatastore()
		assert.NoError(t, e)
		assert.Equal(t, info.Id, "")
		assert.Equal(t, info.Created, true)
		assert.Equal(t, info.Handle, "KB0Pxo49ejanvbwfnn6dYYDbr5BmFf")
		assert.Equal(t, info.Rev, 0)
	})
}
func Test_dsm_DeleteDatastore_HappyPath(t *testing.T) {
	requestCount := 0
	responses := []string{
		`{"handle": "lzBkwO43xw9mrUX5BGdjxIzCmsmdCK", "rev": 0}`,
		`{"ok": "Deleted datastore with handle: u'lzBkwO43xw9mrUX5BGdjxIzCmsmdCK'"}`,
	}

	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := responses[requestCount]
		w.Write([]byte(b))
		requestCount++
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		dsm := datastoreManager{}
		e := dsm.DeleteDatastore("another_datastore_id")
		assert.NoError(t, e)
	})
}
func Test_dsm_ListDatastores_HappyPath(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"datastores": [{"handle": "X21bXh1EfdZsnI1cTcdepkRpdWeEYL", "rev": 3, "dsid": "default"}], "token": "ae"}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		dsm := datastoreManager{}

		infos, e := dsm.ListDatastores()
		assert.NoError(t, e)
		assert.True(t, len(infos) == 1)
		if len(infos) > 0 {
			info := infos[0]
			assert.Equal(t, info.Id, "default")
			assert.Equal(t, info.Created, false)
			assert.Equal(t, info.Handle, "X21bXh1EfdZsnI1cTcdepkRpdWeEYL")
			assert.Equal(t, info.Rev, 3)
		}
	})
}
func Test_client_Mkdir(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"revision": 348, "rev": "15c1441bd38", "thumb_exists": false, "bytes": 0, "modified": "Sun, 29 Sep 2013 18:35:23 +0000", "path": "/hello-directory/foobar", "is_dir": true, "icon": "folder", "root": "app_folder", "size": "0 bytes"}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		c := client{}
		stat, err := c.Mkdir("hello-directory/foobar")
		assert.NoError(t, err)
		assert.Equal(t, stat.Rev, "15c1441bd38")
		assert.Equal(t, stat.Bytes, 0)
		assert.Equal(t, stat.Modified, "Sun, 29 Sep 2013 18:35:23 +0000")
		assert.Equal(t, stat.Path, "/hello-directory/foobar")
		assert.Equal(t, stat.Root, "app_folder")
		assert.True(t, stat.IsDir)
		assert.False(t, stat.IsDeleted)
		assert.Equal(t, stat.Icon, "folder")
		assert.Equal(t, stat.Size, "0 bytes")
		assert.False(t, stat.ThumbExists)
	})
}
func Test_client_GetAccountInfo(t *testing.T) {
	server := test_helpers.NewServer(func(w http.ResponseWriter, r *http.Request) {
		b := `{"referral_link": "https://db.tt/t5R5HR7e", "display_name": "Levi Cook", "uid": 608456, "country": "US", "quota_info": {"datastores": 2, "shared": 27129455635, "quota": 111400714240, "normal": 463460503}, "email": "*****@*****.**"}`
		w.Write([]byte(b))
	})
	defer server.Close()

	withServer(t, server.URL, func() {
		c := client{}
		info, err := c.GetAccountInfo()
		assert.NoError(t, err)
		assert.Equal(t, info.ReferralLink, "https://db.tt/t5R5HR7e")
		assert.Equal(t, info.Uid, uint(608456))
		assert.Equal(t, info.DisplayName, "Levi Cook")
		assert.Equal(t, info.Email, "*****@*****.**")
		assert.Equal(t, info.Country, "US")

		quota := info.QuotaInfo
		assert.Equal(t, quota.Normal, 463460503)
		assert.Equal(t, quota.Shared, 27129455635)
		assert.Equal(t, quota.Quota, 111400714240)
		assert.Equal(t, quota.Datastores, 2)
	})
}