blob: 4422acdce2c86720e963553e6bac969be0c6feaa [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import json
import unittest
import copy
from extensions_paths import JSON_TEMPLATES
from mock_file_system import MockFileSystem
from server_instance import ServerInstance
from servlet import Request
from sidenav_data_source import SidenavDataSource, _AddLevels, _AddAnnotations
from test_file_system import TestFileSystem
from test_util import CaptureLogging
class SamplesDataSourceTest(unittest.TestCase):
def testAddLevels(self):
sidenav_json = [{
'title': 'H2',
'items': [{
'title': 'H3',
'items': [{ 'title': 'X1' }]
}]
}]
expected = [{
'level': 1,
'title': 'H2',
'items': [{
'level': 2,
'title': 'H3',
'items': [{ 'level': 3, 'title': 'X1' }]
}]
}]
_AddLevels(sidenav_json, 1)
self.assertEqual(expected, sidenav_json)
def testAddAnnotations(self):
item1 = { 'href': '/H1.html' }
item2_1 = { 'href': '/H2_1.html' }
item2_2 = { 'href': '/H2_2.html' }
item2 = { 'href': '/H2.html', 'items': [item2_1, item2_2] }
expected = [ item1, item2 ]
sidenav_json = copy.deepcopy(expected)
item2['child_selected'] = True
item2_1['selected'] = True
item2_1['related'] = True
item2_1['parent'] = { 'title': item2.get('title', None),
'href': item2.get('href', None) }
item2_2['related'] = True
self.assertTrue(_AddAnnotations(sidenav_json, item2_1['href']))
self.assertEqual(expected, sidenav_json)
def testWithDifferentBasePath(self):
file_system = TestFileSystem({
'chrome_sidenav.json': json.dumps([
{ 'href': '/H1.html' },
{ 'href': '/H2.html' },
{ 'href': '/base/path/H2.html' },
{ 'href': 'https://qualified/X1.html' },
{
'href': 'H3.html',
'items': [{
'href': 'H4.html'
}]
},
])
}, relative_to=JSON_TEMPLATES)
expected = [
{'href': '/base/path/H1.html', 'level': 2, 'related': True},
{'href': '/base/path/H2.html', 'level': 2, 'selected': True, 'related': True},
{'href': '/base/path/base/path/H2.html', 'level': 2, 'related': True},
{'href': 'https://qualified/X1.html', 'level': 2, 'related': True},
{'items': [
{'href': '/base/path/H4.html', 'level': 3}
],
'href': '/base/path/H3.html', 'level': 2, 'related': True}
]
server_instance = ServerInstance.ForTest(file_system,
base_path='/base/path/')
sidenav_data_source = SidenavDataSource(server_instance,
Request.ForTest('/H2.html'))
log_output = CaptureLogging(
lambda: self.assertEqual(expected, sidenav_data_source.get('chrome')))
self.assertEqual(2, len(log_output))
def testSidenavDataSource(self):
file_system = MockFileSystem(TestFileSystem({
'chrome_sidenav.json': json.dumps([{
'title': 'H1',
'href': 'H1.html',
'items': [{
'title': 'H2',
'href': '/H2.html'
}]
}])
}, relative_to=JSON_TEMPLATES))
expected = [{
'level': 2,
'child_selected': True,
'title': 'H1',
'href': '/H1.html',
'items': [{
'level': 3,
'selected': True,
'related': True,
'title': 'H2',
'href': '/H2.html',
'parent': { 'href': '/H1.html', 'title': 'H1'}
}]
}]
sidenav_data_source = SidenavDataSource(
ServerInstance.ForTest(file_system), Request.ForTest('/H2.html'))
self.assertTrue(*file_system.CheckAndReset())
log_output = CaptureLogging(
lambda: self.assertEqual(expected, sidenav_data_source.get('chrome')))
self.assertEqual(1, len(log_output))
self.assertTrue(
log_output[0].msg.startswith('Paths in sidenav must be qualified.'))
# Test that only a single file is read when creating the sidenav, so that
# we can be confident in the compiled_file_system.SingleFile annotation.
self.assertTrue(*file_system.CheckAndReset(
read_count=1, stat_count=1, read_resolve_count=1))
def testCron(self):
file_system = TestFileSystem({
'chrome_sidenav.json': '[{ "title": "H1" }]'
}, relative_to=JSON_TEMPLATES)
# Ensure Cron doesn't rely on request.
sidenav_data_source = SidenavDataSource(
ServerInstance.ForTest(file_system), request=None)
sidenav_data_source.Cron().Get()
# If Cron fails, chrome_sidenav.json will not be cached, and the _cache_data
# access will fail.
# TODO(jshumway): Make a non hack version of this check.
sidenav_data_source._cache._file_object_store.Get(
'%schrome_sidenav.json' % JSON_TEMPLATES).Get()._cache_data
if __name__ == '__main__':
unittest.main()