manifest_data_source_test.py revision f2477e01787aa58f445919b809d89e252beef54f
1#!/usr/bin/env python
2# Copyright 2013 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
6from copy import deepcopy
7import json
8import unittest
9
10from compiled_file_system import CompiledFileSystem
11from features_bundle import FeaturesBundle
12from future import Future
13import manifest_data_source
14from object_store_creator import ObjectStoreCreator
15
16
17convert_and_annotate_docs = {
18  'name': {
19    'example': "My {{title}}",
20    'name': 'name',
21    'level': 'required'
22  },
23  'doc2': {
24    'level': 'required',
25    'name': 'doc2'
26  },
27  'doc1': {
28    'level': 'required',
29    'name': 'doc1',
30    'children': {
31      'sub1': {
32        'annotations': ['not so important'],
33        'level': 'optional',
34        'name': 'sub1'
35      },
36      'sub2': {
37        'level': 'required',
38        'name': 'sub2'
39      }
40    }
41  },
42  'doc3': {
43    'level':  'only_one',
44    'name': 'doc3'
45  },
46  'doc4': {
47    'level': 'recommended',
48    'name': 'doc4'
49  },
50  'doc5': {
51    'level': 'only_one',
52    'name': 'doc5'
53  },
54  'doc6': {
55    'level': 'optional',
56    'name': 'doc6'
57  }
58}
59
60
61class ManifestDataSourceTest(unittest.TestCase):
62  def testListifyAndSortDocs(self):
63    expected_docs = [
64      {
65        'level': 'required',
66        'name': 'doc1',
67        'children': [
68          {
69            'level': 'required',
70            'name': 'sub2'
71          },
72          {
73            'annotations': ['not so important'],
74            'level': 'optional',
75            'name': 'sub1'
76          }
77        ]
78      },
79      {
80        'level': 'required',
81        'name': 'doc2'
82      },
83      {
84        'level': 'required',
85        'example': '"My App"',
86        'has_example': True,
87        'name': 'name'
88      },
89      {
90        'level': 'recommended',
91        'name': 'doc4'
92      },
93      {
94        'level': 'only_one',
95        'name': 'doc3'
96      },
97      {
98        'level': 'only_one',
99        'name': 'doc5'
100      },
101      {
102        'level': 'optional',
103        'name': 'doc6'
104      }
105    ]
106
107    self.assertEqual(expected_docs, manifest_data_source._ListifyAndSortDocs(
108        deepcopy(convert_and_annotate_docs), 'App'))
109
110  def testAnnotate(self):
111    expected_docs = [
112      {
113        'level': 'required',
114        'name': 'doc1',
115        'children': [
116          {
117            'level': 'required',
118            'name': 'sub2'
119          },
120          {
121            'annotations': ['Optional', 'not so important'],
122            'level': 'optional',
123            'name': 'sub1',
124            'is_last': True
125          }
126        ]
127      },
128      {
129        'level': 'required',
130        'name': 'doc2'
131      },
132      {
133        'name': 'name',
134        'level': 'required',
135        'example': '"My App"',
136        'has_example': True
137      },
138      {
139        'annotations': ['Recommended'],
140        'level': 'recommended',
141        'name': 'doc4'
142      },
143      {
144        'annotations': ['Pick one (or none)'],
145        'level': 'only_one',
146        'name': 'doc3'
147      },
148      {
149        'level': 'only_one',
150        'name': 'doc5'
151      },
152      {
153        'annotations': ['Optional'],
154        'level': 'optional',
155        'name': 'doc6',
156        'is_last': True
157      }
158    ]
159
160    annotated = manifest_data_source._ListifyAndSortDocs(
161        deepcopy(convert_and_annotate_docs), 'App')
162    manifest_data_source._AddLevelAnnotations(annotated)
163    self.assertEqual(expected_docs, annotated)
164
165  def testExpandedExamples(self):
166    docs = {
167      'doc1': {
168        'name': 'doc1',
169        'example': {
170          'big': {
171            'nested': {
172              'json_example': ['with', 'more', 'json']
173            }
174          }
175        }
176      }
177    }
178
179    expected_docs = [
180      {
181        'name': 'doc1',
182        'children': [
183          {
184            'name': 'big',
185            'children': [
186              {
187                'name': 'nested',
188                'children': [
189                  {
190                    'name': 'json_example',
191                    'example': json.dumps(['with', 'more', 'json']),
192                    'has_example': True
193                  }
194                ]
195              }
196            ]
197          }
198        ]
199      }
200    ]
201
202    self.assertEqual(
203        expected_docs, manifest_data_source._ListifyAndSortDocs(docs, 'apps'))
204
205  def testNonExpandedExamples(self):
206    docs = {
207      'doc1': {
208        'name': 'doc1',
209        'example': {}
210      },
211      'doc2': {
212        'name': 'doc2',
213        'example': []
214      },
215      'doc3': {
216        'name': 'doc3',
217        'example': [{}]
218      }
219    }
220
221    expected_docs = [
222      {
223        'name': 'doc1',
224        'has_example': True,
225        'example': '{...}'
226      },
227      {
228        'name': 'doc2',
229        'has_example': True,
230        'example': '[...]'
231      },
232      {
233        'name': 'doc3',
234        'has_example': True,
235        'example': '[{...}]'
236      }
237    ]
238    self.assertEqual(
239        expected_docs, manifest_data_source._ListifyAndSortDocs(docs, 'apps'))
240
241  def testManifestDataSource(self):
242    manifest_features = {
243      'doc1': {
244        'name': 'doc1',
245        'platforms': ['apps', 'extensions'],
246        'example': {},
247        'level': 'required'
248      },
249      'doc1.sub1': {
250        'name': 'doc1.sub1',
251        'platforms': ['apps'],
252        'annotations': ['important!'],
253        'level': 'recommended'
254      },
255      'doc2': {
256        'name': 'doc2',
257        'platforms': ['extensions']
258      }
259    }
260
261    expected_app = [
262      {
263        'example': '{...}',
264        'has_example': True,
265        'level': 'required',
266        'name': 'doc1',
267        'platforms': ['apps', 'extensions'],
268        'children': [
269          {
270            'annotations': [
271              'Recommended',
272              'important!'
273            ],
274            'level': 'recommended',
275            'name': 'sub1',
276            'platforms': ['apps'],
277            'is_last': True
278          }
279        ],
280        'is_last': True
281      }
282    ]
283
284    class FakeFeaturesBundle(object):
285      def GetManifestFeatures(self):
286        return Future(value=manifest_features)
287
288    class FakeServerInstance(object):
289      def __init__(self):
290        self.features_bundle = FakeFeaturesBundle()
291        self.object_store_creator = ObjectStoreCreator.ForTest()
292
293    mds = manifest_data_source.ManifestDataSource(FakeServerInstance(), None)
294    self.assertEqual(expected_app, mds.get('apps'))
295
296if __name__ == '__main__':
297  unittest.main()
298