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
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from future import Future
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import manifest_data_source
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)from object_store_creator import ObjectStoreCreator
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)convert_and_annotate_docs = {
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'name': {
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    'example': "My {{platform}}",
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'name',
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'required'
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc2': {
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'required',
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc2'
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc1': {
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'required',
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc1',
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'children': {
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      'sub1': {
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'annotations': ['not so important'],
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'optional',
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'sub1'
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      'sub2': {
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'sub2'
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc3': {
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level':  'only_one',
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc3'
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc4': {
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'recommended',
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc4'
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc5': {
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'only_one',
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc5'
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  },
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  'doc6': {
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'level': 'optional',
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'name': 'doc6'
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ManifestDataSourceTest(unittest.TestCase):
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testListifyAndSortDocs(self):
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expected_docs = [
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc1',
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'children': [
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'level': 'required',
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'sub2'
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          },
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'annotations': ['not so important'],
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'level': 'optional',
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'sub1'
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          }
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ]
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc2'
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'example': '"My App"',
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'has_example': True,
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'name'
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'recommended',
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc4'
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      {
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'only_one',
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc3'
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'only_one',
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc5'
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'optional',
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc6'
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ]
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEqual(expected_docs, manifest_data_source._ListifyAndSortDocs(
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        deepcopy(convert_and_annotate_docs), 'App'))
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testAnnotate(self):
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expected_docs = [
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc1',
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'children': [
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'level': 'required',
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'sub2'
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          },
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'annotations': ['Optional', 'not so important'],
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'level': 'optional',
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'sub1',
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'is_last': True
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          }
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ]
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc2'
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'name',
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'required',
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'example': '"My App"',
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'has_example': True
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'annotations': ['Recommended'],
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'recommended',
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc4'
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'annotations': ['Pick one (or none)'],
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'only_one',
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc3'
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'only_one',
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc5'
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      },
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'annotations': ['Optional'],
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'level': 'optional',
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc6',
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'is_last': True
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ]
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    annotated = manifest_data_source._ListifyAndSortDocs(
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        deepcopy(convert_and_annotate_docs), 'App')
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    manifest_data_source._AddLevelAnnotations(annotated)
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEqual(expected_docs, annotated)
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  def testExpandedExamples(self):
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    docs = {
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      'doc1': {
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc1',
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'example': {
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          'big': {
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'nested': {
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              'json_example': ['with', 'more', 'json']
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            }
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          }
173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        }
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    expected_docs = [
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      {
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'name': 'doc1',
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'children': [
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          {
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'name': 'big',
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            'children': [
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              {
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                'name': 'nested',
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                'children': [
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                  {
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    'name': 'json_example',
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    'example': json.dumps(['with', 'more', 'json']),
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    'has_example': True
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                  }
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                ]
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              }
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            ]
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          }
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ]
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ]
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    self.assertEqual(
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        expected_docs, manifest_data_source._ListifyAndSortDocs(docs, 'apps'))
202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testNonExpandedExamples(self):
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    docs = {
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      'doc1': {
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'name': 'doc1',
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'example': {}
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      },
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      'doc2': {
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'name': 'doc2',
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'example': []
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      },
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      'doc3': {
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'name': 'doc3',
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'example': [{}]
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    expected_docs = [
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      {
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'name': 'doc1',
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'has_example': True,
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'example': '{...}'
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      },
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      {
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'name': 'doc2',
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'has_example': True,
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'example': '[...]'
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      },
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      {
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'name': 'doc3',
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'has_example': True,
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'example': '[{...}]'
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ]
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEqual(
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        expected_docs, manifest_data_source._ListifyAndSortDocs(docs, 'apps'))
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  def testManifestDataSource(self):
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    manifest_features = {
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'doc1': {
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'name': 'doc1',
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'platforms': ['apps', 'extensions'],
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'example': {},
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'level': 'required'
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      },
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'doc1.sub1': {
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'name': 'doc1.sub1',
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'platforms': ['apps'],
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'annotations': ['important!'],
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'level': 'recommended'
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      }
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    expected_app = [
256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      {
257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'example': '{...}',
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'has_example': True,
259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'level': 'required',
260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'name': 'doc1',
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'platforms': ['apps', 'extensions'],
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'children': [
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          {
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            'annotations': [
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              'Recommended',
266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              'important!'
267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            ],
268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            'level': 'recommended',
269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            'name': 'sub1',
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            'platforms': ['apps'],
271424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            'is_last': True
272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          }
273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        ],
274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        'is_last': True
275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ]
277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    class FakePlatformBundle(object):
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      def GetFeaturesBundle(self, platform):
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return FakeFeaturesBundle()
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    class FakeFeaturesBundle(object):
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      def GetManifestFeatures(self):
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return Future(value=manifest_features)
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
286424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    class FakeServerInstance(object):
287424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      def __init__(self):
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self.platform_bundle = FakePlatformBundle()
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        self.object_store_creator = ObjectStoreCreator.ForTest()
290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mds = manifest_data_source.ManifestDataSource(FakeServerInstance(), None)
292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    self.assertEqual(expected_app, mds.get('apps'))
293424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochif __name__ == '__main__':
295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  unittest.main()
296