Add "additionalProperties" support to remove_extra_items in utils
[osm/RO.git] / osm_ro / tests / test_utils.py
1 # -*- coding: utf-8 -*-
2 # pylint: disable=E1101
3
4 import unittest
5
6 from ..utils import (
7 get_arg,
8 inject_args,
9 remove_extra_items,
10 )
11
12
13 class TestUtils(unittest.TestCase):
14 def test_inject_args_curries_arguments(self):
15 fn = inject_args(lambda a=None, b=None: a + b, a=3, b=5)
16 self.assertEqual(fn(), 8)
17
18 def test_inject_args_doesnt_add_arg_if_not_needed(self):
19 fn = inject_args(lambda: 7, a=1, b=2)
20 self.assertEqual(fn(), 7)
21 fn = inject_args(lambda a=None: a, b=2)
22 self.assertEqual(fn(1), 1)
23
24 def test_inject_args_knows_how_to_handle_arg_order(self):
25 fn = inject_args(lambda a=None, b=None: b - a, a=3)
26 self.assertEqual(fn(b=4), 1)
27 fn = inject_args(lambda b=None, a=None: b - a, a=3)
28 self.assertEqual(fn(b=4), 1)
29
30 def test_inject_args_works_as_decorator(self):
31 fn = inject_args(x=1)(lambda x=None: x)
32 self.assertEqual(fn(), 1)
33
34 def test_get_arg__positional(self):
35 def _fn(x, y, z):
36 return x + y + z
37
38 x = get_arg("x", _fn, (1, 3, 4), {})
39 self.assertEqual(x, 1)
40 y = get_arg("y", _fn, (1, 3, 4), {})
41 self.assertEqual(y, 3)
42 z = get_arg("z", _fn, (1, 3, 4), {})
43 self.assertEqual(z, 4)
44
45 def test_get_arg__keyword(self):
46 def _fn(x, y, z=5):
47 return x + y + z
48
49 z = get_arg("z", _fn, (1, 2), {"z": 3})
50 self.assertEqual(z, 3)
51
52
53
54 def test_remove_extra_items__keep_aditional_properties(self):
55 schema = {
56 "type": "object",
57 "properties": {
58 "a": {
59 "type": "object",
60 "properties": {
61 "type": "object",
62 "properties": {"b": "string"},
63 },
64 "additionalProperties": True,
65 }
66 },
67 }
68
69 example = {"a": {"b": 1, "c": 2}, "d": 3}
70 deleted = remove_extra_items(example, schema)
71 self.assertIn("d", deleted)
72 self.assertIs(example.get("d"), None)
73 self.assertEqual(example["a"]["c"], 2)
74
75
76 if __name__ == "__main__":
77 unittest.main()