# standard imports import unittest # bsie imports from bsie.utils import ns, errors from bsie.utils.bsfs import URI from bsie.utils.node import Node # objects to test from bsie.lib.naming_policy import NamingPolicy, NamingPolicyIterator, DefaultNamingPolicy ## code ## class TestDefaultNamingPolicy(unittest.TestCase): def test_handle_node(self): # setup policy = DefaultNamingPolicy('http://example.com', 'me') # handle_node doesn't modify existing uris self.assertEqual(policy.handle_node( Node(ns.bsn.Invalid, uri='http://example.com/you/foo#bar')).uri, URI('http://example.com/you/foo#bar')) # processes bsn:Entity self.assertEqual(policy.handle_node( Node(ns.bsn.Entity, ucid='abc123cba')).uri, URI('http://example.com/me/file#abc123cba')) # processes bsn:Preview self.assertEqual(policy.handle_node( Node(ns.bsn.Preview, ucid='abc123cba', size=123)).uri, URI('http://example.com/me/preview#abc123cba_s123')) # processes bsn:Tag self.assertEqual(policy.handle_node( Node(ns.bsn.Tag, label='hello')).uri, URI('http://example.com/me/tag#hello')) # processes bsn:Face self.assertEqual(policy.handle_node( Node(ns.bsn.Face, ucid='hello')).uri, URI('http://example.com/me/face#hello')) # raises an exception on unknown types self.assertRaises(errors.ProgrammingError, policy.handle_node, Node(ns.bsn.Invalid, ucid='abc123cba', size=123)) def test_name_entity(self): # setup policy = DefaultNamingPolicy('http://example.com', 'me') # name_entity uses ucid self.assertEqual(policy.name_entity( Node(ns.bsn.Entity, ucid='123abc321')).uri, URI('http://example.com/me/file#123abc321')) # name_entity falls back to a random guid self.assertTrue(policy.name_entity( Node(ns.bsn.Entity)).uri.startswith('http://example.com/me/file#')) def test_name_preview(self): # setup policy = DefaultNamingPolicy('http://example.com', 'me') # name_preview uses ucid self.assertEqual(policy.name_preview( Node(ns.bsn.Preview, ucid='123abc321')).uri, URI('http://example.com/me/preview#123abc321')) self.assertEqual(policy.name_preview( Node(ns.bsn.Preview, ucid='123abc321', size=400)).uri, URI('http://example.com/me/preview#123abc321_s400')) # name_preview uses source self.assertEqual(policy.name_preview( Node(ns.bsn.Preview, source=Node(ns.bsn.Entity, ucid='123file321'))).uri, URI('http://example.com/me/preview#123file321')) self.assertEqual(policy.name_preview( Node(ns.bsn.Preview, source=Node(ns.bsn.Entity, ucid='123file321'), size=300)).uri, URI('http://example.com/me/preview#123file321_s300')) # name_preview falls back to a random guid self.assertTrue(policy.name_preview( Node(ns.bsn.Preview)).uri.startswith('http://example.com/me/preview#')) self.assertTrue(policy.name_preview( Node(ns.bsn.Preview, size=200)).uri.startswith('http://example.com/me/preview#')) self.assertTrue(policy.name_preview( Node(ns.bsn.Preview, size=200)).uri.endswith('_s200')) def test_name_tag(self): # setup policy = DefaultNamingPolicy('http://example.com', 'me') # name_tag uses label self.assertEqual(policy.name_tag( Node(ns.bsn.Tag, label='hello')).uri, URI('http://example.com/me/tag#hello')) # name_tag matches the label self.assertEqual( policy.name_tag(Node(ns.bsn.Tag, label='world')), policy.name_tag(Node(ns.bsn.Tag, label='world')), ) self.assertNotEqual( policy.name_tag(Node(ns.bsn.Tag, label='hello')), policy.name_tag(Node(ns.bsn.Tag, label='world')), ) # label can include characters that are not valid for an uri self.assertEqual(policy.name_tag( Node(ns.bsn.Preview, label='hello world { foo bar ] ')).uri, URI('http://example.com/me/tag#hello%20world%20%7B%20foo%20bar%20%5D%20')) # name_tag falls back to a random guid self.assertTrue(policy.name_tag( Node(ns.bsn.Tag,)).uri.startswith('http://example.com/me/tag#')) def test_name_face(self): # setup policy = DefaultNamingPolicy('http://example.com', 'me') # name_face uses ucid self.assertEqual(policy.name_face( Node(ns.bsn.Face, ucid='hello_world')).uri, URI('http://example.com/me/face#hello_world')) # name_face falls back to a random guid self.assertTrue(policy.name_face( Node(ns.bsn.Face)).uri.startswith('http://example.com/me/face#')) class TestNamingPolicyIterator(unittest.TestCase): def test_call(self): # NOTE: We test NamingPolicy.__call__ here # setup policy = DefaultNamingPolicy('http://example.com', 'me') # call accepts list triples = [('node', 'pred', 'value'), ('node', 'pred', 'value')] it = policy(triples) self.assertIsInstance(it, NamingPolicyIterator) self.assertEqual(it._iterable, triples) self.assertEqual(it._policy, policy) # call accepts iterator triples = iter([('node', 'pred', 'value'), ('node', 'pred', 'value')]) it = policy(triples) self.assertIsInstance(it, NamingPolicyIterator) self.assertEqual(it._iterable, triples) self.assertEqual(it._policy, policy) def test_iter(self): # setup policy = DefaultNamingPolicy('http://example.com', 'me') triples = [ (Node(ns.bsn.Entity, ucid='foo'), 'predA', 'hello'), (Node(ns.bsn.Preview, ucid='bar'), 'predB', 1234), (Node(ns.bsn.Preview, ucid='hello'), 'predC', Node(ns.bsn.Entity, ucid='world')) ] # handles nodes, handles values, ignores predicate self.assertListEqual(list(policy(triples)), [ (Node(ns.bsn.Entity, uri='http://example.com/me/file#foo'), 'predA', 'hello'), (Node(ns.bsn.Preview, uri='http://example.com/me/preview#bar'), 'predB', 1234), (Node(ns.bsn.Preview, uri='http://example.com/me/preview#hello'), 'predC', Node(ns.bsn.Entity, uri='http://example.com/me/file#world')), ]) ## main ## if __name__ == '__main__': unittest.main() ## EOF ##