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