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