6 from datetime import datetime
8 from htsworkflow.util.rdfhelp import \
13 load_string_into_model, \
23 class TestRDFHelp(unittest.TestCase):
24 def test_from_none(self):
25 self.failUnlessEqual(fromTypedNode(None), None)
27 def test_typed_node_boolean(self):
28 node = toTypedNode(True)
29 self.failUnlessEqual(node.literal_value['string'], u'1')
30 self.failUnlessEqual(str(node.literal_value['datatype']),
31 'http://www.w3.org/2001/XMLSchema#boolean')
33 def test_bad_boolean(self):
34 node = RDF.Node(literal='bad', datatype=xsdNS['boolean'].uri)
35 self.failUnlessRaises(ValueError, fromTypedNode, node)
37 def test_typed_node_string(self):
38 node = toTypedNode('hello')
39 self.failUnlessEqual(node.literal_value['string'], u'hello')
40 self.failUnless(node.literal_value['datatype'] is None)
42 def test_typed_real_like(self):
44 node = toTypedNode(num)
45 self.failUnlessEqual(fromTypedNode(node), num)
47 def test_typed_integer(self):
49 node = toTypedNode(num)
50 self.failUnlessEqual(fromTypedNode(node), num)
51 self.failUnlessEqual(type(fromTypedNode(node)), type(num))
53 def test_typed_node_string(self):
56 self.failUnlessEqual(fromTypedNode(node), s)
57 self.failUnlessEqual(type(fromTypedNode(node)), types.UnicodeType)
59 def test_blank_or_uri_blank(self):
61 self.failUnlessEqual(node.is_blank(), True)
63 def test_blank_or_uri_url(self):
64 s = 'http://google.com'
66 self.failUnlessEqual(node.is_resource(), True)
67 self.failUnlessEqual(str(node.uri), s)
69 def test_blank_or_uri_node(self):
70 s = RDF.Node(RDF.Uri('http://google.com'))
72 self.failUnlessEqual(node.is_resource(), True)
73 self.failUnlessEqual(node, s)
75 def test_unicode_node_roundtrip(self):
77 roundtrip = fromTypedNode(toTypedNode(literal))
78 self.failUnlessEqual(roundtrip, literal)
79 self.failUnlessEqual(type(roundtrip), types.UnicodeType)
81 def test_datetime_no_microsecond(self):
82 dateTimeType = xsdNS['dateTime'].uri
83 short_isostamp = '2011-12-20T11:44:25'
84 short_node = RDF.Node(literal=short_isostamp,
85 datatype=dateTimeType)
86 short_datetime = datetime(2011,12,20,11,44,25)
88 self.assertEqual(fromTypedNode(short_node), short_datetime)
89 self.assertEqual(toTypedNode(short_datetime), short_node)
90 self.assertEqual(fromTypedNode(toTypedNode(short_datetime)),
93 def test_datetime_with_microsecond(self):
94 dateTimeType = xsdNS['dateTime'].uri
95 long_isostamp = '2011-12-20T11:44:25.081776'
96 long_node = RDF.Node(literal=long_isostamp,
97 datatype=dateTimeType)
98 long_datetime = datetime(2011,12,20,11,44,25,81776)
100 self.assertEqual(fromTypedNode(long_node), long_datetime)
101 self.assertEqual(toTypedNode(long_datetime), long_node)
102 self.assertEqual(fromTypedNode(toTypedNode(long_datetime)),
105 def test_simplify_uri(self):
106 nsOrg = RDF.NS('example.org/example#')
107 nsCom = RDF.NS('example.com/example#')
111 self.failUnlessEqual(simplifyUri(nsOrg, node), term)
112 self.failUnlessEqual(simplifyUri(nsCom, node), None)
113 self.failUnlessEqual(simplifyUri(nsOrg, node.uri), term)
115 def test_simplify_uri_exceptions(self):
116 nsOrg = RDF.NS('example.org/example#')
117 nsCom = RDF.NS('example.com/example#')
119 node = toTypedNode('bad')
120 self.failUnlessRaises(ValueError, simplifyUri, nsOrg, node)
121 self.failUnlessRaises(ValueError, simplifyUri, nsOrg, nsOrg)
123 def test_owl_import(self):
124 path, name = os.path.split(__file__)
125 loc = 'file://'+os.path.abspath(path)+'/'
128 @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
129 @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
130 @prefix owl: <http://www.w3.org/2002/07/owl#> .
132 _:a owl:imports "{loc}extra.turtle"
134 load_string_into_model(model, 'turtle', fragment, loc)
135 tc = RDF.Node(RDF.Uri('http://jumpgate.caltech.edu/wiki/TestCase'))
136 query = RDF.Statement(tc, rdfsNS['label'], None)
137 result = list(model.find_statements(query))
138 self.failUnlessEqual(len(result), 1)
139 self.failUnlessEqual(str(result[0].object), 'TestCase')
141 def test_sanitize_literal_text(self):
142 self.failUnlessRaises(ValueError, sanitize_literal, "hi")
144 hello_none = RDF.Node(hello_text)
145 self.failUnlessEqual(str(sanitize_literal(hello_none)),
147 hello_str = RDF.Node(literal=hello_text,
148 datatype=xsdNS['string'].uri)
149 self.failUnlessEqual(str(sanitize_literal(hello_str)),
152 def test_sanitize_literal_html(self):
153 hello = "hello <a onload='javascript:alert(\"foo\");' href='http://google.com'>google.com</a>, whats up?"
154 hello_clean = 'hello <a href="http://google.com">google.com</a>, whats up?'
155 hello_node = RDF.Node(literal=hello,
156 datatype=xsdNS['string'].uri)
157 hello_sanitized = sanitize_literal(hello_node)
158 self.failUnlessEqual(str(hello_sanitized),
161 hostile = "hi <b>there</b><script type='text/javascript>alert('boo');</script><a href='javascript:alert('poke')>evil</a> scammer"
162 hostile_node = RDF.Node(hostile)
163 hostile_sanitized = sanitize_literal(hostile_node)
164 # so it drops the stuff after the javascript link.
165 # I suppose it could be worse
166 hostile_result = """hi <b>there</b>"""
167 self.failUnlessEqual(str(hostile_sanitized), hostile_result)
171 return unittest.makeSuite(TestRDFHelp, 'test')
172 except ImportError, e:
173 print "Unable to test rdfhelp"
178 if __name__ == "__main__":
179 unittest.main(defaultTest='suite')