1 #!/usr/bin/env python 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 4 # found in the LICENSE file. 5 6 import json 7 import os 8 import sys 9 import unittest 10 11 from api_data_source import APIDataSource 12 from compiled_file_system import CompiledFileSystem 13 from local_file_system import LocalFileSystem 14 from manifest_data_source import ManifestDataSource 15 from object_store_creator import ObjectStoreCreator 16 from reference_resolver import ReferenceResolver 17 from template_data_source import TemplateDataSource 18 from test_file_system import TestFileSystem 19 from test_util import DisableLogging 20 from third_party.handlebar import Handlebar 21 from servlet import Request 22 23 class _FakeFactory(object): 24 def __init__(self, input_dict=None): 25 if input_dict is None: 26 self._input_dict = {} 27 else: 28 self._input_dict = input_dict 29 30 def Create(self, *args, **optargs): 31 return self._input_dict 32 33 class TemplateDataSourceTest(unittest.TestCase): 34 def setUp(self): 35 self._base_path = os.path.join(sys.path[0], 36 'test_data', 37 'template_data_source') 38 self._fake_api_list_data_source_factory = _FakeFactory() 39 self._fake_intro_data_source_factory = _FakeFactory() 40 self._fake_samples_data_source_factory = _FakeFactory() 41 self._fake_sidenav_data_source_factory = _FakeFactory() 42 self._manifest_data_source = ManifestDataSource( 43 _FakeFactory(), LocalFileSystem.Create(), '', '') 44 45 def _ReadLocalFile(self, filename): 46 with open(os.path.join(self._base_path, filename), 'r') as f: 47 return f.read() 48 49 def _RenderTest(self, name, data_source): 50 template_name = name + '_tmpl.html' 51 template = Handlebar(self._ReadLocalFile(template_name)) 52 self.assertEquals( 53 self._ReadLocalFile(name + '_expected.html'), 54 data_source.Render(template_name)) 55 56 def _CreateTemplateDataSource(self, compiled_fs_factory, api_data=None): 57 if api_data is None: 58 api_data_factory = APIDataSource.Factory(compiled_fs_factory, 59 'fake_path', 60 _FakeFactory()) 61 else: 62 api_data_factory = _FakeFactory(api_data) 63 reference_resolver_factory = ReferenceResolver.Factory( 64 api_data_factory, 65 self._fake_api_list_data_source_factory, 66 ObjectStoreCreator.ForTest()) 67 @DisableLogging('error') # "was never set" error 68 def create_from_factory(factory): 69 path = 'extensions/foo' 70 return factory.Create(Request.ForTest(path), path) 71 return create_from_factory(TemplateDataSource.Factory( 72 api_data_factory, 73 self._fake_api_list_data_source_factory, 74 self._fake_intro_data_source_factory, 75 self._fake_samples_data_source_factory, 76 self._fake_sidenav_data_source_factory, 77 compiled_fs_factory, 78 reference_resolver_factory, 79 self._manifest_data_source, 80 '.', 81 '.', 82 '')) 83 84 def testSimple(self): 85 self._base_path = os.path.join(self._base_path, 'simple') 86 fetcher = LocalFileSystem(self._base_path) 87 compiled_fs_factory = CompiledFileSystem.Factory( 88 fetcher, 89 ObjectStoreCreator.ForTest()) 90 t_data_source = self._CreateTemplateDataSource( 91 compiled_fs_factory, 92 ObjectStoreCreator.ForTest()) 93 template_a1 = Handlebar(self._ReadLocalFile('test1.html')) 94 self.assertEqual(template_a1.render({}, {'templates': {}}).text, 95 t_data_source.get('test1').render({}, {'templates': {}}).text) 96 97 template_a2 = Handlebar(self._ReadLocalFile('test2.html')) 98 self.assertEqual(template_a2.render({}, {'templates': {}}).text, 99 t_data_source.get('test2').render({}, {'templates': {}}).text) 100 101 @DisableLogging('warning') 102 def testNotFound(self): 103 self._base_path = os.path.join(self._base_path, 'simple') 104 fetcher = LocalFileSystem(self._base_path) 105 compiled_fs_factory = CompiledFileSystem.Factory( 106 fetcher, 107 ObjectStoreCreator.ForTest()) 108 t_data_source = self._CreateTemplateDataSource( 109 compiled_fs_factory, 110 ObjectStoreCreator.ForTest()) 111 self.assertEqual(None, t_data_source.get('junk.html')) 112 113 def testPartials(self): 114 self._base_path = os.path.join(self._base_path, 'partials') 115 fetcher = LocalFileSystem(self._base_path) 116 compiled_fs_factory = CompiledFileSystem.Factory( 117 fetcher, 118 ObjectStoreCreator.ForTest()) 119 t_data_source = self._CreateTemplateDataSource(compiled_fs_factory) 120 self.assertEqual( 121 self._ReadLocalFile('test_expected.html'), 122 t_data_source.get('test_tmpl').render( 123 json.loads(self._ReadLocalFile('input.json')), t_data_source).text) 124 125 def testRender(self): 126 self._base_path = os.path.join(self._base_path, 'render') 127 fetcher = LocalFileSystem(self._base_path) 128 context = json.loads(self._ReadLocalFile('test1.json')) 129 compiled_fs_factory = CompiledFileSystem.Factory( 130 fetcher, 131 ObjectStoreCreator.ForTest()) 132 self._RenderTest( 133 'test1', 134 self._CreateTemplateDataSource( 135 compiled_fs_factory, 136 api_data=json.loads(self._ReadLocalFile('test1.json')))) 137 self._RenderTest( 138 'test2', 139 self._CreateTemplateDataSource( 140 compiled_fs_factory, 141 api_data=json.loads(self._ReadLocalFile('test2.json')))) 142 143 if __name__ == '__main__': 144 unittest.main() 145