SourceForge: thetimelineproj/main: tests/category_editor.py@b871ab46d8cd
tests/category_editor.py
author Rickard Lindberg <ricli85@gmail.com>
Sun Jan 03 15:35:51 2010 +0100 (2010-01-03)
changeset 604 b871ab46d8cd
child 608 0b5998a40bd4
permissions -rw-r--r--
Converted CategoryEditor to a humble dialog and tested it.
     1 # Copyright (C) 2009  Rickard Lindberg, Roger Lindberg
     2 #
     3 # This file is part of Timeline.
     4 #
     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.
     9 #
    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.
    14 #
    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/>.
    17 
    18 
    19 import unittest
    20 
    21 from mock import Mock
    22 
    23 from timelinelib.gui.dialogs.categoryeditor import CategoryEditorController
    24 from timelinelib.db.interface import TimelineIOError
    25 from timelinelib.db.objects import Category
    26 
    27 
    28 class TestCategoryEditorController(unittest.TestCase):
    29 
    30     def setUp(self):
    31         # Setup mock for db (we want one existing category in there named foo)
    32         self.db = Mock()
    33         existing_categories = [Category("foo", (0, 0, 0), True)]
    34         self.db.get_categories.return_value = existing_categories
    35         # Setup mock for view
    36         self.view = Mock()
    37         # Setup example new category
    38         self.ex_cat = Category("bar", (255, 0, 0), True)
    39 
    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))
    45 
    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))
    52 
    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)
    58         controller.save()
    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")
    68 
    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
    74         controller.save()
    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)
    82 
    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 = ""
    87         controller.save()
    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)
    94 
    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"
    99         controller.save()
   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)
   106 
   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"
   112         controller.save()
   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)