1# Copyright 2015 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import unittest
6
7import webapp2
8import webtest
9
10from google.appengine.api import users
11
12from dashboard import edit_test_owners
13from dashboard import layered_cache
14from dashboard import test_owner
15from dashboard import testing_common
16from dashboard import xsrf
17
18_SAMPLE_OWNER_DICT = {
19    'ChromiumPerf/speedometer': {'chris@google.com', 'chris@chromium.org'},
20    'ChromiumPerf/octane': {'chris@chromium.org'},
21}
22
23
24class EditTestOwnersTest(testing_common.TestCase):
25
26  def setUp(self):
27    super(EditTestOwnersTest, self).setUp()
28    app = webapp2.WSGIApplication(
29        [('/edit_test_owners', edit_test_owners.EditTestOwnersHandler)])
30    self.testapp = webtest.TestApp(app)
31
32  def tearDown(self):
33    super(EditTestOwnersTest, self).tearDown()
34    self.UnsetCurrentUser()
35
36  def _SetOwnersDict(self, owner_dict):
37    layered_cache.SetExternal(test_owner._MASTER_OWNER_CACHE_KEY,
38                              owner_dict)
39
40  def testGet_NonAdmin_OnlyUserInfoEmbeddedOnPage(self):
41    self.SetCurrentUser('chris@chromium.org', is_admin=False)
42    layered_cache.SetExternal(test_owner._MASTER_OWNER_CACHE_KEY,
43                              _SAMPLE_OWNER_DICT)
44
45    response = self.testapp.get('/edit_test_owners')
46    owner_info = self.GetEmbeddedVariable(response, 'OWNER_INFO')
47    expected_owner_info = [
48        {u'name': u'ChromiumPerf/octane'},
49        {u'name': u'ChromiumPerf/speedometer'}
50    ]
51    self.assertEqual(expected_owner_info, owner_info)
52
53  def testGet_Admin_AllOwnerInfoEmbeddedOnPage(self):
54    self.SetCurrentUser('chris@chromium.org', is_admin=True)
55    self._SetOwnersDict(_SAMPLE_OWNER_DICT)
56
57    response = self.testapp.get('/edit_test_owners')
58    owner_info = self.GetEmbeddedVariable(response, 'OWNER_INFO')
59    self.assertEqual(2, len(owner_info))
60    owner_info.sort(key=lambda x: x['name'])
61    for info in owner_info:
62      if 'sub_items' in info:
63        info['sub_items'].sort(key=lambda x: x['name'])
64    expected_owner_info = [
65        {
66            'name': 'ChromiumPerf/octane',
67            'sub_items': [{'name': 'chris@chromium.org'}]
68        },
69        {
70            'name': 'ChromiumPerf/speedometer',
71            'sub_items': [
72                {'name': 'chris@chromium.org'},
73                {'name': 'chris@google.com'},
74            ],
75        },
76    ]
77    self.assertEqual(expected_owner_info, owner_info)
78
79  def testPost_NonAdminAddsAndRemovesSelf_Succeeds(self):
80    self.SetCurrentUser('chris@chromium.org', is_admin=False)
81    self._SetOwnersDict(_SAMPLE_OWNER_DICT)
82
83    self.testapp.post('/edit_test_owners', {
84        'action': 'add',
85        'item': 'ChromiumPerf/spaceport',
86        'xsrf_token': xsrf.GenerateToken(users.get_current_user()),
87    })
88    owner_dict = layered_cache.GetExternal(test_owner._MASTER_OWNER_CACHE_KEY)
89    self.assertIn('ChromiumPerf/spaceport', owner_dict)
90    self.assertIn('chris@chromium.org', owner_dict['ChromiumPerf/spaceport'])
91
92    self.testapp.post('/edit_test_owners', {
93        'action': 'remove',
94        'item': 'ChromiumPerf/spaceport',
95        'xsrf_token': xsrf.GenerateToken(users.get_current_user()),
96    })
97    owner_dict = layered_cache.GetExternal(test_owner._MASTER_OWNER_CACHE_KEY)
98    self.assertNotIn('ChromiumPerf/spaceport', owner_dict)
99
100  def testPost_AdminAddsAndRemovesOther_Succeeds(self):
101    self.SetCurrentUser('chris@chromium.org', is_admin=True)
102    self._SetOwnersDict(_SAMPLE_OWNER_DICT)
103
104    # Test adding test owner.
105    self.testapp.post('/edit_test_owners', {
106        'action': 'add',
107        'item': 'ChromiumPerf/speedometer',
108        'sub_item': 'john@chromium.org',
109        'xsrf_token': xsrf.GenerateToken(users.get_current_user()),
110    })
111    owner_dict = layered_cache.GetExternal(test_owner._MASTER_OWNER_CACHE_KEY)
112    self.assertIn('john@chromium.org', owner_dict['ChromiumPerf/speedometer'])
113
114    # Test removing test owner.
115    self.testapp.post('/edit_test_owners', {
116        'action': 'remove',
117        'item': 'ChromiumPerf/speedometer',
118        'sub_item': 'john@chromium.org',
119        'xsrf_token': xsrf.GenerateToken(users.get_current_user()),
120    })
121    owner_dict = layered_cache.GetExternal(test_owner._MASTER_OWNER_CACHE_KEY)
122    self.assertNotIn(
123        'john@chromium.org', owner_dict['ChromiumPerf/speedometer'])
124
125    # Test removing all test owners for a test suite path.
126    self.testapp.post('/edit_test_owners', {
127        'action': 'remove',
128        'item': 'ChromiumPerf/speedometer',
129        'xsrf_token': xsrf.GenerateToken(users.get_current_user()),
130    })
131    owner_dict = layered_cache.GetExternal(test_owner._MASTER_OWNER_CACHE_KEY)
132    self.assertNotIn('ChromiumPerf/speedometer', owner_dict)
133
134
135if __name__ == '__main__':
136  unittest.main()
137