| 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 |