Test Failed
Pull Request — master (#64)
by
unknown
28:59 queued 26:30
created

TestMain.test_get_mw_case_2()   B

Complexity

Conditions 1

Size

Total Lines 75
Code Lines 61

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 61
nop 1
dl 0
loc 75
rs 8.2763
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
"""Tests for the main madule."""
2
3
from unittest import TestCase
4
from unittest.mock import patch, MagicMock
5
from datetime import datetime, timedelta
6
import json
7
8
import pytz
9
10
from kytos.lib.helpers import get_controller_mock
11
from napps.kytos.maintenance.main import Main
12
from napps.kytos.maintenance.models import MaintenanceWindow as MW
13
from napps.kytos.maintenance.models import MaintenanceWindows
14
from napps.kytos.maintenance.models import Status
15
16
TIME_FMT = "%Y-%m-%dT%H:%M:%S%z"
17
18
19
class TestMain(TestCase):
20
    """Test the Main class of this NApp."""
21
22
    # pylint: disable=too-many-public-methods
23
24
    def setUp(self):
25
        """Initialize before tests are executed."""
26
        self.server_name_url = \
27
            'http://localhost:8181/api/kytos/maintenance/v1'
28
        self.controller = get_controller_mock()
29
        self.scheduler = MagicMock()
30
        with patch('napps.kytos.maintenance.models.Scheduler.new_scheduler') as new_scheduler:
31
            new_scheduler.return_value = self.scheduler
32
            self.napp = Main(self.controller)
33
        self.api = self.get_app_test_client(self.napp)
34
        self.maxDiff = None
35
36
    @staticmethod
37
    def get_app_test_client(napp):
38
        """Return a flask api test client."""
39
        napp.controller.api_server.register_napp_endpoints(napp)
40
        return napp.controller.api_server.app.test_client()
41
42
    def test_create_mw_case_1(self):
43
        """Test a successful case of the REST to create."""
44
        url = f'{self.server_name_url}'
45
        start = datetime.now(pytz.utc) + timedelta(days=1)
46
        end = start + timedelta(hours=2)
47
        payload = {
48
            'id': '1234',
49
            "start": start.strftime(TIME_FMT),
50
            "end": end.strftime(TIME_FMT),
51
            "switches": [
52
                "00:00:00:00:00:00:02",
53
            ],
54
            'interfaces': [
55
                "00:00:00:00:00:00:00:03:3",
56
            ],
57
        }
58
        response = self.api.post(url, data=json.dumps(payload),
59
                                 content_type='application/json')
60
        current_data = json.loads(response.data)
61
        self.scheduler.add.assert_called_once_with(
62
            MW.construct(
63
                id = '1234',
64
                start = start.replace(microsecond=0),
65
                end = end.replace(microsecond=0),
66
                switches = ['00:00:00:00:00:00:02'],
67
                interfaces = ['00:00:00:00:00:00:00:03:3']
68
            )
69
        )
70
        self.assertEqual(current_data, {'mw_id': '1234'})
71
        self.assertEqual(response.status_code, 201)
72
73
    def test_create_mw_case_2(self):
74
        """Test a fail case of the REST to create a maintenance window."""
75
        url = f'{self.server_name_url}'
76
        start = datetime.now(pytz.utc) + timedelta(days=1)
77
        end = start + timedelta(hours=2)
78
        payload = {
79
            "switches": [
80
                "00:00:00:00:00:00:02",
81
            ],
82
            'interfaces': [
83
                "00:00:00:00:00:00:00:03:3",
84
            ],
85
        }
86
        response = self.api.post(url, data=json.dumps(payload),
87
                                 content_type='application/json')
88
        self.assertEqual(response.status_code, 400)
89
        self.scheduler.add.assert_not_called()
90
91 View Code Duplication
    def test_create_mw_case_3(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
92
        """Test a fail case of the REST to create a maintenance window."""
93
        url = f'{self.server_name_url}'
94
        start = datetime.now(pytz.utc) - timedelta(days=1)
95
        end = start + timedelta(hours=2)
96
        payload = {
97
            "start": start.strftime(TIME_FMT),
98
            "end": end.strftime(TIME_FMT),
99
            "switches": [
100
                "00:00:00:00:00:00:02",
101
            ],
102
            'interfaces': [
103
                "00:00:00:00:00:00:00:03:3",
104
            ],
105
        }
106
        response = self.api.post(url, data=json.dumps(payload),
107
                                 content_type='application/json')
108
        current_data = json.loads(response.data)
109
        self.assertEqual(response.status_code, 400)
110
        self.assertEqual(current_data['description'],
111
                         'Start in the past not allowed')
112
        self.scheduler.add.assert_not_called()
113
114 View Code Duplication
    def test_create_mw_case_4(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
115
        """Test a fail case of the REST to create a maintenance window."""
116
        url = f'{self.server_name_url}'
117
        start = datetime.now(pytz.utc) + timedelta(days=1)
118
        end = start - timedelta(hours=2)
119
        payload = {
120
            "start": start.strftime(TIME_FMT),
121
            "end": end.strftime(TIME_FMT),
122
            "start": start.strftime(TIME_FMT),
123
            "end": end.strftime(TIME_FMT),
124
            "switches": [
125
                "00:00:00:00:00:00:02",
126
            ],
127
            'interfaces': [
128
                "00:00:00:00:00:00:00:03:3",
129
            ],
130
        }
131
        response = self.api.post(url, data=json.dumps(payload),
132
                                 content_type='application/json')
133
        current_data = json.loads(response.data)
134
        self.assertEqual(response.status_code, 400)
135
        self.assertEqual(current_data['description'],
136
                         'End before start not allowed')
137
        self.scheduler.add.assert_not_called()
138
139
    def test_get_mw_case_1(self):
140
        """Test get all maintenance windows, empty list."""
141
        self.scheduler.list_maintenances.return_value = MaintenanceWindows.construct(__root__ = [])
142
        url = f'{self.server_name_url}'
143
        response = self.api.get(url)
144
        current_data = json.loads(response.data)
145
        self.assertEqual(response.status_code, 200)
146
        self.assertEqual(current_data, [])
147
        self.scheduler.list_maintenances.assert_called_once()
148
149
    def test_get_mw_case_2(self):
150
        """Test get all maintenance windows."""
151
        now = datetime.now(pytz.utc)
152
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
153
        end1 = start1 + timedelta(hours=6)
154
        start2 = datetime.now(pytz.utc) + timedelta(hours=5)
155
        end2 = start2 + timedelta(hours=1, minutes=30)
156
        self.scheduler.list_maintenances.return_value = MaintenanceWindows.construct(
157
            __root__ = [
158
            MW.construct(
159
                id = '1234',
160
                start = start1.replace(microsecond=0),
161
                end = end1.replace(microsecond=0),
162
                switches = [
163
                    '00:00:00:00:00:00:12:23'
164
                ],
165
                description = '',
166
                links = [],
167
                interfaces = [],
168
                status = 'pending',
169
                updated_at = now.replace(microsecond=0),
170
                inserted_at = now.replace(microsecond=0),
171
            ),
172
            MW.construct(
173
                id = '4567',
174
                start = start2.replace(microsecond=0),
175
                end = end2.replace(microsecond=0),
176
                switches = [
177
                    '12:34:56:78:90:ab:cd:ef'
178
                ],
179
                description = '',
180
                links = [],
181
                interfaces = [],
182
                status = 'pending',
183
                updated_at = now.replace(microsecond=0),
184
                inserted_at = now.replace(microsecond=0),
185
            ),
186
        ])
187
        mw_dict = [
188
            {
189
                'id': '1234',
190
                'start': start1.strftime(TIME_FMT),
191
                'end': end1.strftime(TIME_FMT),
192
                'switches': [
193
                    '00:00:00:00:00:00:12:23'
194
                ],
195
                'description': '',
196
                'links': [],
197
                'interfaces': [],
198
                'status': 'pending',
199
                'updated_at': now.strftime(TIME_FMT),
200
                'inserted_at': now.strftime(TIME_FMT),
201
            },
202
            {
203
                'id': '4567',
204
                'start': start2.strftime(TIME_FMT),
205
                'end': end2.strftime(TIME_FMT),
206
                'switches': [
207
                    '12:34:56:78:90:ab:cd:ef'
208
                ],
209
                'description': '',
210
                'links': [],
211
                'interfaces': [],
212
                'status': 'pending',
213
                'updated_at': now.strftime(TIME_FMT),
214
                'inserted_at': now.strftime(TIME_FMT),
215
            }
216
        ]
217
218
        url = f'{self.server_name_url}'
219
        response = self.api.get(url)
220
        current_data = json.loads(response.data)
221
        self.assertEqual(response.status_code, 200)
222
        self.assertEqual(current_data, mw_dict)
223
        self.scheduler.list_maintenances.assert_called_once()
224
225
    def test_get_mw_case_3(self):
226
        """Test get non-existent id."""
227
        self.scheduler.get_maintenance.return_value = None
228
        url = f'{self.server_name_url}/2345'
229
        response = self.api.get(url)
230
        current_data = json.loads(response.data)
231
        self.assertEqual(response.status_code, 404)
232
        self.assertEqual(current_data['description'],
233
                         'Maintenance with id 2345 not found')
234
        self.scheduler.get_maintenance.assert_called_once_with('2345')
235
236
    def test_get_mw_case_4(self):
237
        """Test get existent id."""
238
        now = datetime.now(pytz.utc)
239
        start2 = datetime.now(pytz.utc) + timedelta(hours=5)
240
        end2 = start2 + timedelta(hours=1, minutes=30)
241
        self.scheduler.get_maintenance.return_value = MW.construct(
242
            id = '4567',
243
            start = start2.replace(microsecond=0),
244
            end = end2.replace(microsecond=0),
245
            switches = [
246
                '12:34:56:78:90:ab:cd:ef'
247
            ],
248
            updated_at = now.replace(microsecond=0),
249
            inserted_at = now.replace(microsecond=0),
250
        )
251
        mw_dict = {
252
            'id': '4567',
253
            'start': start2.strftime(TIME_FMT),
254
            'end': end2.strftime(TIME_FMT),
255
            'switches': [
256
                '12:34:56:78:90:ab:cd:ef'
257
            ],
258
            'description': '',
259
            'links': [],
260
            'interfaces': [],
261
            'status': 'pending',
262
            'updated_at': now.strftime(TIME_FMT),
263
            'inserted_at': now.strftime(TIME_FMT),
264
        }
265
        url = f'{self.server_name_url}/4567'
266
        response = self.api.get(url)
267
        current_data = json.loads(response.data)
268
        self.assertEqual(response.status_code, 200)
269
        self.assertEqual(current_data, mw_dict)
270
        self.scheduler.get_maintenance.assert_called_once_with('4567')
271
272
    def test_remove_mw_case_1(self):
273
        """Test remove non-existent id."""
274
        self.scheduler.get_maintenance.return_value = None
275
        url = f'{self.server_name_url}/2345'
276
        response = self.api.delete(url)
277
        current_data = json.loads(response.data)
278
        self.assertEqual(response.status_code, 404)
279
        self.assertEqual(current_data['description'],
280
                         'Maintenance with id 2345 not found')
281
        self.scheduler.get_maintenance.assert_called_once_with('2345')
282
        self.scheduler.remove.assert_not_called()
283
284 View Code Duplication
    def test_remove_mw_case_2(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
285
        """Test remove existent id."""
286
        start1 = datetime.now(pytz.utc) + timedelta(hours=1)
287
        end1 = start1 + timedelta(hours=6)
288
        self.scheduler.get_maintenance.return_value = MW.construct(
289
            id = '1234',
290
            start = start1.replace(microsecond=0),
291
            end = end1.replace(microsecond=0),
292
            switches = [
293
                '00:00:00:00:00:00:12:23'
294
            ],
295
        )
296
        url = f'{self.server_name_url}/1234'
297
        response = self.api.delete(url)
298
        current_data = json.loads(response.data)
299
        self.assertEqual(response.status_code, 200)
300
        self.assertEqual(current_data, {'response': 'Maintenance with id 1234 '
301
                                                    'successfully removed'})
302
        self.scheduler.get_maintenance.assert_called_once_with('1234')
303
        self.scheduler.remove.assert_called_once_with('1234')
304
305 View Code Duplication
    def test_remove_mw_case_3(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
306
        """Test remove existent id."""
307
        start1 = datetime.now(pytz.utc) - timedelta(days=1)
308
        end1 = start1 + timedelta(hours=6)
309
        self.scheduler.get_maintenance.return_value = MW.construct(
310
            id = '1234',
311
            start = start1.replace(microsecond=0),
312
            end = end1.replace(microsecond=0),
313
            switches = [
314
                '00:00:00:00:00:00:12:23'
315
            ],
316
            status = 'running',
317
        )
318
        url = f'{self.server_name_url}/1234'
319
        response = self.api.delete(url)
320
        current_data = json.loads(response.data)
321
        self.assertEqual(response.status_code, 400)
322
        self.assertEqual(current_data['description'],
323
                         'Deleting a running maintenance is not allowed')
324
        self.scheduler.get_maintenance.assert_called_once_with('1234')
325
        self.scheduler.remove.assert_not_called()
326
327
    def test_update_mw_case_1(self):
328
        """Test update non-existent id."""
329
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
330
        self.scheduler.get_maintenance.return_value = None
331
        payload = {
332
            "start": start1.strftime(TIME_FMT),
333
        }
334
        url = f'{self.server_name_url}/2345'
335
        response = self.api.patch(url, data=json.dumps(payload),
336
                                  content_type='application/json')
337
        current_data = json.loads(response.data)
338
        self.assertEqual(response.status_code, 404)
339
        self.assertEqual(current_data['description'],
340
                         'Maintenance with id 2345 not found')
341
        self.scheduler.update.assert_not_called()
342
343
    def test_update_mw_case_2(self):
344
        """Test update no data."""
345
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
346
        payload = {
347
            "start": start1.strftime(TIME_FMT),
348
        }
349
        url = f'{self.server_name_url}/1234'
350
        response = self.api.patch(url, data=json.dumps(payload),
351
                                  content_type='text/plain')
352
        current_data = json.loads(response.data)
353
        self.assertEqual(response.status_code, 415)
354
        self.assertEqual(current_data['description'],
355
                         'The request does not have a json')
356
        self.scheduler.update.assert_not_called()
357
358
    def test_update_mw_case_3(self):
359
        """Test successful update."""
360
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
361
        end1 = start1 + timedelta(hours=6)
362
        self.scheduler.get_maintenance.return_value = MW.construct(
363
            id = '1234',
364
            start = start1.replace(microsecond=0),
365
            end = end1.replace(microsecond=0),
366
            switches = [
367
                '00:00:00:00:00:00:12:23'
368
            ],
369
        )
370
        start_new = datetime.now(pytz.utc) + timedelta(days=1, hours=3)
371
        payload = {
372
            "start": start_new.strftime(TIME_FMT),
373
        }
374
        url = f'{self.server_name_url}/1234'
375
        response = self.api.patch(url, data=json.dumps(payload),
376
                                  content_type='application/json')
377
        current_data = json.loads(response.data)
378
        self.assertEqual(current_data,
379
                         {'response': 'Maintenance 1234 updated'})
380
        self.assertEqual(response.status_code, 200)
381
        self.scheduler.get_maintenance.assert_called_once_with('1234')
382
        self.scheduler.update.assert_called_once_with(
383
            MW.construct(
384
                id = '1234',
385
                start = start_new.replace(microsecond=0),
386
                end = end1.replace(microsecond=0),
387
                switches = [
388
                    '00:00:00:00:00:00:12:23'
389
                ],
390
            )
391
        )
392
393 View Code Duplication
    def test_update_mw_case_4(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
394
        """Test successful update."""
395
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
396
        end1 = start1 + timedelta(hours=6)
397
        self.scheduler.get_maintenance.return_value = MW.construct(
398
            id = '1234',
399
            start = start1.replace(microsecond=0),
400
            end = end1.replace(microsecond=0),
401
            switches = [
402
                '00:00:00:00:00:00:12:23'
403
            ],
404
        )
405
        start_new = datetime.now(pytz.utc) - timedelta(days=1, hours=3)
406
        payload = {
407
            "start": start_new.strftime(TIME_FMT),
408
        }
409
        url = f'{self.server_name_url}/1234'
410
        response = self.api.patch(url, data=json.dumps(payload),
411
                                  content_type='application/json')
412
        current_data = json.loads(response.data)
413
        self.assertEqual(response.status_code, 400)
414
        self.assertEqual(current_data['description'],
415
                         'Start in the past not allowed')
416
        self.scheduler.get_maintenance.assert_called_once_with('1234')
417
        self.scheduler.update.assert_not_called()
418
419
    def test_update_mw_case_5(self):
420
        """Test successful update."""
421
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
422
        end1 = start1 + timedelta(hours=6)
423
        self.scheduler.get_maintenance.return_value = MW.construct(
424
            id = '1234',
425
            start = start1.replace(microsecond=0),
426
            end = end1.replace(microsecond=0),
427
            switches = [
428
                '00:00:00:00:00:00:12:23'
429
            ],
430
        )
431
        start_new = datetime.now(pytz.utc) + timedelta(days=1, hours=3)
432
        end_new = start_new - timedelta(hours=5)
433
        payload = {
434
            "start": start_new.strftime(TIME_FMT),
435
            "end": end_new.strftime(TIME_FMT)
436
        }
437
        url = f'{self.server_name_url}/1234'
438
        response = self.api.patch(url, data=json.dumps(payload),
439
                                  content_type='application/json')
440
        current_data = json.loads(response.data)
441
        self.assertEqual(response.status_code, 400)
442
        self.assertEqual(current_data['description'],
443
                         'End before start not allowed')
444
        self.scheduler.get_maintenance.assert_called_once_with('1234')
445
        self.scheduler.update.assert_not_called()
446
447
    def test_update_mw_case_6(self):
448
        """Test successful update."""
449
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
450
        end1 = start1 + timedelta(hours=6)
451
        self.scheduler.get_maintenance.return_value = MW.construct(
452
            id = '1234',
453
            start = start1.replace(microsecond=0),
454
            end = end1.replace(microsecond=0),
455
            switches = [
456
                '00:00:00:00:00:00:12:23'
457
            ],
458
        )
459
        start_new = datetime.now(pytz.utc) + timedelta(days=1, hours=3)
460
        payload = {
461
            "start": start_new.strftime(TIME_FMT),
462
            "switches": [],
463
            'interfaces': [],
464
            'links': [],
465
        }
466
467
        url = f'{self.server_name_url}/1234'
468
        response = self.api.patch(url, data=json.dumps(payload),
469
                                  content_type='application/json')
470
        current_data = json.loads(response.data)
471
        self.assertEqual(response.status_code, 400)
472
        self.assertEqual(current_data['description'],
473
                         'At least one item must be provided')
474
        self.scheduler.get_maintenance.assert_called_once_with('1234')
475
        self.scheduler.update.assert_not_called()
476
477
    def test_end_mw_case_1(self):
478
        """Test method that finishes the maintenance now."""
479
        self.scheduler.get_maintenance.return_value = None
480
        url = f'{self.server_name_url}/2345/end'
481
        response = self.api.patch(url)
482
        current_data = json.loads(response.data)
483
        self.assertEqual(response.status_code, 404)
484
        self.assertEqual(current_data['description'],
485
                         'Maintenance with id 2345 not found')
486
487
    def test_end_mw_case_2(self):
488
        """Test method that finishes the maintenance now."""
489
        start1 = datetime.now(pytz.utc) - timedelta(hours=1)
490
        end1 = start1 + timedelta(hours=6)
491
        self.scheduler.get_maintenance.return_value = MW.construct(
492
            id = '1234',
493
            start = start1.replace(microsecond=0),
494
            end = end1.replace(microsecond=0),
495
            switches = [
496
                '00:00:00:00:00:00:12:23'
497
            ],
498
            status = 'running',
499
        )
500
        url = f'{self.server_name_url}/1234/end'
501
        response = self.api.patch(url)
502
        current_data = json.loads(response.data)
503
        self.scheduler.get.asssert_called_once_with('1234')
504
        self.scheduler.end_maintenance_early.assert_called_once_with('1234')
505
        self.assertEqual(response.status_code, 200)
506
        self.assertEqual(current_data,
507
                         {'response': 'Maintenance window 1234 finished'})
508
509
    def test_end_mw_case_3(self):
510
        """Test method that finishes the maintenance now."""
511
        start1 = datetime.now(pytz.utc) + timedelta(hours=1)
512
        end1 = start1 + timedelta(hours=6)
513
        self.scheduler.get_maintenance.return_value = MW.construct(
514
            id = '1234',
515
            start = start1.replace(microsecond=0),
516
            end = end1.replace(microsecond=0),
517
            switches = [
518
                '00:00:00:00:00:00:12:23'
519
            ],
520
            status = 'pending',
521
        )
522
        url = f'{self.server_name_url}/1234/end'
523
        response = self.api.patch(url)
524
        current_data = json.loads(response.data)
525
        self.scheduler.get.asssert_called_once_with('1234')
526
        self.scheduler.end_maintenance_early.assert_not_called()
527
        self.assertEqual(response.status_code, 400)
528
        self.assertEqual(current_data['description'],
529
                         'Maintenance window 1234 has not yet started')
530
531
    def test_end_mw_case_4(self):
532
        """Test method that finishes the maintenance now."""
533
        start1 = datetime.now(pytz.utc) - timedelta(hours=5)
534
        end1 = start1 + timedelta(hours=4)
535
        self.scheduler.get_maintenance.return_value = MW.construct(
536
            id = '1234',
537
            start = start1.replace(microsecond=0),
538
            end = end1.replace(microsecond=0),
539
            switches = [
540
                '00:00:00:00:00:00:12:23'
541
            ],
542
            status = 'finished',
543
        )
544
        url = f'{self.server_name_url}/1234/end'
545
        response = self.api.patch(url)
546
        current_data = json.loads(response.data)
547
        self.scheduler.get.asssert_called_once_with('1234')
548
        self.scheduler.end_maintenance_early.assert_not_called()
549
        self.assertEqual(response.status_code, 400)
550
        self.assertEqual(current_data['description'],
551
                         'Maintenance window 1234 has already finished')
552
553
    def test_extend_case_1(self):
554
        """Test successful extension."""
555
        start1 = datetime.now(pytz.utc) - timedelta(hours=3)
556
        end1 = start1 + timedelta(hours=4)
557
        self.scheduler.get_maintenance.return_value = MW.construct(
558
            id = '1234',
559
            start = start1.replace(microsecond=0),
560
            end = end1.replace(microsecond=0),
561
            switches = [
562
                '00:00:00:00:00:00:12:23'
563
            ],
564
            status = 'running',
565
        )
566
        url = f'{self.server_name_url}/1234/extend'
567
        payload = {
568
            'minutes': 45
569
        }
570
        response = self.api.patch(url, data=json.dumps(payload),
571
                                  content_type='application/json')
572
        self.assertEqual(response.status_code, 200)
573
        self.scheduler.get_maintenance.called_with('1234')
574
        self.scheduler.update.assert_called_with(MW.construct(
575
            id = '1234',
576
            start = start1.replace(microsecond=0),
577
            end = end1.replace(microsecond=0) + timedelta(minutes=45),
578
            switches = [
579
                '00:00:00:00:00:00:12:23'
580
            ],
581
            status = 'running',
582
        ))
583
584
    def test_extend_case_2(self):
585
        """Test no payload error."""
586
        url = f'{self.server_name_url}/1234/extend'
587
        response = self.api.patch(url)
588
        self.assertEqual(response.status_code, 415)
589
        current_data = json.loads(response.data)
590
        self.assertEqual(current_data['description'],
591
                         'The request does not have a json')
592
        self.scheduler.update.assert_not_called()
593
594
    def test_extend_case_3(self):
595
        """Test payload without minutes."""
596
        url = f'{self.server_name_url}/1234/extend'
597
        payload = {
598
            'seconds': 240
599
        }
600
        response = self.api.patch(url, data=json.dumps(payload),
601
                                  content_type='application/json')
602
        self.assertEqual(response.status_code, 400)
603
        current_data = json.loads(response.data)
604
        self.assertEqual(current_data['description'],
605
                         'Minutes of extension must be sent')
606
        self.scheduler.update.assert_not_called()
607
608
    def test_extend_case_4(self):
609
        """Test no integer extension minutes."""
610
        url = f'{self.server_name_url}/1234/extend'
611
        payload = {
612
            'minutes': '240'
613
        }
614
        response = self.api.patch(url, data=json.dumps(payload),
615
                                  content_type='application/json')
616
        self.assertEqual(response.status_code, 400)
617
        current_data = json.loads(response.data)
618
        self.assertEqual(current_data['description'],
619
                         'Minutes of extension must be integer')
620
        self.scheduler.update.assert_not_called()
621
622 View Code Duplication
    def test_extend_case_5(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
623
        """Test maintenance did not start."""
624
        start1 = datetime.now(pytz.utc) + timedelta(hours=3)
625
        end1 = start1 + timedelta(hours=4)
626
        self.scheduler.get_maintenance.return_value = MW.construct(
627
            id = '1234',
628
            start = start1.replace(microsecond=0),
629
            end = end1.replace(microsecond=0),
630
            switches = [
631
                '00:00:00:00:00:00:12:23'
632
            ],
633
            status = 'pending',
634
        )
635
        url = f'{self.server_name_url}/1234/extend'
636
        payload = {
637
            'minutes': 240
638
        }
639
        response = self.api.patch(url, data=json.dumps(payload),
640
                                  content_type='application/json')
641
        self.assertEqual(response.status_code, 400)
642
        current_data = json.loads(response.data)
643
        self.assertEqual(current_data['description'],
644
                         'Maintenance window 1234 has not yet started')
645
        self.scheduler.get_maintenance.assert_called_once_with('1234')
646
        self.scheduler.update.assert_not_called()
647
648 View Code Duplication
    def test_extend_case_6(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
649
        """Test maintenance already finished."""
650
        start1 = datetime.now(pytz.utc) - timedelta(hours=3)
651
        end1 = start1 + timedelta(hours=2)
652
        self.scheduler.get_maintenance.return_value = MW.construct(
653
            id = '1234',
654
            start = start1.replace(microsecond=0),
655
            end = end1.replace(microsecond=0),
656
            switches = [
657
                '00:00:00:00:00:00:12:23'
658
            ],
659
            status = 'finished',
660
        )
661
        url = f'{self.server_name_url}/1234/extend'
662
        payload = {
663
            'minutes': 240
664
        }
665
        response = self.api.patch(url, data=json.dumps(payload),
666
                                  content_type='application/json')
667
        self.assertEqual(response.status_code, 400)
668
        current_data = json.loads(response.data)
669
        self.assertEqual(current_data['description'],
670
                         'Maintenance window 1234 has already finished')
671
        self.scheduler.get_maintenance.assert_called_once_with('1234')
672
        self.scheduler.update.assert_not_called()
673
674
    def test_extend_case_7(self):
675
        """Test no maintenace found."""
676
        self.scheduler.get_maintenance.return_value = None
677
        url = f'{self.server_name_url}/1235/extend'
678
        payload = {
679
            'minutes': 240
680
        }
681
        response = self.api.patch(url, data=json.dumps(payload),
682
                                  content_type='application/json')
683
        self.assertEqual(response.status_code, 404)
684
        current_data = json.loads(response.data)
685
        self.assertEqual(current_data['description'],
686
                         'Maintenance with id 1235 not found')
687
        self.scheduler.get_maintenance.assert_called_once_with('1235')
688
        self.scheduler.update.assert_not_called()
689