def test_invalid(self): with self.assertRaises(ValueError): Traverser(0) with self.assertRaises(ValueError): Traverser(0.0) with self.assertRaises(ValueError): Traverser("abc")
def test_blacklist(self): id_filter = Filter(blacklist='id') left = {'id': 1, 'username': '******'} right = {'username': '******'} self.assertTrue(id_filter.are_equal(left, right)) self.assertTrue(id_filter.are_equal(left, Traverser(right))) self.assertTrue(id_filter.are_equal(Traverser(left), right)) self.assertTrue(id_filter.are_equal(Traverser(left), Traverser(right)))
def test_contains_with_filter(self): id_filter = Filter(blacklist='id') records = Traverser({'id': 1, 'username': '******'}, filter=id_filter) already_exists_record = Traverser({'username': '******'}) self.assertTrue(already_exists_record in records) self.assertTrue({'username': '******'} in records) new_record = Traverser({'username': '******'}) self.assertFalse(new_record in records) self.assertFalse({'username': '******'} in records)
def test_whitelist(self): username_filter = Filter(whitelist='username') left = {'id': 1, 'username': '******'} right = {'username': '******'} self.assertTrue(username_filter.are_equal(left, right)) self.assertTrue(username_filter.are_equal(left, Traverser(right))) self.assertTrue(username_filter.are_equal(Traverser(left), right)) self.assertTrue( username_filter.are_equal(Traverser(left), Traverser(right)))
def test_extend_singleton(self): obj = Traverser({'username': '******'}) obj.extend([{'username': '******'}]) self.assertEqual(obj(), [{'username': '******'}, {'username': '******'}]) obj = Traverser({'username': '******'}) obj.extend(Traverser([{'username': '******'}])) self.assertEqual(obj(), [{'username': '******'}, {'username': '******'}])
def test_append_to_singleton(self): obj = Traverser({'username': '******'}) obj.append({'username': '******'}) self.assertEqual(obj(), [{'username': '******'}, {'username': '******'}]) obj = Traverser({'username': '******'}) obj.append(Traverser({'username': '******'})) self.assertEqual(obj(), [{'username': '******'}, {'username': '******'}])
def test_get_raises_better_list_access_exception(self): obj = Traverser([]) with self.assertRaises(ValueError): obj.get('bad') value = {'root': []} obj = Traverser(value) with self.assertRaises(ValueError): obj.get('root.bad')
def test_dir_not_including_bad_keys(self): obj = Traverser({'id': 1, '@bad': '', 'even.worse': 3}) dir_list = sorted([k for k in dir(obj) if not k.startswith('_')]) self.assertEqual(dir_list, [ 'append', 'ensure_list', 'extend', 'get', 'id', 'prune', 'set', 'to_json' ])
def test_dir_for_dict(self): obj = Traverser({'id': 1}) dir_list = sorted([k for k in dir(obj) if not k.startswith('_')]) self.assertEqual(dir_list, [ 'append', 'ensure_list', 'extend', 'get', 'id', 'prune', 'set', 'to_json' ])
def test_singleton(self): users = {'username': '******', 'display_name': 'John Doe'} obj = Traverser(users) self.assertIsNone(obj.invalid_key) self.assertEqual(obj.username, 'jdoe') self.assertEqual(obj[0].username, 'jdoe') self.assertEqual(obj['display_name'], 'John Doe') self.assertEqual(obj[0]['display_name'], 'John Doe')
def test_setitem_needing_recursive_unwrap(self): obj = Traverser({}) obj.list_has_traverser = [Traverser([123]), 456] self.assertEqual(obj.list_has_traverser(), [[123], 456]) obj.dict_has_traverser = { 'has_traverser': Traverser([123]), 'no_traverser': 456 } self.assertEqual(sorted(obj.dict_has_traverser().items()), [('has_traverser', [123]), ('no_traverser', 456)])
def test_traverser_prune_called_with_filter(self): id_filter = Filter(blacklist='id') obj = Traverser({'id': 1, 'username': '******'}) obj.prune() self.assertTrue(obj() == {'id': 1, 'username': '******'}) obj.prune(filter=id_filter) self.assertTrue(obj() == {'username': '******'})
def test_setitem(self): users = {'username': '******', 'display_name': 'John Doe'} obj = Traverser(users) obj.set_to_none = None self.assertIsNone(obj.set_to_none) obj.id = 123 self.assertEqual(obj.id, 123) obj.roles = ['admin', 'any_user'] self.assertEqual(obj.roles(), ['admin', 'any_user'])
def test_to_json(self): obj = Traverser({}) self.assertEqual(obj.to_json(), '{}') obj = Traverser([]) self.assertEqual(obj.to_json(), '[]')
def test_extend_call_chain(self): obj = Traverser([]) self.assertTrue(obj.extend([]) is obj)
def test_response_object_with_json_method(self): obj = Traverser(MockResponse('[]')) self.assertEqual(obj, [])
def test_no_deepcopy_causes_intended_side_effects(self): value = {'id': 0} obj = Traverser(value, deepcopy=False) obj.id = 1 self.assertEqual(obj(), {'id': 1}) self.assertEqual(value, {'id': 1})
def test_set_updates_existing_node(self): value = {'root': {'users': [{'username': '******'}]}} obj = Traverser(value) obj.set('root.users', 'any') self.assertEqual(obj.get('root.users'), 'any')
def test_set_creates_list(self): value = {'root': {'stuff': {'users': [{'username': '******'}]}}} obj = Traverser(value) obj.set('root.stuff.parts.0.auto', 'any') self.assertEqual(obj.get('root.stuff.parts.0.auto'), 'any')
def test_get_supports_dot_escaping(self): value = {'root': {'@xsi.type': 'field'}} obj = Traverser(value) self.assertEqual(obj.get('*****@*****.**'), 'field')
def test_prune_call_chain(self): obj = Traverser({}) self.assertTrue(obj.prune() is obj)
def test_get_forgives_missing_node(self): value = {'root': {'users': [{'username': '******'}]}} obj = Traverser(value) self.assertIsNone(obj.get('root.places'))
def test_get_traverses_list(self): value = {'root': {'users': [{'username': '******'}]}} obj = Traverser(value) self.assertEqual(obj.get('root.users.0.username'), 'jdoe')
def test_append_call_chain(self): obj = Traverser([]) self.assertTrue(obj.append({}) is obj)
def test_getitem_does_not_use_get(self): obj = Traverser({'@xsi.type': 'value'}) self.assertEqual(obj['@xsi.type'], 'value')
def test_ensure_list(self): obj = Traverser({'item': 'value'}) self.assertIsNone(obj.ensure_list('invalid_key')) self.assertEqual(obj.ensure_list('item'), ['value']) obj = Traverser({'item': ['value']}) self.assertEqual(obj.ensure_list('item')(), ['value'])
def test_traversal_to_traverser_node(self): obj = Traverser({'item': {'key': 'value'}}) self.assertEqual(obj.item, {'key': 'value'}) self.assertEqual(obj.item.__class__.__name__, 'Traverser') self.assertEqual(obj['item'], {'key': 'value'}) self.assertEqual(obj['item'].__class__.__name__, 'Traverser')
def test_get_finds_node(self): value = {'root': {'users': [{'username': '******'}]}} obj = Traverser(value) self.assertEqual(obj.get('root.users')(), [{'username': '******'}])
def test_eq(self): obj1 = Traverser({'item': 'value'}) obj2 = Traverser({'item': 'value'}) self.assertEqual(obj1, obj2) obj2.item = 'foo' self.assertNotEqual(obj1, obj2)
def test_json(self): obj = Traverser("[]") self.assertEqual(obj(), []) obj = Traverser("{}") self.assertEqual(obj(), {})