Converted CategoryEditor to a humble dialog and tested it.
1 # Copyright (C) 2009 Rickard Lindberg, Roger Lindberg
3 # This file is part of Timeline.
5 # Timeline is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # Timeline is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Timeline. If not, see <http://www.gnu.org/licenses/>.
23 from timelinelib.gui.dialogs.categoryeditor import CategoryEditorController
24 from timelinelib.db.interface import TimelineIOError
25 from timelinelib.db.objects import Category
28 class TestCategoryEditorController(unittest.TestCase):
31 # Setup mock for db (we want one existing category in there named foo)
33 existing_categories = [Category("foo", (0, 0, 0), True)]
34 self.db.get_categories.return_value = existing_categories
37 # Setup example new category
38 self.ex_cat = Category("bar", (255, 0, 0), True)
40 def testInitFromCategory(self):
41 controller = CategoryEditorController(self.view, self.db, self.ex_cat)
42 controller.initialize()
43 self.view.set_name.assert_called_with("bar")
44 self.view.set_color.assert_called_with((255, 0, 0))
46 def testInitFromNone(self):
47 controller = CategoryEditorController(self.view, self.db, None)
48 controller.initialize()
49 # Default values when creating a new category
50 self.view.set_name.assert_called_with("")
51 self.view.set_color.assert_called_with((255, 0, 0))
53 def testSaveNew(self):
54 controller = CategoryEditorController(self.view, self.db, None)
55 # Simulate entering this in gui
56 self.view.get_name.return_value = "new_cat"
57 self.view.get_color.return_value = (255, 44, 0)
59 # Assert that controller fetched data from view
60 self.assertTrue(self.view.get_name.called)
61 self.assertTrue(self.view.get_color.called)
62 # Assert that category was saved to db
63 self.assertTrue(self.db.save_category.called)
64 # Assert that controller closed dialog
65 self.assertTrue(self.view.close.called)
66 # Assert that the controller has a category (the one created)
67 self.assertEquals(controller.category.name, "new_cat")
69 def testSaveExisting(self):
70 controller = CategoryEditorController(self.view, self.db, self.ex_cat)
71 # Simulate that gui is populated from ex_cat
72 self.view.get_name.return_value = self.ex_cat.name
73 self.view.get_color.return_value = self.ex_cat.color
75 # Assert that controller fetched data from view
76 self.assertTrue(self.view.get_name.called)
77 self.assertTrue(self.view.get_color.called)
78 # Assert that category was saved to db
79 self.assertTrue(self.db.save_category.called)
80 # Assert that controller closed dialog
81 self.assertTrue(self.view.close.called)
83 def testInvalidName(self):
84 controller = CategoryEditorController(self.view, self.db, self.ex_cat)
85 # Simulate a blank name which is invalid
86 self.view.get_name.return_value = ""
88 # Assert that category was not saved to db
89 self.assertFalse(self.db.save_category.called)
90 # Assert that controller let view handle error
91 self.assertTrue(self.view.handle_invalid_name.called)
92 # Assert that controller did not close view
93 self.assertFalse(self.view.close.called)
95 def testUsedName(self):
96 controller = CategoryEditorController(self.view, self.db, self.ex_cat)
97 # Simulate name foo which is already in use
98 self.view.get_name.return_value = "foo"
100 # Assert that category was not saved to db
101 self.assertFalse(self.db.save_category.called)
102 # Assert that controller let view handle error
103 self.assertTrue(self.view.handle_used_name.called)
104 # Assert that controller did not close view
105 self.assertFalse(self.view.close.called)
107 def testDbError(self):
108 controller = CategoryEditorController(self.view, self.db, self.ex_cat)
109 # Simulate TimelineIOError when we try to save a valid category
110 self.db.save_category.side_effect = TimelineIOError
111 self.view.get_name.return_value = "foobar"
113 # Assert that controller let view handle error
114 self.assertTrue(self.view.handle_db_error.called)
115 # Assert that controller did not close view
116 self.assertFalse(self.view.close.called)
117 # Assert that controller did not close view
118 self.assertFalse(self.view.close.called)