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 unittest
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from extensions_paths import SERVER2
100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from server_instance import ServerInstance
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from template_data_source import TemplateDataSource
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)from test_util import DisableLogging, ReadFile
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from third_party.motemplate import Motemplate
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)def _ReadFile(*path):
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return ReadFile(SERVER2, 'test_data', 'template_data_source', *path)
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)def _CreateTestDataSource(base_dir):
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''TemplateDataSource is not instantiated directly, rather, its methods
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  are invoked through a subclass of it, which has as its only data the
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  directory in which TemplateDataSource methods should act on. Thus, we test
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TemplateDataSource indirectly through the TestDataSource class
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return TestDataSource(ServerInstance.ForLocal(),
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                        '%stest_data/template_data_source/%s/' %
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                        (SERVER2, base_dir))
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class TestDataSource(TemplateDataSource):
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''Provides a subclass we can use to test the TemplateDataSource methods
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  def __init__(self, server_instance, base_dir):
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    type(self)._BASE = base_dir
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    TemplateDataSource.__init__(self, server_instance)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class TemplateDataSourceTest(unittest.TestCase):
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSimple(self):
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    test_data_source = _CreateTestDataSource('simple')
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    template_a1 = Motemplate(_ReadFile('simple', 'test1.html'))
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    context = [{}, {'templates': {}}]
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    self.assertEqual(
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        template_a1.Render(*context).text,
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        test_data_source.get('test1').Render(*context).text)
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    template_a2 = Motemplate(_ReadFile('simple', 'test2.html'))
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    self.assertEqual(
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        template_a2.Render(*context).text,
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        test_data_source.get('test2').Render(*context).text)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  @DisableLogging('warning')
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testNotFound(self):
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    test_data_source = _CreateTestDataSource('simple')
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    self.assertEqual(None, test_data_source.get('junk'))
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  @DisableLogging('warning')
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPartials(self):
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    test_data_source = _CreateTestDataSource('partials')
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    context = json.loads(_ReadFile('partials', 'input.json'))
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        _ReadFile('partials', 'test_expected.html'),
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        test_data_source.get('test_tmpl').Render(
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            context, test_data_source).text)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unittest.main()
68