Merge lp:~pedronis/u1db/json-preservation-tests into lp:u1db

Proposed by Samuele Pedroni
Status: Merged
Approved by: Samuele Pedroni
Approved revision: 420
Merged at revision: 423
Proposed branch: lp:~pedronis/u1db/json-preservation-tests
Merge into: lp:u1db
Diff against target: 186 lines (+108/-18)
1 file modified
u1db/tests/test_backends.py (+108/-18)
To merge this branch: bzr merge lp:~pedronis/u1db/json-preservation-tests
Reviewer Review Type Date Requested Status
Eric Casteleijn (community) Approve
Review via email: mp+128207@code.launchpad.net

Commit message

add optional json preservation tests as far as supported by current impls on trunk

Description of the change

add optional json preservation tests as far as supported by current impls on trunk

To post a comment you must log in.
Revision history for this message
Eric Casteleijn (thisfred) wrote :

looks good

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'u1db/tests/test_backends.py'
2--- u1db/tests/test_backends.py 2012-09-28 12:13:18 +0000
3+++ u1db/tests/test_backends.py 2012-10-05 10:13:24 +0000
4@@ -83,20 +83,23 @@
5 """A (not very) alternative implementation of Document."""
6
7
8+ALL_SCENARIOS = tests.LOCAL_DATABASES_SCENARIOS + [
9+ ('http', {'make_database_for_test': make_http_database_for_test,
10+ 'copy_database_for_test': copy_http_database_for_test,
11+ 'make_document_for_test': tests.make_document_for_test,
12+ 'make_app_with_state': make_http_app}),
13+ ('oauth_http', {'make_database_for_test':
14+ make_oauth_http_database_for_test,
15+ 'copy_database_for_test':
16+ copy_oauth_http_database_for_test,
17+ 'make_document_for_test': tests.make_document_for_test,
18+ 'make_app_with_state': make_oauth_http_app})
19+ ] + tests.C_DATABASE_SCENARIOS
20+
21+
22 class AllDatabaseTests(tests.DatabaseBaseTests, tests.TestCaseWithServer):
23
24- scenarios = tests.LOCAL_DATABASES_SCENARIOS + [
25- ('http', {'make_database_for_test': make_http_database_for_test,
26- 'copy_database_for_test': copy_http_database_for_test,
27- 'make_document_for_test': tests.make_document_for_test,
28- 'make_app_with_state': make_http_app}),
29- ('oauth_http', {'make_database_for_test':
30- make_oauth_http_database_for_test,
31- 'copy_database_for_test':
32- copy_oauth_http_database_for_test,
33- 'make_document_for_test': tests.make_document_for_test,
34- 'make_app_with_state': make_oauth_http_app})
35- ] + tests.C_DATABASE_SCENARIOS
36+ scenarios = ALL_SCENARIOS
37
38 def test_close(self):
39 self.db.close()
40@@ -338,9 +341,38 @@
41 self.assertGetDoc(self.db, doc.doc_id, doc.rev, nested_doc, False)
42
43
44+peculiar_json1 = '{ "a": 1 ,\n "b": 2}'
45+peculiar_json2 = '{"a": 1,"b":2}'
46+peculiar_json3 = '{"a": 1,"b":2,\n"c": 3}'
47+
48+
49+class OptionalJSONPreservationlDatabaseTests(tests.DatabaseBaseTests,
50+ tests.TestCaseWithServer):
51+
52+ scenarios = ALL_SCENARIOS
53+
54+ def test_preserve_json_create_doc_from_json(self):
55+ doc = self.db.create_doc_from_json(peculiar_json1)
56+ doc1 = self.db.get_doc(doc.doc_id)
57+ self.assertEqual(peculiar_json1, doc1.get_json())
58+
59+ def test_preserve_json_put_doc(self):
60+ doc = self.make_document('doc-id', None, peculiar_json1)
61+ doc = self.db.put_doc(doc)
62+ doc1 = self.db.get_doc('doc-id')
63+ self.assertEqual(peculiar_json1, doc1.get_json())
64+ doc1.set_json(peculiar_json2)
65+ self.db.put_doc(doc1)
66+ doc2 = self.db.get_doc('doc-id')
67+ self.assertEqual(peculiar_json2, doc2.get_json())
68+
69+
70+LOCAL_SCENARIOS = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
71+
72+
73 class DocumentSizeTests(tests.DatabaseBaseTests):
74
75- scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
76+ scenarios = LOCAL_SCENARIOS
77
78 def test_put_doc_refuses_oversized_documents(self):
79 self.db.set_document_size_limit(1)
80@@ -364,7 +396,7 @@
81
82 class LocalDatabaseTests(tests.DatabaseBaseTests):
83
84- scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
85+ scenarios = LOCAL_SCENARIOS
86
87 def test_create_doc_different_ids_diff_db(self):
88 doc1 = self.db.create_doc_from_json(simple_doc)
89@@ -607,9 +639,47 @@
90 self.db.whats_changed(2))
91
92
93+class LocalDatabaseOptionalJSONPreservationTests(tests.DatabaseBaseTests):
94+
95+ scenarios = LOCAL_SCENARIOS
96+
97+ def test_preserve_json_put_doc_if_newer(self):
98+ doc = self.make_document('doc-id', 'other:1', peculiar_json1)
99+ self.db._put_doc_if_newer(doc, save_conflict=False,
100+ replica_uid="other", replica_gen=1)
101+ doc1 = self.db.get_doc('doc-id')
102+ self.assertEqual(peculiar_json1, doc1.get_json())
103+ doc1 = self.make_document('doc-id', 'other:2', peculiar_json2)
104+ self.db._put_doc_if_newer(doc1, save_conflict=False,
105+ replica_uid="other", replica_gen=2)
106+ doc2 = self.db.get_doc('doc-id')
107+ self.assertEqual(peculiar_json2, doc2.get_json())
108+
109+ def test_preserve_json_put_doc_if_newer_autoresolve_json(self):
110+ doc = self.make_document('doc-id', None, peculiar_json1)
111+ self.db.put_doc(doc)
112+ doc1 = self.make_document('doc-id', 'other:1', peculiar_json1)
113+ self.db._put_doc_if_newer(doc1, save_conflict=False,
114+ replica_uid="other", replica_gen=1)
115+ doc2 = self.db.get_doc('doc-id')
116+ self.assertEqual(peculiar_json1, doc2.get_json())
117+
118+ def test_preserve_json_put_doc_if_newer_autoresolve_content(self):
119+ if self.db.__class__.__name__ == 'CDatabase':
120+ self.skipTest("the C implementation atm uses string "
121+ "equivalence only")
122+ doc = self.make_document('doc-id', None, peculiar_json1)
123+ self.db.put_doc(doc)
124+ doc1 = self.make_document('doc-id', 'other:1', peculiar_json2)
125+ self.db._put_doc_if_newer(doc1, save_conflict=False,
126+ replica_uid="other", replica_gen=1)
127+ doc2 = self.db.get_doc('doc-id')
128+ self.assertEqual(peculiar_json2, doc2.get_json())
129+
130+
131 class LocalDatabaseValidateGenNTransIdTests(tests.DatabaseBaseTests):
132
133- scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
134+ scenarios = LOCAL_SCENARIOS
135
136 def test_validate_gen_and_trans_id(self):
137 self.db.create_doc_from_json(simple_doc)
138@@ -633,7 +703,7 @@
139
140 class LocalDatabaseValidateSourceGenTests(tests.DatabaseBaseTests):
141
142- scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
143+ scenarios = LOCAL_SCENARIOS
144
145 def test_validate_source_gen_and_trans_id_same(self):
146 self.db._set_replica_gen_and_trans_id('other', 1, 'T-sid')
147@@ -653,7 +723,7 @@
148 class LocalDatabaseWithConflictsTests(tests.DatabaseBaseTests):
149 # test supporting/functionality around storing conflicts
150
151- scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
152+ scenarios = LOCAL_SCENARIOS
153
154 def test_get_docs_conflicted(self):
155 doc1 = self.db.create_doc_from_json(simple_doc)
156@@ -1019,9 +1089,29 @@
157 self.assertRaises(errors.ConflictedDoc, self.db.delete_doc, doc2)
158
159
160+class LocalDatabaseWithConflictsJSONPreservationTests(tests.DatabaseBaseTests):
161+ # test supporting/functionality around storing conflicts
162+
163+ scenarios = LOCAL_SCENARIOS
164+
165+ def test_json_preservation_put_doc_if_newer_save_conflicted(self):
166+ doc1 = self.db.create_doc_from_json(peculiar_json1)
167+ # Document is inserted as a conflict
168+ doc2 = self.make_document(doc1.doc_id, 'alternate:1',
169+ peculiar_json3)
170+ state, _ = self.db._put_doc_if_newer(
171+ doc2, save_conflict=True, replica_uid='r', replica_gen=1,
172+ replica_trans_id='foo')
173+ self.assertEqual('conflicted', state)
174+ # check json in db
175+ conflicts = self.db.get_doc_conflicts(doc1.doc_id)
176+ self.assertEqual(peculiar_json3, conflicts[0].get_json())
177+ self.assertEqual(peculiar_json1, conflicts[1].get_json())
178+
179+
180 class DatabaseIndexTests(tests.DatabaseBaseTests):
181
182- scenarios = tests.LOCAL_DATABASES_SCENARIOS + tests.C_DATABASE_SCENARIOS
183+ scenarios = LOCAL_SCENARIOS
184
185 def assertParseError(self, definition):
186 self.db.create_doc_from_json(nested_doc)

Subscribers

People subscribed via source and target branches