OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 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 | |
8 import sys | |
9 import unittest | 7 import unittest |
10 | 8 |
11 from compiled_file_system import CompiledFileSystem | 9 from compiled_file_system import CompiledFileSystem |
12 from local_file_system import LocalFileSystem | |
13 from object_store_creator import ObjectStoreCreator | 10 from object_store_creator import ObjectStoreCreator |
14 from sidenav_data_source import SidenavDataSource | 11 from servlet import Request |
| 12 from sidenav_data_source import ( |
| 13 SidenavDataSource, _AddLevels, _AddSelected, _QualifyHrefs) |
| 14 from test_file_system import TestFileSystem |
| 15 from test_util import CaptureLogging |
| 16 |
| 17 |
| 18 class FakeServerInstance(object): |
| 19 def __init__(self, file_system): |
| 20 self.compiled_host_fs_factory = CompiledFileSystem.Factory( |
| 21 file_system, ObjectStoreCreator.ForTest()) |
| 22 self.sidenav_json_base_path = '' |
| 23 |
15 | 24 |
16 class SamplesDataSourceTest(unittest.TestCase): | 25 class SamplesDataSourceTest(unittest.TestCase): |
17 def setUp(self): | 26 def testAddLevels(self): |
18 self._json_path = 'docs/server2/test_data/sidenav_data_source' | 27 sidenav_json = [{ |
19 self._compiled_fs_factory = CompiledFileSystem.Factory( | 28 'title': 'H2', |
20 LocalFileSystem.Create(), | 29 'items': [{ |
21 ObjectStoreCreator.ForTest()) | 30 'title': 'H3', |
| 31 'items': [{ 'title': 'X1' }] |
| 32 }] |
| 33 }] |
22 | 34 |
23 def _CheckLevels(self, items, level=2): | 35 expected = [{ |
24 for item in items: | 36 'level': 1, |
25 self.assertEqual(level, item['level']) | 37 'title': 'H2', |
26 if 'items' in item: | 38 'items': [{ |
27 self._CheckLevels(item['items'], level=level + 1) | 39 'level': 2, |
| 40 'title': 'H3', |
| 41 'items': [{ 'level': 3, 'title': 'X1' }] |
| 42 }] |
| 43 }] |
28 | 44 |
29 def _ReadLocalFile(self, filename): | 45 _AddLevels(sidenav_json, 1) |
30 with open(os.path.join(sys.path[0], | 46 self.assertEqual(expected, sidenav_json) |
31 'test_data', | |
32 'sidenav_data_source', | |
33 filename), 'r') as f: | |
34 return f.read() | |
35 | 47 |
36 def testLevels(self): | 48 def testAddSelected(self): |
37 sidenav_data_source = SidenavDataSource.Factory(self._compiled_fs_factory, | 49 sidenav_json = [ |
38 self._json_path).Create('') | 50 { 'href': '/AH2.html' }, |
39 sidenav_json = sidenav_data_source.get('test') | 51 { |
40 self._CheckLevels(sidenav_json) | 52 'href': '/H2.html', |
| 53 'items': [{ |
| 54 'href': '/H3.html' |
| 55 }] |
| 56 } |
| 57 ] |
41 | 58 |
42 def testSelected(self): | 59 expected = [ |
43 sidenav_data_source = SidenavDataSource.Factory( | 60 { 'href': '/AH2.html' }, |
44 self._compiled_fs_factory, | 61 { |
45 self._json_path).Create('www.b.com') | 62 'child_selected': True, |
46 sidenav_json = sidenav_data_source.get('test') | 63 'href': '/H2.html', |
47 # This will be prettier once JSON is loaded with an OrderedDict. | 64 'items': [{ |
48 for item in sidenav_json: | 65 'href': '/H3.html', |
49 if item['title'] == 'Jim': | 66 'selected': True |
50 self.assertTrue(item.get('child_selected', False)) | 67 }] |
51 for next_item in item['items']: | 68 } |
52 if next_item['title'] == 'B': | 69 ] |
53 self.assertTrue(next_item.get('selected', False)) | |
54 return | |
55 # If we didn't return already, we should fail. | |
56 self.fail() | |
57 | 70 |
58 def testAbsolutePath(self): | 71 _AddSelected(sidenav_json, 'H3.html') |
59 sidenav_data_source = SidenavDataSource.Factory( | 72 self.assertEqual(expected, sidenav_json) |
60 self._compiled_fs_factory, | 73 |
61 self._json_path).Create('absolute_path/test.html') | 74 def testQualifyHrefs(self): |
62 sidenav_json = sidenav_data_source.get('absolute_path') | 75 sidenav_json = [ |
63 self.assertEqual( | 76 { 'href': '/qualified/H1.html' }, |
64 sidenav_json, | 77 { 'href': 'https://qualified/X1.html' }, |
65 json.loads(self._ReadLocalFile('absolute_path_sidenav_expected.json'))) | 78 { |
| 79 'href': 'H2.html', |
| 80 'items': [{ |
| 81 'href': 'H3.html' |
| 82 }] |
| 83 } |
| 84 ] |
| 85 |
| 86 expected = [ |
| 87 { 'href': '/qualified/H1.html' }, |
| 88 { 'href': 'https://qualified/X1.html' }, |
| 89 { |
| 90 'href': '/H2.html', |
| 91 'items': [{ |
| 92 'href': '/H3.html' |
| 93 }] |
| 94 } |
| 95 ] |
| 96 |
| 97 log_output = CaptureLogging(lambda: _QualifyHrefs(sidenav_json)) |
| 98 |
| 99 self.assertEqual(expected, sidenav_json) |
| 100 self.assertEqual(2, len(log_output)) |
| 101 |
| 102 def testSidenavDataSource(self): |
| 103 file_system = TestFileSystem({ |
| 104 'apps_sidenav.json': json.dumps([{ |
| 105 'title': 'H1', |
| 106 'href': 'H1.html', |
| 107 'items': [{ |
| 108 'title': 'H2', |
| 109 'href': '/H2.html' |
| 110 }] |
| 111 }]) |
| 112 }) |
| 113 |
| 114 expected = [{ |
| 115 'level': 2, |
| 116 'child_selected': True, |
| 117 'title': 'H1', |
| 118 'href': '/H1.html', |
| 119 'items': [{ |
| 120 'level': 3, |
| 121 'selected': True, |
| 122 'title': 'H2', |
| 123 'href': '/H2.html' |
| 124 }] |
| 125 }] |
| 126 |
| 127 sidenav_data_source = SidenavDataSource( |
| 128 FakeServerInstance(file_system), Request.ForTest('/H2.html')) |
| 129 |
| 130 log_output = CaptureLogging( |
| 131 lambda: self.assertEqual(expected, sidenav_data_source.get('apps'))) |
| 132 |
| 133 self.assertEqual(1, len(log_output)) |
| 134 self.assertTrue( |
| 135 log_output[0].msg.startswith('Paths in sidenav must be qualified.')) |
| 136 |
| 137 def testCron(self): |
| 138 file_system = TestFileSystem({ |
| 139 'apps_sidenav.json': '[{ "title": "H1" }]' , |
| 140 'extensions_sidenav.json': '[{ "title": "H2" }]' |
| 141 }) |
| 142 |
| 143 # Ensure Cron doesn't rely on request. |
| 144 sidenav_data_source = SidenavDataSource( |
| 145 FakeServerInstance(file_system), request=None) |
| 146 sidenav_data_source.Cron() |
| 147 |
| 148 # If Cron fails, apps_sidenav.json will not be cached, and the _cache_data |
| 149 # access will fail. |
| 150 # TODO(jshumway): Make a non hack version of this check. |
| 151 sidenav_data_source._cache._file_object_store.Get( |
| 152 '/apps_sidenav.json').Get()._cache_data |
| 153 |
66 | 154 |
67 if __name__ == '__main__': | 155 if __name__ == '__main__': |
68 unittest.main() | 156 unittest.main() |
OLD | NEW |