test_operations.py 3.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# Copyright 2014 Budapest University of Technology and Economics (BME IK)
#
# This file is part of CIRCLE Cloud.
#
# CIRCLE 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.
#
# CIRCLE 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 CIRCLE.  If not, see <http://www.gnu.org/licenses/>.

18 19 20 21 22 23 24 25 26 27 28 29
from mock import MagicMock, patch

from django.test import TestCase

from ..operations import Operation


class OperationTestCase(TestCase):
    def test_activity_created_before_async_job(self):
        class AbortEx(Exception):
            pass

30
        op = TestOp(MagicMock())
31 32 33 34 35 36 37 38 39 40 41 42 43 44
        op.async_operation = MagicMock(
            apply_async=MagicMock(side_effect=AbortEx))

        with patch.object(Operation, 'check_precond'):
            with patch.object(Operation, 'create_activity') as create_act:
                try:
                    op.async(system=True)
                except AbortEx:
                    self.assertTrue(create_act.called)

    def test_check_precond_called_before_create_activity(self):
        class AbortEx(Exception):
            pass

45
        op = TestOp(MagicMock())
46 47 48 49 50 51 52 53
        with patch.object(Operation, 'create_activity', side_effect=AbortEx):
            with patch.object(Operation, 'check_precond') as chk_pre:
                try:
                    op.call(system=True)
                except AbortEx:
                    self.assertTrue(chk_pre.called)

    def test_auth_check_on_non_system_call(self):
54
        op = TestOp(MagicMock())
55 56 57 58 59 60 61 62 63
        user = MagicMock()
        with patch.object(Operation, 'check_auth') as check_auth:
            with patch.object(Operation, 'check_precond'), \
                    patch.object(Operation, 'create_activity'), \
                    patch.object(Operation, '_exec_op'):
                op.call(user=user)
            check_auth.assert_called_with(user)

    def test_no_auth_check_on_system_call(self):
64
        op = TestOp(MagicMock())
65 66 67 68 69
        with patch.object(Operation, 'check_auth', side_effect=AssertionError):
            with patch.object(Operation, 'check_precond'), \
                    patch.object(Operation, 'create_activity'), \
                    patch.object(Operation, '_exec_op'):
                op.call(system=True)
70 71

    def test_no_exception_for_more_arguments_when_operation_takes_kwargs(self):
72 73 74
        op = TestOp(MagicMock())
        with patch.object(TestOp, 'create_activity'), \
                patch.object(TestOp, '_exec_op'):
75 76 77 78 79 80
            op.call(system=True, foo=42)

    def test_exception_for_unexpected_arguments(self):
        op = TestOp(MagicMock())
        with patch.object(TestOp, 'create_activity'), \
                patch.object(TestOp, '_exec_op'):
81
            self.assertRaises(TypeError, op.call, system=True, bar=42)
82 83 84 85 86

    def test_exception_for_missing_arguments(self):
        op = TestOp(MagicMock())
        with patch.object(TestOp, 'create_activity'):
            self.assertRaises(TypeError, op.call, system=True)
87 88 89 90 91 92 93


class TestOp(Operation):
    id = 'test'

    def _operation(self, foo):
        pass