Source code for unit.wxgui.dialogs.setcategory.controller
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline. If not, see <http://www.gnu.org/licenses/>.
from unittest.mock import Mock
from timelinelib.canvas.data.memorydb.db import MemoryDB
from timelinelib.test.cases.unit import UnitTestCase
from timelinelib.test.utils import a_category_with
from timelinelib.test.utils import an_event_with
from timelinelib.wxgui.dialogs.setcategory.controller import SetCategoryDialogController
from timelinelib.wxgui.dialogs.setcategory.view import SetCategoryDialog
[docs]class describe_set_category_dialog_controller(UnitTestCase):
[docs] def setUp(self):
self.view = Mock(SetCategoryDialog)
self.controller = SetCategoryDialogController(self.view)
self.db = MemoryDB()
self._create_category1()
self._create_category2()
self._create_event1()
self._create_event2()
self.view.GetSelectedCategory.return_value = self.category1
def _create_category1(self):
self.category1 = a_category_with(name="category-1")
self.db.save_category(self.category1)
def _create_category2(self):
self.category2 = a_category_with(name="category-2")
self.db.save_category(self.category2)
def _create_event1(self):
self.event1 = self._create_event("event-1", None)
self.db.save_event(self.event1)
def _create_event2(self):
self.event2 = self._create_event("event-2", self.category2)
self.db.save_event(self.event2)
def _create_event(self, text, category):
return an_event_with(
time="1 Jan 2010",
text=text,
category=category
)
[docs] def assertEventsHaveCategories(self, events_categories):
self.assertEqual({
event.text: event.category.name if event.category else None
for event
in self.db.get_all_events()
}, {
event.text: category.name if category else None
for event, category
in events_categories
})
[docs] def test_category_can_be_set_on_all_events_without_category(self):
self.view.GetSelectedCategory.return_value = self.category2
self.controller.on_init(self.db, [])
self.controller.on_ok_clicked(None)
self.view.EndModalOk.assert_called_with()
self.assertEventsHaveCategories([
(self.event1, self.category2),
(self.event2, self.category2),
])
[docs] def test_category_can_be_set_on_selected_events(self):
self.view.GetSelectedCategory.return_value = self.category1
self.controller.on_init(self.db, [self.event1.id])
self.controller.on_ok_clicked(None)
self.view.EndModalOk.assert_called_with()
self.assertEventsHaveCategories([
(self.event1, self.category1),
(self.event2, self.category2),
])
[docs] def test_category_can_be_set_when_all_events_have_catageroies(self):
self.event1.set_category(self.category2)
self.event1.save()
self.controller.on_init(self.db, [])
self.controller.on_ok_clicked(None)
self.view.EndModalOk.assert_called_with()
self.assertEventsHaveCategories([
(self.event1, self.category2),
(self.event2, self.category2),
])
[docs] def test_displays_error_message_if_no_category_selected(self):
self.controller.on_init(self.db, [])
self.view.GetSelectedCategory.return_value = None
self.controller.on_ok_clicked(None)
self.view.DisplayErrorMessage.assert_called_with(
"⟪You must select a category!⟫"
)
[docs] def test_title_set_for_no_selected_events(self):
self.controller.on_init(self.db, [])
self.view.SetTitle.assert_called_with(
"⟪Set Category on events without category⟫"
)
[docs] def test_title_set_for_selected_events(self):
self.controller.on_init(self.db, [self.event1.id])
self.view.SetTitle.assert_called_with(
"⟪Set Category on selected events⟫"
)