manifest_data_source_test.py revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#!/usr/bin/env python
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch# found in the LICENSE file.
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from copy import deepcopy
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochimport json
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochimport unittest
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)from compiled_file_system import CompiledFileSystem
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)from features_bundle import FeaturesBundle
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import manifest_data_source
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)from object_store_creator import ObjectStoreCreator
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)convert_and_annotate_docs = {
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'name': {
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'example': "My {{title}}",
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'name',
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'required'
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc2': {
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'required',
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc2'
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc1': {
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'required',
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc1',
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'children': {
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      'sub1': {
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'annotations': ['not so important'],
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'optional',
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'sub1'
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      'sub2': {
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'sub2'
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc3': {
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level':  'only_one',
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc3'
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc4': {
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'recommended',
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc4'
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc5': {
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'only_one',
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc5'
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc6': {
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'optional',
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc6'
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ManifestDataSourceTest(unittest.TestCase):
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testListifyAndSortDocs(self):
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expected_docs = [
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc1',
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'children': [
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'level': 'required',
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'sub2'
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          },
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'annotations': ['not so important'],
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'level': 'optional',
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'sub1'
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          }
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ]
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc2'
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'example': '"My App"',
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'has_example': True,
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'name'
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'recommended',
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc4'
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      {
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'only_one',
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc3'
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'only_one',
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc5'
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'optional',
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc6'
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ]
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEqual(expected_docs, manifest_data_source._ListifyAndSortDocs(
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        deepcopy(convert_and_annotate_docs), 'App'))
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testAnnotate(self):
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expected_docs = [
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc1',
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'children': [
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'level': 'required',
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'sub2'
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          },
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'annotations': ['Optional', 'not so important'],
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'level': 'optional',
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'sub1',
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'is_last': True
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          }
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ]
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc2'
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'name',
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'example': '"My App"',
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'has_example': True
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'annotations': ['Recommended'],
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'recommended',
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc4'
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'annotations': ['Pick one (or none)'],
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'only_one',
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc3'
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'only_one',
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc5'
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'annotations': ['Optional'],
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'optional',
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc6',
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'is_last': True
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ]
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    annotated = manifest_data_source._ListifyAndSortDocs(
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        deepcopy(convert_and_annotate_docs), 'App')
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    manifest_data_source._AddLevelAnnotations(annotated)
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEqual(expected_docs, annotated)
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testExpandedExamples(self):
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    docs = {
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      'doc1': {
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc1',
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'example': {
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          'big': {
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'nested': {
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              'json_example': ['with', 'more', 'json']
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            }
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          }
174ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        }
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expected_docs = [
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc1',
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'children': [
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'big',
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'children': [
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              {
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                'name': 'nested',
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                'children': [
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                  {
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    'name': 'json_example',
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    'example': json.dumps(['with', 'more', 'json']),
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    'has_example': True
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                  }
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                ]
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              }
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            ]
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          }
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ]
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ]
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEqual(
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        expected_docs, manifest_data_source._ListifyAndSortDocs(docs, 'apps'))
203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  def testManifestDataSource(self):
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    manifest_features = {
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'doc1': {
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'name': 'doc1',
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'platforms': ['apps', 'extensions'],
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'example': {},
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'level': 'required'
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      },
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'doc1.sub1': {
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'name': 'doc1.sub1',
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'platforms': ['apps'],
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'annotations': ['important!'],
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'level': 'recommended'
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      },
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'doc2': {
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'name': 'doc2',
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'platforms': ['extensions']
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      }
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
223424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    expected_app = [
225424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      {
226424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'example': '{...}',
227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'has_example': True,
228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'level': 'required',
229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'name': 'doc1',
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'platforms': ['apps', 'extensions'],
231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'children': [
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          {
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            'annotations': [
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              'Recommended',
235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              'important!'
236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            ],
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            'level': 'recommended',
238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            'name': 'sub1',
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            'platforms': ['apps'],
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            'is_last': True
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          }
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        ],
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'is_last': True
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ]
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    class FakeFeaturesBundle(object):
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      def GetManifestFeatures(self):
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        return manifest_features
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    class FakeServerInstance(object):
252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      def __init__(self):
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        self.features_bundle = FakeFeaturesBundle()
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        self.object_store_creator = ObjectStoreCreator.ForTest()
255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mds = manifest_data_source.ManifestDataSource(FakeServerInstance(), None)
257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    self.assertEqual(expected_app, mds.get('apps'))
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
259ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochif __name__ == '__main__':
260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  unittest.main()
261