summaryrefslogtreecommitdiff
path: root/src/mailman/rest/tests/test_validator.py
blob: 95855d17072e8115afd2b59874c742f6aad0664a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# Copyright (C) 2015-2017 by the Free Software Foundation, Inc.
#
# This file is part of GNU Mailman.
#
# GNU Mailman 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.
#
# GNU Mailman 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
# GNU Mailman.  If not, see <http://www.gnu.org/licenses/>.

"""Test REST validators."""

import unittest

from mailman.core.api import API30, API31
from mailman.interfaces.action import Action
from mailman.interfaces.usermanager import IUserManager
from mailman.interfaces.workflows import (ISubscriptionWorkflow,
                                          IUnsubscriptionWorkflow)
from mailman.rest.validator import (
    enum_validator, list_of_strings_validator, policy_validator,
    subscriber_validator)
from mailman.testing.layers import RESTLayer
from mailman.workflows.subscription import ConfirmSubscriptionPolicy
from mailman.workflows.unsubscription import ConfirmUnsubscriptionPolicy
from zope.component import getUtility


class TestValidators(unittest.TestCase):
    layer = RESTLayer

    def test_list_of_strings_validator_single(self):
        # This validator should turn a single key into a list of keys.
        self.assertEqual(list_of_strings_validator('ant'), ['ant'])

    def test_list_of_strings_validator_multiple(self):
        # This validator should turn a single key into a list of keys.
        self.assertEqual(
            list_of_strings_validator(['ant', 'bee', 'cat']),
            ['ant', 'bee', 'cat'])

    def test_list_of_strings_validator_invalid(self):
        # Strings are required.
        self.assertRaises(ValueError, list_of_strings_validator, 7)
        self.assertRaises(ValueError, list_of_strings_validator, ['ant', 7])

    def test_subscriber_validator_int_uuid(self):
        # Convert from an existing user id to a UUID.
        anne = getUtility(IUserManager).make_user('anne@example.com')
        uuid = subscriber_validator(API30)(str(anne.user_id.int))
        self.assertEqual(anne.user_id, uuid)

    def test_subscriber_validator_hex_uuid(self):
        # Convert from an existing user id to a UUID.
        anne = getUtility(IUserManager).make_user('anne@example.com')
        uuid = subscriber_validator(API31)(anne.user_id.hex)
        self.assertEqual(anne.user_id, uuid)

    def test_subscriber_validator_no_int_uuid(self):
        # API 3.1 does not accept ints as subscriber id's.
        anne = getUtility(IUserManager).make_user('anne@example.com')
        self.assertRaises(ValueError,
                          subscriber_validator(API31), str(anne.user_id.int))

    def test_subscriber_validator_bad_int_uuid(self):
        # In API 3.0, UUIDs are ints.
        self.assertRaises(ValueError,
                          subscriber_validator(API30), 'not-a-thing')

    def test_subscriber_validator_bad_int_hex(self):
        # In API 3.1, UUIDs are hexes.
        self.assertRaises(ValueError,
                          subscriber_validator(API31), 'not-a-thing')

    def test_subscriber_validator_email_address_API30(self):
        self.assertEqual(subscriber_validator(API30)('anne@example.com'),
                         'anne@example.com')

    def test_subscriber_validator_email_address_API31(self):
        self.assertEqual(subscriber_validator(API31)('anne@example.com'),
                         'anne@example.com')

    def test_enum_validator_valid(self):
        self.assertEqual(enum_validator(Action)('hold'), Action.hold)

    def test_enum_validator_invalid(self):
        self.assertRaises(ValueError,
                          enum_validator(Action), 'not-a-thing')

    def test_enum_validator_blank(self):
        self.assertEqual(enum_validator(Action, allow_blank=True)(''), None)

    def test_policy_validator_wrong_policy_class(self):
        self.assertRaises(ValueError, policy_validator, None)

    def test_policy_validator_sub_name(self):
        self.assertEqual(policy_validator(ISubscriptionWorkflow)(
                ConfirmSubscriptionPolicy.name), ConfirmSubscriptionPolicy)

    def test_policy_validator_sub_class(self):
        self.assertEqual(policy_validator(ISubscriptionWorkflow)(
                ConfirmSubscriptionPolicy), ConfirmSubscriptionPolicy)

    def test_policy_validator_sub_backward_compat(self):
        self.assertEqual(policy_validator(ISubscriptionWorkflow)('confirm'),
                         ConfirmSubscriptionPolicy)

    def test_policy_validator_sub_wrong_policy(self):
        validator = policy_validator(ISubscriptionWorkflow)
        with self.assertRaises(ValueError):
            validator('not a subscription policy')

    def test_policy_validator_unsub_name(self):
        self.assertEqual(policy_validator(IUnsubscriptionWorkflow)(
                ConfirmUnsubscriptionPolicy.name), ConfirmUnsubscriptionPolicy)

    def test_policy_validator_unsub_class(self):
        self.assertEqual(policy_validator(IUnsubscriptionWorkflow)(
                ConfirmUnsubscriptionPolicy), ConfirmUnsubscriptionPolicy)

    def test_policy_validator_unsub_backward_compat(self):
        self.assertEqual(policy_validator(IUnsubscriptionWorkflow)('confirm'),
                         ConfirmUnsubscriptionPolicy)

    def test_policy_validator_unsub_wrong_policy(self):
        validator = policy_validator(IUnsubscriptionWorkflow)
        with self.assertRaises(ValueError):
            validator('not an unsubscription policy')