15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import json 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from api_data_source import APIDataSource 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from compiled_file_system import CompiledFileSystem 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from local_file_system import LocalFileSystem 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom manifest_data_source import ManifestDataSource 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from object_store_creator import ObjectStoreCreator 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from reference_resolver import ReferenceResolver 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from template_data_source import TemplateDataSource 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom test_file_system import TestFileSystem 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from test_util import DisableLogging 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from third_party.handlebar import Handlebar 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from servlet import Request 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class _FakeFactory(object): 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, input_dict=None): 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if input_dict is None: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._input_dict = {} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._input_dict = input_dict 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def Create(self, *args, **optargs): 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self._input_dict 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TemplateDataSourceTest(unittest.TestCase): 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def setUp(self): 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._base_path = os.path.join(sys.path[0], 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'test_data', 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'template_data_source') 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._fake_api_list_data_source_factory = _FakeFactory() 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._fake_intro_data_source_factory = _FakeFactory() 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._fake_samples_data_source_factory = _FakeFactory() 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._fake_sidenav_data_source_factory = _FakeFactory() 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch self._manifest_data_source = ManifestDataSource( 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch _FakeFactory(), LocalFileSystem.Create(), '', '') 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _ReadLocalFile(self, filename): 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) with open(os.path.join(self._base_path, filename), 'r') as f: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f.read() 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _RenderTest(self, name, data_source): 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_name = name + '_tmpl.html' 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template = Handlebar(self._ReadLocalFile(template_name)) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._ReadLocalFile(name + '_expected.html'), 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_source.Render(template_name)) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def _CreateTemplateDataSource(self, compiled_fs_factory, api_data=None): 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if api_data is None: 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch api_data_factory = APIDataSource.Factory(compiled_fs_factory, 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 'fake_path', 60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch _FakeFactory()) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) api_data_factory = _FakeFactory(api_data) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reference_resolver_factory = ReferenceResolver.Factory( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) api_data_factory, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._fake_api_list_data_source_factory, 66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ObjectStoreCreator.ForTest()) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @DisableLogging('error') # "was never set" error 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def create_from_factory(factory): 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path = 'extensions/foo' 70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return factory.Create(Request.ForTest(path), path) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return create_from_factory(TemplateDataSource.Factory( 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) api_data_factory, 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self._fake_api_list_data_source_factory, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self._fake_intro_data_source_factory, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self._fake_samples_data_source_factory, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self._fake_sidenav_data_source_factory, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory, 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reference_resolver_factory, 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch self._manifest_data_source, 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) '.', 81a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) '.', 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) '')) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSimple(self): 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._base_path = os.path.join(self._base_path, 'simple') 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher = LocalFileSystem(self._base_path) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory = CompiledFileSystem.Factory( 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher, 89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ObjectStoreCreator.ForTest()) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) t_data_source = self._CreateTemplateDataSource( 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory, 92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ObjectStoreCreator.ForTest()) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_a1 = Handlebar(self._ReadLocalFile('test1.html')) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(template_a1.render({}, {'templates': {}}).text, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t_data_source.get('test1').render({}, {'templates': {}}).text) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template_a2 = Handlebar(self._ReadLocalFile('test2.html')) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(template_a2.render({}, {'templates': {}}).text, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t_data_source.get('test2').render({}, {'templates': {}}).text) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @DisableLogging('warning') 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def testNotFound(self): 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) self._base_path = os.path.join(self._base_path, 'simple') 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher = LocalFileSystem(self._base_path) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory = CompiledFileSystem.Factory( 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher, 107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ObjectStoreCreator.ForTest()) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) t_data_source = self._CreateTemplateDataSource( 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory, 110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ObjectStoreCreator.ForTest()) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(None, t_data_source.get('junk.html')) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testPartials(self): 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._base_path = os.path.join(self._base_path, 'partials') 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher = LocalFileSystem(self._base_path) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory = CompiledFileSystem.Factory( 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher, 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ObjectStoreCreator.ForTest()) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) t_data_source = self._CreateTemplateDataSource(compiled_fs_factory) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._ReadLocalFile('test_expected.html'), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t_data_source.get('test_tmpl').render( 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json.loads(self._ReadLocalFile('input.json')), t_data_source).text) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRender(self): 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._base_path = os.path.join(self._base_path, 'render') 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher = LocalFileSystem(self._base_path) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context = json.loads(self._ReadLocalFile('test1.json')) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory = CompiledFileSystem.Factory( 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fetcher, 131b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ObjectStoreCreator.ForTest()) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._RenderTest( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'test1', 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._CreateTemplateDataSource( 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) api_data=json.loads(self._ReadLocalFile('test1.json')))) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._RenderTest( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'test2', 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._CreateTemplateDataSource( 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compiled_fs_factory, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) api_data=json.loads(self._ReadLocalFile('test2.json')))) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__': 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest.main() 145