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.
7 from operator
import itemgetter
10 from extensions_paths
import CHROME_EXTENSIONS
11 from permissions_data_source
import PermissionsDataSource
12 from server_instance
import ServerInstance
13 from third_party
.motemplate
import Motemplate
14 from test_file_system
import TestFileSystem
17 _PERMISSION_FEATURES
= {
18 # This will appear for extensions with a description as defined in the
19 # permissions.json file.
21 'extension_types': ['extension'],
23 # This will appear for apps and extensions with an auto-generated description
24 # since the entry appears in _api_features.json.
26 'extension_types': ['platform_app', 'extension'],
28 # This won't appear for anything since there's no entry in permissions.json
29 # and it's not an API.
31 'extension_types': ['platform_app'],
33 # This won't appear for anything because it's private.
34 'commandLinePrivate': {
35 'extension_types': ['platform_app', 'extension']
37 # This will only appear for apps with an auto-generated description because
40 'extension_types': ['platform_app']
42 'host-permissions': {}
47 # This will appear for both apps and extensions with a custom description,
50 'anchor': 'custom-anchor',
51 'extension_types': ['platform_app', 'extension'],
53 'name': 'match pattern',
54 'partial': 'permissions/host_permissions.html',
56 # A custom 'partial' here overrides the default partial.
58 'partial': 'permissions/active_tab.html'
63 _PERMISSIONS_PARTIALS
= {
64 'active_tab.html': 'active tab',
65 'host_permissions.html': 'host permissions',
66 'generic_description.html': 'generic description',
72 'dependencies': ['permission:alarms']
75 'dependencies': ['permission:cookies']
80 class PermissionsDataSourceTest(unittest
.TestCase
):
81 def testCreatePermissionsDataSource(self
):
82 expected_extensions
= [
84 'anchor': 'custom-anchor',
85 'description': 'host permissions',
86 'extension_types': ['platform_app', 'extension'],
88 'name': 'match pattern',
92 'anchor': 'activeTab',
93 'description': 'active tab',
94 'extension_types': ['extension'],
100 'description': 'generic description',
101 'extension_types': ['platform_app', 'extension'],
109 'anchor': 'custom-anchor',
110 'description': 'host permissions',
111 'extension_types': ['platform_app', 'extension'],
112 'literal_name': True,
113 'name': 'match pattern',
118 'description': 'generic description',
119 'extension_types': ['platform_app', 'extension'],
125 'description': 'generic description',
126 'extension_types': ['platform_app'],
132 test_file_system
= TestFileSystem({
134 '_api_features.json': json
.dumps(_API_FEATURES
),
135 '_manifest_features.json': '{}',
136 '_permission_features.json': json
.dumps(_PERMISSION_FEATURES
),
141 'manifest.json': '{}',
142 'permissions.json': json
.dumps(_PERMISSIONS_JSON
),
145 'permissions': _PERMISSIONS_PARTIALS
149 }, relative_to
=CHROME_EXTENSIONS
)
151 permissions_data_source
= PermissionsDataSource(
152 ServerInstance
.ForTest(test_file_system
), None)
154 actual_extensions
= permissions_data_source
.get('declare_extensions')
155 actual_apps
= permissions_data_source
.get('declare_apps')
157 # Normalise all test data.
158 # - Sort keys. Since the tests don't use OrderedDicts we can't make
159 # assertions about the order, which is unfortunate. Oh well.
160 # - Render all of the Handlerbar instances so that we can use ==.
161 # Motemplates don't implement __eq__, but they probably should.
162 for lst
in (actual_apps
, actual_extensions
,
163 expected_apps
, expected_extensions
):
164 lst
.sort(key
=itemgetter('name'))
166 for key
, value
in mapping
.iteritems():
167 if isinstance(value
, Motemplate
):
168 mapping
[key
] = value
.Render().text
170 self
.assertEqual(expected_extensions
, actual_extensions
)
171 self
.assertEqual(expected_apps
, actual_apps
)
174 if __name__
== '__main__':