~gary/python-openid/python-openid-2.2.1-patched

« back to all changes in this revision

Viewing changes to openid/test/test_etxrd.py

  • Committer: Launchpad Patch Queue Manager
  • Date: 2007-11-30 02:46:28 UTC
  • mfrom: (1.1.1 pyopenid-2.0)
  • Revision ID: launchpad@pqm.canonical.com-20071130024628-qktwsew3383iawmq
[rs=SteveA] upgrade to python-openid-2.0.1

Show diffs side-by-side

added added

removed removed

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