from openid.consumer.html_parse import parseLinkAttrs import os.path import codecs import unittest def parseLink(line): parts = line.split() optional = parts[0] == 'Link*:' assert optional or parts[0] == 'Link:' attrs = {} for attr in parts[1:]: k, v = attr.split('=', 1) if k[-1] == '*': attr_optional = 1 k = k[:-1] else: attr_optional = 0 attrs[k] = (attr_optional, v) return (optional, attrs) def parseCase(s): header, markup = s.split('\n\n', 1) lines = header.split('\n') name = lines.pop(0) assert name.startswith('Name: ') desc = name[6:] return desc, markup, map(parseLink, lines) def parseTests(s): tests = [] cases = s.split('\n\n\n') header = cases.pop(0) tests_line, _ = header.split('\n', 1) k, v = tests_line.split(': ') assert k == 'Num Tests' num_tests = int(v) for case in cases[:-1]: desc, markup, links = parseCase(case) tests.append((desc, markup, links, case)) return num_tests, tests class _LinkTest(unittest.TestCase): def __init__(self, desc, case, expected, raw): unittest.TestCase.__init__(self) self.desc = desc self.case = case self.expected = expected self.raw = raw def shortDescription(self): return self.desc def runTest(self): actual = parseLinkAttrs(self.case) i = 0 for optional, exp_link in self.expected: if optional: if i >= len(actual): continue act_link = actual[i] for k, (o, v) in exp_link.items(): if o: act_v = act_link.get(k) if act_v is None: continue else: act_v = act_link[k] if optional and v != act_v: break self.assertEqual(v, act_v) else: i += 1 assert i == len(actual) def pyUnitTests(): here = os.path.dirname(os.path.abspath(__file__)) test_data_file_name = os.path.join(here, 'linkparse.txt') test_data_file = codecs.open(test_data_file_name, 'r', 'utf-8') test_data = test_data_file.read() test_data_file.close() num_tests, test_cases = parseTests(test_data) tests = [_LinkTest(*case) for case in test_cases] def test_parseSucceeded(): assert len(test_cases) == num_tests, (len(test_cases), num_tests) check_desc = 'Check that we parsed the correct number of test cases' check = unittest.FunctionTestCase( test_parseSucceeded, description=check_desc) tests.insert(0, check) return unittest.TestSuite(tests) if __name__ == '__main__': suite = pyUnitTests() runner = unittest.TextTestRunner() runner.run(suite)