Home | History | Annotate | Download | only in server2
      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