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