Index: chrome/common/extensions/docs/server2/sidenav_data_source_test.py |
diff --git a/chrome/common/extensions/docs/server2/sidenav_data_source_test.py b/chrome/common/extensions/docs/server2/sidenav_data_source_test.py |
index e7eddc1724488d48e567a434c2c73a80b2c4d38a..893eae28c0aa6d3cdce91a9b7edabbc29afca2a4 100755 |
--- a/chrome/common/extensions/docs/server2/sidenav_data_source_test.py |
+++ b/chrome/common/extensions/docs/server2/sidenav_data_source_test.py |
@@ -1,68 +1,173 @@ |
#!/usr/bin/env python |
-# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# 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 os |
-import sys |
+import logging |
import unittest |
from compiled_file_system import CompiledFileSystem |
-from local_file_system import LocalFileSystem |
from object_store_creator import ObjectStoreCreator |
-from sidenav_data_source import SidenavDataSource |
+from servlet import Request |
+from sidenav_data_source import ( |
+ SidenavDataSource, _AddLevels, _AddSelected, _QualifyHrefs) |
+from test_file_system import TestFileSystem |
+ |
+ |
+def CaptureLogging(f): |
not at google - send to devlin
2013/08/29 16:30:13
this looks useful. could you add it to test_util?
|
+ '''Call the function |f|, capturing any logging output generated. |f| must |
+ take no arguments. Returns a list of LogRecords that were emitted. |
+ ''' |
+ output = [] |
+ class Capture(object): |
+ def filter(self, record): |
+ output.append(record) |
+ |
+ cf = Capture() |
+ logging.getLogger('').addFilter(cf) |
+ f() |
+ logging.getLogger('').removeFilter(cf) |
+ |
+ return output |
+ |
+ |
+class FakeServerInstance(object): |
+ def __init__(self, file_system): |
+ self.compiled_host_fs_factory = CompiledFileSystem.Factory( |
+ file_system, ObjectStoreCreator.ForTest()) |
+ self.sidenav_json_base_path = '' |
+ |
class SamplesDataSourceTest(unittest.TestCase): |
- def setUp(self): |
- self._json_path = 'docs/server2/test_data/sidenav_data_source' |
- self._compiled_fs_factory = CompiledFileSystem.Factory( |
- LocalFileSystem.Create(), |
- ObjectStoreCreator.ForTest()) |
- |
- def _CheckLevels(self, items, level=2): |
- for item in items: |
- self.assertEqual(level, item['level']) |
- if 'items' in item: |
- self._CheckLevels(item['items'], level=level + 1) |
- |
- def _ReadLocalFile(self, filename): |
- with open(os.path.join(sys.path[0], |
- 'test_data', |
- 'sidenav_data_source', |
- filename), 'r') as f: |
- return f.read() |
- |
- def testLevels(self): |
- sidenav_data_source = SidenavDataSource.Factory(self._compiled_fs_factory, |
- self._json_path).Create('') |
- sidenav_json = sidenav_data_source.get('test') |
- self._CheckLevels(sidenav_json) |
- |
- def testSelected(self): |
- sidenav_data_source = SidenavDataSource.Factory( |
- self._compiled_fs_factory, |
- self._json_path).Create('www.b.com') |
- sidenav_json = sidenav_data_source.get('test') |
- # This will be prettier once JSON is loaded with an OrderedDict. |
- for item in sidenav_json: |
- if item['title'] == 'Jim': |
- self.assertTrue(item.get('child_selected', False)) |
- for next_item in item['items']: |
- if next_item['title'] == 'B': |
- self.assertTrue(next_item.get('selected', False)) |
- return |
- # If we didn't return already, we should fail. |
- self.fail() |
- |
- def testAbsolutePath(self): |
- sidenav_data_source = SidenavDataSource.Factory( |
- self._compiled_fs_factory, |
- self._json_path).Create('absolute_path/test.html') |
- sidenav_json = sidenav_data_source.get('absolute_path') |
- self.assertEqual( |
- sidenav_json, |
- json.loads(self._ReadLocalFile('absolute_path_sidenav_expected.json'))) |
+ 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 testAddSelected(self): |
+ sidenav_json = [ |
+ { 'href': '/AH2.html' }, |
+ { |
+ 'href': '/H2.html', |
+ 'items': [{ |
+ 'href': '/H3.html' |
+ }] |
+ } |
+ ] |
+ |
+ expected = [ |
+ { 'href': '/AH2.html' }, |
+ { |
+ 'child_selected': True, |
+ 'href': '/H2.html', |
+ 'items': [{ |
+ 'href': '/H3.html', |
+ 'selected': True |
+ }] |
+ } |
+ ] |
+ |
+ _AddSelected(sidenav_json, 'H3.html') |
+ self.assertEqual(expected, sidenav_json) |
+ |
+ def testQualifyHrefs(self): |
+ sidenav_json = [ |
+ { 'href': '/qualified/H1.html' }, |
+ { 'href': 'https://qualified/X1.html' }, |
+ { |
+ 'href': 'H2.html', |
+ 'items': [{ |
+ 'href': 'H3.html' |
+ }] |
+ } |
+ ] |
+ |
+ expected = [ |
+ { 'href': '/qualified/H1.html' }, |
+ { 'href': 'https://qualified/X1.html' }, |
+ { |
+ 'href': '/H2.html', |
+ 'items': [{ |
+ 'href': '/H3.html' |
+ }] |
+ } |
+ ] |
+ |
+ log_output = CaptureLogging(lambda: _QualifyHrefs(sidenav_json)) |
+ |
+ self.assertEqual(expected, sidenav_json) |
+ self.assertEqual(2, len(log_output)) |
+ |
+ def testSidenavDataSource(self): |
+ file_system = TestFileSystem({ |
+ 'apps_sidenav.json': json.dumps([{ |
+ 'title': 'H1', |
+ 'href': 'H1.html', |
+ 'items': [{ |
+ 'title': 'H2', |
+ 'href': '/H2.html' |
+ }] |
+ }]) |
+ }) |
+ |
+ expected = [{ |
+ 'level': 2, |
+ 'child_selected': True, |
+ 'title': 'H1', |
+ 'href': '/H1.html', |
+ 'items': [{ |
+ 'level': 3, |
+ 'selected': True, |
+ 'title': 'H2', |
+ 'href': '/H2.html' |
+ }] |
+ }] |
+ |
+ sidenav_data_source = SidenavDataSource( |
+ FakeServerInstance(file_system), Request.ForTest('/H2.html')) |
+ |
+ log_output = CaptureLogging( |
+ lambda: self.assertEqual(expected, sidenav_data_source.get('apps'))) |
+ |
+ self.assertEqual(1, len(log_output)) |
+ self.assertTrue( |
+ log_output[0].msg.startswith('Paths in sidenav must be qualified.')) |
+ |
+ def testCron(self): |
+ file_system = TestFileSystem({ |
+ 'apps_sidenav.json': '[{ "title": "H1" }]' , |
+ 'extensions_sidenav.json': '[{ "title": "H2" }]' |
+ }) |
+ |
+ # Ensure Cron doesn't rely on request. |
+ sidenav_data_source = SidenavDataSource( |
+ FakeServerInstance(file_system), request=None) |
+ sidenav_data_source.Cron() |
+ |
+ # If Cron fails, apps_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( |
+ '/apps_sidenav.json').Get()._cache_data |
+ |
if __name__ == '__main__': |
unittest.main() |