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