from unittest.mock import MagicMock
from osm_common.dbbase import DbException
from osm_common.dbmemory import DbMemory
+from copy import deepcopy
__author__ = 'Eduardo Sousa <eduardosousa@av.it.pt>'
db.create_list("test", [
{"_id": 1, "data": {"data2": {"data3": 1}}, "list": [{"a": 1}], "text": "sometext"},
- {"_id": 2, "data": {"data2": {"data3": 2}}, "list": [{"a": 2}]},
+ {"_id": 2, "data": {"data2": {"data3": 2}}, "list": [{"a": 2}], "list2": [1, 2, 3]},
{"_id": 3, "data": {"data2": {"data3": 3}}, "list": [{"a": 3}]},
{"_id": 4, "data": {"data2": {"data3": 4}}, "list": [{"a": 4}, {"a": 0}]},
{"_id": 5, "data": {"data2": {"data3": 5}}, "list": [{"a": 5}]},
({"_id": 1}, [1]),
({"data.data2.data3": 2}, [2]),
({"data.data2.data3.eq": 2}, [2]),
+ ({"data.data2.data3": [2]}, [2]),
+ ({"data.data2.data3.cont": [2]}, [2]),
({"data.data2.data3.neq": 2}, [1, 3, 4, 5, 6, 7, 8]),
+ ({"data.data2.data3.neq": [2]}, [1, 3, 4, 5, 6, 7, 8]),
+ ({"data.data2.data3.ncont": [2]}, [1, 3, 4, 5, 6, 7, 8]),
({"data.data2.data3": [2, 3]}, [2, 3]),
({"data.data2.data3.gt": 4}, [5, 6, 7]),
({"data.data2.data3.gte": 4}, [4, 5, 6, 7]),
({"data.data2.data3.lte": 4}, [1, 2, 3, 4]),
({"data.data2.data3.lte": 4.5}, [1, 2, 3, 4]),
({"data.data2.data3.gt": "text"}, []),
+ ({"nonexist.nonexist": "4"}, []),
+ ({"nonexist.nonexist": None}, [1, 2, 3, 4, 5, 6, 7, 8]),
+ ({"nonexist.nonexist.neq": "4"}, [1, 2, 3, 4, 5, 6, 7, 8]),
+ ({"nonexist.nonexist.neq": None}, []),
({"text.eq": "sometext"}, [1]),
({"text.neq": "sometext"}, [2, 3, 4, 5, 6, 7, 8]),
({"text.eq": "somet"}, []),
({"data.data2.data3": None}, [8]),
({"data.data2": "4"}, []),
({"list.0.a": 1}, [1, 6]),
+ ({"list2": 1}, [2]),
+ ({"list2": [1, 5]}, [2]),
+ ({"list2": [1, 2]}, [2]),
+ ({"list2": [5, 7]}, []),
({"list.ANYINDEX.a": 1}, [1]),
({"list.a": 3, "list.b": 1}, [8]),
({"list.ANYINDEX.a": 3, "list.ANYINDEX.b": 1}, []),
else:
db_men.set_one("table", {}, update_dict)
self.assertEqual(db_content, expected, message)
+
+ def test_set_one_pull(self):
+ example = {"a": [1, "1", 1], "d": {}, "n": None}
+ test_set = (
+ # (database content, set-content, expected database content (None=fails), message)
+ (example, {"a": "1"}, {"a": [1, 1], "d": {}, "n": None}, "pull one item"),
+ (example, {"a": 1}, {"a": ["1"], "d": {}, "n": None}, "pull two items"),
+ (example, {"a": "v"}, example, "pull non existing item"),
+ (example, {"a.6": 1}, example, "pull non existing arrray"),
+ (example, {"d.b.c": 1}, example, "pull non existing arrray2"),
+ (example, {"b": 1}, example, "pull non existing arrray3"),
+ (example, {"d": 1}, None, "pull over dict"),
+ (example, {"n": 1}, None, "pull over None"),
+ )
+ db_men = DbMemory()
+ db_men._find = Mock()
+ for db_content, pull_dict, expected, message in test_set:
+ db_content = deepcopy(db_content)
+ db_men._find.return_value = ((0, db_content), )
+ if expected is None:
+ self.assertRaises(DbException, db_men.set_one, "table", {}, None, fail_on_empty=False, pull=pull_dict)
+ else:
+ db_men.set_one("table", {}, None, pull=pull_dict)
+ self.assertEqual(db_content, expected, message)
+
+ def test_set_one_push(self):
+ example = {"a": [1, "1", 1], "d": {}, "n": None}
+ test_set = (
+ # (database content, set-content, expected database content (None=fails), message)
+ (example, {"d.b.c": 1}, {"a": [1, "1", 1], "d": {"b": {"c": [1]}}, "n": None}, "push non existing arrray2"),
+ (example, {"b": 1}, {"a": [1, "1", 1], "d": {}, "b": [1], "n": None}, "push non existing arrray3"),
+ (example, {"a.6": 1}, {"a": [1, "1", 1, None, None, None, [1]], "d": {}, "n": None},
+ "push non existing arrray"),
+ (example, {"a": 2}, {"a": [1, "1", 1, 2], "d": {}, "n": None}, "push one item"),
+ (example, {"a": {1: 1}}, {"a": [1, "1", 1, {1: 1}], "d": {}, "n": None}, "push a dict"),
+ (example, {"d": 1}, None, "push over dict"),
+ (example, {"n": 1}, None, "push over None"),
+ )
+ db_men = DbMemory()
+ db_men._find = Mock()
+ for db_content, push_dict, expected, message in test_set:
+ db_content = deepcopy(db_content)
+ db_men._find.return_value = ((0, db_content), )
+ if expected is None:
+ self.assertRaises(DbException, db_men.set_one, "table", {}, None, fail_on_empty=False, push=push_dict)
+ else:
+ db_men.set_one("table", {}, None, push=push_dict)
+ self.assertEqual(db_content, expected, message)
+
+ def test_unset_one(self):
+ example = {"a": [1, "1", 1], "d": {}, "n": None}
+ test_set = (
+ # (database content, set-content, expected database content (None=fails), message)
+ (example, {"d.b.c": 1}, example, "unset non existing"),
+ (example, {"b": 1}, example, "unset non existing"),
+ (example, {"a.6": 1}, example, "unset non existing arrray"),
+ (example, {"a": 2}, {"d": {}, "n": None}, "unset array"),
+ (example, {"d": 1}, {"a": [1, "1", 1], "n": None}, "unset dict"),
+ (example, {"n": 1}, {"a": [1, "1", 1], "d": {}}, "unset None"),
+ )
+ db_men = DbMemory()
+ db_men._find = Mock()
+ for db_content, unset_dict, expected, message in test_set:
+ db_content = deepcopy(db_content)
+ db_men._find.return_value = ((0, db_content), )
+ if expected is None:
+ self.assertRaises(DbException, db_men.set_one, "table", {}, None, fail_on_empty=False, unset=unset_dict)
+ else:
+ db_men.set_one("table", {}, None, unset=unset_dict)
+ self.assertEqual(db_content, expected, message)