diff options
author | Garren Smith <garren.smith@gmail.com> | 2020-03-31 11:39:58 +0200 |
---|---|---|
committer | garren smith <garren.smith@gmail.com> | 2020-04-06 17:55:49 +0200 |
commit | 29ef7fb37007821edd8a0673226090cd47d48bab (patch) | |
tree | 8f8a730cc17b904f334e3f1ea2b0167e6f91d5a5 | |
parent | 1bc7c54ac2aee5302ce53a7a0c41867495f34704 (diff) | |
download | couchdb-29ef7fb37007821edd8a0673226090cd47d48bab.tar.gz |
update mango tests to work with Mango on FDB
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | src/mango/test/01-index-crud-test.py | 15 | ||||
-rw-r--r-- | src/mango/test/02-basic-find-test.py | 15 | ||||
-rw-r--r-- | src/mango/test/05-index-selection-test.py | 7 | ||||
-rw-r--r-- | src/mango/test/12-use-correct-index-test.py | 38 | ||||
-rw-r--r-- | src/mango/test/13-stable-update-test.py | 51 | ||||
-rw-r--r-- | src/mango/test/13-users-db-find-test.py | 7 | ||||
-rw-r--r-- | src/mango/test/15-execution-stats-test.py | 7 | ||||
-rw-r--r-- | src/mango/test/17-multi-type-value-test.py | 4 | ||||
-rw-r--r-- | src/mango/test/19-find-conflicts.py | 7 | ||||
-rw-r--r-- | src/mango/test/20-no-timeout-test.py | 32 | ||||
-rw-r--r-- | src/mango/test/22-build-wait-selected-index.py | 50 | ||||
-rw-r--r-- | src/mango/test/mango.py | 20 | ||||
-rw-r--r-- | src/mango/test/user_docs.py | 7 |
14 files changed, 129 insertions, 136 deletions
@@ -160,9 +160,10 @@ endif .PHONY: check-fdb check-fdb: - make eunit apps=couch_eval,couch_expiring_cache,ctrace,couch_jobs,couch_views,fabric + make eunit apps=couch_eval,couch_expiring_cache,ctrace,couch_jobs,couch_views,fabric,mango make elixir tests=test/elixir/test/basics_test.exs,test/elixir/test/replication_test.exs,test/elixir/test/map_test.exs,test/elixir/test/all_docs_test.exs,test/elixir/test/bulk_docs_test.exs make exunit tests=src/couch_rate/test/exunit/ + make mango-test .PHONY: eunit # target: eunit - Run EUnit tests, use EUNIT_OPTS to provide custom options @@ -349,7 +350,7 @@ mango-test: devclean all @cd src/mango && \ python3 -m venv .venv && \ .venv/bin/python3 -m pip install -r requirements.txt - @cd src/mango && ../../dev/run "$(TEST_OPTS)" -n 1 --admin=adm:pass '.venv/bin/python3 -m nose --with-xunit' + @cd src/mango && ../../dev/run "$(TEST_OPTS)" -n 1 --admin=adm:pass --erlang-config=rel/files/eunit.config '.venv/bin/python3 -m nose -v --with-xunit' ################################################################################ # Developing diff --git a/src/mango/test/01-index-crud-test.py b/src/mango/test/01-index-crud-test.py index b60239992..13ae300dd 100644 --- a/src/mango/test/01-index-crud-test.py +++ b/src/mango/test/01-index-crud-test.py @@ -113,6 +113,21 @@ class IndexCrudTests(mango.DbPerClass): return raise AssertionError("index not created") + def test_ignore_design_docs(self): + fields = ["baz", "foo"] + ret = self.db.create_index(fields, name="idx_02") + assert ret is True + self.db.save_doc({ + "_id": "_design/ignore", + "views": { + "view1": { + "map": "function (doc) { emit(doc._id, 1)}" + } + } + }) + indexes = self.db.list_indexes() + self.assertEqual(len(indexes), 2) + def test_read_idx_doc(self): self.db.create_index(["foo", "bar"], name="idx_01") self.db.create_index(["hello", "bar"]) diff --git a/src/mango/test/02-basic-find-test.py b/src/mango/test/02-basic-find-test.py index afdba03a2..2a03a3a55 100644 --- a/src/mango/test/02-basic-find-test.py +++ b/src/mango/test/02-basic-find-test.py @@ -100,16 +100,6 @@ class BasicFindTests(mango.UserDocsTests): else: raise AssertionError("bad find") - def test_bad_r(self): - bad_rs = ([None, True, False, 1.2, "no limit!", {"foo": "bar"}, [2]],) - for br in bad_rs: - try: - self.db.find({"int": {"$gt": 2}}, r=br) - except Exception as e: - assert e.response.status_code == 400 - else: - raise AssertionError("bad find") - def test_bad_conflicts(self): bad_conflicts = ([None, 1.2, "no limit!", {"foo": "bar"}, [2]],) for bc in bad_conflicts: @@ -262,11 +252,6 @@ class BasicFindTests(mango.UserDocsTests): assert sorted(d.keys()) == ["location", "user_id"] assert sorted(d["location"].keys()) == ["address"] - def test_r(self): - for r in [1, 2, 3]: - docs = self.db.find({"age": {"$gt": 0}}, r=r) - assert len(docs) == 15 - def test_empty(self): docs = self.db.find({}) # 15 users diff --git a/src/mango/test/05-index-selection-test.py b/src/mango/test/05-index-selection-test.py index cb4d32986..bae3d58f1 100644 --- a/src/mango/test/05-index-selection-test.py +++ b/src/mango/test/05-index-selection-test.py @@ -14,6 +14,8 @@ import mango import user_docs import unittest +import requests + class IndexSelectionTests: def test_basic(self): @@ -201,8 +203,11 @@ class IndexSelectionTests: } }, } - with self.assertRaises(KeyError): + try: self.db.save_doc(design_doc) + assert False, "Should not get here." + except requests.exceptions.HTTPError as e: + self.assertEqual(e.response.json()['error'], 'invalid_design_doc') def test_explain_sort_reverse(self): selector = {"manager": {"$gt": None}} diff --git a/src/mango/test/12-use-correct-index-test.py b/src/mango/test/12-use-correct-index-test.py index c21ad6c5e..a7f07b5e8 100644 --- a/src/mango/test/12-use-correct-index-test.py +++ b/src/mango/test/12-use-correct-index-test.py @@ -54,36 +54,41 @@ class ChooseCorrectIndexForDocs(mango.DbPerClass): self.db.save_docs(copy.deepcopy(DOCS)) def test_choose_index_with_one_field_in_index(self): - self.db.create_index(["name", "age", "user_id"], ddoc="aaa") - self.db.create_index(["name"], ddoc="zzz") + self.db.create_index(["name", "age", "user_id"], ddoc="aaa", wait_for_built_index=False) + self.db.create_index(["name"], ddoc="zzz", wait_for_built_index=False) + self.db.wait_for_built_indexes() explain = self.db.find({"name": "Eddie"}, explain=True) self.assertEqual(explain["index"]["ddoc"], "_design/zzz") def test_choose_index_with_two(self): - self.db.create_index(["name", "age", "user_id"], ddoc="aaa") - self.db.create_index(["name", "age"], ddoc="bbb") - self.db.create_index(["name"], ddoc="zzz") + self.db.create_index(["name", "age", "user_id"], ddoc="aaa", wait_for_built_index=False) + self.db.create_index(["name", "age"], ddoc="bbb", wait_for_built_index=False) + self.db.create_index(["name"], ddoc="zzz", wait_for_built_index=False) + self.db.wait_for_built_indexes() explain = self.db.find({"name": "Eddie", "age": {"$gte": 12}}, explain=True) self.assertEqual(explain["index"]["ddoc"], "_design/bbb") def test_choose_index_alphabetically(self): - self.db.create_index(["name"], ddoc="aaa") - self.db.create_index(["name"], ddoc="bbb") - self.db.create_index(["name"], ddoc="zzz") + self.db.create_index(["name"], ddoc="aaa", wait_for_built_index=False) + self.db.create_index(["name"], ddoc="bbb", wait_for_built_index=False) + self.db.create_index(["name"], ddoc="zzz", wait_for_built_index=False) + self.db.wait_for_built_indexes() explain = self.db.find({"name": "Eddie", "age": {"$gte": 12}}, explain=True) self.assertEqual(explain["index"]["ddoc"], "_design/aaa") def test_choose_index_most_accurate(self): - self.db.create_index(["name", "age", "user_id"], ddoc="aaa") - self.db.create_index(["name", "age"], ddoc="bbb") - self.db.create_index(["name"], ddoc="zzz") + self.db.create_index(["name", "age", "user_id"], ddoc="aaa", wait_for_built_index=False) + self.db.create_index(["name", "age"], ddoc="bbb", wait_for_built_index=False) + self.db.create_index(["name"], ddoc="zzz", wait_for_built_index=False) + self.db.wait_for_built_indexes() explain = self.db.find({"name": "Eddie", "age": {"$gte": 12}}, explain=True) self.assertEqual(explain["index"]["ddoc"], "_design/bbb") def test_choose_index_most_accurate_in_memory_selector(self): - self.db.create_index(["name", "location", "user_id"], ddoc="aaa") - self.db.create_index(["name", "age", "user_id"], ddoc="bbb") - self.db.create_index(["name"], ddoc="zzz") + self.db.create_index(["name", "location", "user_id"], ddoc="aaa", wait_for_built_index=False) + self.db.create_index(["name", "age", "user_id"], ddoc="bbb", wait_for_built_index=False) + self.db.create_index(["name"], ddoc="zzz", wait_for_built_index=False) + self.db.wait_for_built_indexes() explain = self.db.find({"name": "Eddie", "number": {"$lte": 12}}, explain=True) self.assertEqual(explain["index"]["ddoc"], "_design/zzz") @@ -100,8 +105,9 @@ class ChooseCorrectIndexForDocs(mango.DbPerClass): def test_chooses_idxA(self): DOCS2 = [{"a": 1, "b": 1, "c": 1}, {"a": 1000, "d": 1000, "e": 1000}] self.db.save_docs(copy.deepcopy(DOCS2)) - self.db.create_index(["a", "b", "c"]) - self.db.create_index(["a", "d", "e"]) + self.db.create_index(["a", "b", "c"], wait_for_built_index=False) + self.db.create_index(["a", "d", "e"], wait_for_built_index=False) + self.db.wait_for_built_indexes() explain = self.db.find( {"a": {"$gt": 0}, "b": {"$gt": 0}, "c": {"$gt": 0}}, explain=True ) diff --git a/src/mango/test/13-stable-update-test.py b/src/mango/test/13-stable-update-test.py deleted file mode 100644 index 303f3fab1..000000000 --- a/src/mango/test/13-stable-update-test.py +++ /dev/null @@ -1,51 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - -import copy -import mango - -DOCS1 = [ - { - "_id": "54af50626de419f5109c962f", - "user_id": 0, - "age": 10, - "name": "Jimi", - "location": "UK", - "number": 4, - }, - { - "_id": "54af50622071121b25402dc3", - "user_id": 1, - "age": 12, - "name": "Eddie", - "location": "ZAR", - "number": 2, - }, -] - - -class SupportStableAndUpdate(mango.DbPerClass): - def setUp(self): - self.db.recreate() - # Hack to prevent auto-indexer from foiling update=False test - # https://github.com/apache/couchdb/issues/2313 - self.db.save_doc( - {"_id": "_design/foo", "language": "query", "autoupdate": False} - ) - self.db.create_index(["name"], ddoc="foo") - self.db.save_docs(copy.deepcopy(DOCS1)) - - def test_update_updates_view_when_specified(self): - docs = self.db.find({"name": "Eddie"}, update=False) - assert len(docs) == 0 - docs = self.db.find({"name": "Eddie"}, update=True) - assert len(docs) == 1 diff --git a/src/mango/test/13-users-db-find-test.py b/src/mango/test/13-users-db-find-test.py index 73d15ea1a..9f9b53a81 100644 --- a/src/mango/test/13-users-db-find-test.py +++ b/src/mango/test/13-users-db-find-test.py @@ -12,10 +12,15 @@ # the License. -import mango, requests +import mango, requests, unittest +# Re-enable once the _users db is implemented class UsersDbFindTests(mango.UsersDbTests): + @classmethod + def setUpClass(klass): + raise unittest.SkipTest("Re-enable once the _users db is implemented") + def test_simple_find(self): docs = self.db.find({"name": {"$eq": "demo02"}}) assert len(docs) == 1 diff --git a/src/mango/test/15-execution-stats-test.py b/src/mango/test/15-execution-stats-test.py index 537a19add..6ccc04b44 100644 --- a/src/mango/test/15-execution-stats-test.py +++ b/src/mango/test/15-execution-stats-test.py @@ -22,7 +22,6 @@ class ExecutionStatsTests(mango.UserDocsTests): self.assertEqual(len(resp["docs"]), 3) self.assertEqual(resp["execution_stats"]["total_keys_examined"], 0) self.assertEqual(resp["execution_stats"]["total_docs_examined"], 3) - self.assertEqual(resp["execution_stats"]["total_quorum_docs_examined"], 0) self.assertEqual(resp["execution_stats"]["results_returned"], 3) # See https://github.com/apache/couchdb/issues/1732 # Erlang os:timestamp() only has ms accuracy on Windows! @@ -35,12 +34,11 @@ class ExecutionStatsTests(mango.UserDocsTests): def test_quorum_json_index(self): resp = self.db.find( - {"age": {"$lt": 35}}, return_raw=True, r=3, executionStats=True + {"age": {"$lt": 35}}, return_raw=True, executionStats=True ) self.assertEqual(len(resp["docs"]), 3) self.assertEqual(resp["execution_stats"]["total_keys_examined"], 0) - self.assertEqual(resp["execution_stats"]["total_docs_examined"], 0) - self.assertEqual(resp["execution_stats"]["total_quorum_docs_examined"], 3) + self.assertEqual(resp["execution_stats"]["total_docs_examined"], 3) self.assertEqual(resp["execution_stats"]["results_returned"], 3) # See https://github.com/apache/couchdb/issues/1732 # Erlang os:timestamp() only has ms accuracy on Windows! @@ -70,7 +68,6 @@ class ExecutionStatsTests_Text(mango.UserDocsTextTests): self.assertEqual(len(resp["docs"]), 1) self.assertEqual(resp["execution_stats"]["total_keys_examined"], 0) self.assertEqual(resp["execution_stats"]["total_docs_examined"], 1) - self.assertEqual(resp["execution_stats"]["total_quorum_docs_examined"], 0) self.assertEqual(resp["execution_stats"]["results_returned"], 1) self.assertGreater(resp["execution_stats"]["execution_time_ms"], 0) diff --git a/src/mango/test/17-multi-type-value-test.py b/src/mango/test/17-multi-type-value-test.py index 21e7afda4..5a8fcedef 100644 --- a/src/mango/test/17-multi-type-value-test.py +++ b/src/mango/test/17-multi-type-value-test.py @@ -53,9 +53,9 @@ class MultiValueFieldTests: class MultiValueFieldJSONTests(mango.DbPerClass, MultiValueFieldTests): def setUp(self): self.db.recreate() + self.db.create_index(["name"], wait_for_built_index=False) + self.db.create_index(["age", "name"], wait_for_built_index=True) self.db.save_docs(copy.deepcopy(DOCS)) - self.db.create_index(["name"]) - self.db.create_index(["age", "name"]) # @unittest.skipUnless(mango.has_text_service(), "requires text service") diff --git a/src/mango/test/19-find-conflicts.py b/src/mango/test/19-find-conflicts.py index bf865d6ea..3bf3c0693 100644 --- a/src/mango/test/19-find-conflicts.py +++ b/src/mango/test/19-find-conflicts.py @@ -12,11 +12,12 @@ import mango import copy +import unittest -DOC = [{"_id": "doc", "a": 2}] +DOC = [{"_id": "doc", "a": 2}, {"_id": "doc1", "b": 2}] CONFLICT = [{"_id": "doc", "_rev": "1-23202479633c2b380f79507a776743d5", "a": 1}] - +CONFLICT2 = [{"_id": "doc1", "_rev": "1-23202479633c2b380f79507a776743d5", "b": 1}] class ChooseCorrectIndexForDocs(mango.DbPerClass): def setUp(self): @@ -25,7 +26,7 @@ class ChooseCorrectIndexForDocs(mango.DbPerClass): self.db.save_docs_with_conflicts(copy.deepcopy(CONFLICT)) def test_retrieve_conflicts(self): - self.db.create_index(["_conflicts"]) + self.db.create_index(["_conflicts"], wait_for_built_index=False) result = self.db.find({"_conflicts": {"$exists": True}}, conflicts=True) self.assertEqual( result[0]["_conflicts"][0], "1-23202479633c2b380f79507a776743d5" diff --git a/src/mango/test/20-no-timeout-test.py b/src/mango/test/20-no-timeout-test.py deleted file mode 100644 index cffdfc335..000000000 --- a/src/mango/test/20-no-timeout-test.py +++ /dev/null @@ -1,32 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - -import mango -import copy -import unittest - - -class LongRunningMangoTest(mango.DbPerClass): - def setUp(self): - self.db.recreate() - docs = [] - for i in range(100000): - docs.append({"_id": str(i), "another": "field"}) - if i % 20000 == 0: - self.db.save_docs(docs) - docs = [] - - # This test should run to completion and not timeout - def test_query_does_not_time_out(self): - selector = {"_id": {"$gt": 0}, "another": "wrong"} - docs = self.db.find(selector) - self.assertEqual(len(docs), 0) diff --git a/src/mango/test/22-build-wait-selected-index.py b/src/mango/test/22-build-wait-selected-index.py new file mode 100644 index 000000000..fd856f4d6 --- /dev/null +++ b/src/mango/test/22-build-wait-selected-index.py @@ -0,0 +1,50 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +import mango +import copy +import unittest + + +class BuildAndWaitOnSelectedIndex(mango.DbPerClass): + def setUp(self): + self.db.recreate() + docs = [] + for i in range(1000): + docs.append({"_id": str(i), "val": i}) + if len(docs) == 250: + self.db.save_docs(docs) + docs = [] + + def test_wait_for_query(self): + self.db.create_index(["val"], ddoc="my-ddoc", wait_for_built_index=False) + + explain = self.db.find({'val': {"$gt": 990}}, use_index="my-ddoc", explain=True) + self.assertEqual(explain["index"]["ddoc"], "_design/my-ddoc") + + docs = self.db.find({'val': {"$gte": 990}}, limit=10) + + self.assertEqual(len(docs), 10) + + def test_dont_wait(self): + self.db.create_index(["val"], ddoc="my-ddoc", wait_for_built_index=False) + + explain = self.db.find({'val': {"$gt": 990}}, explain=True) + self.assertEqual(explain["index"]["name"], "_all_docs") + + docs = self.db.find({'val': {"$gte": 990}}) + self.assertEqual(len(docs), 10) + + def test_update_false(self): + self.db.create_index(["val"], ddoc="my-ddoc", wait_for_built_index=False) + docs = self.db.find({'val': {"$gte": 990}}, update=False, use_index="my-ddoc") + self.assertEqual(docs, []) diff --git a/src/mango/test/mango.py b/src/mango/test/mango.py index db0fab057..e013e0e1e 100644 --- a/src/mango/test/mango.py +++ b/src/mango/test/mango.py @@ -139,8 +139,9 @@ class Database(object): ddoc=None, partial_filter_selector=None, selector=None, + wait_for_built_index=True, ): - body = {"index": {"fields": fields}, "type": idx_type, "w": 3} + body = {"index": {"fields": fields}, "type": idx_type} if name is not None: body["name"] = name if ddoc is not None: @@ -156,13 +157,22 @@ class Database(object): assert r.json()["name"] is not None created = r.json()["result"] == "created" - if created: - # wait until the database reports the index as available - while len(self.get_index(r.json()["id"], r.json()["name"])) < 1: - delay(t=0.1) + if created and wait_for_built_index: + # wait until the database reports the index as available and build + while True: + idx = self.get_index(r.json()["id"], r.json()["name"])[0] + if idx["build_status"] == "ready": + break + delay(t=0.2) return created + def wait_for_built_indexes(self): + while True: + if all(idx["build_status"] == "ready" for idx in self.list_indexes()): + break + delay(t=0.2) + def create_text_index( self, analyzer=None, diff --git a/src/mango/test/user_docs.py b/src/mango/test/user_docs.py index 8f0ed2e04..d69e6d652 100644 --- a/src/mango/test/user_docs.py +++ b/src/mango/test/user_docs.py @@ -61,12 +61,11 @@ def setup_users(db, **kwargs): def setup(db, index_type="view", **kwargs): db.recreate() - db.save_docs(copy.deepcopy(DOCS)) if index_type == "view": add_view_indexes(db, kwargs) elif index_type == "text": add_text_indexes(db, kwargs) - + db.save_docs(copy.deepcopy(DOCS)) def add_view_indexes(db, kwargs): indexes = [ @@ -90,7 +89,9 @@ def add_view_indexes(db, kwargs): (["ordered"], "ordered"), ] for (idx, name) in indexes: - assert db.create_index(idx, name=name, ddoc=name) is True + assert db.create_index(idx, name=name, ddoc=name, + wait_for_built_index=False) is True + db.wait_for_built_indexes() def add_text_indexes(db, kwargs): |