blob: bcb4e916c28d799ccd420fe0cd46f84881dd58fd [file] [log] [blame]
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import unittest
import webapp2
import webtest
from dashboard import edit_config_handler
from dashboard import put_entities_task
from dashboard import request_handler
from dashboard import testing_common
from dashboard.models import graph_data
class EditConfigHandlerTest(testing_common.TestCase):
# TODO(qyearsley): Add a simple helper class and separate tests for
# EditConfigHandler.
def setUp(self):
super(EditConfigHandlerTest, self).setUp()
app = webapp2.WSGIApplication([
('/put_entities_task', put_entities_task.PutEntitiesTaskHandler)])
self.testapp = webtest.TestApp(app)
self.SetCurrentUser('foo@bar.com', is_admin=True)
def _AddSampleTestData(self):
"""Adds some sample data used in the tests below."""
master = graph_data.Master(id='TheMaster').put()
bot = graph_data.Bot(id='TheBot', parent=master).put()
suite1 = graph_data.Test(id='Suite1', parent=bot).put()
suite2 = graph_data.Test(id='Suite2', parent=bot).put()
graph_data.Test(id='aaa', parent=suite1, has_rows=True).put()
graph_data.Test(id='bbb', parent=suite1, has_rows=True).put()
graph_data.Test(id='ccc', parent=suite2, has_rows=True).put()
graph_data.Test(id='ddd', parent=suite2, has_rows=True).put()
def testSplitPatternLines_OnePattern(self):
# The SplitPatternLines function returns a list of patterns.
self.assertEqual([], edit_config_handler._SplitPatternLines(''))
self.assertEqual(['A/b/c'], edit_config_handler._SplitPatternLines('A/b/c'))
self.assertEqual(
['A/b/c'], edit_config_handler._SplitPatternLines('A/b/c\n\n'))
def testSplitPatternLines_SortsPatterns(self):
# Re-ordering and extra newlines are ignored in patterns input.
self.assertEqual(
['A/b/c/d', 'E/f/g/h'],
edit_config_handler._SplitPatternLines('A/b/c/d\nE/f/g/h'))
self.assertEqual(
['A/b/c/d', 'E/f/g/h'],
edit_config_handler._SplitPatternLines('E/f/g/h\nA/b/c/d'))
self.assertEqual(
['A/b/c/d', 'E/f/g/h'],
edit_config_handler._SplitPatternLines('A/b/c/d\n\nE/f/g/h\n'))
def testSplitPatternLines_NoSlashes_RaisesError(self):
# A valid test path must contain a master, bot, and test part.
with self.assertRaises(request_handler.InvalidInputError):
edit_config_handler._SplitPatternLines('invalid')
def testSplitPatternLines_HasBrackets_RaisesError(self):
# Strings with brackets in them cannot be valid test paths.
with self.assertRaises(request_handler.InvalidInputError):
edit_config_handler._SplitPatternLines('A/b/c/d/[e]')
def testChangeTestPatterns_NoneValue_RaisesTypeError(self):
with self.assertRaises(TypeError):
edit_config_handler._ChangeTestPatterns('a/b/c', None)
def testChangeTestPatterns_NoChange_ReturnsEmptySets(self):
self.assertEqual(
(set(), set()),
edit_config_handler._ChangeTestPatterns([], []))
self.assertEqual(
(set(), set()),
edit_config_handler._ChangeTestPatterns(['a/b/c'], ['a/b/c']))
def testChangeTestPatterns_OnlyAdd_ReturnsAddedAndEmptySet(self):
self._AddSampleTestData()
self.assertEqual(
({'TheMaster/TheBot/Suite1/aaa'}, set()),
edit_config_handler._ChangeTestPatterns(
['*/*/*/bbb'], ['*/*/*/aaa', '*/*/*/bbb']))
def testChangeTestPatterns_OnlyRemove_ReturnsEmptySetAndRemoved(self):
self._AddSampleTestData()
self.assertEqual(
(set(), {'TheMaster/TheBot/Suite1/bbb'}),
edit_config_handler._ChangeTestPatterns(
['*/*/*/aaa', '*/*/Suite1/bbb'], ['*/*/*/aaa']))
def testChangeTestPatterns_RemoveAndAdd_ReturnsAddedAndRemoved(self):
self._AddSampleTestData()
added = {
'TheMaster/TheBot/Suite1/aaa',
}
removed = {
'TheMaster/TheBot/Suite2/ccc',
'TheMaster/TheBot/Suite2/ddd',
}
self.assertEqual(
(added, removed),
edit_config_handler._ChangeTestPatterns(
['*/*/Suite2/*'], ['*/*/*/aaa']))
def testChangeTestPatterns_CanTakeSetsAsArguments(self):
self._AddSampleTestData()
self.assertEqual(
({'TheMaster/TheBot/Suite1/aaa'}, set()),
edit_config_handler._ChangeTestPatterns(set(), {'*/*/Suite1/aaa'}))
def testComputeDeltas_Empty(self):
self.assertEqual((set(), set()), edit_config_handler._ComputeDeltas([], []))
def testComputeDeltas_OnlyAdded(self):
self.assertEqual(
({'a'}, set()), edit_config_handler._ComputeDeltas('bcd', 'abcd'))
def testComputeDeltas_OnlyRemoved(self):
self.assertEqual(
(set(), {'a'}), edit_config_handler._ComputeDeltas('abcd', 'bcd'))
def testRemoveOverlapping_NoOverlap_ReturnsSameSet(self):
self.assertEqual(
({1, 2, 3}, {4, 5, 6}),
edit_config_handler._RemoveOverlapping({1, 2, 3}, {4, 5, 6}))
def testRemoveOverlapping_SomeOverlap_ReturnsSetDifferences(self):
self.assertEqual(
({1}, {3}), edit_config_handler._RemoveOverlapping({1, 2}, {2, 3}))
def testRemoveOverlapping_AllOverlap_ReturnsEmptySets(self):
self.assertEqual(
(set(), set()), edit_config_handler._RemoveOverlapping({1, 2}, {1, 2}))
if __name__ == '__main__':
unittest.main()