Merge lp:~thisfred/u1db/create_doc-from-dict into lp:u1db

Proposed by Eric Casteleijn
Status: Merged
Approved by: Eric Casteleijn
Approved revision: 359
Merged at revision: 357
Proposed branch: lp:~thisfred/u1db/create_doc-from-dict
Merge into: lp:u1db
Diff against target: 2648 lines (+447/-393)
21 files modified
README (+1/-1)
html-docs/high-level-api.rst (+10/-10)
html-docs/quickstart.rst (+3/-3)
include/u1db/u1db.h (+2/-2)
src/u1db.c (+2/-2)
u1db/__init__.py (+16/-1)
u1db/backends/__init__.py (+12/-3)
u1db/commandline/client.py (+1/-1)
u1db/remote/http_database.py (+1/-1)
u1db/tests/c_backend_wrapper.pyx (+4/-4)
u1db/tests/commandline/test_client.py (+20/-20)
u1db/tests/test_backends.py (+250/-220)
u1db/tests/test_c_backend.py (+32/-32)
u1db/tests/test_http_app.py (+18/-18)
u1db/tests/test_http_database.py (+2/-2)
u1db/tests/test_open.py (+1/-1)
u1db/tests/test_remote_sync_target.py (+2/-2)
u1db/tests/test_sqlite_backend.py (+7/-7)
u1db/tests/test_sync.py (+61/-61)
u1todo/test_u1todo.py (+1/-1)
u1todo/u1todo.py (+1/-1)
To merge this branch: bzr merge lp:~thisfred/u1db/create_doc-from-dict
Reviewer Review Type Date Requested Status
Lucio Torre (community) Approve
Review via email: mp+115821@code.launchpad.net

Commit message

since doc.content now returns a python dictionary, db.create_doc() should also take one. This means that both are now optional API. The old create_doc() was renamed to create_doc_from_json().

Description of the change

since doc.content now returns a python dictionary, db.create_doc() should also take one. This means that both are now optional API. The old create_doc() was renamed to create_doc_from_json().

To post a comment you must log in.
358. By Eric Casteleijn

unchanged: attach bug

359. By Eric Casteleijn

changed api doc

Revision history for this message
Lucio Torre (lucio.torre) wrote :

thanks

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'README'
--- README 2012-05-10 19:11:54 +0000
+++ README 2012-07-19 20:11:24 +0000
@@ -12,7 +12,7 @@
1212
13 import u1db13 import u1db
14 db = u1db.open(":memory:", create=True)14 db = u1db.open(":memory:", create=True)
15 doc = db.create_doc('{"firstname": "Bob", "familyname": "Foo"}')15 doc = db.create_doc({"firstname": "Bob", "familyname": "Foo"})
16 print "document id: %s" % doc.doc_id16 print "document id: %s" % doc.doc_id
17 print "document revision: %s" % doc.revision17 print "document revision: %s" % doc.revision
1818
1919
=== modified file 'html-docs/high-level-api.rst'
--- html-docs/high-level-api.rst 2012-07-16 16:45:45 +0000
+++ html-docs/high-level-api.rst 2012-07-19 20:11:24 +0000
@@ -19,14 +19,14 @@
19Creating and editing documents19Creating and editing documents
20------------------------------20------------------------------
2121
22To create a document, use ``create_doc()``. Code examples below are from22To create a document, use ``create_doc()``. Code examples below are
23:ref:`reference-implementation` in Python.23from :ref:`reference-implementation` in Python.
2424
25.. testcode ::25.. testcode ::
2626
27 import json, u1db27 import json, u1db
28 db = u1db.open(":memory:", create=True)28 db = u1db.open(":memory:", create=True)
29 doc = db.create_doc(json.dumps({"key": "value"}), doc_id="testdoc")29 doc = db.create_doc({"key": "value"}, doc_id="testdoc")
30 print doc.content30 print doc.content
31 print doc.doc_id31 print doc.doc_id
3232
@@ -44,10 +44,10 @@
4444
45 import json, u1db45 import json, u1db
46 db = u1db.open(":memory:", create=True)46 db = u1db.open(":memory:", create=True)
47 doc1 = db.create_doc(json.dumps({"key1": "value1"}), doc_id="doc1")47 doc1 = db.create_doc({"key1": "value1"}, doc_id="doc1")
48 # the next line should fail because it's creating a doc that already exists48 # the next line should fail because it's creating a doc that already exists
49 try:49 try:
50 doc1fail = db.create_doc(json.dumps({"key1fail": "value1fail"}), doc_id="doc1")50 doc1fail = db.create_doc({"key1fail": "value1fail"}, doc_id="doc1")
51 except u1db.errors.RevisionConflict:51 except u1db.errors.RevisionConflict:
52 print "There was a conflict when creating the doc!"52 print "There was a conflict when creating the doc!"
53 print "Now editing the doc with the doc object we got back..."53 print "Now editing the doc with the doc object we got back..."
@@ -68,7 +68,7 @@
6868
69 import json, u1db69 import json, u1db
70 db = u1db.open(":memory:", create=True)70 db = u1db.open(":memory:", create=True)
71 doc = db.create_doc(json.dumps({"key": "value"}))71 doc = db.create_doc({"key": "value"})
72 db.delete_doc(doc)72 db.delete_doc(doc)
73 print db.get_doc(doc.doc_id)73 print db.get_doc(doc.doc_id)
74 doc = db.get_doc(doc.doc_id, include_deleted=True)74 doc = db.get_doc(doc.doc_id, include_deleted=True)
@@ -88,7 +88,7 @@
8888
89 import json, u1db89 import json, u1db
90 db = u1db.open(":memory:", create=True)90 db = u1db.open(":memory:", create=True)
91 doc = db.create_doc(json.dumps({"key": "value"}), doc_id="testdoc")91 doc = db.create_doc({"key": "value"}, doc_id="testdoc")
92 doc1 = db.get_doc("testdoc")92 doc1 = db.get_doc("testdoc")
93 print doc1.content93 print doc1.content
94 print doc1.doc_id94 print doc1.doc_id
@@ -104,8 +104,8 @@
104104
105 import json, u1db105 import json, u1db
106 db = u1db.open(":memory:", create=True)106 db = u1db.open(":memory:", create=True)
107 doc1 = db.create_doc(json.dumps({"key": "value"}), doc_id="testdoc1")107 doc1 = db.create_doc({"key": "value"}, doc_id="testdoc1")
108 doc2 = db.create_doc(json.dumps({"key": "value"}), doc_id="testdoc2")108 doc2 = db.create_doc({"key": "value"}, doc_id="testdoc2")
109 for doc in db.get_docs(["testdoc2","testdoc1"]):109 for doc in db.get_docs(["testdoc2","testdoc1"]):
110 print doc.doc_id110 print doc.doc_id
111111
@@ -119,7 +119,7 @@
119Document functions119Document functions
120^^^^^^^^^^^^^^^^^^120^^^^^^^^^^^^^^^^^^
121121
122 * create_doc(JSON string, optional_doc_id)122 * create_doc(dictionary, optional_doc_id)
123 * put_doc(Document)123 * put_doc(Document)
124 * get_doc(doc_id)124 * get_doc(doc_id)
125 * get_docs(list_of_doc_ids)125 * get_docs(list_of_doc_ids)
126126
=== modified file 'html-docs/quickstart.rst'
--- html-docs/quickstart.rst 2012-07-16 16:20:53 +0000
+++ html-docs/quickstart.rst 2012-07-19 20:11:24 +0000
@@ -29,16 +29,16 @@
29 >>> import u1db, json, tempfile29 >>> import u1db, json, tempfile
30 >>> db = u1db.open(":memory:", create=True)30 >>> db = u1db.open(":memory:", create=True)
3131
32 >>> content = json.dumps({"name": "Alan Hansen"}) # create a document32 >>> content = {"name": "Alan Hansen"} # create a document
33 >>> doc = db.create_doc(content)33 >>> doc = db.create_doc(content)
34 >>> doc.content34 >>> doc.content
35 {'name': 'Alan Hansen'}35 {'name': 'Alan Hansen'}
36 >>> doc.content = json.dumps({"name": "Alan Hansen", "position": "defence"}) # update the document's content36 >>> doc.content = json.dumps({"name": "Alan Hansen", "position": "defence"}) # update the document's content
37 >>> rev = db.put_doc(doc)37 >>> rev = db.put_doc(doc)
3838
39 >>> content = json.dumps({"name": "John Barnes", "position": "forward"}) # create more documents39 >>> content = {"name": "John Barnes", "position": "forward"} # create more documents
40 >>> doc2 = db.create_doc(content)40 >>> doc2 = db.create_doc(content)
41 >>> content = json.dumps({"name": "Ian Rush", "position": "forward"})41 >>> content = {"name": "Ian Rush", "position": "forward"}
42 >>> doc2 = db.create_doc(content)42 >>> doc2 = db.create_doc(content)
4343
44 >>> db.create_index("by-position", "position") # create an index by passing a field name44 >>> db.create_index("by-position", "position") # create an index by passing a field name
4545
=== modified file 'include/u1db/u1db.h'
--- include/u1db/u1db.h 2012-07-11 17:19:42 +0000
+++ include/u1db/u1db.h 2012-07-19 20:11:24 +0000
@@ -126,8 +126,8 @@
126 * freed with u1db_free_doc126 * freed with u1db_free_doc
127 * @return a status code indicating success or failure.127 * @return a status code indicating success or failure.
128 */128 */
129int u1db_create_doc(u1database *db, const char *json, const char *doc_id,129int u1db_create_doc_from_json(u1database *db, const char *json,
130 u1db_document **doc);130 const char *doc_id, u1db_document **doc);
131131
132/**132/**
133 * Put new document content for the given document identifier.133 * Put new document content for the given document identifier.
134134
=== modified file 'src/u1db.c'
--- src/u1db.c 2012-07-13 22:09:11 +0000
+++ src/u1db.c 2012-07-19 20:11:24 +0000
@@ -309,8 +309,8 @@
309}309}
310310
311int311int
312u1db_create_doc(u1database *db, const char *json, const char *doc_id,312u1db_create_doc_from_json(u1database *db, const char *json, const char *doc_id,
313 u1db_document **doc)313 u1db_document **doc)
314{314{
315 char *local_doc_id = NULL;315 char *local_doc_id = NULL;
316 int status;316 int status;
317317
=== modified file 'u1db/__init__.py'
--- u1db/__init__.py 2012-07-19 16:54:26 +0000
+++ u1db/__init__.py 2012-07-19 20:11:24 +0000
@@ -136,12 +136,27 @@
136 If the database specifies a maximum document size and the document136 If the database specifies a maximum document size and the document
137 exceeds it, create will fail and raise a DocumentTooBig exception.137 exceeds it, create will fail and raise a DocumentTooBig exception.
138138
139 :param content: The JSON document string139 :param content: A Python dictionary.
140 :param doc_id: An optional identifier specifying the document id.140 :param doc_id: An optional identifier specifying the document id.
141 :return: Document141 :return: Document
142 """142 """
143 raise NotImplementedError(self.create_doc)143 raise NotImplementedError(self.create_doc)
144144
145 def create_doc_from_json(self, json, doc_id=None):
146 """Create a new document.
147
148 You can optionally specify the document identifier, but the document
149 must not already exist. See 'put_doc' if you want to override an
150 existing document.
151 If the database specifies a maximum document size and the document
152 exceeds it, create will fail and raise a DocumentTooBig exception.
153
154 :param json: The JSON document string
155 :param doc_id: An optional identifier specifying the document id.
156 :return: Document
157 """
158 raise NotImplementedError(self.create_doc_from_json)
159
145 def put_doc(self, doc):160 def put_doc(self, doc):
146 """Update a document.161 """Update a document.
147 If the document currently has conflicts, put will fail.162 If the document currently has conflicts, put will fail.
148163
=== modified file 'u1db/backends/__init__.py'
--- u1db/backends/__init__.py 2012-07-10 22:27:06 +0000
+++ u1db/backends/__init__.py 2012-07-19 20:11:24 +0000
@@ -17,6 +17,7 @@
17"""Abstract classes and common implementations for the backends."""17"""Abstract classes and common implementations for the backends."""
1818
19import re19import re
20import simplejson
20import uuid21import uuid
2122
22import u1db23import u1db
@@ -85,9 +86,17 @@
85 raise NotImplementedError(self._has_conflicts)86 raise NotImplementedError(self._has_conflicts)
8687
87 def create_doc(self, content, doc_id=None):88 def create_doc(self, content, doc_id=None):
88 if doc_id is None:89 json = simplejson.dumps(content)
89 doc_id = self._allocate_doc_id()90 if doc_id is None:
90 doc = self._factory(doc_id, None, content)91 doc_id = self._allocate_doc_id()
92 doc = self._factory(doc_id, None, json)
93 self.put_doc(doc)
94 return doc
95
96 def create_doc_from_json(self, json, doc_id=None):
97 if doc_id is None:
98 doc_id = self._allocate_doc_id()
99 doc = self._factory(doc_id, None, json)
91 self.put_doc(doc)100 self.put_doc(doc)
92 return doc101 return doc
93102
94103
=== modified file 'u1db/commandline/client.py'
--- u1db/commandline/client.py 2012-06-11 12:37:40 +0000
+++ u1db/commandline/client.py 2012-07-19 20:11:24 +0000
@@ -78,7 +78,7 @@
78 if infile is None:78 if infile is None:
79 infile = self.stdin79 infile = self.stdin
80 db = self._open(database, create=False)80 db = self._open(database, create=False)
81 doc = db.create_doc(infile.read(), doc_id=doc_id)81 doc = db.create_doc_from_json(infile.read(), doc_id=doc_id)
82 self.stderr.write('id: %s\nrev: %s\n' % (doc.doc_id, doc.rev))82 self.stderr.write('id: %s\nrev: %s\n' % (doc.doc_id, doc.rev))
8383
84client_commands.register(CmdCreate)84client_commands.register(CmdCreate)
8585
=== modified file 'u1db/remote/http_database.py'
--- u1db/remote/http_database.py 2012-07-13 21:46:01 +0000
+++ u1db/remote/http_database.py 2012-07-19 20:11:24 +0000
@@ -119,7 +119,7 @@
119 docs.append(doc)119 docs.append(doc)
120 return docs120 return docs
121121
122 def create_doc(self, content, doc_id=None):122 def create_doc_from_json(self, content, doc_id=None):
123 if doc_id is None:123 if doc_id is None:
124 doc_id = 'D-%s' % (uuid.uuid4().hex,)124 doc_id = 'D-%s' % (uuid.uuid4().hex,)
125 res, headers = self._request_json('PUT', ['doc', doc_id], {},125 res, headers = self._request_json('PUT', ['doc', doc_id], {},
126126
=== modified file 'u1db/tests/c_backend_wrapper.pyx'
--- u1db/tests/c_backend_wrapper.pyx 2012-07-17 15:44:54 +0000
+++ u1db/tests/c_backend_wrapper.pyx 2012-07-19 20:11:24 +0000
@@ -70,8 +70,8 @@
70 int u1db_set_replica_uid(u1database *, char *replica_uid)70 int u1db_set_replica_uid(u1database *, char *replica_uid)
71 int u1db_set_document_size_limit(u1database *, int limit)71 int u1db_set_document_size_limit(u1database *, int limit)
72 int u1db_get_replica_uid(u1database *, const_char_ptr *replica_uid)72 int u1db_get_replica_uid(u1database *, const_char_ptr *replica_uid)
73 int u1db_create_doc(u1database *db, char *json, char *doc_id,73 int u1db_create_doc_from_json(u1database *db, char *json, char *doc_id,
74 u1db_document **doc)74 u1db_document **doc)
75 int u1db_delete_doc(u1database *db, u1db_document *doc)75 int u1db_delete_doc(u1database *db, u1db_document *doc)
76 int u1db_get_doc(u1database *db, char *doc_id, int include_deleted,76 int u1db_get_doc(u1database *db, char *doc_id, int include_deleted,
77 u1db_document **doc)77 u1db_document **doc)
@@ -966,7 +966,7 @@
966 finally:966 finally:
967 u1db__free_table(&tbl)967 u1db__free_table(&tbl)
968968
969 def create_doc(self, content, doc_id=None):969 def create_doc_from_json(self, json, doc_id=None):
970 cdef u1db_document *doc = NULL970 cdef u1db_document *doc = NULL
971 cdef char *c_doc_id971 cdef char *c_doc_id
972972
@@ -975,7 +975,7 @@
975 else:975 else:
976 c_doc_id = doc_id976 c_doc_id = doc_id
977 handle_status('Failed to create_doc',977 handle_status('Failed to create_doc',
978 u1db_create_doc(self._db, content, c_doc_id, &doc))978 u1db_create_doc_from_json(self._db, json, c_doc_id, &doc))
979 pydoc = CDocument()979 pydoc = CDocument()
980 pydoc._doc = doc980 pydoc._doc = doc
981 return pydoc981 return pydoc
982982
=== modified file 'u1db/tests/commandline/test_client.py'
--- u1db/tests/commandline/test_client.py 2012-07-10 22:27:06 +0000
+++ u1db/tests/commandline/test_client.py 2012-07-19 20:11:24 +0000
@@ -210,7 +210,7 @@
210class TestCmdDelete(TestCaseWithDB):210class TestCmdDelete(TestCaseWithDB):
211211
212 def test_delete(self):212 def test_delete(self):
213 doc = self.db.create_doc(tests.simple_doc)213 doc = self.db.create_doc_from_json(tests.simple_doc)
214 cmd = self.make_command(client.CmdDelete)214 cmd = self.make_command(client.CmdDelete)
215 cmd.run(self.db_path, doc.doc_id, doc.rev)215 cmd.run(self.db_path, doc.doc_id, doc.rev)
216 doc2 = self.db.get_doc(doc.doc_id, include_deleted=True)216 doc2 = self.db.get_doc(doc.doc_id, include_deleted=True)
@@ -221,7 +221,7 @@
221 self.assertEqual('rev: %s\n' % (doc2.rev,), cmd.stderr.getvalue())221 self.assertEqual('rev: %s\n' % (doc2.rev,), cmd.stderr.getvalue())
222222
223 def test_delete_fails_if_nonexistent(self):223 def test_delete_fails_if_nonexistent(self):
224 doc = self.db.create_doc(tests.simple_doc)224 doc = self.db.create_doc_from_json(tests.simple_doc)
225 db2_path = self.db_path + '.typo'225 db2_path = self.db_path + '.typo'
226 cmd = self.make_command(client.CmdDelete)226 cmd = self.make_command(client.CmdDelete)
227 # TODO: We should really not be showing a traceback here. But we need227 # TODO: We should really not be showing a traceback here. But we need
@@ -242,7 +242,7 @@
242 cmd.run, self.db_path, 'no-doc-id', 'no-rev')242 cmd.run, self.db_path, 'no-doc-id', 'no-rev')
243243
244 def test_delete_bad_rev(self):244 def test_delete_bad_rev(self):
245 doc = self.db.create_doc(tests.simple_doc)245 doc = self.db.create_doc_from_json(tests.simple_doc)
246 cmd = self.make_command(client.CmdDelete)246 cmd = self.make_command(client.CmdDelete)
247 self.assertRaises(errors.RevisionConflict,247 self.assertRaises(errors.RevisionConflict,
248 cmd.run, self.db_path, doc.doc_id, 'not-the-actual-doc-rev:1')248 cmd.run, self.db_path, doc.doc_id, 'not-the-actual-doc-rev:1')
@@ -253,7 +253,7 @@
253253
254 def setUp(self):254 def setUp(self):
255 super(TestCmdGet, self).setUp()255 super(TestCmdGet, self).setUp()
256 self.doc = self.db.create_doc(tests.simple_doc, doc_id='my-test-doc')256 self.doc = self.db.create_doc_from_json(tests.simple_doc, doc_id='my-test-doc')
257257
258 def test_get_simple(self):258 def test_get_simple(self):
259 cmd = self.make_command(client.CmdGet)259 cmd = self.make_command(client.CmdGet)
@@ -292,14 +292,14 @@
292292
293 def setUp(self):293 def setUp(self):
294 super(TestCmdGetDocConflicts, self).setUp()294 super(TestCmdGetDocConflicts, self).setUp()
295 self.doc1 = self.db.create_doc(tests.simple_doc, doc_id='my-doc')295 self.doc1 = self.db.create_doc_from_json(tests.simple_doc, doc_id='my-doc')
296 self.doc2 = self.make_document('my-doc', 'other:1', '{}', False)296 self.doc2 = self.make_document('my-doc', 'other:1', '{}', False)
297 self.db._put_doc_if_newer(297 self.db._put_doc_if_newer(
298 self.doc2, save_conflict=True, replica_uid='r', replica_gen=1,298 self.doc2, save_conflict=True, replica_uid='r', replica_gen=1,
299 replica_trans_id='foo')299 replica_trans_id='foo')
300300
301 def test_get_doc_conflicts_none(self):301 def test_get_doc_conflicts_none(self):
302 self.db.create_doc(tests.simple_doc, doc_id='a-doc')302 self.db.create_doc_from_json(tests.simple_doc, doc_id='a-doc')
303 cmd = self.make_command(client.CmdGetDocConflicts)303 cmd = self.make_command(client.CmdGetDocConflicts)
304 cmd.run(self.db_path, 'a-doc')304 cmd.run(self.db_path, 'a-doc')
305 self.assertEqual([],305 self.assertEqual([],
@@ -354,7 +354,7 @@
354354
355 def setUp(self):355 def setUp(self):
356 super(TestCmdPut, self).setUp()356 super(TestCmdPut, self).setUp()
357 self.doc = self.db.create_doc(tests.simple_doc, doc_id='my-test-doc')357 self.doc = self.db.create_doc_from_json(tests.simple_doc, doc_id='my-test-doc')
358358
359 def test_put_simple(self):359 def test_put_simple(self):
360 cmd = self.make_command(client.CmdPut)360 cmd = self.make_command(client.CmdPut)
@@ -416,7 +416,7 @@
416416
417 def setUp(self):417 def setUp(self):
418 super(TestCmdResolve, self).setUp()418 super(TestCmdResolve, self).setUp()
419 self.doc1 = self.db.create_doc(tests.simple_doc, doc_id='my-doc')419 self.doc1 = self.db.create_doc_from_json(tests.simple_doc, doc_id='my-doc')
420 self.doc2 = self.make_document('my-doc', 'other:1', '{}', False)420 self.doc2 = self.make_document('my-doc', 'other:1', '{}', False)
421 self.db._put_doc_if_newer(421 self.db._put_doc_if_newer(
422 self.doc2, save_conflict=True, replica_uid='r', replica_gen=1,422 self.doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -477,8 +477,8 @@
477 self.db2 = u1db_open(self.db2_path, create=True)477 self.db2 = u1db_open(self.db2_path, create=True)
478 self.addCleanup(self.db2.close)478 self.addCleanup(self.db2.close)
479 self.db2._set_replica_uid('test2')479 self.db2._set_replica_uid('test2')
480 self.doc = self.db.create_doc(tests.simple_doc, doc_id='test-id')480 self.doc = self.db.create_doc_from_json(tests.simple_doc, doc_id='test-id')
481 self.doc2 = self.db2.create_doc(tests.nested_doc, doc_id='my-test-id')481 self.doc2 = self.db2.create_doc_from_json(tests.nested_doc, doc_id='my-test-id')
482482
483 def test_sync(self):483 def test_sync(self):
484 cmd = self.make_command(client.CmdSync)484 cmd = self.make_command(client.CmdSync)
@@ -501,8 +501,8 @@
501 self.db2 = self.request_state._create_database('test2.db')501 self.db2 = self.request_state._create_database('test2.db')
502502
503 def test_sync_remote(self):503 def test_sync_remote(self):
504 doc1 = self.db.create_doc(tests.simple_doc)504 doc1 = self.db.create_doc_from_json(tests.simple_doc)
505 doc2 = self.db2.create_doc(tests.nested_doc)505 doc2 = self.db2.create_doc_from_json(tests.nested_doc)
506 db2_url = self.getURL('test2.db')506 db2_url = self.getURL('test2.db')
507 self.assertTrue(db2_url.startswith('http://'))507 self.assertTrue(db2_url.startswith('http://'))
508 self.assertTrue(db2_url.endswith('/test2.db'))508 self.assertTrue(db2_url.endswith('/test2.db'))
@@ -626,7 +626,7 @@
626626
627 def test_get_index_keys(self):627 def test_get_index_keys(self):
628 self.db.create_index("foo", "bar")628 self.db.create_index("foo", "bar")
629 self.db.create_doc('{"bar": 42}')629 self.db.create_doc_from_json('{"bar": 42}')
630 cmd = self.make_command(client.CmdGetIndexKeys)630 cmd = self.make_command(client.CmdGetIndexKeys)
631 retval = cmd.run(self.db_path, "foo")631 retval = cmd.run(self.db_path, "foo")
632 self.assertEqual(retval, None)632 self.assertEqual(retval, None)
@@ -635,7 +635,7 @@
635635
636 def test_get_index_keys_nonascii(self):636 def test_get_index_keys_nonascii(self):
637 self.db.create_index("foo", "bar")637 self.db.create_index("foo", "bar")
638 self.db.create_doc('{"bar": "\u00a4"}')638 self.db.create_doc_from_json('{"bar": "\u00a4"}')
639 cmd = self.make_command(client.CmdGetIndexKeys)639 cmd = self.make_command(client.CmdGetIndexKeys)
640 retval = cmd.run(self.db_path, "foo")640 retval = cmd.run(self.db_path, "foo")
641 self.assertEqual(retval, None)641 self.assertEqual(retval, None)
@@ -669,8 +669,8 @@
669669
670 def test_get_from_index(self):670 def test_get_from_index(self):
671 self.db.create_index("index", "key")671 self.db.create_index("index", "key")
672 doc1 = self.db.create_doc(tests.simple_doc)672 doc1 = self.db.create_doc_from_json(tests.simple_doc)
673 doc2 = self.db.create_doc(tests.nested_doc)673 doc2 = self.db.create_doc_from_json(tests.nested_doc)
674 cmd = self.make_command(client.CmdGetFromIndex)674 cmd = self.make_command(client.CmdGetFromIndex)
675 retval = cmd.run(self.db_path, "index", ["value"])675 retval = cmd.run(self.db_path, "index", ["value"])
676 self.assertEqual(retval, None)676 self.assertEqual(retval, None)
@@ -815,7 +815,7 @@
815 self.assertRegexpMatches(stripped, expected_re)815 self.assertRegexpMatches(stripped, expected_re)
816816
817 def test_get(self):817 def test_get(self):
818 doc = self.db.create_doc(tests.simple_doc, doc_id='test-id')818 doc = self.db.create_doc_from_json(tests.simple_doc, doc_id='test-id')
819 ret, stdout, stderr = self.run_main(['get', self.db_path, 'test-id'])819 ret, stdout, stderr = self.run_main(['get', self.db_path, 'test-id'])
820 self.assertEqual(0, ret)820 self.assertEqual(0, ret)
821 self.assertEqual(tests.simple_doc + "\n", stdout)821 self.assertEqual(tests.simple_doc + "\n", stdout)
@@ -824,7 +824,7 @@
824 self.assertEqual(1, ret)824 self.assertEqual(1, ret)
825825
826 def test_delete(self):826 def test_delete(self):
827 doc = self.db.create_doc(tests.simple_doc, doc_id='test-id')827 doc = self.db.create_doc_from_json(tests.simple_doc, doc_id='test-id')
828 ret, stdout, stderr = self.run_main(828 ret, stdout, stderr = self.run_main(
829 ['delete', self.db_path, 'test-id', doc.rev])829 ['delete', self.db_path, 'test-id', doc.rev])
830 doc = self.db.get_doc('test-id', include_deleted=True)830 doc = self.db.get_doc('test-id', include_deleted=True)
@@ -838,7 +838,7 @@
838 u1db_open(path, create=False)838 u1db_open(path, create=False)
839839
840 def test_put(self):840 def test_put(self):
841 doc = self.db.create_doc(tests.simple_doc, doc_id='test-id')841 doc = self.db.create_doc_from_json(tests.simple_doc, doc_id='test-id')
842 ret, stdout, stderr = self.run_main(842 ret, stdout, stderr = self.run_main(
843 ['put', self.db_path, 'test-id', doc.rev],843 ['put', self.db_path, 'test-id', doc.rev],
844 stdin=tests.nested_doc)844 stdin=tests.nested_doc)
@@ -850,7 +850,7 @@
850 self.assertEqual('rev: %s\n' % (doc.rev,), stderr)850 self.assertEqual('rev: %s\n' % (doc.rev,), stderr)
851851
852 def test_sync(self):852 def test_sync(self):
853 doc = self.db.create_doc(tests.simple_doc, doc_id='test-id')853 doc = self.db.create_doc_from_json(tests.simple_doc, doc_id='test-id')
854 self.db2_path = self.working_dir + '/test2.db'854 self.db2_path = self.working_dir + '/test2.db'
855 self.db2 = u1db_open(self.db2_path, create=True)855 self.db2 = u1db_open(self.db2_path, create=True)
856 self.addCleanup(self.db2.close)856 self.addCleanup(self.db2.close)
857857
=== modified file 'u1db/tests/test_backends.py'
--- u1db/tests/test_backends.py 2012-07-13 22:09:11 +0000
+++ u1db/tests/test_backends.py 2012-07-19 20:11:24 +0000
@@ -99,27 +99,28 @@
99 self.db.close()99 self.db.close()
100100
101 def test_create_doc_allocating_doc_id(self):101 def test_create_doc_allocating_doc_id(self):
102 doc = self.db.create_doc(simple_doc)102 doc = self.db.create_doc_from_json(simple_doc)
103 self.assertNotEqual(None, doc.doc_id)103 self.assertNotEqual(None, doc.doc_id)
104 self.assertNotEqual(None, doc.rev)104 self.assertNotEqual(None, doc.rev)
105 self.assertGetDoc(self.db, doc.doc_id, doc.rev, simple_doc, False)105 self.assertGetDoc(self.db, doc.doc_id, doc.rev, simple_doc, False)
106106
107 def test_create_doc_different_ids_same_db(self):107 def test_create_doc_different_ids_same_db(self):
108 doc1 = self.db.create_doc(simple_doc)108 doc1 = self.db.create_doc_from_json(simple_doc)
109 doc2 = self.db.create_doc(nested_doc)109 doc2 = self.db.create_doc_from_json(nested_doc)
110 self.assertNotEqual(doc1.doc_id, doc2.doc_id)110 self.assertNotEqual(doc1.doc_id, doc2.doc_id)
111111
112 def test_create_doc_with_id(self):112 def test_create_doc_with_id(self):
113 doc = self.db.create_doc(simple_doc, doc_id='my-id')113 doc = self.db.create_doc_from_json(simple_doc, doc_id='my-id')
114 self.assertEqual('my-id', doc.doc_id)114 self.assertEqual('my-id', doc.doc_id)
115 self.assertNotEqual(None, doc.rev)115 self.assertNotEqual(None, doc.rev)
116 self.assertGetDoc(self.db, doc.doc_id, doc.rev, simple_doc, False)116 self.assertGetDoc(self.db, doc.doc_id, doc.rev, simple_doc, False)
117117
118 def test_create_doc_existing_id(self):118 def test_create_doc_existing_id(self):
119 doc = self.db.create_doc(simple_doc)119 doc = self.db.create_doc_from_json(simple_doc)
120 new_content = '{"something": "else"}'120 new_content = '{"something": "else"}'
121 self.assertRaises(errors.RevisionConflict, self.db.create_doc,121 self.assertRaises(
122 new_content, doc.doc_id)122 errors.RevisionConflict, self.db.create_doc_from_json,
123 new_content, doc.doc_id)
123 self.assertGetDoc(self.db, doc.doc_id, doc.rev, simple_doc, False)124 self.assertGetDoc(self.db, doc.doc_id, doc.rev, simple_doc, False)
124125
125 def test_put_doc_creating_initial(self):126 def test_put_doc_creating_initial(self):
@@ -133,7 +134,7 @@
133 self.assertRaises(errors.InvalidDocId, self.db.put_doc, doc)134 self.assertRaises(errors.InvalidDocId, self.db.put_doc, doc)
134135
135 def test_put_doc_update(self):136 def test_put_doc_update(self):
136 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')137 doc = self.db.create_doc_from_json(simple_doc, doc_id='my_doc_id')
137 orig_rev = doc.rev138 orig_rev = doc.rev
138 doc.set_json('{"updated": "stuff"}')139 doc.set_json('{"updated": "stuff"}')
139 new_rev = self.db.put_doc(doc)140 new_rev = self.db.put_doc(doc)
@@ -144,12 +145,12 @@
144145
145 def test_put_non_ascii_key(self):146 def test_put_non_ascii_key(self):
146 content = simplejson.dumps({u'key\xe5': u'val'})147 content = simplejson.dumps({u'key\xe5': u'val'})
147 doc = self.db.create_doc(content, doc_id='my_doc')148 doc = self.db.create_doc_from_json(content, doc_id='my_doc')
148 self.assertGetDoc(self.db, 'my_doc', doc.rev, content, False)149 self.assertGetDoc(self.db, 'my_doc', doc.rev, content, False)
149150
150 def test_put_non_ascii_value(self):151 def test_put_non_ascii_value(self):
151 content = simplejson.dumps({'key': u'\xe5'})152 content = simplejson.dumps({'key': u'\xe5'})
152 doc = self.db.create_doc(content, doc_id='my_doc')153 doc = self.db.create_doc_from_json(content, doc_id='my_doc')
153 self.assertGetDoc(self.db, 'my_doc', doc.rev, content, False)154 self.assertGetDoc(self.db, 'my_doc', doc.rev, content, False)
154155
155 def test_put_doc_refuses_no_id(self):156 def test_put_doc_refuses_no_id(self):
@@ -173,7 +174,7 @@
173 self.assertRaises(errors.InvalidDocId, self.db.put_doc, doc)174 self.assertRaises(errors.InvalidDocId, self.db.put_doc, doc)
174175
175 def test_put_fails_with_bad_old_rev(self):176 def test_put_fails_with_bad_old_rev(self):
176 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')177 doc = self.db.create_doc_from_json(simple_doc, doc_id='my_doc_id')
177 old_rev = doc.rev178 old_rev = doc.rev
178 bad_doc = self.make_document(doc.doc_id, 'other:1',179 bad_doc = self.make_document(doc.doc_id, 'other:1',
179 '{"something": "else"}')180 '{"something": "else"}')
@@ -181,11 +182,11 @@
181 self.assertGetDoc(self.db, 'my_doc_id', old_rev, simple_doc, False)182 self.assertGetDoc(self.db, 'my_doc_id', old_rev, simple_doc, False)
182183
183 def test_create_succeeds_after_delete(self):184 def test_create_succeeds_after_delete(self):
184 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')185 doc = self.db.create_doc_from_json(simple_doc, doc_id='my_doc_id')
185 self.db.delete_doc(doc)186 self.db.delete_doc(doc)
186 deleted_doc = self.db.get_doc('my_doc_id', include_deleted=True)187 deleted_doc = self.db.get_doc('my_doc_id', include_deleted=True)
187 deleted_vc = vectorclock.VectorClockRev(deleted_doc.rev)188 deleted_vc = vectorclock.VectorClockRev(deleted_doc.rev)
188 new_doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')189 new_doc = self.db.create_doc_from_json(simple_doc, doc_id='my_doc_id')
189 self.assertGetDoc(self.db, 'my_doc_id', new_doc.rev, simple_doc, False)190 self.assertGetDoc(self.db, 'my_doc_id', new_doc.rev, simple_doc, False)
190 new_vc = vectorclock.VectorClockRev(new_doc.rev)191 new_vc = vectorclock.VectorClockRev(new_doc.rev)
191 self.assertTrue(192 self.assertTrue(
@@ -193,7 +194,7 @@
193 "%s does not supersede %s" % (new_doc.rev, deleted_doc.rev))194 "%s does not supersede %s" % (new_doc.rev, deleted_doc.rev))
194195
195 def test_put_succeeds_after_delete(self):196 def test_put_succeeds_after_delete(self):
196 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')197 doc = self.db.create_doc_from_json(simple_doc, doc_id='my_doc_id')
197 self.db.delete_doc(doc)198 self.db.delete_doc(doc)
198 deleted_doc = self.db.get_doc('my_doc_id', include_deleted=True)199 deleted_doc = self.db.get_doc('my_doc_id', include_deleted=True)
199 deleted_vc = vectorclock.VectorClockRev(deleted_doc.rev)200 deleted_vc = vectorclock.VectorClockRev(deleted_doc.rev)
@@ -206,46 +207,46 @@
206 "%s does not supersede %s" % (doc2.rev, deleted_doc.rev))207 "%s does not supersede %s" % (doc2.rev, deleted_doc.rev))
207208
208 def test_get_doc_after_put(self):209 def test_get_doc_after_put(self):
209 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')210 doc = self.db.create_doc_from_json(simple_doc, doc_id='my_doc_id')
210 self.assertGetDoc(self.db, 'my_doc_id', doc.rev, simple_doc, False)211 self.assertGetDoc(self.db, 'my_doc_id', doc.rev, simple_doc, False)
211212
212 def test_get_doc_nonexisting(self):213 def test_get_doc_nonexisting(self):
213 self.assertIs(None, self.db.get_doc('non-existing'))214 self.assertIs(None, self.db.get_doc('non-existing'))
214215
215 def test_get_doc_deleted(self):216 def test_get_doc_deleted(self):
216 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')217 doc = self.db.create_doc_from_json(simple_doc, doc_id='my_doc_id')
217 self.db.delete_doc(doc)218 self.db.delete_doc(doc)
218 self.assertIs(None, self.db.get_doc('my_doc_id'))219 self.assertIs(None, self.db.get_doc('my_doc_id'))
219220
220 def test_get_doc_include_deleted(self):221 def test_get_doc_include_deleted(self):
221 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')222 doc = self.db.create_doc_from_json(simple_doc, doc_id='my_doc_id')
222 self.db.delete_doc(doc)223 self.db.delete_doc(doc)
223 self.assertGetDocIncludeDeleted(224 self.assertGetDocIncludeDeleted(
224 self.db, doc.doc_id, doc.rev, None, False)225 self.db, doc.doc_id, doc.rev, None, False)
225226
226 def test_get_docs(self):227 def test_get_docs(self):
227 doc1 = self.db.create_doc(simple_doc)228 doc1 = self.db.create_doc_from_json(simple_doc)
228 doc2 = self.db.create_doc(nested_doc)229 doc2 = self.db.create_doc_from_json(nested_doc)
229 self.assertEqual([doc1, doc2],230 self.assertEqual([doc1, doc2],
230 self.db.get_docs([doc1.doc_id, doc2.doc_id]))231 self.db.get_docs([doc1.doc_id, doc2.doc_id]))
231232
232 def test_get_docs_deleted(self):233 def test_get_docs_deleted(self):
233 doc1 = self.db.create_doc(simple_doc)234 doc1 = self.db.create_doc_from_json(simple_doc)
234 doc2 = self.db.create_doc(nested_doc)235 doc2 = self.db.create_doc_from_json(nested_doc)
235 self.db.delete_doc(doc1)236 self.db.delete_doc(doc1)
236 self.assertEqual([doc2], self.db.get_docs([doc1.doc_id, doc2.doc_id]))237 self.assertEqual([doc2], self.db.get_docs([doc1.doc_id, doc2.doc_id]))
237238
238 def test_get_docs_include_deleted(self):239 def test_get_docs_include_deleted(self):
239 doc1 = self.db.create_doc(simple_doc)240 doc1 = self.db.create_doc_from_json(simple_doc)
240 doc2 = self.db.create_doc(nested_doc)241 doc2 = self.db.create_doc_from_json(nested_doc)
241 self.db.delete_doc(doc1)242 self.db.delete_doc(doc1)
242 self.assertEqual(243 self.assertEqual(
243 [doc1, doc2],244 [doc1, doc2],
244 self.db.get_docs([doc1.doc_id, doc2.doc_id], include_deleted=True))245 self.db.get_docs([doc1.doc_id, doc2.doc_id], include_deleted=True))
245246
246 def test_get_docs_request_ordered(self):247 def test_get_docs_request_ordered(self):
247 doc1 = self.db.create_doc(simple_doc)248 doc1 = self.db.create_doc_from_json(simple_doc)
248 doc2 = self.db.create_doc(nested_doc)249 doc2 = self.db.create_doc_from_json(nested_doc)
249 self.assertEqual([doc1, doc2],250 self.assertEqual([doc1, doc2],
250 self.db.get_docs([doc1.doc_id, doc2.doc_id]))251 self.db.get_docs([doc1.doc_id, doc2.doc_id]))
251 self.assertEqual([doc2, doc1],252 self.assertEqual([doc2, doc1],
@@ -255,15 +256,15 @@
255 self.assertEqual([], self.db.get_docs([]))256 self.assertEqual([], self.db.get_docs([]))
256257
257 def test_handles_nested_content(self):258 def test_handles_nested_content(self):
258 doc = self.db.create_doc(nested_doc)259 doc = self.db.create_doc_from_json(nested_doc)
259 self.assertGetDoc(self.db, doc.doc_id, doc.rev, nested_doc, False)260 self.assertGetDoc(self.db, doc.doc_id, doc.rev, nested_doc, False)
260261
261 def test_handles_doc_with_null(self):262 def test_handles_doc_with_null(self):
262 doc = self.db.create_doc('{"key": null}')263 doc = self.db.create_doc_from_json('{"key": null}')
263 self.assertGetDoc(self.db, doc.doc_id, doc.rev, '{"key": null}', False)264 self.assertGetDoc(self.db, doc.doc_id, doc.rev, '{"key": null}', False)
264265
265 def test_delete_doc(self):266 def test_delete_doc(self):
266 doc = self.db.create_doc(simple_doc)267 doc = self.db.create_doc_from_json(simple_doc)
267 self.assertGetDoc(self.db, doc.doc_id, doc.rev, simple_doc, False)268 self.assertGetDoc(self.db, doc.doc_id, doc.rev, simple_doc, False)
268 orig_rev = doc.rev269 orig_rev = doc.rev
269 self.db.delete_doc(doc)270 self.db.delete_doc(doc)
@@ -277,7 +278,7 @@
277 self.assertRaises(errors.DocumentDoesNotExist, self.db.delete_doc, doc)278 self.assertRaises(errors.DocumentDoesNotExist, self.db.delete_doc, doc)
278279
279 def test_delete_doc_already_deleted(self):280 def test_delete_doc_already_deleted(self):
280 doc = self.db.create_doc(simple_doc)281 doc = self.db.create_doc_from_json(simple_doc)
281 self.db.delete_doc(doc)282 self.db.delete_doc(doc)
282 self.assertRaises(errors.DocumentAlreadyDeleted,283 self.assertRaises(errors.DocumentAlreadyDeleted,
283 self.db.delete_doc, doc)284 self.db.delete_doc, doc)
@@ -285,19 +286,19 @@
285 self.db, doc.doc_id, doc.rev, None, False)286 self.db, doc.doc_id, doc.rev, None, False)
286287
287 def test_delete_doc_bad_rev(self):288 def test_delete_doc_bad_rev(self):
288 doc1 = self.db.create_doc(simple_doc)289 doc1 = self.db.create_doc_from_json(simple_doc)
289 self.assertGetDoc(self.db, doc1.doc_id, doc1.rev, simple_doc, False)290 self.assertGetDoc(self.db, doc1.doc_id, doc1.rev, simple_doc, False)
290 doc2 = self.make_document(doc1.doc_id, 'other:1', simple_doc)291 doc2 = self.make_document(doc1.doc_id, 'other:1', simple_doc)
291 self.assertRaises(errors.RevisionConflict, self.db.delete_doc, doc2)292 self.assertRaises(errors.RevisionConflict, self.db.delete_doc, doc2)
292 self.assertGetDoc(self.db, doc1.doc_id, doc1.rev, simple_doc, False)293 self.assertGetDoc(self.db, doc1.doc_id, doc1.rev, simple_doc, False)
293294
294 def test_delete_doc_sets_content_to_None(self):295 def test_delete_doc_sets_content_to_None(self):
295 doc = self.db.create_doc(simple_doc)296 doc = self.db.create_doc_from_json(simple_doc)
296 self.db.delete_doc(doc)297 self.db.delete_doc(doc)
297 self.assertIs(None, doc.get_json())298 self.assertIs(None, doc.get_json())
298299
299 def test_delete_doc_rev_supersedes(self):300 def test_delete_doc_rev_supersedes(self):
300 doc = self.db.create_doc(simple_doc)301 doc = self.db.create_doc_from_json(simple_doc)
301 doc.set_json(nested_doc)302 doc.set_json(nested_doc)
302 self.db.put_doc(doc)303 self.db.put_doc(doc)
303 doc.set_json('{"fishy": "content"}')304 doc.set_json('{"fishy": "content"}')
@@ -310,7 +311,7 @@
310 "%s does not supersede %s" % (doc.rev, old_rev))311 "%s does not supersede %s" % (doc.rev, old_rev))
311312
312 def test_delete_then_put(self):313 def test_delete_then_put(self):
313 doc = self.db.create_doc(simple_doc)314 doc = self.db.create_doc_from_json(simple_doc)
314 self.db.delete_doc(doc)315 self.db.delete_doc(doc)
315 self.assertGetDocIncludeDeleted(316 self.assertGetDocIncludeDeleted(
316 self.db, doc.doc_id, doc.rev, None, False)317 self.db, doc.doc_id, doc.rev, None, False)
@@ -331,7 +332,7 @@
331 def test_create_doc_refuses_oversized_documents(self):332 def test_create_doc_refuses_oversized_documents(self):
332 self.db.set_document_size_limit(1)333 self.db.set_document_size_limit(1)
333 self.assertRaises(334 self.assertRaises(
334 errors.DocumentTooBig, self.db.create_doc, simple_doc,335 errors.DocumentTooBig, self.db.create_doc_from_json, simple_doc,
335 doc_id='my_doc_id')336 doc_id='my_doc_id')
336337
337 def test_set_document_size_limit_zero(self):338 def test_set_document_size_limit_zero(self):
@@ -348,9 +349,9 @@
348 scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS349 scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
349350
350 def test_create_doc_different_ids_diff_db(self):351 def test_create_doc_different_ids_diff_db(self):
351 doc1 = self.db.create_doc(simple_doc)352 doc1 = self.db.create_doc_from_json(simple_doc)
352 db2 = self.create_database('other-uid')353 db2 = self.create_database('other-uid')
353 doc2 = db2.create_doc(simple_doc)354 doc2 = db2.create_doc_from_json(simple_doc)
354 self.assertNotEqual(doc1.doc_id, doc2.doc_id)355 self.assertNotEqual(doc1.doc_id, doc2.doc_id)
355356
356 def test_put_doc_refuses_slashes_picky(self):357 def test_put_doc_refuses_slashes_picky(self):
@@ -361,28 +362,28 @@
361 self.assertEqual([], self.db.get_all_docs()[1])362 self.assertEqual([], self.db.get_all_docs()[1])
362363
363 def test_get_all_docs(self):364 def test_get_all_docs(self):
364 doc1 = self.db.create_doc(simple_doc)365 doc1 = self.db.create_doc_from_json(simple_doc)
365 doc2 = self.db.create_doc(nested_doc)366 doc2 = self.db.create_doc_from_json(nested_doc)
366 self.assertEqual(367 self.assertEqual(
367 sorted([doc1, doc2]), sorted(self.db.get_all_docs()[1]))368 sorted([doc1, doc2]), sorted(self.db.get_all_docs()[1]))
368369
369 def test_get_all_docs_exclude_deleted(self):370 def test_get_all_docs_exclude_deleted(self):
370 doc1 = self.db.create_doc(simple_doc)371 doc1 = self.db.create_doc_from_json(simple_doc)
371 doc2 = self.db.create_doc(nested_doc)372 doc2 = self.db.create_doc_from_json(nested_doc)
372 self.db.delete_doc(doc2)373 self.db.delete_doc(doc2)
373 self.assertEqual([doc1], self.db.get_all_docs()[1])374 self.assertEqual([doc1], self.db.get_all_docs()[1])
374375
375 def test_get_all_docs_include_deleted(self):376 def test_get_all_docs_include_deleted(self):
376 doc1 = self.db.create_doc(simple_doc)377 doc1 = self.db.create_doc_from_json(simple_doc)
377 doc2 = self.db.create_doc(nested_doc)378 doc2 = self.db.create_doc_from_json(nested_doc)
378 self.db.delete_doc(doc2)379 self.db.delete_doc(doc2)
379 self.assertEqual(380 self.assertEqual(
380 sorted([doc1, doc2]),381 sorted([doc1, doc2]),
381 sorted(self.db.get_all_docs(include_deleted=True)[1]))382 sorted(self.db.get_all_docs(include_deleted=True)[1]))
382383
383 def test_get_all_docs_generation(self):384 def test_get_all_docs_generation(self):
384 self.db.create_doc(simple_doc)385 self.db.create_doc_from_json(simple_doc)
385 self.db.create_doc(nested_doc)386 self.db.create_doc_from_json(nested_doc)
386 self.assertEqual(2, self.db.get_all_docs()[0])387 self.assertEqual(2, self.db.get_all_docs()[0])
387388
388 def test_simple_put_doc_if_newer(self):389 def test_simple_put_doc_if_newer(self):
@@ -394,7 +395,7 @@
394 self.assertGetDoc(self.db, 'my-doc-id', 'test:1', simple_doc, False)395 self.assertGetDoc(self.db, 'my-doc-id', 'test:1', simple_doc, False)
395396
396 def test_simple_put_doc_if_newer_deleted(self):397 def test_simple_put_doc_if_newer_deleted(self):
397 self.db.create_doc('{}', doc_id='my-doc-id')398 self.db.create_doc_from_json('{}', doc_id='my-doc-id')
398 doc = self.make_document('my-doc-id', 'test:2', None)399 doc = self.make_document('my-doc-id', 'test:2', None)
399 state_at_gen = self.db._put_doc_if_newer(400 state_at_gen = self.db._put_doc_if_newer(
400 doc, save_conflict=False, replica_uid='r', replica_gen=1,401 doc, save_conflict=False, replica_uid='r', replica_gen=1,
@@ -405,7 +406,7 @@
405406
406 def test_put_doc_if_newer_already_superseded(self):407 def test_put_doc_if_newer_already_superseded(self):
407 orig_doc = '{"new": "doc"}'408 orig_doc = '{"new": "doc"}'
408 doc1 = self.db.create_doc(orig_doc)409 doc1 = self.db.create_doc_from_json(orig_doc)
409 doc1_rev1 = doc1.rev410 doc1_rev1 = doc1.rev
410 doc1.set_json(simple_doc)411 doc1.set_json(simple_doc)
411 self.db.put_doc(doc1)412 self.db.put_doc(doc1)
@@ -419,7 +420,7 @@
419 self.assertGetDoc(self.db, doc1.doc_id, doc1_rev2, simple_doc, False)420 self.assertGetDoc(self.db, doc1.doc_id, doc1_rev2, simple_doc, False)
420421
421 def test_put_doc_if_newer_autoresolve(self):422 def test_put_doc_if_newer_autoresolve(self):
422 doc1 = self.db.create_doc(simple_doc)423 doc1 = self.db.create_doc_from_json(simple_doc)
423 rev = doc1.rev424 rev = doc1.rev
424 doc = self.make_document(doc1.doc_id, "whatever:1", doc1.get_json())425 doc = self.make_document(doc1.doc_id, "whatever:1", doc1.get_json())
425 state, _ = self.db._put_doc_if_newer(426 state, _ = self.db._put_doc_if_newer(
@@ -433,14 +434,14 @@
433434
434 def test_put_doc_if_newer_already_converged(self):435 def test_put_doc_if_newer_already_converged(self):
435 orig_doc = '{"new": "doc"}'436 orig_doc = '{"new": "doc"}'
436 doc1 = self.db.create_doc(orig_doc)437 doc1 = self.db.create_doc_from_json(orig_doc)
437 state_at_gen = self.db._put_doc_if_newer(438 state_at_gen = self.db._put_doc_if_newer(
438 doc1, save_conflict=False, replica_uid='r', replica_gen=1,439 doc1, save_conflict=False, replica_uid='r', replica_gen=1,
439 replica_trans_id='foo')440 replica_trans_id='foo')
440 self.assertEqual(('converged', 1), state_at_gen)441 self.assertEqual(('converged', 1), state_at_gen)
441442
442 def test_put_doc_if_newer_conflicted(self):443 def test_put_doc_if_newer_conflicted(self):
443 doc1 = self.db.create_doc(simple_doc)444 doc1 = self.db.create_doc_from_json(simple_doc)
444 # Nothing is inserted, the document id is returned as would-conflict445 # Nothing is inserted, the document id is returned as would-conflict
445 alt_doc = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)446 alt_doc = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
446 state, _ = self.db._put_doc_if_newer(447 state, _ = self.db._put_doc_if_newer(
@@ -460,7 +461,7 @@
460461
461 def test_put_doc_if_newer_same_generation_same_txid(self):462 def test_put_doc_if_newer_same_generation_same_txid(self):
462 self.db._set_replica_gen_and_trans_id('other', 1, 'T-sid')463 self.db._set_replica_gen_and_trans_id('other', 1, 'T-sid')
463 doc = self.db.create_doc(simple_doc)464 doc = self.db.create_doc_from_json(simple_doc)
464 self.make_document(doc.doc_id, 'other:1', simple_doc)465 self.make_document(doc.doc_id, 'other:1', simple_doc)
465 state, _ = self.db._put_doc_if_newer(466 state, _ = self.db._put_doc_if_newer(
466 doc, save_conflict=False, replica_uid='other', replica_gen=1,467 doc, save_conflict=False, replica_uid='other', replica_gen=1,
@@ -477,7 +478,7 @@
477478
478 def test_put_doc_if_newer_old_generation_older_doc(self):479 def test_put_doc_if_newer_old_generation_older_doc(self):
479 orig_doc = '{"new": "doc"}'480 orig_doc = '{"new": "doc"}'
480 doc = self.db.create_doc(orig_doc)481 doc = self.db.create_doc_from_json(orig_doc)
481 doc_rev1 = doc.rev482 doc_rev1 = doc.rev
482 doc.set_json(simple_doc)483 doc.set_json(simple_doc)
483 self.db.put_doc(doc)484 self.db.put_doc(doc)
@@ -497,7 +498,7 @@
497 replica_uid='other', replica_gen=1, replica_trans_id='T-sad')498 replica_uid='other', replica_gen=1, replica_trans_id='T-sad')
498499
499 def test_put_doc_if_newer_replica_uid(self):500 def test_put_doc_if_newer_replica_uid(self):
500 doc1 = self.db.create_doc(simple_doc)501 doc1 = self.db.create_doc_from_json(simple_doc)
501 self.db._set_replica_gen_and_trans_id('other', 1, 'T-sid')502 self.db._set_replica_gen_and_trans_id('other', 1, 'T-sid')
502 doc2 = self.make_document(doc1.doc_id, doc1.rev + '|other:1',503 doc2 = self.make_document(doc1.doc_id, doc1.rev + '|other:1',
503 nested_doc)504 nested_doc)
@@ -535,7 +536,7 @@
535 self.db._get_replica_gen_and_trans_id('other-db'))536 self.db._get_replica_gen_and_trans_id('other-db'))
536537
537 def test_put_updates_transaction_log(self):538 def test_put_updates_transaction_log(self):
538 doc = self.db.create_doc(simple_doc)539 doc = self.db.create_doc_from_json(simple_doc)
539 self.assertTransactionLog([doc.doc_id], self.db)540 self.assertTransactionLog([doc.doc_id], self.db)
540 doc.set_json('{"something": "else"}')541 doc.set_json('{"something": "else"}')
541 self.db.put_doc(doc)542 self.db.put_doc(doc)
@@ -545,7 +546,7 @@
545 self.db.whats_changed())546 self.db.whats_changed())
546547
547 def test_delete_updates_transaction_log(self):548 def test_delete_updates_transaction_log(self):
548 doc = self.db.create_doc(simple_doc)549 doc = self.db.create_doc_from_json(simple_doc)
549 db_gen, _, _ = self.db.whats_changed()550 db_gen, _, _ = self.db.whats_changed()
550 self.db.delete_doc(doc)551 self.db.delete_doc(doc)
551 last_trans_id = self.getLastTransId(self.db)552 last_trans_id = self.getLastTransId(self.db)
@@ -556,7 +557,7 @@
556 self.assertEqual((0, '', []), self.db.whats_changed())557 self.assertEqual((0, '', []), self.db.whats_changed())
557558
558 def test_whats_changed_returns_one_id_for_multiple_changes(self):559 def test_whats_changed_returns_one_id_for_multiple_changes(self):
559 doc = self.db.create_doc(simple_doc)560 doc = self.db.create_doc_from_json(simple_doc)
560 doc.set_json('{"new": "contents"}')561 doc.set_json('{"new": "contents"}')
561 self.db.put_doc(doc)562 self.db.put_doc(doc)
562 last_trans_id = self.getLastTransId(self.db)563 last_trans_id = self.getLastTransId(self.db)
@@ -565,8 +566,8 @@
565 self.assertEqual((2, last_trans_id, []), self.db.whats_changed(2))566 self.assertEqual((2, last_trans_id, []), self.db.whats_changed(2))
566567
567 def test_whats_changed_returns_last_edits_ascending(self):568 def test_whats_changed_returns_last_edits_ascending(self):
568 doc = self.db.create_doc(simple_doc)569 doc = self.db.create_doc_from_json(simple_doc)
569 doc1 = self.db.create_doc(simple_doc)570 doc1 = self.db.create_doc_from_json(simple_doc)
570 doc.set_json('{"new": "contents"}')571 doc.set_json('{"new": "contents"}')
571 self.db.delete_doc(doc1)572 self.db.delete_doc(doc1)
572 delete_trans_id = self.getLastTransId(self.db)573 delete_trans_id = self.getLastTransId(self.db)
@@ -578,9 +579,9 @@
578 self.db.whats_changed())579 self.db.whats_changed())
579580
580 def test_whats_changed_doesnt_include_old_gen(self):581 def test_whats_changed_doesnt_include_old_gen(self):
581 self.db.create_doc(simple_doc)582 self.db.create_doc_from_json(simple_doc)
582 self.db.create_doc(simple_doc)583 self.db.create_doc_from_json(simple_doc)
583 doc2 = self.db.create_doc(simple_doc)584 doc2 = self.db.create_doc_from_json(simple_doc)
584 last_trans_id = self.getLastTransId(self.db)585 last_trans_id = self.getLastTransId(self.db)
585 self.assertEqual((3, last_trans_id, [(doc2.doc_id, 3, last_trans_id)]),586 self.assertEqual((3, last_trans_id, [(doc2.doc_id, 3, last_trans_id)]),
586 self.db.whats_changed(2))587 self.db.whats_changed(2))
@@ -591,19 +592,19 @@
591 scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS592 scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
592593
593 def test_validate_gen_and_trans_id(self):594 def test_validate_gen_and_trans_id(self):
594 self.db.create_doc(simple_doc)595 self.db.create_doc_from_json(simple_doc)
595 gen, trans_id = self.db._get_generation_info()596 gen, trans_id = self.db._get_generation_info()
596 self.db.validate_gen_and_trans_id(gen, trans_id)597 self.db.validate_gen_and_trans_id(gen, trans_id)
597598
598 def test_validate_gen_and_trans_id_invalid_txid(self):599 def test_validate_gen_and_trans_id_invalid_txid(self):
599 self.db.create_doc(simple_doc)600 self.db.create_doc_from_json(simple_doc)
600 gen, _ = self.db._get_generation_info()601 gen, _ = self.db._get_generation_info()
601 self.assertRaises(602 self.assertRaises(
602 errors.InvalidTransactionId,603 errors.InvalidTransactionId,
603 self.db.validate_gen_and_trans_id, gen, 'wrong')604 self.db.validate_gen_and_trans_id, gen, 'wrong')
604605
605 def test_validate_gen_and_trans_id_invalid_gen(self):606 def test_validate_gen_and_trans_id_invalid_gen(self):
606 self.db.create_doc(simple_doc)607 self.db.create_doc_from_json(simple_doc)
607 gen, trans_id = self.db._get_generation_info()608 gen, trans_id = self.db._get_generation_info()
608 self.assertRaises(609 self.assertRaises(
609 errors.InvalidGeneration,610 errors.InvalidGeneration,
@@ -635,7 +636,7 @@
635 scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS636 scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
636637
637 def test_get_docs_conflicted(self):638 def test_get_docs_conflicted(self):
638 doc1 = self.db.create_doc(simple_doc)639 doc1 = self.db.create_doc_from_json(simple_doc)
639 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)640 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
640 self.db._put_doc_if_newer(641 self.db._put_doc_if_newer(
641 doc2, save_conflict=True, replica_uid='r', replica_gen=1,642 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -643,8 +644,8 @@
643 self.assertEqual([doc2], self.db.get_docs([doc1.doc_id]))644 self.assertEqual([doc2], self.db.get_docs([doc1.doc_id]))
644645
645 def test_get_docs_conflicts_ignored(self):646 def test_get_docs_conflicts_ignored(self):
646 doc1 = self.db.create_doc(simple_doc)647 doc1 = self.db.create_doc_from_json(simple_doc)
647 doc2 = self.db.create_doc(nested_doc)648 doc2 = self.db.create_doc_from_json(nested_doc)
648 alt_doc = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)649 alt_doc = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
649 self.db._put_doc_if_newer(650 self.db._put_doc_if_newer(
650 alt_doc, save_conflict=True, replica_uid='r', replica_gen=1,651 alt_doc, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -656,7 +657,7 @@
656 check_for_conflicts=False))657 check_for_conflicts=False))
657658
658 def test_get_doc_conflicts(self):659 def test_get_doc_conflicts(self):
659 doc = self.db.create_doc(simple_doc)660 doc = self.db.create_doc_from_json(simple_doc)
660 alt_doc = self.make_document(doc.doc_id, 'alternate:1', nested_doc)661 alt_doc = self.make_document(doc.doc_id, 'alternate:1', nested_doc)
661 self.db._put_doc_if_newer(662 self.db._put_doc_if_newer(
662 alt_doc, save_conflict=True, replica_uid='r', replica_gen=1,663 alt_doc, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -665,14 +666,14 @@
665 self.db.get_doc_conflicts(doc.doc_id))666 self.db.get_doc_conflicts(doc.doc_id))
666667
667 def test_get_doc_conflicts_unconflicted(self):668 def test_get_doc_conflicts_unconflicted(self):
668 doc = self.db.create_doc(simple_doc)669 doc = self.db.create_doc_from_json(simple_doc)
669 self.assertEqual([], self.db.get_doc_conflicts(doc.doc_id))670 self.assertEqual([], self.db.get_doc_conflicts(doc.doc_id))
670671
671 def test_get_doc_conflicts_no_such_id(self):672 def test_get_doc_conflicts_no_such_id(self):
672 self.assertEqual([], self.db.get_doc_conflicts('doc-id'))673 self.assertEqual([], self.db.get_doc_conflicts('doc-id'))
673674
674 def test_resolve_doc(self):675 def test_resolve_doc(self):
675 doc = self.db.create_doc(simple_doc)676 doc = self.db.create_doc_from_json(simple_doc)
676 alt_doc = self.make_document(doc.doc_id, 'alternate:1', nested_doc)677 alt_doc = self.make_document(doc.doc_id, 'alternate:1', nested_doc)
677 self.db._put_doc_if_newer(678 self.db._put_doc_if_newer(
678 alt_doc, save_conflict=True, replica_uid='r', replica_gen=1,679 alt_doc, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -687,7 +688,7 @@
687 self.assertGetDocConflicts(self.db, doc.doc_id, [])688 self.assertGetDocConflicts(self.db, doc.doc_id, [])
688689
689 def test_resolve_doc_picks_biggest_vcr(self):690 def test_resolve_doc_picks_biggest_vcr(self):
690 doc1 = self.db.create_doc(simple_doc)691 doc1 = self.db.create_doc_from_json(simple_doc)
691 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)692 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
692 self.db._put_doc_if_newer(693 self.db._put_doc_if_newer(
693 doc2, save_conflict=True, replica_uid='r', replica_gen=1,694 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -708,7 +709,7 @@
708 self.assertTrue(vcr_new.is_newer(vcr_2))709 self.assertTrue(vcr_new.is_newer(vcr_2))
709710
710 def test_resolve_doc_partial_not_winning(self):711 def test_resolve_doc_partial_not_winning(self):
711 doc1 = self.db.create_doc(simple_doc)712 doc1 = self.db.create_doc_from_json(simple_doc)
712 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)713 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
713 self.db._put_doc_if_newer(714 self.db._put_doc_if_newer(
714 doc2, save_conflict=True, replica_uid='r', replica_gen=1,715 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -733,7 +734,7 @@
733 (doc1.rev, simple_doc)])734 (doc1.rev, simple_doc)])
734735
735 def test_resolve_doc_partial_winning(self):736 def test_resolve_doc_partial_winning(self):
736 doc1 = self.db.create_doc(simple_doc)737 doc1 = self.db.create_doc_from_json(simple_doc)
737 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)738 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
738 self.db._put_doc_if_newer(739 self.db._put_doc_if_newer(
739 doc2, save_conflict=True, replica_uid='r', replica_gen=1,740 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -754,7 +755,7 @@
754 (doc2.rev, nested_doc)])755 (doc2.rev, nested_doc)])
755756
756 def test_resolve_doc_with_delete_conflict(self):757 def test_resolve_doc_with_delete_conflict(self):
757 doc1 = self.db.create_doc(simple_doc)758 doc1 = self.db.create_doc_from_json(simple_doc)
758 self.db.delete_doc(doc1)759 self.db.delete_doc(doc1)
759 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)760 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
760 self.db._put_doc_if_newer(761 self.db._put_doc_if_newer(
@@ -768,7 +769,7 @@
768 self.assertGetDoc(self.db, doc2.doc_id, doc2.rev, nested_doc, False)769 self.assertGetDoc(self.db, doc2.doc_id, doc2.rev, nested_doc, False)
769770
770 def test_resolve_doc_with_delete_to_delete(self):771 def test_resolve_doc_with_delete_to_delete(self):
771 doc1 = self.db.create_doc(simple_doc)772 doc1 = self.db.create_doc_from_json(simple_doc)
772 self.db.delete_doc(doc1)773 self.db.delete_doc(doc1)
773 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)774 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
774 self.db._put_doc_if_newer(775 self.db._put_doc_if_newer(
@@ -783,7 +784,7 @@
783 self.db, doc1.doc_id, doc1.rev, None, False)784 self.db, doc1.doc_id, doc1.rev, None, False)
784785
785 def test_put_doc_if_newer_save_conflicted(self):786 def test_put_doc_if_newer_save_conflicted(self):
786 doc1 = self.db.create_doc(simple_doc)787 doc1 = self.db.create_doc_from_json(simple_doc)
787 # Document is inserted as a conflict788 # Document is inserted as a conflict
788 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)789 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
789 state, _ = self.db._put_doc_if_newer(790 state, _ = self.db._put_doc_if_newer(
@@ -794,7 +795,7 @@
794 self.assertGetDoc(self.db, doc1.doc_id, doc2.rev, nested_doc, True)795 self.assertGetDoc(self.db, doc1.doc_id, doc2.rev, nested_doc, True)
795796
796 def test_force_doc_conflict_supersedes_properly(self):797 def test_force_doc_conflict_supersedes_properly(self):
797 doc1 = self.db.create_doc(simple_doc)798 doc1 = self.db.create_doc_from_json(simple_doc)
798 doc2 = self.make_document(doc1.doc_id, 'alternate:1', '{"b": 1}')799 doc2 = self.make_document(doc1.doc_id, 'alternate:1', '{"b": 1}')
799 self.db._put_doc_if_newer(800 self.db._put_doc_if_newer(
800 doc2, save_conflict=True, replica_uid='r', replica_gen=1,801 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -813,7 +814,7 @@
813 (doc1.rev, simple_doc)])814 (doc1.rev, simple_doc)])
814815
815 def test_put_doc_if_newer_save_conflict_was_deleted(self):816 def test_put_doc_if_newer_save_conflict_was_deleted(self):
816 doc1 = self.db.create_doc(simple_doc)817 doc1 = self.db.create_doc_from_json(simple_doc)
817 self.db.delete_doc(doc1)818 self.db.delete_doc(doc1)
818 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)819 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
819 self.db._put_doc_if_newer(820 self.db._put_doc_if_newer(
@@ -826,7 +827,7 @@
826 [('alternate:1', nested_doc), (doc1.rev, None)])827 [('alternate:1', nested_doc), (doc1.rev, None)])
827828
828 def test_put_doc_if_newer_propagates_full_resolution(self):829 def test_put_doc_if_newer_propagates_full_resolution(self):
829 doc1 = self.db.create_doc(simple_doc)830 doc1 = self.db.create_doc_from_json(simple_doc)
830 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)831 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
831 self.db._put_doc_if_newer(832 self.db._put_doc_if_newer(
832 doc2, save_conflict=True, replica_uid='r', replica_gen=1,833 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -847,7 +848,7 @@
847 self.assertFalse(doc3.has_conflicts)848 self.assertFalse(doc3.has_conflicts)
848849
849 def test_put_doc_if_newer_propagates_partial_resolution(self):850 def test_put_doc_if_newer_propagates_partial_resolution(self):
850 doc1 = self.db.create_doc(simple_doc)851 doc1 = self.db.create_doc_from_json(simple_doc)
851 doc2 = self.make_document(doc1.doc_id, 'altalt:1', '{}')852 doc2 = self.make_document(doc1.doc_id, 'altalt:1', '{}')
852 self.db._put_doc_if_newer(853 self.db._put_doc_if_newer(
853 doc2, save_conflict=True, replica_uid='r', replica_gen=1,854 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -876,7 +877,7 @@
876 [('alternate:2|test:1', '{"good": 1}'), ('altalt:1', '{}')])877 [('alternate:2|test:1', '{"good": 1}'), ('altalt:1', '{}')])
877878
878 def test_put_doc_if_newer_replica_uid(self):879 def test_put_doc_if_newer_replica_uid(self):
879 doc1 = self.db.create_doc(simple_doc)880 doc1 = self.db.create_doc_from_json(simple_doc)
880 self.db._set_replica_gen_and_trans_id('other', 1, 'T-id')881 self.db._set_replica_gen_and_trans_id('other', 1, 'T-id')
881 doc2 = self.make_document(doc1.doc_id, doc1.rev + '|other:1',882 doc2 = self.make_document(doc1.doc_id, doc1.rev + '|other:1',
882 nested_doc)883 nested_doc)
@@ -896,7 +897,7 @@
896 def test_put_doc_if_newer_autoresolve_2(self):897 def test_put_doc_if_newer_autoresolve_2(self):
897 # this is an ordering variant of _3, but that already works898 # this is an ordering variant of _3, but that already works
898 # adding the test explicitly to catch the regression easily899 # adding the test explicitly to catch the regression easily
899 doc_a1 = self.db.create_doc(simple_doc)900 doc_a1 = self.db.create_doc_from_json(simple_doc)
900 doc_a2 = self.make_document(doc_a1.doc_id, 'test:2', "{}")901 doc_a2 = self.make_document(doc_a1.doc_id, 'test:2', "{}")
901 doc_a1b1 = self.make_document(doc_a1.doc_id, 'test:1|other:1',902 doc_a1b1 = self.make_document(doc_a1.doc_id, 'test:1|other:1',
902 '{"a":"42"}')903 '{"a":"42"}')
@@ -916,7 +917,7 @@
916 self.assertFalse(self.db.get_doc(doc_a1.doc_id).has_conflicts)917 self.assertFalse(self.db.get_doc(doc_a1.doc_id).has_conflicts)
917918
918 def test_put_doc_if_newer_autoresolve_3(self):919 def test_put_doc_if_newer_autoresolve_3(self):
919 doc_a1 = self.db.create_doc(simple_doc)920 doc_a1 = self.db.create_doc_from_json(simple_doc)
920 doc_a1b1 = self.make_document(doc_a1.doc_id, 'test:1|other:1', "{}")921 doc_a1b1 = self.make_document(doc_a1.doc_id, 'test:1|other:1', "{}")
921 doc_a2 = self.make_document(doc_a1.doc_id, 'test:2', '{"a":"42"}')922 doc_a2 = self.make_document(doc_a1.doc_id, 'test:2', '{"a":"42"}')
922 doc_a3 = self.make_document(doc_a1.doc_id, 'test:3', "{}")923 doc_a3 = self.make_document(doc_a1.doc_id, 'test:3', "{}")
@@ -941,7 +942,7 @@
941 self.assertTrue(rev.is_newer(rev_a1b1))942 self.assertTrue(rev.is_newer(rev_a1b1))
942943
943 def test_put_doc_if_newer_autoresolve_4(self):944 def test_put_doc_if_newer_autoresolve_4(self):
944 doc_a1 = self.db.create_doc(simple_doc)945 doc_a1 = self.db.create_doc_from_json(simple_doc)
945 doc_a1b1 = self.make_document(doc_a1.doc_id, 'test:1|other:1', None)946 doc_a1b1 = self.make_document(doc_a1.doc_id, 'test:1|other:1', None)
946 doc_a2 = self.make_document(doc_a1.doc_id, 'test:2', '{"a":"42"}')947 doc_a2 = self.make_document(doc_a1.doc_id, 'test:2', '{"a":"42"}')
947 doc_a3 = self.make_document(doc_a1.doc_id, 'test:3', None)948 doc_a3 = self.make_document(doc_a1.doc_id, 'test:3', None)
@@ -966,7 +967,7 @@
966 self.assertTrue(rev.is_newer(rev_a1b1))967 self.assertTrue(rev.is_newer(rev_a1b1))
967968
968 def test_put_refuses_to_update_conflicted(self):969 def test_put_refuses_to_update_conflicted(self):
969 doc1 = self.db.create_doc(simple_doc)970 doc1 = self.db.create_doc_from_json(simple_doc)
970 content2 = '{"key": "altval"}'971 content2 = '{"key": "altval"}'
971 doc2 = self.make_document(doc1.doc_id, 'altrev:1', content2)972 doc2 = self.make_document(doc1.doc_id, 'altrev:1', content2)
972 self.db._put_doc_if_newer(973 self.db._put_doc_if_newer(
@@ -978,7 +979,7 @@
978 self.assertRaises(errors.ConflictedDoc, self.db.put_doc, doc2)979 self.assertRaises(errors.ConflictedDoc, self.db.put_doc, doc2)
979980
980 def test_delete_refuses_for_conflicted(self):981 def test_delete_refuses_for_conflicted(self):
981 doc1 = self.db.create_doc(simple_doc)982 doc1 = self.db.create_doc_from_json(simple_doc)
982 doc2 = self.make_document(doc1.doc_id, 'altrev:1', nested_doc)983 doc2 = self.make_document(doc1.doc_id, 'altrev:1', nested_doc)
983 self.db._put_doc_if_newer(984 self.db._put_doc_if_newer(
984 doc2, save_conflict=True, replica_uid='r', replica_gen=1,985 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -997,7 +998,8 @@
997 self.db.list_indexes())998 self.db.list_indexes())
998999
999 def test_create_index_on_non_ascii_field_name(self):1000 def test_create_index_on_non_ascii_field_name(self):
1000 doc = self.db.create_doc(simplejson.dumps({u'\xe5': 'value'}))1001 doc = self.db.create_doc_from_json(
1002 simplejson.dumps({u'\xe5': 'value'}))
1001 self.db.create_index('test-idx', u'\xe5')1003 self.db.create_index('test-idx', u'\xe5')
1002 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))1004 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))
10031005
@@ -1007,17 +1009,19 @@
1007 [('test-idx', [u'\xe5'])], self.db.list_indexes())1009 [('test-idx', [u'\xe5'])], self.db.list_indexes())
10081010
1009 def test_create_index_evaluates_it(self):1011 def test_create_index_evaluates_it(self):
1010 doc = self.db.create_doc(simple_doc)1012 doc = self.db.create_doc_from_json(simple_doc)
1011 self.db.create_index('test-idx', 'key')1013 self.db.create_index('test-idx', 'key')
1012 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))1014 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))
10131015
1014 def test_wildcard_matches_unicode_value(self):1016 def test_wildcard_matches_unicode_value(self):
1015 doc = self.db.create_doc(simplejson.dumps({"key": u"valu\xe5"}))1017 doc = self.db.create_doc_from_json(simplejson.dumps(
1018 {"key": u"valu\xe5"}))
1016 self.db.create_index('test-idx', 'key')1019 self.db.create_index('test-idx', 'key')
1017 self.assertEqual([doc], self.db.get_from_index('test-idx', '*'))1020 self.assertEqual([doc], self.db.get_from_index('test-idx', '*'))
10181021
1019 def test_retrieve_unicode_value_from_index(self):1022 def test_retrieve_unicode_value_from_index(self):
1020 doc = self.db.create_doc(simplejson.dumps({"key": u"valu\xe5"}))1023 doc = self.db.create_doc_from_json(simplejson.dumps(
1024 {"key": u"valu\xe5"}))
1021 self.db.create_index('test-idx', 'key')1025 self.db.create_index('test-idx', 'key')
1022 self.assertEqual(1026 self.assertEqual(
1023 [doc], self.db.get_from_index('test-idx', u"valu\xe5"))1027 [doc], self.db.get_from_index('test-idx', u"valu\xe5"))
@@ -1034,8 +1038,8 @@
1034 self.assertEqual([('test-idx', ['key'])], self.db.list_indexes())1038 self.assertEqual([('test-idx', ['key'])], self.db.list_indexes())
10351039
1036 def test_create_index_after_deleting_document(self):1040 def test_create_index_after_deleting_document(self):
1037 doc = self.db.create_doc(simple_doc)1041 doc = self.db.create_doc_from_json(simple_doc)
1038 doc2 = self.db.create_doc(simple_doc)1042 doc2 = self.db.create_doc_from_json(simple_doc)
1039 self.db.delete_doc(doc2)1043 self.db.delete_doc(doc2)
1040 self.db.create_index('test-idx', 'key')1044 self.db.create_index('test-idx', 'key')
1041 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))1045 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))
@@ -1048,112 +1052,118 @@
10481052
1049 def test_create_adds_to_index(self):1053 def test_create_adds_to_index(self):
1050 self.db.create_index('test-idx', 'key')1054 self.db.create_index('test-idx', 'key')
1051 doc = self.db.create_doc(simple_doc)1055 doc = self.db.create_doc_from_json(simple_doc)
1052 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))1056 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))
10531057
1054 def test_get_from_index_unmatched(self):1058 def test_get_from_index_unmatched(self):
1055 self.db.create_doc(simple_doc)1059 self.db.create_doc_from_json(simple_doc)
1056 self.db.create_index('test-idx', 'key')1060 self.db.create_index('test-idx', 'key')
1057 self.assertEqual([], self.db.get_from_index('test-idx', 'novalue'))1061 self.assertEqual([], self.db.get_from_index('test-idx', 'novalue'))
10581062
1059 def test_create_index_multiple_exact_matches(self):1063 def test_create_index_multiple_exact_matches(self):
1060 doc = self.db.create_doc(simple_doc)1064 doc = self.db.create_doc_from_json(simple_doc)
1061 doc2 = self.db.create_doc(simple_doc)1065 doc2 = self.db.create_doc_from_json(simple_doc)
1062 self.db.create_index('test-idx', 'key')1066 self.db.create_index('test-idx', 'key')
1063 self.assertEqual(1067 self.assertEqual(
1064 sorted([doc, doc2]),1068 sorted([doc, doc2]),
1065 sorted(self.db.get_from_index('test-idx', 'value')))1069 sorted(self.db.get_from_index('test-idx', 'value')))
10661070
1067 def test_get_from_index(self):1071 def test_get_from_index(self):
1068 doc = self.db.create_doc(simple_doc)1072 doc = self.db.create_doc_from_json(simple_doc)
1069 self.db.create_index('test-idx', 'key')1073 self.db.create_index('test-idx', 'key')
1070 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))1074 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))
10711075
1072 def test_get_from_index_multi(self):1076 def test_get_from_index_multi(self):
1073 content = '{"key": "value", "key2": "value2"}'1077 content = '{"key": "value", "key2": "value2"}'
1074 doc = self.db.create_doc(content)1078 doc = self.db.create_doc_from_json(content)
1075 self.db.create_index('test-idx', 'key', 'key2')1079 self.db.create_index('test-idx', 'key', 'key2')
1076 self.assertEqual(1080 self.assertEqual(
1077 [doc], self.db.get_from_index('test-idx', 'value', 'value2'))1081 [doc], self.db.get_from_index('test-idx', 'value', 'value2'))
10781082
1079 def test_get_from_index_multi_ordered(self):1083 def test_get_from_index_multi_ordered(self):
1080 doc1 = self.db.create_doc('{"key": "value3", "key2": "value4"}')1084 doc1 = self.db.create_doc_from_json(
1081 doc2 = self.db.create_doc('{"key": "value2", "key2": "value3"}')1085 '{"key": "value3", "key2": "value4"}')
1082 doc3 = self.db.create_doc('{"key": "value2", "key2": "value2"}')1086 doc2 = self.db.create_doc_from_json(
1083 doc4 = self.db.create_doc('{"key": "value1", "key2": "value1"}')1087 '{"key": "value2", "key2": "value3"}')
1088 doc3 = self.db.create_doc_from_json(
1089 '{"key": "value2", "key2": "value2"}')
1090 doc4 = self.db.create_doc_from_json(
1091 '{"key": "value1", "key2": "value1"}')
1084 self.db.create_index('test-idx', 'key', 'key2')1092 self.db.create_index('test-idx', 'key', 'key2')
1085 self.assertEqual(1093 self.assertEqual(
1086 [doc4, doc3, doc2, doc1],1094 [doc4, doc3, doc2, doc1],
1087 self.db.get_from_index('test-idx', 'v*', '*'))1095 self.db.get_from_index('test-idx', 'v*', '*'))
10881096
1089 def test_get_range_from_index_start_end(self):1097 def test_get_range_from_index_start_end(self):
1090 doc1 = self.db.create_doc('{"key": "value3"}')1098 doc1 = self.db.create_doc_from_json('{"key": "value3"}')
1091 doc2 = self.db.create_doc('{"key": "value2"}')1099 doc2 = self.db.create_doc_from_json('{"key": "value2"}')
1092 self.db.create_doc('{"key": "value4"}')1100 self.db.create_doc_from_json('{"key": "value4"}')
1093 self.db.create_doc('{"key": "value1"}')1101 self.db.create_doc_from_json('{"key": "value1"}')
1094 self.db.create_index('test-idx', 'key')1102 self.db.create_index('test-idx', 'key')
1095 self.assertEqual(1103 self.assertEqual(
1096 [doc2, doc1],1104 [doc2, doc1],
1097 self.db.get_range_from_index('test-idx', 'value2', 'value3'))1105 self.db.get_range_from_index('test-idx', 'value2', 'value3'))
10981106
1099 def test_get_range_from_index_start(self):1107 def test_get_range_from_index_start(self):
1100 doc1 = self.db.create_doc('{"key": "value3"}')1108 doc1 = self.db.create_doc_from_json('{"key": "value3"}')
1101 doc2 = self.db.create_doc('{"key": "value2"}')1109 doc2 = self.db.create_doc_from_json('{"key": "value2"}')
1102 doc3 = self.db.create_doc('{"key": "value4"}')1110 doc3 = self.db.create_doc_from_json('{"key": "value4"}')
1103 self.db.create_doc('{"key": "value1"}')1111 self.db.create_doc_from_json('{"key": "value1"}')
1104 self.db.create_index('test-idx', 'key')1112 self.db.create_index('test-idx', 'key')
1105 self.assertEqual(1113 self.assertEqual(
1106 [doc2, doc1, doc3],1114 [doc2, doc1, doc3],
1107 self.db.get_range_from_index('test-idx', 'value2'))1115 self.db.get_range_from_index('test-idx', 'value2'))
11081116
1109 def test_get_range_from_index_end(self):1117 def test_get_range_from_index_end(self):
1110 self.db.create_doc('{"key": "value3"}')1118 self.db.create_doc_from_json('{"key": "value3"}')
1111 doc2 = self.db.create_doc('{"key": "value2"}')1119 doc2 = self.db.create_doc_from_json('{"key": "value2"}')
1112 self.db.create_doc('{"key": "value4"}')1120 self.db.create_doc_from_json('{"key": "value4"}')
1113 doc4 = self.db.create_doc('{"key": "value1"}')1121 doc4 = self.db.create_doc_from_json('{"key": "value1"}')
1114 self.db.create_index('test-idx', 'key')1122 self.db.create_index('test-idx', 'key')
1115 self.assertEqual(1123 self.assertEqual(
1116 [doc4, doc2],1124 [doc4, doc2],
1117 self.db.get_range_from_index('test-idx', None, 'value2'))1125 self.db.get_range_from_index('test-idx', None, 'value2'))
11181126
1119 def test_get_wildcard_range_from_index_start(self):1127 def test_get_wildcard_range_from_index_start(self):
1120 doc1 = self.db.create_doc('{"key": "value4"}')1128 doc1 = self.db.create_doc_from_json('{"key": "value4"}')
1121 doc2 = self.db.create_doc('{"key": "value23"}')1129 doc2 = self.db.create_doc_from_json('{"key": "value23"}')
1122 doc3 = self.db.create_doc('{"key": "value2"}')1130 doc3 = self.db.create_doc_from_json('{"key": "value2"}')
1123 doc4 = self.db.create_doc('{"key": "value22"}')1131 doc4 = self.db.create_doc_from_json('{"key": "value22"}')
1124 self.db.create_doc('{"key": "value1"}')1132 self.db.create_doc_from_json('{"key": "value1"}')
1125 self.db.create_index('test-idx', 'key')1133 self.db.create_index('test-idx', 'key')
1126 self.assertEqual(1134 self.assertEqual(
1127 [doc3, doc4, doc2, doc1],1135 [doc3, doc4, doc2, doc1],
1128 self.db.get_range_from_index('test-idx', 'value2*'))1136 self.db.get_range_from_index('test-idx', 'value2*'))
11291137
1130 def test_get_wildcard_range_from_index_end(self):1138 def test_get_wildcard_range_from_index_end(self):
1131 self.db.create_doc('{"key": "value4"}')1139 self.db.create_doc_from_json('{"key": "value4"}')
1132 doc2 = self.db.create_doc('{"key": "value23"}')1140 doc2 = self.db.create_doc_from_json('{"key": "value23"}')
1133 doc3 = self.db.create_doc('{"key": "value2"}')1141 doc3 = self.db.create_doc_from_json('{"key": "value2"}')
1134 doc4 = self.db.create_doc('{"key": "value22"}')1142 doc4 = self.db.create_doc_from_json('{"key": "value22"}')
1135 doc5 = self.db.create_doc('{"key": "value1"}')1143 doc5 = self.db.create_doc_from_json('{"key": "value1"}')
1136 self.db.create_index('test-idx', 'key')1144 self.db.create_index('test-idx', 'key')
1137 self.assertEqual(1145 self.assertEqual(
1138 [doc5, doc3, doc4, doc2],1146 [doc5, doc3, doc4, doc2],
1139 self.db.get_range_from_index('test-idx', None, 'value2*'))1147 self.db.get_range_from_index('test-idx', None, 'value2*'))
11401148
1141 def test_get_wildcard_range_from_index_start_end(self):1149 def test_get_wildcard_range_from_index_start_end(self):
1142 self.db.create_doc('{"key": "a"}')1150 self.db.create_doc_from_json('{"key": "a"}')
1143 self.db.create_doc('{"key": "boo3"}')1151 self.db.create_doc_from_json('{"key": "boo3"}')
1144 doc3 = self.db.create_doc('{"key": "catalyst"}')1152 doc3 = self.db.create_doc_from_json('{"key": "catalyst"}')
1145 doc4 = self.db.create_doc('{"key": "whaever"}')1153 doc4 = self.db.create_doc_from_json('{"key": "whaever"}')
1146 self.db.create_doc('{"key": "zerg"}')1154 self.db.create_doc_from_json('{"key": "zerg"}')
1147 self.db.create_index('test-idx', 'key')1155 self.db.create_index('test-idx', 'key')
1148 self.assertEqual(1156 self.assertEqual(
1149 [doc3, doc4],1157 [doc3, doc4],
1150 self.db.get_range_from_index('test-idx', 'cat*', 'zap*'))1158 self.db.get_range_from_index('test-idx', 'cat*', 'zap*'))
11511159
1152 def test_get_range_from_index_multi_column_start_end(self):1160 def test_get_range_from_index_multi_column_start_end(self):
1153 self.db.create_doc('{"key": "value3", "key2": "value4"}')1161 self.db.create_doc_from_json('{"key": "value3", "key2": "value4"}')
1154 doc2 = self.db.create_doc('{"key": "value2", "key2": "value3"}')1162 doc2 = self.db.create_doc_from_json(
1155 doc3 = self.db.create_doc('{"key": "value2", "key2": "value2"}')1163 '{"key": "value2", "key2": "value3"}')
1156 self.db.create_doc('{"key": "value1", "key2": "value1"}')1164 doc3 = self.db.create_doc_from_json(
1165 '{"key": "value2", "key2": "value2"}')
1166 self.db.create_doc_from_json('{"key": "value1", "key2": "value1"}')
1157 self.db.create_index('test-idx', 'key', 'key2')1167 self.db.create_index('test-idx', 'key', 'key2')
1158 self.assertEqual(1168 self.assertEqual(
1159 [doc3, doc2],1169 [doc3, doc2],
@@ -1161,20 +1171,25 @@
1161 'test-idx', ('value2', 'value2'), ('value2', 'value3')))1171 'test-idx', ('value2', 'value2'), ('value2', 'value3')))
11621172
1163 def test_get_range_from_index_multi_column_start(self):1173 def test_get_range_from_index_multi_column_start(self):
1164 doc1 = self.db.create_doc('{"key": "value3", "key2": "value4"}')1174 doc1 = self.db.create_doc_from_json(
1165 doc2 = self.db.create_doc('{"key": "value2", "key2": "value3"}')1175 '{"key": "value3", "key2": "value4"}')
1166 self.db.create_doc('{"key": "value2", "key2": "value2"}')1176 doc2 = self.db.create_doc_from_json(
1167 self.db.create_doc('{"key": "value1", "key2": "value1"}')1177 '{"key": "value2", "key2": "value3"}')
1178 self.db.create_doc_from_json('{"key": "value2", "key2": "value2"}')
1179 self.db.create_doc_from_json('{"key": "value1", "key2": "value1"}')
1168 self.db.create_index('test-idx', 'key', 'key2')1180 self.db.create_index('test-idx', 'key', 'key2')
1169 self.assertEqual(1181 self.assertEqual(
1170 [doc2, doc1],1182 [doc2, doc1],
1171 self.db.get_range_from_index('test-idx', ('value2', 'value3')))1183 self.db.get_range_from_index('test-idx', ('value2', 'value3')))
11721184
1173 def test_get_range_from_index_multi_column_end(self):1185 def test_get_range_from_index_multi_column_end(self):
1174 self.db.create_doc('{"key": "value3", "key2": "value4"}')1186 self.db.create_doc_from_json('{"key": "value3", "key2": "value4"}')
1175 doc2 = self.db.create_doc('{"key": "value2", "key2": "value3"}')1187 doc2 = self.db.create_doc_from_json(
1176 doc3 = self.db.create_doc('{"key": "value2", "key2": "value2"}')1188 '{"key": "value2", "key2": "value3"}')
1177 doc4 = self.db.create_doc('{"key": "value1", "key2": "value1"}')1189 doc3 = self.db.create_doc_from_json(
1190 '{"key": "value2", "key2": "value2"}')
1191 doc4 = self.db.create_doc_from_json(
1192 '{"key": "value1", "key2": "value1"}')
1178 self.db.create_index('test-idx', 'key', 'key2')1193 self.db.create_index('test-idx', 'key', 'key2')
1179 self.assertEqual(1194 self.assertEqual(
1180 [doc4, doc3, doc2],1195 [doc4, doc3, doc2],
@@ -1182,20 +1197,26 @@
1182 'test-idx', None, ('value2', 'value3')))1197 'test-idx', None, ('value2', 'value3')))
11831198
1184 def test_get_wildcard_range_from_index_multi_column_start(self):1199 def test_get_wildcard_range_from_index_multi_column_start(self):
1185 doc1 = self.db.create_doc('{"key": "value3", "key2": "value4"}')1200 doc1 = self.db.create_doc_from_json(
1186 doc2 = self.db.create_doc('{"key": "value2", "key2": "value23"}')1201 '{"key": "value3", "key2": "value4"}')
1187 doc3 = self.db.create_doc('{"key": "value2", "key2": "value2"}')1202 doc2 = self.db.create_doc_from_json(
1188 self.db.create_doc('{"key": "value1", "key2": "value1"}')1203 '{"key": "value2", "key2": "value23"}')
1204 doc3 = self.db.create_doc_from_json(
1205 '{"key": "value2", "key2": "value2"}')
1206 self.db.create_doc_from_json('{"key": "value1", "key2": "value1"}')
1189 self.db.create_index('test-idx', 'key', 'key2')1207 self.db.create_index('test-idx', 'key', 'key2')
1190 self.assertEqual(1208 self.assertEqual(
1191 [doc3, doc2, doc1],1209 [doc3, doc2, doc1],
1192 self.db.get_range_from_index('test-idx', ('value2', 'value2*')))1210 self.db.get_range_from_index('test-idx', ('value2', 'value2*')))
11931211
1194 def test_get_wildcard_range_from_index_multi_column_end(self):1212 def test_get_wildcard_range_from_index_multi_column_end(self):
1195 self.db.create_doc('{"key": "value3", "key2": "value4"}')1213 self.db.create_doc_from_json('{"key": "value3", "key2": "value4"}')
1196 doc2 = self.db.create_doc('{"key": "value2", "key2": "value23"}')1214 doc2 = self.db.create_doc_from_json(
1197 doc3 = self.db.create_doc('{"key": "value2", "key2": "value2"}')1215 '{"key": "value2", "key2": "value23"}')
1198 doc4 = self.db.create_doc('{"key": "value1", "key2": "value1"}')1216 doc3 = self.db.create_doc_from_json(
1217 '{"key": "value2", "key2": "value2"}')
1218 doc4 = self.db.create_doc_from_json(
1219 '{"key": "value1", "key2": "value1"}')
1199 self.db.create_index('test-idx', 'key', 'key2')1220 self.db.create_index('test-idx', 'key', 'key2')
1200 self.assertEqual(1221 self.assertEqual(
1201 [doc4, doc3, doc2],1222 [doc4, doc3, doc2],
@@ -1203,20 +1224,25 @@
1203 'test-idx', None, ('value2', 'value2*')))1224 'test-idx', None, ('value2', 'value2*')))
12041225
1205 def test_get_glob_range_from_index_multi_column_start(self):1226 def test_get_glob_range_from_index_multi_column_start(self):
1206 doc1 = self.db.create_doc('{"key": "value3", "key2": "value4"}')1227 doc1 = self.db.create_doc_from_json(
1207 doc2 = self.db.create_doc('{"key": "value2", "key2": "value23"}')1228 '{"key": "value3", "key2": "value4"}')
1208 self.db.create_doc('{"key": "value1", "key2": "value2"}')1229 doc2 = self.db.create_doc_from_json(
1209 self.db.create_doc('{"key": "value1", "key2": "value1"}')1230 '{"key": "value2", "key2": "value23"}')
1231 self.db.create_doc_from_json('{"key": "value1", "key2": "value2"}')
1232 self.db.create_doc_from_json('{"key": "value1", "key2": "value1"}')
1210 self.db.create_index('test-idx', 'key', 'key2')1233 self.db.create_index('test-idx', 'key', 'key2')
1211 self.assertEqual(1234 self.assertEqual(
1212 [doc2, doc1],1235 [doc2, doc1],
1213 self.db.get_range_from_index('test-idx', ('value2', '*')))1236 self.db.get_range_from_index('test-idx', ('value2', '*')))
12141237
1215 def test_get_glob_range_from_index_multi_column_end(self):1238 def test_get_glob_range_from_index_multi_column_end(self):
1216 self.db.create_doc('{"key": "value3", "key2": "value4"}')1239 self.db.create_doc_from_json('{"key": "value3", "key2": "value4"}')
1217 doc2 = self.db.create_doc('{"key": "value2", "key2": "value23"}')1240 doc2 = self.db.create_doc_from_json(
1218 doc3 = self.db.create_doc('{"key": "value1", "key2": "value2"}')1241 '{"key": "value2", "key2": "value23"}')
1219 doc4 = self.db.create_doc('{"key": "value1", "key2": "value1"}')1242 doc3 = self.db.create_doc_from_json(
1243 '{"key": "value1", "key2": "value2"}')
1244 doc4 = self.db.create_doc_from_json(
1245 '{"key": "value1", "key2": "value1"}')
1220 self.db.create_index('test-idx', 'key', 'key2')1246 self.db.create_index('test-idx', 'key', 'key2')
1221 self.assertEqual(1247 self.assertEqual(
1222 [doc4, doc3, doc2],1248 [doc4, doc3, doc2],
@@ -1260,7 +1286,7 @@
1260 self.assertEqual([], self.db.get_index_keys('test-idx'))1286 self.assertEqual([], self.db.get_index_keys('test-idx'))
12611287
1262 def test_put_updates_index(self):1288 def test_put_updates_index(self):
1263 doc = self.db.create_doc(simple_doc)1289 doc = self.db.create_doc_from_json(simple_doc)
1264 self.db.create_index('test-idx', 'key')1290 self.db.create_index('test-idx', 'key')
1265 new_content = '{"key": "altval"}'1291 new_content = '{"key": "altval"}'
1266 doc.set_json(new_content)1292 doc.set_json(new_content)
@@ -1269,8 +1295,8 @@
1269 self.assertEqual([doc], self.db.get_from_index('test-idx', 'altval'))1295 self.assertEqual([doc], self.db.get_from_index('test-idx', 'altval'))
12701296
1271 def test_delete_updates_index(self):1297 def test_delete_updates_index(self):
1272 doc = self.db.create_doc(simple_doc)1298 doc = self.db.create_doc_from_json(simple_doc)
1273 doc2 = self.db.create_doc(simple_doc)1299 doc2 = self.db.create_doc_from_json(simple_doc)
1274 self.db.create_index('test-idx', 'key')1300 self.db.create_index('test-idx', 'key')
1275 self.assertEqual(1301 self.assertEqual(
1276 sorted([doc, doc2]),1302 sorted([doc, doc2]),
@@ -1303,12 +1329,12 @@
13031329
1304 def test_get_all_from_index(self):1330 def test_get_all_from_index(self):
1305 self.db.create_index('test-idx', 'key')1331 self.db.create_index('test-idx', 'key')
1306 doc1 = self.db.create_doc(simple_doc)1332 doc1 = self.db.create_doc_from_json(simple_doc)
1307 doc2 = self.db.create_doc(nested_doc)1333 doc2 = self.db.create_doc_from_json(nested_doc)
1308 # This one should not be in the index1334 # This one should not be in the index
1309 self.db.create_doc('{"no": "key"}')1335 self.db.create_doc_from_json('{"no": "key"}')
1310 diff_value_doc = '{"key": "diff value"}'1336 diff_value_doc = '{"key": "diff value"}'
1311 doc4 = self.db.create_doc(diff_value_doc)1337 doc4 = self.db.create_doc_from_json(diff_value_doc)
1312 # This is essentially a 'prefix' match, but we match every entry.1338 # This is essentially a 'prefix' match, but we match every entry.
1313 self.assertEqual(1339 self.assertEqual(
1314 sorted([doc1, doc2, doc4]),1340 sorted([doc1, doc2, doc4]),
@@ -1316,16 +1342,16 @@
13161342
1317 def test_get_all_from_index_ordered(self):1343 def test_get_all_from_index_ordered(self):
1318 self.db.create_index('test-idx', 'key')1344 self.db.create_index('test-idx', 'key')
1319 doc1 = self.db.create_doc('{"key": "value x"}')1345 doc1 = self.db.create_doc_from_json('{"key": "value x"}')
1320 doc2 = self.db.create_doc('{"key": "value b"}')1346 doc2 = self.db.create_doc_from_json('{"key": "value b"}')
1321 doc3 = self.db.create_doc('{"key": "value a"}')1347 doc3 = self.db.create_doc_from_json('{"key": "value a"}')
1322 doc4 = self.db.create_doc('{"key": "value m"}')1348 doc4 = self.db.create_doc_from_json('{"key": "value m"}')
1323 # This is essentially a 'prefix' match, but we match every entry.1349 # This is essentially a 'prefix' match, but we match every entry.
1324 self.assertEqual(1350 self.assertEqual(
1325 [doc3, doc2, doc4, doc1], self.db.get_from_index('test-idx', '*'))1351 [doc3, doc2, doc4, doc1], self.db.get_from_index('test-idx', '*'))
13261352
1327 def test_put_updates_when_adding_key(self):1353 def test_put_updates_when_adding_key(self):
1328 doc = self.db.create_doc("{}")1354 doc = self.db.create_doc_from_json("{}")
1329 self.db.create_index('test-idx', 'key')1355 self.db.create_index('test-idx', 'key')
1330 self.assertEqual([], self.db.get_from_index('test-idx', '*'))1356 self.assertEqual([], self.db.get_from_index('test-idx', '*'))
1331 doc.set_json(simple_doc)1357 doc.set_json(simple_doc)
@@ -1334,9 +1360,9 @@
13341360
1335 def test_get_from_index_empty_string(self):1361 def test_get_from_index_empty_string(self):
1336 self.db.create_index('test-idx', 'key')1362 self.db.create_index('test-idx', 'key')
1337 doc1 = self.db.create_doc(simple_doc)1363 doc1 = self.db.create_doc_from_json(simple_doc)
1338 content2 = '{"key": ""}'1364 content2 = '{"key": ""}'
1339 doc2 = self.db.create_doc(content2)1365 doc2 = self.db.create_doc_from_json(content2)
1340 self.assertEqual([doc2], self.db.get_from_index('test-idx', ''))1366 self.assertEqual([doc2], self.db.get_from_index('test-idx', ''))
1341 # Empty string matches the wildcard.1367 # Empty string matches the wildcard.
1342 self.assertEqual(1368 self.assertEqual(
@@ -1345,8 +1371,8 @@
13451371
1346 def test_get_from_index_not_null(self):1372 def test_get_from_index_not_null(self):
1347 self.db.create_index('test-idx', 'key')1373 self.db.create_index('test-idx', 'key')
1348 doc1 = self.db.create_doc(simple_doc)1374 doc1 = self.db.create_doc_from_json(simple_doc)
1349 self.db.create_doc('{"key": null}')1375 self.db.create_doc_from_json('{"key": null}')
1350 self.assertEqual([doc1], self.db.get_from_index('test-idx', '*'))1376 self.assertEqual([doc1], self.db.get_from_index('test-idx', '*'))
13511377
1352 def test_get_partial_from_index(self):1378 def test_get_partial_from_index(self):
@@ -1355,10 +1381,10 @@
1355 content3 = '{"k1": "v1", "k2": "y2"}'1381 content3 = '{"k1": "v1", "k2": "y2"}'
1356 # doc4 has a different k1 value, so it doesn't match the prefix.1382 # doc4 has a different k1 value, so it doesn't match the prefix.
1357 content4 = '{"k1": "NN", "k2": "v2"}'1383 content4 = '{"k1": "NN", "k2": "v2"}'
1358 doc1 = self.db.create_doc(content1)1384 doc1 = self.db.create_doc_from_json(content1)
1359 doc2 = self.db.create_doc(content2)1385 doc2 = self.db.create_doc_from_json(content2)
1360 doc3 = self.db.create_doc(content3)1386 doc3 = self.db.create_doc_from_json(content3)
1361 self.db.create_doc(content4)1387 self.db.create_doc_from_json(content4)
1362 self.db.create_index('test-idx', 'k1', 'k2')1388 self.db.create_index('test-idx', 'k1', 'k2')
1363 self.assertEqual(1389 self.assertEqual(
1364 sorted([doc1, doc2, doc3]),1390 sorted([doc1, doc2, doc3]),
@@ -1372,32 +1398,32 @@
1372 # doc4 has a different k2 prefix value, so it doesn't match1398 # doc4 has a different k2 prefix value, so it doesn't match
1373 content4 = '{"k1": "v1", "k2": "ZZ"}'1399 content4 = '{"k1": "v1", "k2": "ZZ"}'
1374 self.db.create_index('test-idx', 'k1', 'k2')1400 self.db.create_index('test-idx', 'k1', 'k2')
1375 doc1 = self.db.create_doc(content1)1401 doc1 = self.db.create_doc_from_json(content1)
1376 doc2 = self.db.create_doc(content2)1402 doc2 = self.db.create_doc_from_json(content2)
1377 doc3 = self.db.create_doc(content3)1403 doc3 = self.db.create_doc_from_json(content3)
1378 self.db.create_doc(content4)1404 self.db.create_doc_from_json(content4)
1379 self.assertEqual(1405 self.assertEqual(
1380 sorted([doc1, doc2, doc3]),1406 sorted([doc1, doc2, doc3]),
1381 sorted(self.db.get_from_index('test-idx', "v1", "v*")))1407 sorted(self.db.get_from_index('test-idx', "v1", "v*")))
13821408
1383 def test_nested_index(self):1409 def test_nested_index(self):
1384 doc = self.db.create_doc(nested_doc)1410 doc = self.db.create_doc_from_json(nested_doc)
1385 self.db.create_index('test-idx', 'sub.doc')1411 self.db.create_index('test-idx', 'sub.doc')
1386 self.assertEqual(1412 self.assertEqual(
1387 [doc], self.db.get_from_index('test-idx', 'underneath'))1413 [doc], self.db.get_from_index('test-idx', 'underneath'))
1388 doc2 = self.db.create_doc(nested_doc)1414 doc2 = self.db.create_doc_from_json(nested_doc)
1389 self.assertEqual(1415 self.assertEqual(
1390 sorted([doc, doc2]),1416 sorted([doc, doc2]),
1391 sorted(self.db.get_from_index('test-idx', 'underneath')))1417 sorted(self.db.get_from_index('test-idx', 'underneath')))
13921418
1393 def test_nested_nonexistent(self):1419 def test_nested_nonexistent(self):
1394 self.db.create_doc(nested_doc)1420 self.db.create_doc_from_json(nested_doc)
1395 # sub exists, but sub.foo does not:1421 # sub exists, but sub.foo does not:
1396 self.db.create_index('test-idx', 'sub.foo')1422 self.db.create_index('test-idx', 'sub.foo')
1397 self.assertEqual([], self.db.get_from_index('test-idx', '*'))1423 self.assertEqual([], self.db.get_from_index('test-idx', '*'))
13981424
1399 def test_nested_nonexistent2(self):1425 def test_nested_nonexistent2(self):
1400 self.db.create_doc(nested_doc)1426 self.db.create_doc_from_json(nested_doc)
1401 # sub exists, but sub.foo does not:1427 # sub exists, but sub.foo does not:
1402 self.db.create_index('test-idx', 'sub.foo.bar.baz.qux.fnord')1428 self.db.create_index('test-idx', 'sub.foo.bar.baz.qux.fnord')
1403 self.assertEqual([], self.db.get_from_index('test-idx', '*'))1429 self.assertEqual([], self.db.get_from_index('test-idx', '*'))
@@ -1405,20 +1431,20 @@
1405 def test_index_list1(self):1431 def test_index_list1(self):
1406 self.db.create_index("index", "name")1432 self.db.create_index("index", "name")
1407 content = '{"name": ["foo", "bar"]}'1433 content = '{"name": ["foo", "bar"]}'
1408 doc = self.db.create_doc(content)1434 doc = self.db.create_doc_from_json(content)
1409 rows = self.db.get_from_index("index", "bar")1435 rows = self.db.get_from_index("index", "bar")
1410 self.assertEqual([doc], rows)1436 self.assertEqual([doc], rows)
14111437
1412 def test_index_list2(self):1438 def test_index_list2(self):
1413 self.db.create_index("index", "name")1439 self.db.create_index("index", "name")
1414 content = '{"name": ["foo", "bar"]}'1440 content = '{"name": ["foo", "bar"]}'
1415 doc = self.db.create_doc(content)1441 doc = self.db.create_doc_from_json(content)
1416 rows = self.db.get_from_index("index", "foo")1442 rows = self.db.get_from_index("index", "foo")
1417 self.assertEqual([doc], rows)1443 self.assertEqual([doc], rows)
14181444
1419 def test_get_from_index_case_sensitive(self):1445 def test_get_from_index_case_sensitive(self):
1420 self.db.create_index('test-idx', 'key')1446 self.db.create_index('test-idx', 'key')
1421 doc1 = self.db.create_doc(simple_doc)1447 doc1 = self.db.create_doc_from_json(simple_doc)
1422 self.assertEqual([], self.db.get_from_index('test-idx', 'V*'))1448 self.assertEqual([], self.db.get_from_index('test-idx', 'V*'))
1423 self.assertEqual([doc1], self.db.get_from_index('test-idx', 'v*'))1449 self.assertEqual([doc1], self.db.get_from_index('test-idx', 'v*'))
14241450
@@ -1439,9 +1465,9 @@
1439 content1 = '{"key": "va%lue"}'1465 content1 = '{"key": "va%lue"}'
1440 content2 = '{"key": "value"}'1466 content2 = '{"key": "value"}'
1441 content3 = '{"key": "va_lue"}'1467 content3 = '{"key": "va_lue"}'
1442 doc1 = self.db.create_doc(content1)1468 doc1 = self.db.create_doc_from_json(content1)
1443 self.db.create_doc(content2)1469 self.db.create_doc_from_json(content2)
1444 doc3 = self.db.create_doc(content3)1470 doc3 = self.db.create_doc_from_json(content3)
1445 # The '%' in the search should be treated literally, not as a sql1471 # The '%' in the search should be treated literally, not as a sql
1446 # globbing character.1472 # globbing character.
1447 self.assertEqual([doc1], self.db.get_from_index('test-idx', 'va%*'))1473 self.assertEqual([doc1], self.db.get_from_index('test-idx', 'va%*'))
@@ -1451,21 +1477,21 @@
1451 def test_get_from_index_with_lower(self):1477 def test_get_from_index_with_lower(self):
1452 self.db.create_index("index", "lower(name)")1478 self.db.create_index("index", "lower(name)")
1453 content = '{"name": "Foo"}'1479 content = '{"name": "Foo"}'
1454 doc = self.db.create_doc(content)1480 doc = self.db.create_doc_from_json(content)
1455 rows = self.db.get_from_index("index", "foo")1481 rows = self.db.get_from_index("index", "foo")
1456 self.assertEqual([doc], rows)1482 self.assertEqual([doc], rows)
14571483
1458 def test_get_from_index_with_lower_matches_same_case(self):1484 def test_get_from_index_with_lower_matches_same_case(self):
1459 self.db.create_index("index", "lower(name)")1485 self.db.create_index("index", "lower(name)")
1460 content = '{"name": "foo"}'1486 content = '{"name": "foo"}'
1461 doc = self.db.create_doc(content)1487 doc = self.db.create_doc_from_json(content)
1462 rows = self.db.get_from_index("index", "foo")1488 rows = self.db.get_from_index("index", "foo")
1463 self.assertEqual([doc], rows)1489 self.assertEqual([doc], rows)
14641490
1465 def test_index_lower_doesnt_match_different_case(self):1491 def test_index_lower_doesnt_match_different_case(self):
1466 self.db.create_index("index", "lower(name)")1492 self.db.create_index("index", "lower(name)")
1467 content = '{"name": "Foo"}'1493 content = '{"name": "Foo"}'
1468 self.db.create_doc(content)1494 self.db.create_doc_from_json(content)
1469 rows = self.db.get_from_index("index", "Foo")1495 rows = self.db.get_from_index("index", "Foo")
1470 self.assertEqual([], rows)1496 self.assertEqual([], rows)
14711497
@@ -1473,93 +1499,93 @@
1473 self.db.create_index("index", "lower(name)")1499 self.db.create_index("index", "lower(name)")
1474 self.db.create_index("other_index", "name")1500 self.db.create_index("other_index", "name")
1475 content = '{"name": "Foo"}'1501 content = '{"name": "Foo"}'
1476 self.db.create_doc(content)1502 self.db.create_doc_from_json(content)
1477 rows = self.db.get_from_index("index", "Foo")1503 rows = self.db.get_from_index("index", "Foo")
1478 self.assertEqual(0, len(rows))1504 self.assertEqual(0, len(rows))
14791505
1480 def test_index_split_words_match_first(self):1506 def test_index_split_words_match_first(self):
1481 self.db.create_index("index", "split_words(name)")1507 self.db.create_index("index", "split_words(name)")
1482 content = '{"name": "foo bar"}'1508 content = '{"name": "foo bar"}'
1483 doc = self.db.create_doc(content)1509 doc = self.db.create_doc_from_json(content)
1484 rows = self.db.get_from_index("index", "foo")1510 rows = self.db.get_from_index("index", "foo")
1485 self.assertEqual([doc], rows)1511 self.assertEqual([doc], rows)
14861512
1487 def test_index_split_words_match_second(self):1513 def test_index_split_words_match_second(self):
1488 self.db.create_index("index", "split_words(name)")1514 self.db.create_index("index", "split_words(name)")
1489 content = '{"name": "foo bar"}'1515 content = '{"name": "foo bar"}'
1490 doc = self.db.create_doc(content)1516 doc = self.db.create_doc_from_json(content)
1491 rows = self.db.get_from_index("index", "bar")1517 rows = self.db.get_from_index("index", "bar")
1492 self.assertEqual([doc], rows)1518 self.assertEqual([doc], rows)
14931519
1494 def test_index_split_words_match_both(self):1520 def test_index_split_words_match_both(self):
1495 self.db.create_index("index", "split_words(name)")1521 self.db.create_index("index", "split_words(name)")
1496 content = '{"name": "foo foo"}'1522 content = '{"name": "foo foo"}'
1497 doc = self.db.create_doc(content)1523 doc = self.db.create_doc_from_json(content)
1498 rows = self.db.get_from_index("index", "foo")1524 rows = self.db.get_from_index("index", "foo")
1499 self.assertEqual([doc], rows)1525 self.assertEqual([doc], rows)
15001526
1501 def test_index_split_words_double_space(self):1527 def test_index_split_words_double_space(self):
1502 self.db.create_index("index", "split_words(name)")1528 self.db.create_index("index", "split_words(name)")
1503 content = '{"name": "foo bar"}'1529 content = '{"name": "foo bar"}'
1504 doc = self.db.create_doc(content)1530 doc = self.db.create_doc_from_json(content)
1505 rows = self.db.get_from_index("index", "bar")1531 rows = self.db.get_from_index("index", "bar")
1506 self.assertEqual([doc], rows)1532 self.assertEqual([doc], rows)
15071533
1508 def test_index_split_words_leading_space(self):1534 def test_index_split_words_leading_space(self):
1509 self.db.create_index("index", "split_words(name)")1535 self.db.create_index("index", "split_words(name)")
1510 content = '{"name": " foo bar"}'1536 content = '{"name": " foo bar"}'
1511 doc = self.db.create_doc(content)1537 doc = self.db.create_doc_from_json(content)
1512 rows = self.db.get_from_index("index", "foo")1538 rows = self.db.get_from_index("index", "foo")
1513 self.assertEqual([doc], rows)1539 self.assertEqual([doc], rows)
15141540
1515 def test_index_split_words_trailing_space(self):1541 def test_index_split_words_trailing_space(self):
1516 self.db.create_index("index", "split_words(name)")1542 self.db.create_index("index", "split_words(name)")
1517 content = '{"name": "foo bar "}'1543 content = '{"name": "foo bar "}'
1518 doc = self.db.create_doc(content)1544 doc = self.db.create_doc_from_json(content)
1519 rows = self.db.get_from_index("index", "bar")1545 rows = self.db.get_from_index("index", "bar")
1520 self.assertEqual([doc], rows)1546 self.assertEqual([doc], rows)
15211547
1522 def test_get_from_index_with_number(self):1548 def test_get_from_index_with_number(self):
1523 self.db.create_index("index", "number(foo, 5)")1549 self.db.create_index("index", "number(foo, 5)")
1524 content = '{"foo": 12}'1550 content = '{"foo": 12}'
1525 doc = self.db.create_doc(content)1551 doc = self.db.create_doc_from_json(content)
1526 rows = self.db.get_from_index("index", "00012")1552 rows = self.db.get_from_index("index", "00012")
1527 self.assertEqual([doc], rows)1553 self.assertEqual([doc], rows)
15281554
1529 def test_get_from_index_with_number_bigger_than_padding(self):1555 def test_get_from_index_with_number_bigger_than_padding(self):
1530 self.db.create_index("index", "number(foo, 5)")1556 self.db.create_index("index", "number(foo, 5)")
1531 content = '{"foo": 123456}'1557 content = '{"foo": 123456}'
1532 doc = self.db.create_doc(content)1558 doc = self.db.create_doc_from_json(content)
1533 rows = self.db.get_from_index("index", "123456")1559 rows = self.db.get_from_index("index", "123456")
1534 self.assertEqual([doc], rows)1560 self.assertEqual([doc], rows)
15351561
1536 def test_number_mapping_ignores_non_numbers(self):1562 def test_number_mapping_ignores_non_numbers(self):
1537 self.db.create_index("index", "number(foo, 5)")1563 self.db.create_index("index", "number(foo, 5)")
1538 content = '{"foo": 56}'1564 content = '{"foo": 56}'
1539 doc1 = self.db.create_doc(content)1565 doc1 = self.db.create_doc_from_json(content)
1540 content = '{"foo": "this is not a maigret painting"}'1566 content = '{"foo": "this is not a maigret painting"}'
1541 self.db.create_doc(content)1567 self.db.create_doc_from_json(content)
1542 rows = self.db.get_from_index("index", "*")1568 rows = self.db.get_from_index("index", "*")
1543 self.assertEqual([doc1], rows)1569 self.assertEqual([doc1], rows)
15441570
1545 def test_get_from_index_with_bool(self):1571 def test_get_from_index_with_bool(self):
1546 self.db.create_index("index", "bool(foo)")1572 self.db.create_index("index", "bool(foo)")
1547 content = '{"foo": true}'1573 content = '{"foo": true}'
1548 doc = self.db.create_doc(content)1574 doc = self.db.create_doc_from_json(content)
1549 rows = self.db.get_from_index("index", "1")1575 rows = self.db.get_from_index("index", "1")
1550 self.assertEqual([doc], rows)1576 self.assertEqual([doc], rows)
15511577
1552 def test_get_from_index_with_bool_false(self):1578 def test_get_from_index_with_bool_false(self):
1553 self.db.create_index("index", "bool(foo)")1579 self.db.create_index("index", "bool(foo)")
1554 content = '{"foo": false}'1580 content = '{"foo": false}'
1555 doc = self.db.create_doc(content)1581 doc = self.db.create_doc_from_json(content)
1556 rows = self.db.get_from_index("index", "0")1582 rows = self.db.get_from_index("index", "0")
1557 self.assertEqual([doc], rows)1583 self.assertEqual([doc], rows)
15581584
1559 def test_get_from_index_with_non_bool(self):1585 def test_get_from_index_with_non_bool(self):
1560 self.db.create_index("index", "bool(foo)")1586 self.db.create_index("index", "bool(foo)")
1561 content = '{"foo": 42}'1587 content = '{"foo": 42}'
1562 self.db.create_doc(content)1588 self.db.create_doc_from_json(content)
1563 rows = self.db.get_from_index("index", "*")1589 rows = self.db.get_from_index("index", "*")
1564 self.assertEqual([], rows)1590 self.assertEqual([], rows)
15651591
@@ -1568,9 +1594,9 @@
1568 content1 = '{"key": "value1"}'1594 content1 = '{"key": "value1"}'
1569 content2 = '{"key": "value2"}'1595 content2 = '{"key": "value2"}'
1570 content3 = '{"key": "value2"}'1596 content3 = '{"key": "value2"}'
1571 self.db.create_doc(content1)1597 self.db.create_doc_from_json(content1)
1572 self.db.create_doc(content2)1598 self.db.create_doc_from_json(content2)
1573 self.db.create_doc(content3)1599 self.db.create_doc_from_json(content3)
1574 self.assertEqual(1600 self.assertEqual(
1575 [('value1',), ('value2',)],1601 [('value1',), ('value2',)],
1576 sorted(self.db.get_index_keys('test-idx')))1602 sorted(self.db.get_index_keys('test-idx')))
@@ -1581,10 +1607,10 @@
1581 content2 = '{"key1": "value2", "key2": "val2-2"}'1607 content2 = '{"key1": "value2", "key2": "val2-2"}'
1582 content3 = '{"key1": "value2", "key2": "val2-2"}'1608 content3 = '{"key1": "value2", "key2": "val2-2"}'
1583 content4 = '{"key1": "value2", "key2": "val3"}'1609 content4 = '{"key1": "value2", "key2": "val3"}'
1584 self.db.create_doc(content1)1610 self.db.create_doc_from_json(content1)
1585 self.db.create_doc(content2)1611 self.db.create_doc_from_json(content2)
1586 self.db.create_doc(content3)1612 self.db.create_doc_from_json(content3)
1587 self.db.create_doc(content4)1613 self.db.create_doc_from_json(content4)
1588 self.assertEqual([1614 self.assertEqual([
1589 ('value1', 'val2-1'),1615 ('value1', 'val2-1'),
1590 ('value2', 'val2-2'),1616 ('value2', 'val2-2'),
@@ -1594,13 +1620,17 @@
15941620
1595class PythonBackendTests(tests.DatabaseBaseTests):1621class PythonBackendTests(tests.DatabaseBaseTests):
15961622
1623 def setUp(self):
1624 super(PythonBackendTests, self).setUp()
1625 self.simple_doc = simplejson.loads(simple_doc)
1626
1597 def test_create_doc_with_factory(self):1627 def test_create_doc_with_factory(self):
1598 self.db.set_document_factory(TestAlternativeDocument)1628 self.db.set_document_factory(TestAlternativeDocument)
1599 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')1629 doc = self.db.create_doc(self.simple_doc, doc_id='my_doc_id')
1600 self.assertTrue(isinstance(doc, TestAlternativeDocument))1630 self.assertTrue(isinstance(doc, TestAlternativeDocument))
16011631
1602 def test_get_doc_after_put_with_factory(self):1632 def test_get_doc_after_put_with_factory(self):
1603 doc = self.db.create_doc(simple_doc, doc_id='my_doc_id')1633 doc = self.db.create_doc(self.simple_doc, doc_id='my_doc_id')
1604 self.db.set_document_factory(TestAlternativeDocument)1634 self.db.set_document_factory(TestAlternativeDocument)
1605 result = self.db.get_doc('my_doc_id')1635 result = self.db.get_doc('my_doc_id')
1606 self.assertTrue(isinstance(result, TestAlternativeDocument))1636 self.assertTrue(isinstance(result, TestAlternativeDocument))
@@ -1615,13 +1645,13 @@
16151645
1616 def test_get_all_docs_with_factory(self):1646 def test_get_all_docs_with_factory(self):
1617 self.db.set_document_factory(TestAlternativeDocument)1647 self.db.set_document_factory(TestAlternativeDocument)
1618 self.db.create_doc(simple_doc)1648 self.db.create_doc(self.simple_doc)
1619 self.assertTrue(isinstance(1649 self.assertTrue(isinstance(
1620 self.db.get_all_docs()[1][0], TestAlternativeDocument))1650 self.db.get_all_docs()[1][0], TestAlternativeDocument))
16211651
1622 def test_get_docs_conflicted_with_factory(self):1652 def test_get_docs_conflicted_with_factory(self):
1623 self.db.set_document_factory(TestAlternativeDocument)1653 self.db.set_document_factory(TestAlternativeDocument)
1624 doc1 = self.db.create_doc(simple_doc)1654 doc1 = self.db.create_doc(self.simple_doc)
1625 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)1655 doc2 = self.make_document(doc1.doc_id, 'alternate:1', nested_doc)
1626 self.db._put_doc_if_newer(1656 self.db._put_doc_if_newer(
1627 doc2, save_conflict=True, replica_uid='r', replica_gen=1,1657 doc2, save_conflict=True, replica_uid='r', replica_gen=1,
@@ -1632,7 +1662,7 @@
16321662
1633 def test_get_from_index_with_factory(self):1663 def test_get_from_index_with_factory(self):
1634 self.db.set_document_factory(TestAlternativeDocument)1664 self.db.set_document_factory(TestAlternativeDocument)
1635 self.db.create_doc(simple_doc)1665 self.db.create_doc(self.simple_doc)
1636 self.db.create_index('test-idx', 'key')1666 self.db.create_index('test-idx', 'key')
1637 self.assertTrue(1667 self.assertTrue(
1638 isinstance(1668 isinstance(
@@ -1640,7 +1670,7 @@
1640 TestAlternativeDocument))1670 TestAlternativeDocument))
16411671
1642 def test_sync_exchange_updates_indexes(self):1672 def test_sync_exchange_updates_indexes(self):
1643 doc = self.db.create_doc(simple_doc)1673 doc = self.db.create_doc(self.simple_doc)
1644 self.db.create_index('test-idx', 'key')1674 self.db.create_index('test-idx', 'key')
1645 new_content = '{"key": "altval"}'1675 new_content = '{"key": "altval"}'
1646 other_rev = 'test:1|z:2'1676 other_rev = 'test:1|z:2'
16471677
=== modified file 'u1db/tests/test_c_backend.py'
--- u1db/tests/test_c_backend.py 2012-07-06 20:48:40 +0000
+++ u1db/tests/test_c_backend.py 2012-07-19 20:11:24 +0000
@@ -70,13 +70,13 @@
70 def test__get_generation(self):70 def test__get_generation(self):
71 db = c_backend_wrapper.CDatabase(':memory:')71 db = c_backend_wrapper.CDatabase(':memory:')
72 self.assertEqual(0, db._get_generation())72 self.assertEqual(0, db._get_generation())
73 db.create_doc(tests.simple_doc)73 db.create_doc_from_json(tests.simple_doc)
74 self.assertEqual(1, db._get_generation())74 self.assertEqual(1, db._get_generation())
7575
76 def test__get_generation_info(self):76 def test__get_generation_info(self):
77 db = c_backend_wrapper.CDatabase(':memory:')77 db = c_backend_wrapper.CDatabase(':memory:')
78 self.assertEqual((0, ''), db._get_generation_info())78 self.assertEqual((0, ''), db._get_generation_info())
79 db.create_doc(tests.simple_doc)79 db.create_doc_from_json(tests.simple_doc)
80 info = db._get_generation_info()80 info = db._get_generation_info()
81 self.assertEqual(1, info[0])81 self.assertEqual(1, info[0])
82 self.assertTrue(info[1].startswith('T-'))82 self.assertTrue(info[1].startswith('T-'))
@@ -107,14 +107,14 @@
107 # We manually poke data into the DB, so that we test just the "get_doc"107 # We manually poke data into the DB, so that we test just the "get_doc"
108 # code, rather than also testing the index management code.108 # code, rather than also testing the index management code.
109 self.db = c_backend_wrapper.CDatabase(':memory:')109 self.db = c_backend_wrapper.CDatabase(':memory:')
110 doc = self.db.create_doc(tests.simple_doc)110 doc = self.db.create_doc_from_json(tests.simple_doc)
111 self.db.create_index_list("key-idx", ["key"])111 self.db.create_index_list("key-idx", ["key"])
112 docs = self.db.get_from_index('key-idx', 'value')112 docs = self.db.get_from_index('key-idx', 'value')
113 self.assertEqual([doc], docs)113 self.assertEqual([doc], docs)
114114
115 def test_create_index_list_on_non_ascii_field_name(self):115 def test_create_index_list_on_non_ascii_field_name(self):
116 self.db = c_backend_wrapper.CDatabase(':memory:')116 self.db = c_backend_wrapper.CDatabase(':memory:')
117 doc = self.db.create_doc(simplejson.dumps({u'\xe5': 'value'}))117 doc = self.db.create_doc_from_json(simplejson.dumps({u'\xe5': 'value'}))
118 self.db.create_index_list('test-idx', [u'\xe5'])118 self.db.create_index_list('test-idx', [u'\xe5'])
119 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))119 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))
120120
@@ -126,13 +126,13 @@
126126
127 def test_create_index_evaluates_it(self):127 def test_create_index_evaluates_it(self):
128 self.db = c_backend_wrapper.CDatabase(':memory:')128 self.db = c_backend_wrapper.CDatabase(':memory:')
129 doc = self.db.create_doc(tests.simple_doc)129 doc = self.db.create_doc_from_json(tests.simple_doc)
130 self.db.create_index_list('test-idx', ['key'])130 self.db.create_index_list('test-idx', ['key'])
131 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))131 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))
132132
133 def test_wildcard_matches_unicode_value(self):133 def test_wildcard_matches_unicode_value(self):
134 self.db = c_backend_wrapper.CDatabase(':memory:')134 self.db = c_backend_wrapper.CDatabase(':memory:')
135 doc = self.db.create_doc(simplejson.dumps({"key": u"valu\xe5"}))135 doc = self.db.create_doc_from_json(simplejson.dumps({"key": u"valu\xe5"}))
136 self.db.create_index_list('test-idx', ['key'])136 self.db.create_index_list('test-idx', ['key'])
137 self.assertEqual([doc], self.db.get_from_index('test-idx', '*'))137 self.assertEqual([doc], self.db.get_from_index('test-idx', '*'))
138138
@@ -151,8 +151,8 @@
151151
152 def test_create_index_after_deleting_document(self):152 def test_create_index_after_deleting_document(self):
153 self.db = c_backend_wrapper.CDatabase(':memory:')153 self.db = c_backend_wrapper.CDatabase(':memory:')
154 doc = self.db.create_doc(tests.simple_doc)154 doc = self.db.create_doc_from_json(tests.simple_doc)
155 doc2 = self.db.create_doc(tests.simple_doc)155 doc2 = self.db.create_doc_from_json(tests.simple_doc)
156 self.db.delete_doc(doc2)156 self.db.delete_doc(doc2)
157 self.db.create_index_list('test-idx', ['key'])157 self.db.create_index_list('test-idx', ['key'])
158 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))158 self.assertEqual([doc], self.db.get_from_index('test-idx', 'value'))
@@ -161,7 +161,7 @@
161 # We manually poke data into the DB, so that we test just the "get_doc"161 # We manually poke data into the DB, so that we test just the "get_doc"
162 # code, rather than also testing the index management code.162 # code, rather than also testing the index management code.
163 self.db = c_backend_wrapper.CDatabase(':memory:')163 self.db = c_backend_wrapper.CDatabase(':memory:')
164 doc = self.db.create_doc(tests.simple_doc)164 doc = self.db.create_doc_from_json(tests.simple_doc)
165 self.db.create_index("key-idx", "key")165 self.db.create_index("key-idx", "key")
166 docs = self.db.get_from_index('key-idx', 'value')166 docs = self.db.get_from_index('key-idx', 'value')
167 self.assertEqual([doc], docs)167 self.assertEqual([doc], docs)
@@ -170,7 +170,7 @@
170 # We manually poke data into the DB, so that we test just the "get_doc"170 # We manually poke data into the DB, so that we test just the "get_doc"
171 # code, rather than also testing the index management code.171 # code, rather than also testing the index management code.
172 self.db = c_backend_wrapper.CDatabase(':memory:')172 self.db = c_backend_wrapper.CDatabase(':memory:')
173 doc = self.db.create_doc(tests.simple_doc)173 doc = self.db.create_doc_from_json(tests.simple_doc)
174 self.db.create_index("key-idx", "key")174 self.db.create_index("key-idx", "key")
175 docs = self.db.get_from_index_list('key-idx', ['value'])175 docs = self.db.get_from_index_list('key-idx', ['value'])
176 self.assertEqual([doc], docs)176 self.assertEqual([doc], docs)
@@ -178,7 +178,7 @@
178 def test_get_from_index_list_multi(self):178 def test_get_from_index_list_multi(self):
179 self.db = c_backend_wrapper.CDatabase(':memory:')179 self.db = c_backend_wrapper.CDatabase(':memory:')
180 content = '{"key": "value", "key2": "value2"}'180 content = '{"key": "value", "key2": "value2"}'
181 doc = self.db.create_doc(content)181 doc = self.db.create_doc_from_json(content)
182 self.db.create_index('test-idx', 'key', 'key2')182 self.db.create_index('test-idx', 'key', 'key2')
183 self.assertEqual(183 self.assertEqual(
184 [doc],184 [doc],
@@ -186,10 +186,10 @@
186186
187 def test_get_from_index_list_multi_ordered(self):187 def test_get_from_index_list_multi_ordered(self):
188 self.db = c_backend_wrapper.CDatabase(':memory:')188 self.db = c_backend_wrapper.CDatabase(':memory:')
189 doc1 = self.db.create_doc('{"key": "value3", "key2": "value4"}')189 doc1 = self.db.create_doc_from_json('{"key": "value3", "key2": "value4"}')
190 doc2 = self.db.create_doc('{"key": "value2", "key2": "value3"}')190 doc2 = self.db.create_doc_from_json('{"key": "value2", "key2": "value3"}')
191 doc3 = self.db.create_doc('{"key": "value2", "key2": "value2"}')191 doc3 = self.db.create_doc_from_json('{"key": "value2", "key2": "value2"}')
192 doc4 = self.db.create_doc('{"key": "value1", "key2": "value1"}')192 doc4 = self.db.create_doc_from_json('{"key": "value1", "key2": "value1"}')
193 self.db.create_index('test-idx', 'key', 'key2')193 self.db.create_index('test-idx', 'key', 'key2')
194 self.assertEqual(194 self.assertEqual(
195 [doc4, doc3, doc2, doc1],195 [doc4, doc3, doc2, doc1],
@@ -197,14 +197,14 @@
197197
198 def test_get_from_index_2(self):198 def test_get_from_index_2(self):
199 self.db = c_backend_wrapper.CDatabase(':memory:')199 self.db = c_backend_wrapper.CDatabase(':memory:')
200 doc = self.db.create_doc(tests.nested_doc)200 doc = self.db.create_doc_from_json(tests.nested_doc)
201 self.db.create_index("multi-idx", "key", "sub.doc")201 self.db.create_index("multi-idx", "key", "sub.doc")
202 docs = self.db.get_from_index('multi-idx', 'value', 'underneath')202 docs = self.db.get_from_index('multi-idx', 'value', 'underneath')
203 self.assertEqual([doc], docs)203 self.assertEqual([doc], docs)
204204
205 def test_get_index_keys(self):205 def test_get_index_keys(self):
206 self.db = c_backend_wrapper.CDatabase(':memory:')206 self.db = c_backend_wrapper.CDatabase(':memory:')
207 self.db.create_doc(tests.simple_doc)207 self.db.create_doc_from_json(tests.simple_doc)
208 self.db.create_index("key-idx", "key")208 self.db.create_index("key-idx", "key")
209 keys = self.db.get_index_keys('key-idx')209 keys = self.db.get_index_keys('key-idx')
210 self.assertEqual([("value",)], keys)210 self.assertEqual([("value",)], keys)
@@ -303,7 +303,7 @@
303 self.assertEqual(['doc-id'], exc.get_seen_ids())303 self.assertEqual(['doc-id'], exc.get_seen_ids())
304304
305 def test_sync_exchange_conflicted_doc(self):305 def test_sync_exchange_conflicted_doc(self):
306 doc = self.db.create_doc(tests.simple_doc)306 doc = self.db.create_doc_from_json(tests.simple_doc)
307 exc = self.st._get_sync_exchange("source-uid", 5)307 exc = self.st._get_sync_exchange("source-uid", 5)
308 doc2 = c_backend_wrapper.make_document(doc.doc_id, 'replica:1',308 doc2 = c_backend_wrapper.make_document(doc.doc_id, 'replica:1',
309 tests.nested_doc)309 tests.nested_doc)
@@ -315,7 +315,7 @@
315 self.assertEqual([], exc.get_seen_ids())315 self.assertEqual([], exc.get_seen_ids())
316316
317 def test_sync_exchange_find_doc_ids(self):317 def test_sync_exchange_find_doc_ids(self):
318 doc = self.db.create_doc(tests.simple_doc)318 doc = self.db.create_doc_from_json(tests.simple_doc)
319 exc = self.st._get_sync_exchange("source-uid", 0)319 exc = self.st._get_sync_exchange("source-uid", 0)
320 self.assertEqual(0, exc.target_gen)320 self.assertEqual(0, exc.target_gen)
321 exc.find_doc_ids_to_return()321 exc.find_doc_ids_to_return()
@@ -326,8 +326,8 @@
326 self.assertEqual(1, exc.target_gen)326 self.assertEqual(1, exc.target_gen)
327327
328 def test_sync_exchange_find_doc_ids_not_including_recently_inserted(self):328 def test_sync_exchange_find_doc_ids_not_including_recently_inserted(self):
329 doc1 = self.db.create_doc(tests.simple_doc)329 doc1 = self.db.create_doc_from_json(tests.simple_doc)
330 doc2 = self.db.create_doc(tests.nested_doc)330 doc2 = self.db.create_doc_from_json(tests.nested_doc)
331 exc = self.st._get_sync_exchange("source-uid", 0)331 exc = self.st._get_sync_exchange("source-uid", 0)
332 doc3 = c_backend_wrapper.make_document(doc1.doc_id,332 doc3 = c_backend_wrapper.make_document(doc1.doc_id,
333 doc1.rev + "|zreplica:2", tests.simple_doc)333 doc1.rev + "|zreplica:2", tests.simple_doc)
@@ -343,16 +343,16 @@
343 def return_doc_cb(doc, gen, trans_id):343 def return_doc_cb(doc, gen, trans_id):
344 returned.append((doc, gen, trans_id))344 returned.append((doc, gen, trans_id))
345345
346 doc1 = self.db.create_doc(tests.simple_doc)346 doc1 = self.db.create_doc_from_json(tests.simple_doc)
347 exc = self.st._get_sync_exchange("source-uid", 0)347 exc = self.st._get_sync_exchange("source-uid", 0)
348 exc.find_doc_ids_to_return()348 exc.find_doc_ids_to_return()
349 exc.return_docs(return_doc_cb)349 exc.return_docs(return_doc_cb)
350 self.assertEqual((doc1, 1), returned[0][:-1])350 self.assertEqual((doc1, 1), returned[0][:-1])
351351
352 def test_sync_exchange_doc_ids(self):352 def test_sync_exchange_doc_ids(self):
353 doc1 = self.db.create_doc(tests.simple_doc, doc_id='doc-1')353 doc1 = self.db.create_doc_from_json(tests.simple_doc, doc_id='doc-1')
354 db2 = c_backend_wrapper.CDatabase(':memory:')354 db2 = c_backend_wrapper.CDatabase(':memory:')
355 doc2 = db2.create_doc(tests.nested_doc, doc_id='doc-2')355 doc2 = db2.create_doc_from_json(tests.nested_doc, doc_id='doc-2')
356 returned = []356 returned = []
357357
358 def return_doc_cb(doc, gen, trans_id):358 def return_doc_cb(doc, gen, trans_id):
@@ -419,11 +419,11 @@
419419
420 def test_trivial_sync(self):420 def test_trivial_sync(self):
421 mem_db = self.request_state._create_database('test.db')421 mem_db = self.request_state._create_database('test.db')
422 mem_doc = mem_db.create_doc(tests.nested_doc)422 mem_doc = mem_db.create_doc_from_json(tests.nested_doc)
423 url = self.getURL('test.db')423 url = self.getURL('test.db')
424 target = c_backend_wrapper.create_http_sync_target(url)424 target = c_backend_wrapper.create_http_sync_target(url)
425 db = c_backend_wrapper.CDatabase(':memory:')425 db = c_backend_wrapper.CDatabase(':memory:')
426 doc = db.create_doc(tests.simple_doc)426 doc = db.create_doc_from_json(tests.simple_doc)
427 c_backend_wrapper.sync_db_to_target(db, target)427 c_backend_wrapper.sync_db_to_target(db, target)
428 self.assertGetDoc(mem_db, doc.doc_id, doc.rev, doc.get_json(), False)428 self.assertGetDoc(mem_db, doc.doc_id, doc.rev, doc.get_json(), False)
429 self.assertGetDoc(db, mem_doc.doc_id, mem_doc.rev, mem_doc.get_json(),429 self.assertGetDoc(db, mem_doc.doc_id, mem_doc.rev, mem_doc.get_json(),
@@ -431,7 +431,7 @@
431431
432 def test_unavailable(self):432 def test_unavailable(self):
433 mem_db = self.request_state._create_database('test.db')433 mem_db = self.request_state._create_database('test.db')
434 mem_db.create_doc(tests.nested_doc)434 mem_db.create_doc_from_json(tests.nested_doc)
435 tries = []435 tries = []
436436
437 def wrapper(instance, *args, **kwargs):437 def wrapper(instance, *args, **kwargs):
@@ -442,7 +442,7 @@
442 url = self.getURL('test.db')442 url = self.getURL('test.db')
443 target = c_backend_wrapper.create_http_sync_target(url)443 target = c_backend_wrapper.create_http_sync_target(url)
444 db = c_backend_wrapper.CDatabase(':memory:')444 db = c_backend_wrapper.CDatabase(':memory:')
445 db.create_doc(tests.simple_doc)445 db.create_doc_from_json(tests.simple_doc)
446 self.assertRaises(446 self.assertRaises(
447 errors.Unavailable, c_backend_wrapper.sync_db_to_target, db,447 errors.Unavailable, c_backend_wrapper.sync_db_to_target, db,
448 target)448 target)
@@ -450,7 +450,7 @@
450450
451 def test_unavailable_then_available(self):451 def test_unavailable_then_available(self):
452 mem_db = self.request_state._create_database('test.db')452 mem_db = self.request_state._create_database('test.db')
453 mem_doc = mem_db.create_doc(tests.nested_doc)453 mem_doc = mem_db.create_doc_from_json(tests.nested_doc)
454 orig_whatschanged = mem_db.whats_changed454 orig_whatschanged = mem_db.whats_changed
455 tries = []455 tries = []
456456
@@ -464,7 +464,7 @@
464 url = self.getURL('test.db')464 url = self.getURL('test.db')
465 target = c_backend_wrapper.create_http_sync_target(url)465 target = c_backend_wrapper.create_http_sync_target(url)
466 db = c_backend_wrapper.CDatabase(':memory:')466 db = c_backend_wrapper.CDatabase(':memory:')
467 doc = db.create_doc(tests.simple_doc)467 doc = db.create_doc_from_json(tests.simple_doc)
468 c_backend_wrapper.sync_db_to_target(db, target)468 c_backend_wrapper.sync_db_to_target(db, target)
469 self.assertEqual(1, len(tries))469 self.assertEqual(1, len(tries))
470 self.assertGetDoc(mem_db, doc.doc_id, doc.rev, doc.get_json(), False)470 self.assertGetDoc(mem_db, doc.doc_id, doc.rev, doc.get_json(), False)
@@ -484,13 +484,13 @@
484484
485 def test_trivial_sync(self):485 def test_trivial_sync(self):
486 mem_db = self.request_state._create_database('test.db')486 mem_db = self.request_state._create_database('test.db')
487 mem_doc = mem_db.create_doc(tests.nested_doc)487 mem_doc = mem_db.create_doc_from_json(tests.nested_doc)
488 url = self.getURL('~/test.db')488 url = self.getURL('~/test.db')
489 target = c_backend_wrapper.create_oauth_http_sync_target(url,489 target = c_backend_wrapper.create_oauth_http_sync_target(url,
490 tests.consumer1.key, tests.consumer1.secret,490 tests.consumer1.key, tests.consumer1.secret,
491 tests.token1.key, tests.token1.secret)491 tests.token1.key, tests.token1.secret)
492 db = c_backend_wrapper.CDatabase(':memory:')492 db = c_backend_wrapper.CDatabase(':memory:')
493 doc = db.create_doc(tests.simple_doc)493 doc = db.create_doc_from_json(tests.simple_doc)
494 c_backend_wrapper.sync_db_to_target(db, target)494 c_backend_wrapper.sync_db_to_target(db, target)
495 self.assertGetDoc(mem_db, doc.doc_id, doc.rev, doc.get_json(), False)495 self.assertGetDoc(mem_db, doc.doc_id, doc.rev, doc.get_json(), False)
496 self.assertGetDoc(db, mem_doc.doc_id, mem_doc.rev, mem_doc.get_json(),496 self.assertGetDoc(db, mem_doc.doc_id, mem_doc.rev, mem_doc.get_json(),
497497
=== modified file 'u1db/tests/test_http_app.py'
--- u1db/tests/test_http_app.py 2012-07-12 17:21:15 +0000
+++ u1db/tests/test_http_app.py 2012-07-19 20:11:24 +0000
@@ -604,7 +604,7 @@
604 self.assertEqual({'rev': doc.rev}, simplejson.loads(resp.body))604 self.assertEqual({'rev': doc.rev}, simplejson.loads(resp.body))
605605
606 def test_put_doc(self):606 def test_put_doc(self):
607 doc = self.db0.create_doc('{"x": 1}', doc_id='doc1')607 doc = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
608 resp = self.app.put('/db0/doc/doc1?old_rev=%s' % doc.rev,608 resp = self.app.put('/db0/doc/doc1?old_rev=%s' % doc.rev,
609 params='{"x": 2}',609 params='{"x": 2}',
610 headers={'content-type': 'application/json'})610 headers={'content-type': 'application/json'})
@@ -616,7 +616,7 @@
616616
617 def test_put_doc_too_large(self):617 def test_put_doc_too_large(self):
618 self.http_app.max_request_size = 15000618 self.http_app.max_request_size = 15000
619 doc = self.db0.create_doc('{"x": 1}', doc_id='doc1')619 doc = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
620 resp = self.app.put('/db0/doc/doc1?old_rev=%s' % doc.rev,620 resp = self.app.put('/db0/doc/doc1?old_rev=%s' % doc.rev,
621 params='{"%s": 2}' % ('z' * 16000),621 params='{"%s": 2}' % ('z' * 16000),
622 headers={'content-type': 'application/json'},622 headers={'content-type': 'application/json'},
@@ -624,7 +624,7 @@
624 self.assertEqual(400, resp.status)624 self.assertEqual(400, resp.status)
625625
626 def test_delete_doc(self):626 def test_delete_doc(self):
627 doc = self.db0.create_doc('{"x": 1}', doc_id='doc1')627 doc = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
628 resp = self.app.delete('/db0/doc/doc1?old_rev=%s' % doc.rev)628 resp = self.app.delete('/db0/doc/doc1?old_rev=%s' % doc.rev)
629 doc = self.db0.get_doc('doc1', include_deleted=True)629 doc = self.db0.get_doc('doc1', include_deleted=True)
630 self.assertEqual(None, doc.content)630 self.assertEqual(None, doc.content)
@@ -633,7 +633,7 @@
633 self.assertEqual({'rev': doc.rev}, simplejson.loads(resp.body))633 self.assertEqual({'rev': doc.rev}, simplejson.loads(resp.body))
634634
635 def test_get_doc(self):635 def test_get_doc(self):
636 doc = self.db0.create_doc('{"x": 1}', doc_id='doc1')636 doc = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
637 resp = self.app.get('/db0/doc/%s' % doc.doc_id)637 resp = self.app.get('/db0/doc/%s' % doc.doc_id)
638 self.assertEqual(200, resp.status)638 self.assertEqual(200, resp.status)
639 self.assertEqual('application/json', resp.header('content-type'))639 self.assertEqual('application/json', resp.header('content-type'))
@@ -651,7 +651,7 @@
651 self.assertEqual('false', resp.header('x-u1db-has-conflicts'))651 self.assertEqual('false', resp.header('x-u1db-has-conflicts'))
652652
653 def test_get_doc_deleted(self):653 def test_get_doc_deleted(self):
654 doc = self.db0.create_doc('{"x": 1}', doc_id='doc1')654 doc = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
655 self.db0.delete_doc(doc)655 self.db0.delete_doc(doc)
656 resp = self.app.get('/db0/doc/doc1', expect_errors=True)656 resp = self.app.get('/db0/doc/doc1', expect_errors=True)
657 self.assertEqual(404, resp.status)657 self.assertEqual(404, resp.status)
@@ -661,7 +661,7 @@
661 simplejson.loads(resp.body))661 simplejson.loads(resp.body))
662662
663 def test_get_doc_deleted_explicit_exclude(self):663 def test_get_doc_deleted_explicit_exclude(self):
664 doc = self.db0.create_doc('{"x": 1}', doc_id='doc1')664 doc = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
665 self.db0.delete_doc(doc)665 self.db0.delete_doc(doc)
666 resp = self.app.get(666 resp = self.app.get(
667 '/db0/doc/doc1?include_deleted=false', expect_errors=True)667 '/db0/doc/doc1?include_deleted=false', expect_errors=True)
@@ -672,7 +672,7 @@
672 simplejson.loads(resp.body))672 simplejson.loads(resp.body))
673673
674 def test_get_deleted_doc(self):674 def test_get_deleted_doc(self):
675 doc = self.db0.create_doc('{"x": 1}', doc_id='doc1')675 doc = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
676 self.db0.delete_doc(doc)676 self.db0.delete_doc(doc)
677 resp = self.app.get(677 resp = self.app.get(
678 '/db0/doc/doc1?include_deleted=true', expect_errors=True)678 '/db0/doc/doc1?include_deleted=true', expect_errors=True)
@@ -691,8 +691,8 @@
691 simplejson.loads(resp.body))691 simplejson.loads(resp.body))
692692
693 def test_get_docs(self):693 def test_get_docs(self):
694 doc1 = self.db0.create_doc('{"x": 1}', doc_id='doc1')694 doc1 = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
695 doc2 = self.db0.create_doc('{"x": 1}', doc_id='doc2')695 doc2 = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc2')
696 ids = ','.join([doc1.doc_id, doc2.doc_id])696 ids = ','.join([doc1.doc_id, doc2.doc_id])
697 resp = self.app.get('/db0/docs?doc_ids=%s' % ids)697 resp = self.app.get('/db0/docs?doc_ids=%s' % ids)
698 self.assertEqual(200, resp.status)698 self.assertEqual(200, resp.status)
@@ -706,8 +706,8 @@
706 self.assertEqual(expected, simplejson.loads(resp.body))706 self.assertEqual(expected, simplejson.loads(resp.body))
707707
708 def test_get_docs_percent(self):708 def test_get_docs_percent(self):
709 doc1 = self.db0.create_doc('{"x": 1}', doc_id='doc%1')709 doc1 = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc%1')
710 doc2 = self.db0.create_doc('{"x": 1}', doc_id='doc2')710 doc2 = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc2')
711 ids = ','.join([doc1.doc_id, doc2.doc_id])711 ids = ','.join([doc1.doc_id, doc2.doc_id])
712 resp = self.app.get('/db0/docs?doc_ids=%s' % ids)712 resp = self.app.get('/db0/docs?doc_ids=%s' % ids)
713 self.assertEqual(200, resp.status)713 self.assertEqual(200, resp.status)
@@ -721,8 +721,8 @@
721 self.assertEqual(expected, simplejson.loads(resp.body))721 self.assertEqual(expected, simplejson.loads(resp.body))
722722
723 def test_get_docs_deleted(self):723 def test_get_docs_deleted(self):
724 doc1 = self.db0.create_doc('{"x": 1}', doc_id='doc1')724 doc1 = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
725 doc2 = self.db0.create_doc('{"x": 1}', doc_id='doc2')725 doc2 = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc2')
726 self.db0.delete_doc(doc2)726 self.db0.delete_doc(doc2)
727 ids = ','.join([doc1.doc_id, doc2.doc_id])727 ids = ','.join([doc1.doc_id, doc2.doc_id])
728 resp = self.app.get('/db0/docs?doc_ids=%s' % ids)728 resp = self.app.get('/db0/docs?doc_ids=%s' % ids)
@@ -735,8 +735,8 @@
735 self.assertEqual(expected, simplejson.loads(resp.body))735 self.assertEqual(expected, simplejson.loads(resp.body))
736736
737 def test_get_docs_include_deleted(self):737 def test_get_docs_include_deleted(self):
738 doc1 = self.db0.create_doc('{"x": 1}', doc_id='doc1')738 doc1 = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
739 doc2 = self.db0.create_doc('{"x": 1}', doc_id='doc2')739 doc2 = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc2')
740 self.db0.delete_doc(doc2)740 self.db0.delete_doc(doc2)
741 ids = ','.join([doc1.doc_id, doc2.doc_id])741 ids = ','.join([doc1.doc_id, doc2.doc_id])
742 resp = self.app.get('/db0/docs?doc_ids=%s&include_deleted=true' % ids)742 resp = self.app.get('/db0/docs?doc_ids=%s&include_deleted=true' % ids)
@@ -841,8 +841,8 @@
841 self.assertEqual(400, resp.status)841 self.assertEqual(400, resp.status)
842842
843 def test_sync_exchange_receive(self):843 def test_sync_exchange_receive(self):
844 doc = self.db0.create_doc('{"value": "there"}')844 doc = self.db0.create_doc_from_json('{"value": "there"}')
845 doc2 = self.db0.create_doc('{"value": "there2"}')845 doc2 = self.db0.create_doc_from_json('{"value": "there2"}')
846 args = dict(last_known_generation=0)846 args = dict(last_known_generation=0)
847 body = "[\r\n%s\r\n]" % simplejson.dumps(args)847 body = "[\r\n%s\r\n]" % simplejson.dumps(args)
848 resp = self.app.post('/db0/sync-from/replica',848 resp = self.app.post('/db0/sync-from/replica',
@@ -920,7 +920,7 @@
920 self.http_app.request_begin = begin920 self.http_app.request_begin = begin
921 self.http_app.request_done = done921 self.http_app.request_done = done
922922
923 doc = self.db0.create_doc('{"x": 1}', doc_id='doc1')923 doc = self.db0.create_doc_from_json('{"x": 1}', doc_id='doc1')
924 self.app.get('/db0/doc/%s' % doc.doc_id)924 self.app.get('/db0/doc/%s' % doc.doc_id)
925925
926 self.assertEqual(['begin', 'done'], calls)926 self.assertEqual(['begin', 'done'], calls)
927927
=== modified file 'u1db/tests/test_http_database.py'
--- u1db/tests/test_http_database.py 2012-05-24 21:09:21 +0000
+++ u1db/tests/test_http_database.py 2012-07-19 20:11:24 +0000
@@ -147,7 +147,7 @@
147147
148 def test_create_doc_with_id(self):148 def test_create_doc_with_id(self):
149 self.response_val = {'rev': 'doc-rev'}, {}149 self.response_val = {'rev': 'doc-rev'}, {}
150 new_doc = self.db.create_doc('{"v": 1}', doc_id='doc-id')150 new_doc = self.db.create_doc_from_json('{"v": 1}', doc_id='doc-id')
151 self.assertEqual('doc-rev', new_doc.rev)151 self.assertEqual('doc-rev', new_doc.rev)
152 self.assertEqual('doc-id', new_doc.doc_id)152 self.assertEqual('doc-id', new_doc.doc_id)
153 self.assertEqual('{"v": 1}', new_doc.get_json())153 self.assertEqual('{"v": 1}', new_doc.get_json())
@@ -156,7 +156,7 @@
156156
157 def test_create_doc_without_id(self):157 def test_create_doc_without_id(self):
158 self.response_val = {'rev': 'doc-rev-2'}, {}158 self.response_val = {'rev': 'doc-rev-2'}, {}
159 new_doc = self.db.create_doc('{"v": 3}')159 new_doc = self.db.create_doc_from_json('{"v": 3}')
160 self.assertEqual('D-', new_doc.doc_id[:2])160 self.assertEqual('D-', new_doc.doc_id[:2])
161 self.assertEqual('doc-rev-2', new_doc.rev)161 self.assertEqual('doc-rev-2', new_doc.rev)
162 self.assertEqual('{"v": 3}', new_doc.get_json())162 self.assertEqual('{"v": 3}', new_doc.get_json())
163163
=== modified file 'u1db/tests/test_open.py'
--- u1db/tests/test_open.py 2012-05-30 16:28:17 +0000
+++ u1db/tests/test_open.py 2012-07-19 20:11:24 +0000
@@ -54,7 +54,7 @@
54 def test_open_existing(self):54 def test_open_existing(self):
55 db = sqlite_backend.SQLitePartialExpandDatabase(self.db_path)55 db = sqlite_backend.SQLitePartialExpandDatabase(self.db_path)
56 self.addCleanup(db.close)56 self.addCleanup(db.close)
57 doc = db.create_doc(tests.simple_doc)57 doc = db.create_doc_from_json(tests.simple_doc)
58 # Even though create=True, we shouldn't wipe the db58 # Even though create=True, we shouldn't wipe the db
59 db2 = u1db_open(self.db_path, create=True)59 db2 = u1db_open(self.db_path, create=True)
60 self.addCleanup(db2.close)60 self.addCleanup(db2.close)
6161
=== modified file 'u1db/tests/test_remote_sync_target.py'
--- u1db/tests/test_remote_sync_target.py 2012-07-06 20:48:40 +0000
+++ u1db/tests/test_remote_sync_target.py 2012-07-19 20:11:24 +0000
@@ -267,7 +267,7 @@
267 self.patch(self.server.RequestHandlerClass, 'get_stderr',267 self.patch(self.server.RequestHandlerClass, 'get_stderr',
268 blackhole_getstderr)268 blackhole_getstderr)
269 db = self.request_state._create_database('test')269 db = self.request_state._create_database('test')
270 doc = db.create_doc('{"value": "there"}')270 doc = db.create_doc_from_json('{"value": "there"}')
271271
272 def bomb_get_docs(doc_ids, check_for_conflicts=None,272 def bomb_get_docs(doc_ids, check_for_conflicts=None,
273 include_deleted=False):273 include_deleted=False):
@@ -294,7 +294,7 @@
294 def test_sync_exchange_receive(self):294 def test_sync_exchange_receive(self):
295 self.startServer()295 self.startServer()
296 db = self.request_state._create_database('test')296 db = self.request_state._create_database('test')
297 doc = db.create_doc('{"value": "there"}')297 doc = db.create_doc_from_json('{"value": "there"}')
298 remote_target = self.getSyncTarget('test')298 remote_target = self.getSyncTarget('test')
299 other_changes = []299 other_changes = []
300300
301301
=== modified file 'u1db/tests/test_sqlite_backend.py'
--- u1db/tests/test_sqlite_backend.py 2012-07-06 20:48:40 +0000
+++ u1db/tests/test_sqlite_backend.py 2012-07-19 20:11:24 +0000
@@ -187,7 +187,7 @@
187 self.db.list_indexes())187 self.db.list_indexes())
188188
189 def test_no_indexes_no_document_fields(self):189 def test_no_indexes_no_document_fields(self):
190 self.db.create_doc(190 self.db.create_doc_from_json(
191 '{"key1": "val1", "key2": "val2"}')191 '{"key1": "val1", "key2": "val2"}')
192 c = self.db._get_sqlite_handle().cursor()192 c = self.db._get_sqlite_handle().cursor()
193 c.execute("SELECT doc_id, field_name, value FROM document_fields"193 c.execute("SELECT doc_id, field_name, value FROM document_fields"
@@ -195,8 +195,8 @@
195 self.assertEqual([], c.fetchall())195 self.assertEqual([], c.fetchall())
196196
197 def test_create_extracts_fields(self):197 def test_create_extracts_fields(self):
198 doc1 = self.db.create_doc('{"key1": "val1", "key2": "val2"}')198 doc1 = self.db.create_doc_from_json('{"key1": "val1", "key2": "val2"}')
199 doc2 = self.db.create_doc('{"key1": "valx", "key2": "valy"}')199 doc2 = self.db.create_doc_from_json('{"key1": "valx", "key2": "valy"}')
200 c = self.db._get_sqlite_handle().cursor()200 c = self.db._get_sqlite_handle().cursor()
201 c.execute("SELECT doc_id, field_name, value FROM document_fields"201 c.execute("SELECT doc_id, field_name, value FROM document_fields"
202 " ORDER BY doc_id, field_name, value")202 " ORDER BY doc_id, field_name, value")
@@ -213,7 +213,7 @@
213213
214 def test_put_updates_fields(self):214 def test_put_updates_fields(self):
215 self.db.create_index('test', 'key1', 'key2')215 self.db.create_index('test', 'key1', 'key2')
216 doc1 = self.db.create_doc(216 doc1 = self.db.create_doc_from_json(
217 '{"key1": "val1", "key2": "val2"}')217 '{"key1": "val1", "key2": "val2"}')
218 doc1.content = {"key1": "val1", "key2": "valy"}218 doc1.content = {"key1": "val1", "key2": "valy"}
219 self.db.put_doc(doc1)219 self.db.put_doc(doc1)
@@ -226,7 +226,7 @@
226226
227 def test_put_updates_nested_fields(self):227 def test_put_updates_nested_fields(self):
228 self.db.create_index('test', 'key', 'sub.doc')228 self.db.create_index('test', 'key', 'sub.doc')
229 doc1 = self.db.create_doc(nested_doc)229 doc1 = self.db.create_doc_from_json(nested_doc)
230 c = self.db._get_sqlite_handle().cursor()230 c = self.db._get_sqlite_handle().cursor()
231 c.execute("SELECT doc_id, field_name, value FROM document_fields"231 c.execute("SELECT doc_id, field_name, value FROM document_fields"
232 " ORDER BY doc_id, field_name, value")232 " ORDER BY doc_id, field_name, value")
@@ -380,7 +380,7 @@
380380
381 def test_indexed_fields_expanded(self):381 def test_indexed_fields_expanded(self):
382 self.db.create_index('idx1', 'key1')382 self.db.create_index('idx1', 'key1')
383 doc1 = self.db.create_doc('{"key1": "val1", "key2": "val2"}')383 doc1 = self.db.create_doc_from_json('{"key1": "val1", "key2": "val2"}')
384 self.assertEqual(set(['key1']), self.db._get_indexed_fields())384 self.assertEqual(set(['key1']), self.db._get_indexed_fields())
385 c = self.db._get_sqlite_handle().cursor()385 c = self.db._get_sqlite_handle().cursor()
386 c.execute("SELECT doc_id, field_name, value FROM document_fields"386 c.execute("SELECT doc_id, field_name, value FROM document_fields"
@@ -388,7 +388,7 @@
388 self.assertEqual([(doc1.doc_id, 'key1', 'val1')], c.fetchall())388 self.assertEqual([(doc1.doc_id, 'key1', 'val1')], c.fetchall())
389389
390 def test_create_index_updates_fields(self):390 def test_create_index_updates_fields(self):
391 doc1 = self.db.create_doc('{"key1": "val1", "key2": "val2"}')391 doc1 = self.db.create_doc_from_json('{"key1": "val1", "key2": "val2"}')
392 self.db.create_index('idx1', 'key1')392 self.db.create_index('idx1', 'key1')
393 self.assertEqual(set(['key1']), self.db._get_indexed_fields())393 self.assertEqual(set(['key1']), self.db._get_indexed_fields())
394 c = self.db._get_sqlite_handle().cursor()394 c = self.db._get_sqlite_handle().cursor()
395395
=== modified file 'u1db/tests/test_sync.py'
--- u1db/tests/test_sync.py 2012-07-13 19:35:51 +0000
+++ u1db/tests/test_sync.py 2012-07-19 20:11:24 +0000
@@ -152,7 +152,7 @@
152 def test_create_doc_updates_sync_info(self):152 def test_create_doc_updates_sync_info(self):
153 self.assertEqual(153 self.assertEqual(
154 ('test', 0, '', 0, ''), self.st.get_sync_info('other'))154 ('test', 0, '', 0, ''), self.st.get_sync_info('other'))
155 self.db.create_doc(simple_doc)155 self.db.create_doc_from_json(simple_doc)
156 self.assertEqual(1, self.st.get_sync_info('other')[1])156 self.assertEqual(1, self.st.get_sync_info('other')[1])
157157
158 def test_record_sync_info(self):158 def test_record_sync_info(self):
@@ -175,7 +175,7 @@
175 self.assertEqual(10, self.st.get_sync_info('replica')[3])175 self.assertEqual(10, self.st.get_sync_info('replica')[3])
176176
177 def test_sync_exchange_deleted(self):177 def test_sync_exchange_deleted(self):
178 doc = self.db.create_doc('{}')178 doc = self.db.create_doc_from_json('{}')
179 edit_rev = 'replica:1|' + doc.rev179 edit_rev = 'replica:1|' + doc.rev
180 docs_by_gen = [180 docs_by_gen = [
181 (self.make_document(doc.doc_id, edit_rev, None), 10, 'T-sid')]181 (self.make_document(doc.doc_id, edit_rev, None), 10, 'T-sid')]
@@ -207,7 +207,7 @@
207 self.assertEqual(11, self.st.get_sync_info('replica')[3])207 self.assertEqual(11, self.st.get_sync_info('replica')[3])
208208
209 def test_sync_exchange_refuses_conflicts(self):209 def test_sync_exchange_refuses_conflicts(self):
210 doc = self.db.create_doc(simple_doc)210 doc = self.db.create_doc_from_json(simple_doc)
211 self.assertTransactionLog([doc.doc_id], self.db)211 self.assertTransactionLog([doc.doc_id], self.db)
212 new_doc = '{"key": "altval"}'212 new_doc = '{"key": "altval"}'
213 docs_by_gen = [213 docs_by_gen = [
@@ -225,7 +225,7 @@
225 {'last_gen': 1, 'docs': [(doc.doc_id, doc.rev)]})225 {'last_gen': 1, 'docs': [(doc.doc_id, doc.rev)]})
226226
227 def test_sync_exchange_ignores_convergence(self):227 def test_sync_exchange_ignores_convergence(self):
228 doc = self.db.create_doc(simple_doc)228 doc = self.db.create_doc_from_json(simple_doc)
229 self.assertTransactionLog([doc.doc_id], self.db)229 self.assertTransactionLog([doc.doc_id], self.db)
230 gen, txid = self.db._get_generation_info()230 gen, txid = self.db._get_generation_info()
231 docs_by_gen = [231 docs_by_gen = [
@@ -237,7 +237,7 @@
237 self.assertEqual(([], 1), (self.other_changes, new_gen))237 self.assertEqual(([], 1), (self.other_changes, new_gen))
238238
239 def test_sync_exchange_returns_new_docs(self):239 def test_sync_exchange_returns_new_docs(self):
240 doc = self.db.create_doc(simple_doc)240 doc = self.db.create_doc_from_json(simple_doc)
241 self.assertTransactionLog([doc.doc_id], self.db)241 self.assertTransactionLog([doc.doc_id], self.db)
242 new_gen, _ = self.st.sync_exchange(242 new_gen, _ = self.st.sync_exchange(
243 [], 'other-replica', last_known_generation=0,243 [], 'other-replica', last_known_generation=0,
@@ -251,7 +251,7 @@
251 {'last_gen': 1, 'docs': [(doc.doc_id, doc.rev)]})251 {'last_gen': 1, 'docs': [(doc.doc_id, doc.rev)]})
252252
253 def test_sync_exchange_returns_deleted_docs(self):253 def test_sync_exchange_returns_deleted_docs(self):
254 doc = self.db.create_doc(simple_doc)254 doc = self.db.create_doc_from_json(simple_doc)
255 self.db.delete_doc(doc)255 self.db.delete_doc(doc)
256 self.assertTransactionLog([doc.doc_id, doc.doc_id], self.db)256 self.assertTransactionLog([doc.doc_id, doc.doc_id], self.db)
257 new_gen, _ = self.st.sync_exchange(257 new_gen, _ = self.st.sync_exchange(
@@ -266,8 +266,8 @@
266 {'last_gen': 2, 'docs': [(doc.doc_id, doc.rev)]})266 {'last_gen': 2, 'docs': [(doc.doc_id, doc.rev)]})
267267
268 def test_sync_exchange_returns_many_new_docs(self):268 def test_sync_exchange_returns_many_new_docs(self):
269 doc = self.db.create_doc(simple_doc)269 doc = self.db.create_doc_from_json(simple_doc)
270 doc2 = self.db.create_doc(nested_doc)270 doc2 = self.db.create_doc_from_json(nested_doc)
271 self.assertTransactionLog([doc.doc_id, doc2.doc_id], self.db)271 self.assertTransactionLog([doc.doc_id, doc2.doc_id], self.db)
272 new_gen, _ = self.st.sync_exchange(272 new_gen, _ = self.st.sync_exchange(
273 [], 'other-replica', last_known_generation=0,273 [], 'other-replica', last_known_generation=0,
@@ -285,7 +285,7 @@
285 [(doc.doc_id, doc.rev), (doc2.doc_id, doc2.rev)]})285 [(doc.doc_id, doc.rev), (doc2.doc_id, doc2.rev)]})
286286
287 def test_sync_exchange_getting_newer_docs(self):287 def test_sync_exchange_getting_newer_docs(self):
288 doc = self.db.create_doc(simple_doc)288 doc = self.db.create_doc_from_json(simple_doc)
289 self.assertTransactionLog([doc.doc_id], self.db)289 self.assertTransactionLog([doc.doc_id], self.db)
290 new_doc = '{"key": "altval"}'290 new_doc = '{"key": "altval"}'
291 docs_by_gen = [291 docs_by_gen = [
@@ -309,7 +309,7 @@
309 expected.append((doc.doc_id, conc_rev, cont, 3))309 expected.append((doc.doc_id, conc_rev, cont, 3))
310310
311 self.set_trace_hook(before_whatschanged_cb)311 self.set_trace_hook(before_whatschanged_cb)
312 doc = self.db.create_doc(simple_doc)312 doc = self.db.create_doc_from_json(simple_doc)
313 self.assertTransactionLog([doc.doc_id], self.db)313 self.assertTransactionLog([doc.doc_id], self.db)
314 new_doc = '{"key": "altval"}'314 new_doc = '{"key": "altval"}'
315 docs_by_gen = [315 docs_by_gen = [
@@ -326,10 +326,10 @@
326 def after_whatschanged_cb(state):326 def after_whatschanged_cb(state):
327 if state != 'after whats_changed':327 if state != 'after whats_changed':
328 return328 return
329 self.db.create_doc('{"new": "doc"}')329 self.db.create_doc_from_json('{"new": "doc"}')
330330
331 self.set_trace_hook(after_whatschanged_cb)331 self.set_trace_hook(after_whatschanged_cb)
332 doc = self.db.create_doc(simple_doc)332 doc = self.db.create_doc_from_json(simple_doc)
333 self.assertTransactionLog([doc.doc_id], self.db)333 self.assertTransactionLog([doc.doc_id], self.db)
334 new_doc = '{"key": "altval"}'334 new_doc = '{"key": "altval"}'
335 docs_by_gen = [335 docs_by_gen = [
@@ -341,7 +341,7 @@
341 self.assertEqual(([], 2), (self.other_changes, new_gen))341 self.assertEqual(([], 2), (self.other_changes, new_gen))
342342
343 def test_sync_exchange_converged_handling(self):343 def test_sync_exchange_converged_handling(self):
344 doc = self.db.create_doc(simple_doc)344 doc = self.db.create_doc_from_json(simple_doc)
345 docs_by_gen = [345 docs_by_gen = [
346 (self.make_document('new', 'other:1', '{}'), 4, 'T-foo'),346 (self.make_document('new', 'other:1', '{}'), 4, 'T-foo'),
347 (self.make_document(doc.doc_id, doc.rev, doc.get_json()), 5,347 (self.make_document(doc.doc_id, doc.rev, doc.get_json()), 5,
@@ -360,7 +360,7 @@
360 # suppress traceback printing in the wsgiref server360 # suppress traceback printing in the wsgiref server
361 self.patch(simple_server.ServerHandler,361 self.patch(simple_server.ServerHandler,
362 'log_exception', lambda h, exc_info: None)362 'log_exception', lambda h, exc_info: None)
363 doc = self.db.create_doc(simple_doc)363 doc = self.db.create_doc_from_json(simple_doc)
364 self.assertTransactionLog([doc.doc_id], self.db)364 self.assertTransactionLog([doc.doc_id], self.db)
365 self.assertRaises(365 self.assertRaises(
366 (errors.U1DBError, errors.BrokenSyncStream),366 (errors.U1DBError, errors.BrokenSyncStream),
@@ -373,7 +373,7 @@
373 if sync_exchange_doc_ids is None:373 if sync_exchange_doc_ids is None:
374 self.skipTest("sync_exchange_doc_ids not implemented")374 self.skipTest("sync_exchange_doc_ids not implemented")
375 db2 = self.create_database('test2')375 db2 = self.create_database('test2')
376 doc = db2.create_doc(simple_doc)376 doc = db2.create_doc_from_json(simple_doc)
377 new_gen, trans_id = sync_exchange_doc_ids(377 new_gen, trans_id = sync_exchange_doc_ids(
378 db2, [(doc.doc_id, 10, 'T-sid')], 0, None,378 db2, [(doc.doc_id, 10, 'T-sid')], 0, None,
379 return_doc_cb=self.receive_doc)379 return_doc_cb=self.receive_doc)
@@ -513,9 +513,9 @@
513 'return': {'docs': [], 'last_gen': 0}})513 'return': {'docs': [], 'last_gen': 0}})
514514
515 def test_sync_autoresolves(self):515 def test_sync_autoresolves(self):
516 doc1 = self.db1.create_doc(simple_doc, doc_id='doc')516 doc1 = self.db1.create_doc_from_json(simple_doc, doc_id='doc')
517 rev1 = doc1.rev517 rev1 = doc1.rev
518 doc2 = self.db2.create_doc(simple_doc, doc_id='doc')518 doc2 = self.db2.create_doc_from_json(simple_doc, doc_id='doc')
519 rev2 = doc2.rev519 rev2 = doc2.rev
520 self.sync(self.db1, self.db2)520 self.sync(self.db1, self.db2)
521 doc = self.db1.get_doc('doc')521 doc = self.db1.get_doc('doc')
@@ -548,7 +548,7 @@
548 # a3b2 a1b2 (autoresolved)548 # a3b2 a1b2 (autoresolved)
549 # `------->549 # `------->
550 # a3b2 a3b2550 # a3b2 a3b2
551 self.db1.create_doc(simple_doc, doc_id='doc')551 self.db1.create_doc_from_json(simple_doc, doc_id='doc')
552 self.sync(self.db1, self.db2)552 self.sync(self.db1, self.db2)
553 for db, content in [(self.db1, '{}'), (self.db2, '{"hi": 42}')]:553 for db, content in [(self.db1, '{}'), (self.db2, '{"hi": 42}')]:
554 doc = db.get_doc('doc')554 doc = db.get_doc('doc')
@@ -600,7 +600,7 @@
600 # a1b1+a2 a1b2 (a1b2 has same content as a2)600 # a1b1+a2 a1b2 (a1b2 has same content as a2)
601 # <-------'601 # <-------'
602 # a3b2 a3b2 (autoresolved and propagated)602 # a3b2 a3b2 (autoresolved and propagated)
603 self.db1.create_doc(simple_doc, doc_id='doc')603 self.db1.create_doc_from_json(simple_doc, doc_id='doc')
604 self.sync(self.db1, self.db2)604 self.sync(self.db1, self.db2)
605 for db, content in [(self.db1, '{}'), (self.db2, '{"hi": 42}')]:605 for db, content in [(self.db1, '{}'), (self.db2, '{"hi": 42}')]:
606 doc = db.get_doc('doc')606 doc = db.get_doc('doc')
@@ -656,7 +656,7 @@
656 # `------->656 # `------->
657 # a2b2c1 a2b2c1 a2c1657 # a2b2c1 a2b2c1 a2c1
658 self.db3 = self.create_database('test3')658 self.db3 = self.create_database('test3')
659 self.db1.create_doc(simple_doc, doc_id='doc')659 self.db1.create_doc_from_json(simple_doc, doc_id='doc')
660 self.sync(self.db1, self.db2)660 self.sync(self.db1, self.db2)
661 self.sync(self.db2, self.db3)661 self.sync(self.db2, self.db3)
662 for db, content in [(self.db2, '{"hi": 42}'),662 for db, content in [(self.db2, '{"hi": 42}'),
@@ -703,7 +703,7 @@
703 self.assertEqual(self.db1.get_doc('doc'), self.db2.get_doc('doc'))703 self.assertEqual(self.db1.get_doc('doc'), self.db2.get_doc('doc'))
704704
705 def test_sync_puts_changes(self):705 def test_sync_puts_changes(self):
706 doc = self.db1.create_doc(simple_doc)706 doc = self.db1.create_doc_from_json(simple_doc)
707 self.assertEqual(1, self.sync(self.db1, self.db2))707 self.assertEqual(1, self.sync(self.db1, self.db2))
708 self.assertGetDoc(self.db2, doc.doc_id, doc.rev, simple_doc, False)708 self.assertGetDoc(self.db2, doc.doc_id, doc.rev, simple_doc, False)
709 self.assertEqual(1, self.db1._get_replica_gen_and_trans_id('test2')[0])709 self.assertEqual(1, self.db1._get_replica_gen_and_trans_id('test2')[0])
@@ -715,7 +715,7 @@
715 'return': {'docs': [], 'last_gen': 1}})715 'return': {'docs': [], 'last_gen': 1}})
716716
717 def test_sync_pulls_changes(self):717 def test_sync_pulls_changes(self):
718 doc = self.db2.create_doc(simple_doc)718 doc = self.db2.create_doc_from_json(simple_doc)
719 self.db1.create_index('test-idx', 'key')719 self.db1.create_index('test-idx', 'key')
720 self.assertEqual(0, self.sync(self.db1, self.db2))720 self.assertEqual(0, self.sync(self.db1, self.db2))
721 self.assertGetDoc(self.db1, doc.doc_id, doc.rev, simple_doc, False)721 self.assertGetDoc(self.db1, doc.doc_id, doc.rev, simple_doc, False)
@@ -728,7 +728,7 @@
728 self.assertEqual([doc], self.db1.get_from_index('test-idx', 'value'))728 self.assertEqual([doc], self.db1.get_from_index('test-idx', 'value'))
729729
730 def test_sync_pulling_doesnt_update_other_if_changed(self):730 def test_sync_pulling_doesnt_update_other_if_changed(self):
731 doc = self.db2.create_doc(simple_doc)731 doc = self.db2.create_doc_from_json(simple_doc)
732 # After the local side has sent its list of docs, before we start732 # After the local side has sent its list of docs, before we start
733 # receiving the "targets" response, we update the local database with a733 # receiving the "targets" response, we update the local database with a
734 # new record.734 # new record.
@@ -738,7 +738,7 @@
738 def before_get_docs(state):738 def before_get_docs(state):
739 if state != 'before get_docs':739 if state != 'before get_docs':
740 return740 return
741 self.db1.create_doc(simple_doc)741 self.db1.create_doc_from_json(simple_doc)
742742
743 self.assertEqual(0, self.sync(self.db1, self.db2,743 self.assertEqual(0, self.sync(self.db1, self.db2,
744 trace_hook=before_get_docs))744 trace_hook=before_get_docs))
@@ -754,7 +754,7 @@
754 (0, ''), self.db2._get_replica_gen_and_trans_id('test1'))754 (0, ''), self.db2._get_replica_gen_and_trans_id('test1'))
755755
756 def test_sync_doesnt_update_other_if_nothing_pulled(self):756 def test_sync_doesnt_update_other_if_nothing_pulled(self):
757 self.db1.create_doc(simple_doc)757 self.db1.create_doc_from_json(simple_doc)
758758
759 def no_record_sync_info(state):759 def no_record_sync_info(state):
760 if state != 'record_sync_info':760 if state != 'record_sync_info':
@@ -767,7 +767,7 @@
767 self.db2._get_replica_gen_and_trans_id(self.db1._replica_uid)[0])767 self.db2._get_replica_gen_and_trans_id(self.db1._replica_uid)[0])
768768
769 def test_sync_ignores_convergence(self):769 def test_sync_ignores_convergence(self):
770 doc = self.db1.create_doc(simple_doc)770 doc = self.db1.create_doc_from_json(simple_doc)
771 self.db3 = self.create_database('test3')771 self.db3 = self.create_database('test3')
772 self.assertEqual(1, self.sync(self.db1, self.db3))772 self.assertEqual(1, self.sync(self.db1, self.db3))
773 self.assertEqual(0, self.sync(self.db2, self.db3))773 self.assertEqual(0, self.sync(self.db2, self.db3))
@@ -779,7 +779,7 @@
779 'return': {'docs': [], 'last_gen': 1}})779 'return': {'docs': [], 'last_gen': 1}})
780780
781 def test_sync_ignores_superseded(self):781 def test_sync_ignores_superseded(self):
782 doc = self.db1.create_doc(simple_doc)782 doc = self.db1.create_doc_from_json(simple_doc)
783 doc_rev1 = doc.rev783 doc_rev1 = doc.rev
784 self.db3 = self.create_database('test3')784 self.db3 = self.create_database('test3')
785 self.sync(self.db1, self.db3)785 self.sync(self.db1, self.db3)
@@ -798,12 +798,12 @@
798 self.assertGetDoc(self.db1, doc.doc_id, doc_rev2, new_content, False)798 self.assertGetDoc(self.db1, doc.doc_id, doc_rev2, new_content, False)
799799
800 def test_sync_sees_remote_conflicted(self):800 def test_sync_sees_remote_conflicted(self):
801 doc1 = self.db1.create_doc(simple_doc)801 doc1 = self.db1.create_doc_from_json(simple_doc)
802 doc_id = doc1.doc_id802 doc_id = doc1.doc_id
803 doc1_rev = doc1.rev803 doc1_rev = doc1.rev
804 self.db1.create_index('test-idx', 'key')804 self.db1.create_index('test-idx', 'key')
805 new_doc = '{"key": "altval"}'805 new_doc = '{"key": "altval"}'
806 doc2 = self.db2.create_doc(new_doc, doc_id=doc_id)806 doc2 = self.db2.create_doc_from_json(new_doc, doc_id=doc_id)
807 doc2_rev = doc2.rev807 doc2_rev = doc2.rev
808 self.assertTransactionLog([doc1.doc_id], self.db1)808 self.assertTransactionLog([doc1.doc_id], self.db1)
809 self.sync(self.db1, self.db2)809 self.sync(self.db1, self.db2)
@@ -820,7 +820,7 @@
820 self.assertEqual([], self.db1.get_from_index('test-idx', 'value'))820 self.assertEqual([], self.db1.get_from_index('test-idx', 'value'))
821821
822 def test_sync_sees_remote_delete_conflicted(self):822 def test_sync_sees_remote_delete_conflicted(self):
823 doc1 = self.db1.create_doc(simple_doc)823 doc1 = self.db1.create_doc_from_json(simple_doc)
824 doc_id = doc1.doc_id824 doc_id = doc1.doc_id
825 self.db1.create_index('test-idx', 'key')825 self.db1.create_index('test-idx', 'key')
826 self.sync(self.db1, self.db2)826 self.sync(self.db1, self.db2)
@@ -844,7 +844,7 @@
844 self.assertEqual([], self.db1.get_from_index('test-idx', 'value'))844 self.assertEqual([], self.db1.get_from_index('test-idx', 'value'))
845845
846 def test_sync_local_race_conflicted(self):846 def test_sync_local_race_conflicted(self):
847 doc = self.db1.create_doc(simple_doc)847 doc = self.db1.create_doc_from_json(simple_doc)
848 doc_id = doc.doc_id848 doc_id = doc.doc_id
849 doc1_rev = doc.rev849 doc1_rev = doc.rev
850 self.db1.create_index('test-idx', 'key')850 self.db1.create_index('test-idx', 'key')
@@ -871,7 +871,7 @@
871 self.assertEqual([], self.db1.get_from_index('test-idx', 'localval'))871 self.assertEqual([], self.db1.get_from_index('test-idx', 'localval'))
872872
873 def test_sync_propagates_deletes(self):873 def test_sync_propagates_deletes(self):
874 doc1 = self.db1.create_doc(simple_doc)874 doc1 = self.db1.create_doc_from_json(simple_doc)
875 doc_id = doc1.doc_id875 doc_id = doc1.doc_id
876 self.db1.create_index('test-idx', 'key')876 self.db1.create_index('test-idx', 'key')
877 self.sync(self.db1, self.db2)877 self.sync(self.db1, self.db2)
@@ -902,7 +902,7 @@
902 self.db3, doc_id, deleted_rev, None, False)902 self.db3, doc_id, deleted_rev, None, False)
903903
904 def test_sync_propagates_resolution(self):904 def test_sync_propagates_resolution(self):
905 doc1 = self.db1.create_doc('{"a": 1}', doc_id='the-doc')905 doc1 = self.db1.create_doc_from_json('{"a": 1}', doc_id='the-doc')
906 db3 = self.create_database('test3')906 db3 = self.create_database('test3')
907 self.sync(self.db2, self.db1)907 self.sync(self.db2, self.db1)
908 self.assertEqual(908 self.assertEqual(
@@ -940,9 +940,9 @@
940940
941 def test_sync_supersedes_conflicts(self):941 def test_sync_supersedes_conflicts(self):
942 db3 = self.create_database('test3')942 db3 = self.create_database('test3')
943 doc1 = self.db1.create_doc('{"a": 1}', doc_id='the-doc')943 doc1 = self.db1.create_doc_from_json('{"a": 1}', doc_id='the-doc')
944 self.db2.create_doc('{"b": 1}', doc_id='the-doc')944 self.db2.create_doc_from_json('{"b": 1}', doc_id='the-doc')
945 db3.create_doc('{"c": 1}', doc_id='the-doc')945 db3.create_doc_from_json('{"c": 1}', doc_id='the-doc')
946 self.sync(db3, self.db1)946 self.sync(db3, self.db1)
947 self.assertEqual(947 self.assertEqual(
948 self.db1._get_generation_info(),948 self.db1._get_generation_info(),
@@ -965,7 +965,7 @@
965 self.assertEqual(3, len(db3.get_doc_conflicts('the-doc')))965 self.assertEqual(3, len(db3.get_doc_conflicts('the-doc')))
966966
967 def test_sync_stops_after_get_sync_info(self):967 def test_sync_stops_after_get_sync_info(self):
968 self.db1.create_doc(tests.simple_doc)968 self.db1.create_doc_from_json(tests.simple_doc)
969 self.sync(self.db1, self.db2)969 self.sync(self.db1, self.db2)
970970
971 def put_hook(state):971 def put_hook(state):
@@ -974,60 +974,60 @@
974 self.sync(self.db1, self.db2, trace_hook=put_hook)974 self.sync(self.db1, self.db2, trace_hook=put_hook)
975975
976 def test_sync_detects_rollback_in_source(self):976 def test_sync_detects_rollback_in_source(self):
977 self.db1.create_doc(tests.simple_doc, doc_id='doc1')977 self.db1.create_doc_from_json(tests.simple_doc, doc_id='doc1')
978 self.sync(self.db1, self.db2)978 self.sync(self.db1, self.db2)
979 db1_copy = self.copy_database(self.db1)979 db1_copy = self.copy_database(self.db1)
980 self.db1.create_doc(tests.simple_doc, doc_id='doc2')980 self.db1.create_doc_from_json(tests.simple_doc, doc_id='doc2')
981 self.sync(self.db1, self.db2)981 self.sync(self.db1, self.db2)
982 self.assertRaises(982 self.assertRaises(
983 errors.InvalidGeneration, self.sync, db1_copy, self.db2)983 errors.InvalidGeneration, self.sync, db1_copy, self.db2)
984984
985 def test_sync_detects_rollback_in_target(self):985 def test_sync_detects_rollback_in_target(self):
986 self.db1.create_doc(tests.simple_doc, doc_id="divergent")986 self.db1.create_doc_from_json(tests.simple_doc, doc_id="divergent")
987 self.sync(self.db1, self.db2)987 self.sync(self.db1, self.db2)
988 db2_copy = self.copy_database(self.db2)988 db2_copy = self.copy_database(self.db2)
989 self.db2.create_doc(tests.simple_doc, doc_id='doc2')989 self.db2.create_doc_from_json(tests.simple_doc, doc_id='doc2')
990 self.sync(self.db1, self.db2)990 self.sync(self.db1, self.db2)
991 self.assertRaises(991 self.assertRaises(
992 errors.InvalidGeneration, self.sync, self.db1, db2_copy)992 errors.InvalidGeneration, self.sync, self.db1, db2_copy)
993993
994 def test_sync_detects_diverged_source(self):994 def test_sync_detects_diverged_source(self):
995 db3 = self.copy_database(self.db1)995 db3 = self.copy_database(self.db1)
996 self.db1.create_doc(tests.simple_doc, doc_id="divergent")996 self.db1.create_doc_from_json(tests.simple_doc, doc_id="divergent")
997 db3.create_doc(tests.simple_doc, doc_id="divergent")997 db3.create_doc_from_json(tests.simple_doc, doc_id="divergent")
998 self.sync(self.db1, self.db2)998 self.sync(self.db1, self.db2)
999 self.assertRaises(999 self.assertRaises(
1000 errors.InvalidTransactionId, self.sync, db3, self.db2)1000 errors.InvalidTransactionId, self.sync, db3, self.db2)
10011001
1002 def test_sync_detects_diverged_target(self):1002 def test_sync_detects_diverged_target(self):
1003 db3 = self.copy_database(self.db2)1003 db3 = self.copy_database(self.db2)
1004 db3.create_doc(tests.nested_doc, doc_id="divergent")1004 db3.create_doc_from_json(tests.nested_doc, doc_id="divergent")
1005 self.db1.create_doc(tests.simple_doc, doc_id="divergent")1005 self.db1.create_doc_from_json(tests.simple_doc, doc_id="divergent")
1006 self.sync(self.db1, self.db2)1006 self.sync(self.db1, self.db2)
1007 self.assertRaises(1007 self.assertRaises(
1008 errors.InvalidTransactionId, self.sync, self.db1, db3)1008 errors.InvalidTransactionId, self.sync, self.db1, db3)
10091009
1010 def test_sync_detects_rollback_and_divergence_in_source(self):1010 def test_sync_detects_rollback_and_divergence_in_source(self):
1011 self.db1.create_doc(tests.simple_doc, doc_id='doc1')1011 self.db1.create_doc_from_json(tests.simple_doc, doc_id='doc1')
1012 self.sync(self.db1, self.db2)1012 self.sync(self.db1, self.db2)
1013 db1_copy = self.copy_database(self.db1)1013 db1_copy = self.copy_database(self.db1)
1014 self.db1.create_doc(tests.simple_doc, doc_id='doc2')1014 self.db1.create_doc_from_json(tests.simple_doc, doc_id='doc2')
1015 self.db1.create_doc(tests.simple_doc, doc_id='doc3')1015 self.db1.create_doc_from_json(tests.simple_doc, doc_id='doc3')
1016 self.sync(self.db1, self.db2)1016 self.sync(self.db1, self.db2)
1017 db1_copy.create_doc(tests.simple_doc, doc_id='doc2')1017 db1_copy.create_doc_from_json(tests.simple_doc, doc_id='doc2')
1018 db1_copy.create_doc(tests.simple_doc, doc_id='doc3')1018 db1_copy.create_doc_from_json(tests.simple_doc, doc_id='doc3')
1019 self.assertRaises(1019 self.assertRaises(
1020 errors.InvalidTransactionId, self.sync, db1_copy, self.db2)1020 errors.InvalidTransactionId, self.sync, db1_copy, self.db2)
10211021
1022 def test_sync_detects_rollback_and_divergence_in_target(self):1022 def test_sync_detects_rollback_and_divergence_in_target(self):
1023 self.db1.create_doc(tests.simple_doc, doc_id="divergent")1023 self.db1.create_doc_from_json(tests.simple_doc, doc_id="divergent")
1024 self.sync(self.db1, self.db2)1024 self.sync(self.db1, self.db2)
1025 db2_copy = self.copy_database(self.db2)1025 db2_copy = self.copy_database(self.db2)
1026 self.db2.create_doc(tests.simple_doc, doc_id='doc2')1026 self.db2.create_doc_from_json(tests.simple_doc, doc_id='doc2')
1027 self.db2.create_doc(tests.simple_doc, doc_id='doc3')1027 self.db2.create_doc_from_json(tests.simple_doc, doc_id='doc3')
1028 self.sync(self.db1, self.db2)1028 self.sync(self.db1, self.db2)
1029 db2_copy.create_doc(tests.simple_doc, doc_id='doc2')1029 db2_copy.create_doc_from_json(tests.simple_doc, doc_id='doc2')
1030 db2_copy.create_doc(tests.simple_doc, doc_id='doc3')1030 db2_copy.create_doc_from_json(tests.simple_doc, doc_id='doc3')
1031 self.assertRaises(1031 self.assertRaises(
1032 errors.InvalidTransactionId, self.sync, self.db1, db2_copy)1032 errors.InvalidTransactionId, self.sync, self.db1, db2_copy)
10331033
@@ -1044,8 +1044,8 @@
1044 self.db2 = self.request_state._create_database('test2.db')1044 self.db2 = self.request_state._create_database('test2.db')
10451045
1046 def test_db_sync(self):1046 def test_db_sync(self):
1047 doc1 = self.db.create_doc(tests.simple_doc)1047 doc1 = self.db.create_doc_from_json(tests.simple_doc)
1048 doc2 = self.db2.create_doc(tests.nested_doc)1048 doc2 = self.db2.create_doc_from_json(tests.nested_doc)
1049 db2_url = self.getURL('test2.db')1049 db2_url = self.getURL('test2.db')
1050 self.db.sync(db2_url)1050 self.db.sync(db2_url)
1051 self.assertGetDoc(self.db2, doc1.doc_id, doc1.rev, tests.simple_doc,1051 self.assertGetDoc(self.db2, doc1.doc_id, doc1.rev, tests.simple_doc,
@@ -1066,10 +1066,10 @@
1066 self.db2 = self.request_state._create_database('test2')1066 self.db2 = self.request_state._create_database('test2')
10671067
1068 def test_sync_tracks_generations_incrementally(self):1068 def test_sync_tracks_generations_incrementally(self):
1069 doc11 = self.db1.create_doc('{"a": 1}')1069 doc11 = self.db1.create_doc_from_json('{"a": 1}')
1070 doc12 = self.db1.create_doc('{"a": 2}')1070 doc12 = self.db1.create_doc_from_json('{"a": 2}')
1071 doc21 = self.db2.create_doc('{"b": 1}')1071 doc21 = self.db2.create_doc_from_json('{"b": 1}')
1072 doc22 = self.db2.create_doc('{"b": 2}')1072 doc22 = self.db2.create_doc_from_json('{"b": 2}')
1073 #sanity1073 #sanity
1074 self.assertEqual(2, len(self.db1._get_transaction_log()))1074 self.assertEqual(2, len(self.db1._get_transaction_log()))
1075 self.assertEqual(2, len(self.db2._get_transaction_log()))1075 self.assertEqual(2, len(self.db2._get_transaction_log()))
10761076
=== modified file 'u1todo/test_u1todo.py'
--- u1todo/test_u1todo.py 2012-05-30 21:46:48 +0000
+++ u1todo/test_u1todo.py 2012-07-19 20:11:24 +0000
@@ -183,7 +183,7 @@
183 def setUp(self):183 def setUp(self):
184 super(TaskTestCase, self).setUp()184 super(TaskTestCase, self).setUp()
185 self.db = inmemory.InMemoryDatabase("u1todo")185 self.db = inmemory.InMemoryDatabase("u1todo")
186 self.document = self.db.create_doc(EMPTY_TASK)186 self.document = self.db.create_doc_from_json(EMPTY_TASK)
187187
188 def test_task(self):188 def test_task(self):
189 """Initializing a task."""189 """Initializing a task."""
190190
=== modified file 'u1todo/u1todo.py'
--- u1todo/u1todo.py 2012-07-03 17:54:40 +0000
+++ u1todo/u1todo.py 2012-07-19 20:11:24 +0000
@@ -144,7 +144,7 @@
144 # Store the document in the database. Since we did not set a document144 # Store the document in the database. Since we did not set a document
145 # id, the database will store it as a new document, and generate145 # id, the database will store it as a new document, and generate
146 # a valid id.146 # a valid id.
147 document = self.db.create_doc(content=content)147 document = self.db.create_doc_from_json(content)
148 # Wrap the document in a Task object.148 # Wrap the document in a Task object.
149 return Task(document)149 return Task(document)
150150

Subscribers

People subscribed via source and target branches