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