Test Failed
Pull Request — master (#64)
by
unknown
03:02
created

TestMain.test_get_mw_case_2()   B

Complexity

Conditions 1

Size

Total Lines 65
Code Lines 49

Duplication

Lines 0
Ratio 0 %

Importance

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