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
4 # found in the LICENSE file.
9 from compiled_file_system import CompiledFileSystem
10 from mock_file_system import MockFileSystem
11 from object_store_creator import ObjectStoreCreator
12 from server_instance import ServerInstance
13 from servlet import Request
14 from sidenav_data_source import SidenavDataSource, _AddLevels, _AddSelected
15 from test_file_system import TestFileSystem
16 from test_util import CaptureLogging
19 class SamplesDataSourceTest(unittest.TestCase):
20 def testAddLevels(self):
25 'items': [{ 'title': 'X1' }]
35 'items': [{ 'level': 3, 'title': 'X1' }]
39 _AddLevels(sidenav_json, 1)
40 self.assertEqual(expected, sidenav_json)
42 def testAddSelected(self):
44 { 'href': '/AH2.html' },
54 { 'href': '/AH2.html' },
56 'child_selected': True,
65 _AddSelected(sidenav_json, '/H3.html')
66 self.assertEqual(expected, sidenav_json)
68 def testWithDifferentBasePath(self):
69 file_system = TestFileSystem({
70 'apps_sidenav.json': json.dumps([
71 { 'href': '/H1.html' },
72 { 'href': '/H2.html' },
73 { 'href': '/base/path/H2.html' },
74 { 'href': 'https://qualified/X1.html' },
82 }, relative_to='docs/templates/json')
85 {'href': '/base/path/H1.html', 'level': 2},
86 {'href': '/base/path/H2.html', 'level': 2, 'selected': True},
87 {'href': '/base/path/base/path/H2.html', 'level': 2},
88 {'href': 'https://qualified/X1.html', 'level': 2},
90 {'href': '/base/path/H4.html', 'level': 3}
92 'href': '/base/path/H3.html', 'level': 2}
95 server_instance = ServerInstance.ForTest(file_system,
96 base_path='/base/path/')
97 sidenav_data_source = SidenavDataSource(server_instance,
98 Request.ForTest('/H2.html'))
100 log_output = CaptureLogging(
101 lambda: self.assertEqual(expected, sidenav_data_source.get('apps')))
102 self.assertEqual(2, len(log_output))
104 def testSidenavDataSource(self):
105 file_system = MockFileSystem(TestFileSystem({
106 'apps_sidenav.json': json.dumps([{
114 }, relative_to='docs/templates/json'))
118 'child_selected': True,
129 sidenav_data_source = SidenavDataSource(
130 ServerInstance.ForTest(file_system), Request.ForTest('/H2.html'))
131 self.assertTrue(*file_system.CheckAndReset())
133 log_output = CaptureLogging(
134 lambda: self.assertEqual(expected, sidenav_data_source.get('apps')))
136 self.assertEqual(1, len(log_output))
138 log_output[0].msg.startswith('Paths in sidenav must be qualified.'))
140 # Test that only a single file is read when creating the sidenav, so that
141 # we can be confident in the compiled_file_system.SingleFile annotation.
142 self.assertTrue(*file_system.CheckAndReset(
143 read_count=1, stat_count=1, read_resolve_count=1))
146 file_system = TestFileSystem({
147 'apps_sidenav.json': '[{ "title": "H1" }]' ,
148 'extensions_sidenav.json': '[{ "title": "H2" }]'
149 }, relative_to='docs/templates/json')
151 # Ensure Cron doesn't rely on request.
152 sidenav_data_source = SidenavDataSource(
153 ServerInstance.ForTest(file_system), request=None)
154 sidenav_data_source.Cron()
156 # If Cron fails, apps_sidenav.json will not be cached, and the _cache_data
158 # TODO(jshumway): Make a non hack version of this check.
159 sidenav_data_source._cache._file_object_store.Get(
160 'docs/templates/json/apps_sidenav.json').Get()._cache_data
163 if __name__ == '__main__':