Package yadis :: Package test :: Module test_etxrd
[hide private]
[frames] | no frames]

Source Code for Module yadis.test.test_etxrd

  1  import unittest 
  2  from yadis import services, etxrd, xri 
  3  import os.path 
  4   
5 -def sibpath(one, other, make_absolute=True):
6 if os.path.isabs(other): 7 return other 8 p = os.path.join(os.path.dirname(one), other) 9 if make_absolute: 10 p = os.path.abspath(p) 11 return p
12 13 14 XRD_FILE = sibpath(__file__, os.path.join("data", "test1-xrd.xml")) 15 NOXRDS_FILE = sibpath(__file__, os.path.join("data", "not-xrds.xml")) 16 NOXRD_FILE = sibpath(__file__, os.path.join("data", "no-xrd.xml")) 17 18 # None of the namespaces or service URIs below are official (or even 19 # sanctioned by the owners of that piece of URL-space) 20 21 LID_2_0 = "http://lid.netmesh.org/sso/2.0b5" 22 TYPEKEY_1_0 = "http://typekey.com/services/1.0" 23
24 -def simpleOpenIDTransformer(endpoint):
25 """Function to extract information from an OpenID service element""" 26 if 'http://openid.net/signon/1.0' not in endpoint.type_uris: 27 return None 28 29 delegates = list(endpoint.service_element.findall( 30 '{http://openid.net/xmlns/1.0}Delegate')) 31 assert len(delegates) == 1 32 delegate = delegates[0].text 33 return (endpoint.uri, delegate)
34
35 -class TestServiceParser(unittest.TestCase):
36 - def setUp(self):
37 self.xmldoc = file(XRD_FILE).read() 38 self.yadis_url = 'http://unittest.url/'
39
40 - def _getServices(self, flt=None):
41 return list(services.applyFilter(self.yadis_url, self.xmldoc, flt))
42
43 - def testParse(self):
44 """Make sure that parsing succeeds at all""" 45 services = self._getServices()
46
47 - def testParseOpenID(self):
48 """Parse for OpenID services with a transformer function""" 49 services = self._getServices(simpleOpenIDTransformer) 50 51 expectedServices = [ 52 ("http://www.myopenid.com/server", "http://josh.myopenid.com/"), 53 ("http://www.schtuff.com/openid", "http://users.schtuff.com/josh"), 54 ("http://www.livejournal.com/openid/server.bml", 55 "http://www.livejournal.com/users/nedthealpaca/"), 56 ] 57 58 it = iter(services) 59 for (server_url, delegate) in expectedServices: 60 for (actual_url, actual_delegate) in it: 61 self.failUnlessEqual(server_url, actual_url) 62 self.failUnlessEqual(delegate, actual_delegate) 63 break 64 else: 65 self.fail('Not enough services found')
66
67 - def _checkServices(self, expectedServices):
68 """Check to make sure that the expected services are found in 69 that order in the parsed document.""" 70 it = iter(self._getServices()) 71 for (type_uri, uri) in expectedServices: 72 for service in it: 73 if type_uri in service.type_uris: 74 self.failUnlessEqual(service.uri, uri) 75 break 76 else: 77 self.fail('Did not find %r service' % (type_uri,))
78
79 - def testGetSeveral(self):
80 """Get some services in order""" 81 expectedServices = [ 82 # type, URL 83 (TYPEKEY_1_0, None), 84 (LID_2_0, "http://mylid.net/josh"), 85 ] 86 87 self._checkServices(expectedServices)
88
89 - def testGetSeveralForOne(self):
90 """Getting services for one Service with several Type elements.""" 91 types = [ 'http://lid.netmesh.org/sso/2.0b5' 92 , 'http://lid.netmesh.org/2.0b5' 93 ] 94 95 uri = "http://mylid.net/josh" 96 97 for service in self._getServices(): 98 if service.uri == uri: 99 found_types = service.matchTypes(types) 100 if found_types == types: 101 break 102 else: 103 self.fail('Did not find service with expected types and uris')
104
105 - def testNoXRDS(self):
106 """Make sure that we get an exception when an XRDS element is 107 not present""" 108 self.xmldoc = file(NOXRDS_FILE).read() 109 self.failUnlessRaises( 110 etxrd.XRDSError, 111 services.applyFilter, self.yadis_url, self.xmldoc, None)
112
113 - def testEmpty(self):
114 """Make sure that we get an exception when an XRDS element is 115 not present""" 116 self.xmldoc = '' 117 self.failUnlessRaises( 118 etxrd.XRDSError, 119 services.applyFilter, self.yadis_url, self.xmldoc, None)
120
121 - def testNoXRD(self):
122 """Make sure that we get an exception when there is no XRD 123 element present.""" 124 self.xmldoc = file(NOXRD_FILE).read() 125 self.failUnlessRaises( 126 etxrd.XRDSError, 127 services.applyFilter, self.yadis_url, self.xmldoc, None)
128 129
130 -class TestCanonicalID(unittest.TestCase):
131 132 canonicalIDtests = [ 133 ("@ootao*test1", "delegated-20060809.xrds", 134 "@!5BAD.2AA.3C72.AF46!0000.0000.3B9A.CA01"), 135 ("@ootao*test1", "delegated-20060809-r1.xrds", 136 "@!5BAD.2AA.3C72.AF46!0000.0000.3B9A.CA01"), 137 ("@ootao*test1", "delegated-20060809-r2.xrds", 138 "@!5BAD.2AA.3C72.AF46!0000.0000.3B9A.CA01"), 139 ("@ootao*test1", "sometimesprefix.xrds", 140 "@!5BAD.2AA.3C72.AF46!0000.0000.3B9A.CA01"), 141 ("@ootao*test1", "prefixsometimes.xrds", 142 "@!5BAD.2AA.3C72.AF46!0000.0000.3B9A.CA01"), 143 ("=keturn*isDrummond", "spoof1.xrds", etxrd.XRDSFraud), 144 ("=keturn*isDrummond", "spoof2.xrds", etxrd.XRDSFraud), 145 ("@keturn*is*drummond", "spoof3.xrds", etxrd.XRDSFraud), 146 ("=x", "status222.xrds", None), 147 # Don't let IRI authorities be canonical for the GCS. 148 ("phreak.example.com", "delegated-20060809-r2.xrds", etxrd.XRDSFraud), 149 # TODO: Refs 150 # ("@ootao*test.ref", "ref.xrds", "@!BAE.A650.823B.2475") 151 ] 152 153 # TODO: Add a IRI authority with an IRI canonicalID. 154 # TODO: Add test cases with real examples of multiple CanonicalIDs 155 # somewhere in the resolution chain. 156
157 - def test_getCanonicalID(self):
158 for iname, filename, expectedID in self.canonicalIDtests: 159 filename = sibpath(__file__, os.path.join("data", filename)) 160 xrds = etxrd.parseXRDS(file(filename).read()) 161 self._getCanonicalID(iname, xrds, expectedID)
162 163
164 - def _getCanonicalID(self, iname, xrds, expectedID):
165 if isinstance(expectedID, (str, unicode, type(None))): 166 cid = etxrd.getCanonicalID(iname, xrds) 167 self.failUnlessEqual(cid, expectedID and xri.XRI(expectedID)) 168 elif issubclass(expectedID, etxrd.XRDSError): 169 self.failUnlessRaises(expectedID, etxrd.getCanonicalID, 170 iname, xrds) 171 else: 172 self.fail("Don't know how to test for expected value %r" 173 % (expectedID,))
174 175 176 if __name__ == '__main__': 177 unittest.main() 178