Completed
Pull Request — master (#396)
by
unknown
01:54
created

FakeResponse   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 12
Duplicated Lines 0 %
Metric Value
dl 0
loc 12
rs 10
wmc 3

3 Methods

Rating   Name   Duplication   Size   Complexity  
A json() 0 2 1
A raise_for_status() 0 2 1
A __init__() 0 4 1
1
import json
2
3
import mock
4
import requests
5
import responses
6
import unittest2
7
8
# XXX: This file uses a lot of globals and shared state.
9
# We should definitely refactor this at some
10
# point since we have tests now.
11
import st2_handler as sensu_handler
12
13
14
__all__ = [
15
    'SensuHandlerTestCase'
16
]
17
18
19
class FakeResponse(object):
20
21
    def __init__(self, text, status_code, reason):
22
        self.text = text
23
        self.status_code = status_code
24
        self.reason = reason
25
26
    def json(self):
27
        return json.loads(self.text)
28
29
    def raise_for_status(self):
30
        raise Exception(self.reason)
31
32
33
class SensuHandlerTestCase(unittest2.TestCase):
34
35
    def test_st2_headers_token_auth(self):
36
        sensu_handler.IS_API_KEY_AUTH = False
37
        self.assertEqual(sensu_handler.IS_API_KEY_AUTH, False,
38
                         'API auth should be off for this test.')
39
        sensu_handler.ST2_AUTH_TOKEN = 'dummy-token'
40
        sensu_handler.ST2_API_KEY = 'dummy-api-key'
41
        headers = sensu_handler._get_st2_request_headers()
42
        self.assertTrue('X-Auth-Token' in headers)
43
        self.assertTrue('St2-Api-Key' not in headers)
44
        self.assertEqual(headers['X-Auth-Token'], 'dummy-token')
45
46
    def test_st2_headers_apikey_auth(self):
47
        sensu_handler.IS_API_KEY_AUTH = True
48
        self.assertEqual(sensu_handler.IS_API_KEY_AUTH, True,
49
                         'API auth should be on for this test.')
50
        sensu_handler.ST2_AUTH_TOKEN = 'dummy-token'
51
        sensu_handler.ST2_API_KEY = 'dummy-api-key'
52
        headers = sensu_handler._get_st2_request_headers()
53
        self.assertTrue('X-Auth-Token' not in headers)
54
        self.assertTrue('St2-Api-Key' in headers)
55
        self.assertEqual(headers['St2-Api-Key'], 'dummy-api-key')
56
57
    def test_get_st2_auth_url(self):
58
        sensu_handler.ST2_AUTH_BASE_URL = 'https://localhost/auth/v1/'
59
        self.assertEqual(sensu_handler._get_auth_url(),
60
                         'https://localhost/auth/v1/tokens')
61
62
    def test_get_st2_triggers_base_url(self):
63
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
64
        self.assertEqual(sensu_handler._get_st2_triggers_base_url(),
65
                        'https://localhost/api/v1/triggertypes')
66
67
    def test_get_st2_triggers_url(self):
68
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
69
        self.assertEqual(sensu_handler._get_st2_triggers_url(),
70
                        'https://localhost/api/v1/triggertypes/sensu.event_handler')
71
72
    def test_get_st2_webhooks_url(self):
73
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
74
        self.assertEqual(sensu_handler._get_st2_webhooks_url(),
75
                        'https://localhost/api/v1/webhooks/st2')
76
77
    @responses.activate
78
    def test_post_event_to_st2_bad_payload(self):
79
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
80
        responses.add(
81
            responses.POST, 'https://localhost/api/v1/webhooks/st2',
82
            json={}, status=202
83
        )
84
        payload = {'foo': 'bar'}
85
        with self.assertRaises(SystemExit) as cm:
86
            sensu_handler._post_event_to_st2(payload)
87
        self.assertTrue(cm.exception.code > 0)
88
89
    @responses.activate
90
    def test_get_auth_token(self):
91
        sensu_handler.ST2_AUTH_BASE_URL = 'https://localhost/auth/v1/'
92
        responses.add(
93
            responses.POST, 'https://localhost/auth/v1/tokens',
94
            json={'token': 'your_auth_token'}, status=202
95
        )
96
        token = sensu_handler._get_auth_token()
97
        self.assertEqual(token, 'your_auth_token')
98
99
    @mock.patch('st2_handler._create_trigger_type')
100
    @responses.activate
101
    def test_get_trigger_type_trigger_exists(self, mock_method):
102
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
103
        responses.add(
104
            responses.GET, 'https://localhost/api/v1/triggertypes/sensu.event_handler',
105
            json={'type': 'sensu.event_handler'}, status=200
106
        )
107
        sensu_handler._register_trigger_with_st2()
108
        self.assertFalse(mock_method.called)
109
110
    @mock.patch('st2_handler._create_trigger_type')
111
    @responses.activate
112
    def test_trigger_creation_trigger_not_exists(self, mock_method):
113
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
114
        responses.add(
115
            responses.GET, 'https://localhost/api/v1/triggertypes/sensu.event_handler',
116
            json={}, status=404
117
        )
118
        sensu_handler._register_trigger_with_st2()
119
        self.assertTrue(mock_method.called)
120
121
    @mock.patch.object(requests, 'post', mock.MagicMock(
122
        return_value=FakeResponse(json.dumps({}), status_code=200, reason='blah')))
123
    def test_create_trigger_type(self):
124
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
125
        sensu_handler._create_trigger_type()
126
        requests.post.assert_called_once_with('https://localhost/api/v1/triggertypes',
127
            data='{"description": "Trigger type for sensu event handler.", ' +
128
                 '"name": "event_handler", "pack": "sensu"}',
129
            headers={'Content-Type': 'application/json; charset=utf-8'}, verify=False)
130
131
    @mock.patch.object(requests, 'post', mock.MagicMock(
132
        return_value=FakeResponse(json.dumps({}), status_code=200, reason='blah')))
133
    def test_ssl_verify_on(self):
134
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
135
        sensu_handler.ST2_SSL_VERIFY = True
136
        sensu_handler._create_trigger_type()
137
        requests.post.assert_called_with('https://localhost/api/v1/triggertypes',
138
            data='{"description": "Trigger type for sensu event handler.", ' +
139
                 '"name": "event_handler", "pack": "sensu"}',
140
            headers={'Content-Type': 'application/json; charset=utf-8'}, verify=True
141
        )
142
143
    @responses.activate
144
    def test_post_event_to_st2_good_payload(self):
145
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
146
        responses.add(
147
            responses.POST, 'https://localhost/api/v1/webhooks/st2',
148
            json={}, status=202
149
        )
150
        responses.add(
151
            responses.GET, 'http://localhost:4567/stashes/silence/ma_client',
152
            json={}, status=404
153
        )
154
        responses.add(
155
            responses.GET, 'http://localhost:4567/stashes/silence/ma_client/ma_check',
156
            json={}, status=404
157
        )
158
        responses.add(
159
            responses.GET, 'http://localhost:4567/stashes/silence/all/ma_check',
160
            json={}, status=404
161
        )
162
        trigger_payload = {
163
            'client': {'name': 'ma_client'},
164
            'check': {'name': 'ma_check'},
165
            'id': 'foo-check-id'
166
        }
167
        ret = sensu_handler._post_event_to_st2(json.dumps(trigger_payload))
168
        self.assertEqual(ret, True)
169
170
    @responses.activate
171
    def test_post_event_to_st2_sensu_stashed(self):
172
        sensu_handler.ST2_API_BASE_URL = 'https://localhost/api/v1/'
173
        responses.add(
174
            responses.POST, 'https://localhost/api/v1/webhooks/st2',
175
            json={}, status=202
176
        )
177
        responses.add(
178
            responses.GET, 'http://localhost:4567/stashes/silence/ma_client',
179
            json={}, status=200
180
        )
181
        responses.add(
182
            responses.GET, 'http://localhost:4567/stashes/silence/ma_client/ma_check',
183
            json={}, status=200
184
        )
185
        responses.add(
186
            responses.GET, 'http://localhost:4567/stashes/silence/all/ma_check',
187
            json={}, status=200
188
        )
189
        trigger_payload = {
190
            'client': {'name': 'ma_client'},
191
            'check': {'name': 'ma_check'},
192
            'id': 'foo-check-id'
193
        }
194
        with self.assertRaises(SystemExit) as cm:
195
            sensu_handler._post_event_to_st2(json.dumps(trigger_payload))
196
        self.assertEqual(cm.exception.code, 0)
197