reference_resolver_test.py revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1#!/usr/bin/env python 2# Copyright (c) 2012 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6import json 7import os 8import sys 9import unittest 10 11from file_system import FileNotFoundError 12from reference_resolver import ReferenceResolver 13from test_object_store import TestObjectStore 14 15 16class FakeAPIDataSource(object): 17 def __init__(self, json_data): 18 self._json = json_data 19 20 def get(self, key, disable_refs=False): 21 assert disable_refs, 'ReferenceResolve should be disabling refs' 22 if key not in self._json: 23 raise FileNotFoundError(key) 24 return self._json[key] 25 26 27class FakeAPIModels(object): 28 def __init__(self, names): 29 self._names = names 30 31 def GetNames(self): 32 return self._names 33 34 35class APIDataSourceTest(unittest.TestCase): 36 def setUp(self): 37 self._base_path = os.path.join(sys.path[0], 'test_data', 'test_json') 38 39 def _ReadLocalFile(self, filename): 40 with open(os.path.join(self._base_path, filename), 'r') as f: 41 return f.read() 42 43 def testGetLink(self): 44 test_data = json.loads(self._ReadLocalFile('fake_data_source.json')) 45 resolver = ReferenceResolver(FakeAPIDataSource(test_data), 46 FakeAPIModels(test_data.keys()), 47 TestObjectStore('test')) 48 self.assertEqual({ 49 'href': 'foo.html', 50 'text': 'foo', 51 'name': 'foo' 52 }, resolver.GetLink('foo', namespace='baz')) 53 self.assertEqual({ 54 'href': 'foo.html#type-foo_t1', 55 'text': 'foo.foo_t1', 56 'name': 'foo_t1' 57 }, resolver.GetLink('foo.foo_t1', namespace='baz')) 58 self.assertEqual({ 59 'href': 'baz.html#event-baz_e1', 60 'text': 'baz_e1', 61 'name': 'baz_e1' 62 }, resolver.GetLink('baz.baz_e1', namespace='baz')) 63 self.assertEqual({ 64 'href': 'baz.html#event-baz_e1', 65 'text': 'baz_e1', 66 'name': 'baz_e1' 67 }, resolver.GetLink('baz_e1', namespace='baz')) 68 self.assertEqual({ 69 'href': 'foo.html#method-foo_f1', 70 'text': 'foo.foo_f1', 71 'name': 'foo_f1' 72 }, resolver.GetLink('foo.foo_f1', namespace='baz')) 73 self.assertEqual({ 74 'href': 'foo.html#property-foo_p3', 75 'text': 'foo.foo_p3', 76 'name': 'foo_p3' 77 }, resolver.GetLink('foo.foo_p3', namespace='baz')) 78 self.assertEqual({ 79 'href': 'bar.bon.html#type-bar_bon_t3', 80 'text': 'bar.bon.bar_bon_t3', 81 'name': 'bar_bon_t3' 82 }, resolver.GetLink('bar.bon.bar_bon_t3', namespace='baz')) 83 self.assertEqual({ 84 'href': 'bar.bon.html#property-bar_bon_p3', 85 'text': 'bar_bon_p3', 86 'name': 'bar_bon_p3' 87 }, resolver.GetLink('bar_bon_p3', namespace='bar.bon')) 88 self.assertEqual({ 89 'href': 'bar.bon.html#property-bar_bon_p3', 90 'text': 'bar_bon_p3', 91 'name': 'bar_bon_p3' 92 }, resolver.GetLink('bar.bon.bar_bon_p3', namespace='bar.bon')) 93 self.assertEqual({ 94 'href': 'bar.html#event-bar_e2', 95 'text': 'bar_e2', 96 'name': 'bar_e2' 97 }, resolver.GetLink('bar.bar_e2', namespace='bar')) 98 self.assertEqual({ 99 'href': 'bar.html#type-bon', 100 'text': 'bon', 101 'name': 'bon' 102 }, resolver.GetLink('bar.bon', namespace='bar')) 103 self.assertEqual({ 104 'href': 'foo.html#event-foo_t3-foo_t3_e1', 105 'text': 'foo_t3.foo_t3_e1', 106 'name': 'foo_t3_e1' 107 }, resolver.GetLink('foo_t3.foo_t3_e1', namespace='foo')) 108 self.assertEqual({ 109 'href': 'foo.html#event-foo_t3-foo_t3_e1', 110 'text': 'foo_t3.foo_t3_e1', 111 'name': 'foo_t3_e1' 112 }, resolver.GetLink('foo.foo_t3.foo_t3_e1', namespace='foo')) 113 self.assertEqual({ 114 'href': 'foo.html#event-foo_t3-foo_t3_e1', 115 'text': 'foo_t3.foo_t3_e1', 116 'name': 'foo_t3_e1' 117 }, resolver.GetLink('foo.foo_p1.foo_t3_e1', namespace='foo')) 118 self.assertEqual({ 119 'href': 'bar.html#property-bar_t1-bar_t1_p1', 120 'text': 'bar.bar_t1.bar_t1_p1', 121 'name': 'bar_t1_p1' 122 }, resolver.GetLink('bar.bar_p3.bar_t1_p1', namespace='foo')) 123 self.assertEqual({ 124 'href': 'bar.html#property-bar_t1-bar_t1_p1', 125 'text': 'bar_t1.bar_t1_p1', 126 'name': 'bar_t1_p1' 127 }, resolver.GetLink('bar_p3.bar_t1_p1', namespace='bar')) 128 self.assertEqual( 129 None, 130 resolver.GetLink('bar.bar_p3.bar_t2_p1', namespace='bar')) 131 self.assertEqual( 132 None, 133 resolver.GetLink('bar.bon.bar_e3', namespace='bar')) 134 self.assertEqual( 135 None, 136 resolver.GetLink('bar_p3', namespace='baz.bon')) 137 self.assertEqual( 138 None, 139 resolver.GetLink('falafel.faf', namespace='a')) 140 self.assertEqual( 141 None, 142 resolver.GetLink('bar_p3', namespace='foo')) 143 self.assertEqual( 144 'Hello <a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, ' 145 '<a href="bar.bon.html#property-bar_bon_p3">Bon Bon</a>, ' 146 '<a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>', 147 resolver.ResolveAllLinks( 148 'Hello $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', 149 namespace='bar.bon')) 150 self.assertEqual( 151 'I like <a href="bar.html#property-bar_t1-bar_t1_p1">food</a>.', 152 resolver.ResolveAllLinks('I like $ref:[bar.bar_p3.bar_t1_p1 food].', 153 namespace='foo')) 154 self.assertEqual( 155 'Ref <a href="foo.html">It\'s foo!</a>', 156 resolver.ResolveAllLinks('Ref $ref:[foo It\'s foo!]', namespace='bar')) 157 self.assertEqual( 158 'Ref <a href="bar.html#type-bon">Bon</a>', 159 resolver.ResolveAllLinks('Ref $ref:[bar.bon Bon]', namespace='bar')) 160 161 # Different kinds of whitespace can be significant inside <pre> tags. 162 self.assertEqual( 163 '<pre><a href="bar.html#type-bon">bar.bon</a>({\nkey: value})', 164 resolver.ResolveAllLinks('<pre>$ref:[bar.bon]({\nkey: value})', 165 namespace='baz')) 166 167 # Allow bare "$ref:foo.bar." at the end of a string. 168 self.assertEqual( 169 '<a href="bar.html#type-bon">bar.bon</a>.', 170 resolver.ResolveAllLinks('$ref:bar.bon.', 171 namespace='baz')) 172 173 # If a request is provided it should construct an appropriate relative link. 174 self.assertEqual( 175 'Hi <a href="../../bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, ' 176 '<a href="../../bar.bon.html#property-bar_bon_p3">Bon Bon</a>, ' 177 '<a href="../../bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>', 178 resolver.ResolveAllLinks( 179 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', 180 relative_to='big/long/path/bar.html', 181 namespace='bar.bon')) 182 self.assertEqual( 183 'Hi <a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, ' 184 '<a href="bar.bon.html#property-bar_bon_p3">Bon Bon</a>, ' 185 '<a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>', 186 resolver.ResolveAllLinks( 187 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', 188 relative_to='', 189 namespace='bar.bon')) 190 self.assertEqual( 191 'Hi <a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, ' 192 '<a href="bar.bon.html#property-bar_bon_p3">Bon Bon</a>, ' 193 '<a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>', 194 resolver.ResolveAllLinks( 195 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', 196 relative_to='bar.html', 197 namespace='bar.bon')) 198 self.assertEqual( 199 'Hi <a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, ' 200 '<a href="bar.bon.html#property-bar_bon_p3">Bon Bon</a>, ' 201 '<a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>', 202 resolver.ResolveAllLinks( 203 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', 204 relative_to='foo/bar.html', 205 namespace='bar.bon')) 206 self.assertEqual( 207 'Hi <a href="../bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, ' 208 '<a href="../bar.bon.html#property-bar_bon_p3">Bon Bon</a>, ' 209 '<a href="../bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>', 210 resolver.ResolveAllLinks( 211 'Hi $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3', 212 relative_to='foo/baz/bar.html', 213 namespace='bar.bon')) 214 215if __name__ == '__main__': 216 unittest.main() 217