From 2691e2b239546d49cf40efa4120e513d7beb5bbf Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Thu, 31 Oct 2013 11:55:55 +0100 Subject: [PATCH] More Tests for projector views --- openslides/projector/api.py | 1 + openslides/projector/views.py | 9 +-- tests/projector/test_views.py | 108 +++++++++++++++++++++++++++++++++- 3 files changed, 110 insertions(+), 8 deletions(-) diff --git a/openslides/projector/api.py b/openslides/projector/api.py index 3bf27677e..14f1da5e4 100644 --- a/openslides/projector/api.py +++ b/openslides/projector/api.py @@ -205,6 +205,7 @@ def get_all_widgets(request, session=False): active, that means that they are mentioned in the session. """ all_module_widgets = [] + # TODO: Do not touch the filesystem on any request for app in settings.INSTALLED_APPS: try: mod = import_module(app + '.views') diff --git a/openslides/projector/views.py b/openslides/projector/views.py index d1a8d0728..ecf7eef8f 100644 --- a/openslides/projector/views.py +++ b/openslides/projector/views.py @@ -13,7 +13,6 @@ from django.contrib import messages from django.core.context_processors import csrf from django.core.urlresolvers import reverse -from django.db import transaction from django.shortcuts import redirect from django.utils.translation import ugettext as _ @@ -109,7 +108,7 @@ class SelectWidgetsView(TemplateView): template_name = 'projector/select_widgets.html' def get_context_data(self, **kwargs): - context = super(SelectWidgetsView, self). get_context_data(**kwargs) + context = super(SelectWidgetsView, self).get_context_data(**kwargs) widgets = get_all_widgets(self.request) activated_widgets = self.request.session.get('widgets', {}) for name, widget in widgets.items(): @@ -123,7 +122,6 @@ class SelectWidgetsView(TemplateView): context['widgets'] = widgets return context - @transaction.commit_manually def post(self, request, *args, **kwargs): """ Activates or deactivates the widgets in a post request. @@ -131,16 +129,13 @@ class SelectWidgetsView(TemplateView): context = self.get_context_data(**kwargs) activated_widgets = self.request.session.get('widgets', {}) - transaction.commit() for name, widget in context['widgets'].items(): if widget.form.is_valid(): activated_widgets[name] = widget.form.cleaned_data['widget'] else: - transaction.rollback() - messages.error(request, _('Errors in the form')) + messages.error(request, _('Errors in the form.')) break else: - transaction.commit() self.request.session['widgets'] = activated_widgets return redirect(reverse('dashboard')) diff --git a/tests/projector/test_views.py b/tests/projector/test_views.py index 733ed04b9..8065971e3 100644 --- a/tests/projector/test_views.py +++ b/tests/projector/test_views.py @@ -11,7 +11,7 @@ """ from django.test.client import Client, RequestFactory -from mock import call, patch +from mock import call, MagicMock, patch from openslides.projector.models import ProjectorSlide from openslides.projector import views @@ -66,6 +66,112 @@ class ActivateViewTest(TestCase): self.assertEqual(mock_config.__setitem__.call_count, 2) +class SelectWidgetsViewTest(TestCase): + rf = RequestFactory() + + @patch('openslides.projector.views.SelectWidgetsForm') + @patch('openslides.projector.views.TemplateView.get_context_data') + @patch('openslides.projector.views.get_all_widgets') + def test_get_context_data(self, mock_get_all_widgets, mock_get_context_data, + mock_SelectWidgetsForm): + view = views.SelectWidgetsView() + view.request = self.rf.get('/') + view.request.session = MagicMock() + widget = MagicMock() + widget.name.return_value = 'some_widget' + mock_get_all_widgets.return_value = {'some_widget': widget} + mock_get_context_data.return_value = {} + + # Test get + context = view.get_context_data() + self.assertIn('widgets', context) + self.assertIn('some_widget', context['widgets']) + mock_SelectWidgetsForm.called_with( + prefix='some_widget', initial={'widget': True}) + + # Test post + view.request = self.rf.post('/') + view.request.session = MagicMock() + context = view.get_context_data() + mock_SelectWidgetsForm.called_with( + view.request.POST, prefix='some_widget', initial={'widget': True}) + + @patch('openslides.projector.views.messages') + def test_post(self, mock_messages): + view = views.SelectWidgetsView() + view.request = self.rf.post('/') + view.request.session = {} + widget = MagicMock() + widget.name.return_value = 'some_widget' + context = {'widgets': {'some_widget': widget}} + mock_context_data = MagicMock(return_value=context) + + with patch('openslides.projector.views.SelectWidgetsView.get_context_data', mock_context_data): + widget.form.is_valid.return_value = True + view.post(view.request) + self.assertIn('some_widget', view.request.session['widgets']) + + # Test with errors in form + widget.form.is_valid.return_value = False + view.request.session = {} + view.post(view.request) + self.assertNotIn('widgets', view.request.session) + mock_messages.error.assert_called_with(view.request, 'Errors in the form.') + + +class ProjectorControllViewTest(TestCase): + @patch('openslides.projector.views.call_on_projector') + def test_bigger(self, mock_call_on_projector): + view = views.ProjectorControllView() + request = True # request is required, but not used in the method + mock_config = MagicMock() + + mock_config_store = {'projector_scale': 5, 'projector_scroll': 5} + + def getter(key): + return mock_config_store[key] + + def setter(key, value): + mock_config_store[key] = value + + mock_config.__getitem__.side_effect = getter + mock_config.__setitem__.side_effect = setter + mock_config.get_default.return_value = 0 + + self.assertRaises(KeyError, view.pre_redirect, request) + with patch('openslides.projector.views.config', mock_config): + view.pre_redirect(request, direction='bigger') + self.assertEqual(mock_config_store['projector_scale'], 6) + mock_call_on_projector.assert_called_with({'scroll': 5, 'scale': 6}) + + view.pre_redirect(request, direction='smaller') + self.assertEqual(mock_config_store['projector_scale'], 5) + mock_call_on_projector.assert_called_with({'scroll': 5, 'scale': 5}) + + view.pre_redirect(request, direction='down') + self.assertEqual(mock_config_store['projector_scroll'], 6) + mock_call_on_projector.assert_called_with({'scroll': 6, 'scale': 5}) + + view.pre_redirect(request, direction='up') + self.assertEqual(mock_config_store['projector_scroll'], 5) + mock_call_on_projector.assert_called_with({'scroll': 5, 'scale': 5}) + + view.pre_redirect(request, direction='clean_scale') + self.assertEqual(mock_config_store['projector_scale'], 0) + mock_call_on_projector.assert_called_with({'scroll': 5, 'scale': 0}) + + view.pre_redirect(request, direction='clean_scroll') + self.assertEqual(mock_config_store['projector_scroll'], 0) + mock_call_on_projector.assert_called_with({'scroll': 0, 'scale': 0}) + + def test_get_ajax_context(self): + view = views.ProjectorControllView() + with patch('openslides.projector.views.config', {'projector_scale': 1, + 'projector_scroll': 2}): + context = view.get_ajax_context() + self.assertEqual(context, {'scale_level': 1, 'scroll_level': 2}) + + class CustomSlidesTest(TestCase): def setUp(self): self.admin_client = Client()