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

TestMain.test_extend_case_2()   A

Complexity

Conditions 1

Size

Total Lines 9
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 8
nop 1
dl 0
loc 9
rs 10
c 0
b 0
f 0
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.update.assert_not_called()
328
329
    def test_update_mw_case_2(self):
330
        """Test update no data."""
331
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
332
        payload = {
333
            "start": start1.strftime(TIME_FMT),
334
        }
335
        url = f'{self.server_name_url}/1234'
336
        response = self.api.patch(url, data=json.dumps(payload),
337
                                  content_type='text/plain')
338
        current_data = json.loads(response.data)
339
        self.assertEqual(response.status_code, 415)
340
        self.assertEqual(current_data['description'],
341
                         'The request does not have a json')
342
        self.scheduler.update.assert_not_called()
343
344
    def test_update_mw_case_3(self):
345
        """Test successful update."""
346
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
347
        end1 = start1 + timedelta(hours=6)
348
        self.scheduler.get_maintenance.return_value = MW.construct(
349
            id = '1234',
350
            start = start1.replace(microsecond=0),
351
            end = end1.replace(microsecond=0),
352
            switches = [
353
                '00:00:00:00:00:00:12:23'
354
            ],
355
        )
356
        start_new = datetime.now(pytz.utc) + timedelta(days=1, hours=3)
357
        payload = {
358
            "start": start_new.strftime(TIME_FMT),
359
        }
360
        url = f'{self.server_name_url}/1234'
361
        response = self.api.patch(url, data=json.dumps(payload),
362
                                  content_type='application/json')
363
        current_data = json.loads(response.data)
364
        self.assertEqual(current_data,
365
                         {'response': 'Maintenance 1234 updated'})
366
        self.assertEqual(response.status_code, 200)
367
        self.scheduler.get_maintenance.assert_called_once_with('1234')
368
        self.scheduler.update.assert_called_once_with(
369
            MW.construct(
370
                id = '1234',
371
                start = start_new.replace(microsecond=0),
372
                end = end1.replace(microsecond=0),
373
                switches = [
374
                    '00:00:00:00:00:00:12:23'
375
                ],
376
            )
377
        )
378
379 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...
380
        """Test successful update."""
381
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
382
        end1 = start1 + timedelta(hours=6)
383
        self.scheduler.get_maintenance.return_value = MW.construct(
384
            id = '1234',
385
            start = start1.replace(microsecond=0),
386
            end = end1.replace(microsecond=0),
387
            switches = [
388
                '00:00:00:00:00:00:12:23'
389
            ],
390
        )
391
        start_new = datetime.now(pytz.utc) - timedelta(days=1, hours=3)
392
        payload = {
393
            "start": start_new.strftime(TIME_FMT),
394
        }
395
        url = f'{self.server_name_url}/1234'
396
        response = self.api.patch(url, data=json.dumps(payload),
397
                                  content_type='application/json')
398
        current_data = json.loads(response.data)
399
        self.assertEqual(response.status_code, 400)
400
        self.assertEqual(current_data['description'],
401
                         'Start in the past not allowed')
402
        self.scheduler.get_maintenance.assert_called_once_with('1234')
403
        self.scheduler.update.assert_not_called()
404
405
    def test_update_mw_case_5(self):
406
        """Test successful update."""
407
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
408
        end1 = start1 + timedelta(hours=6)
409
        self.scheduler.get_maintenance.return_value = MW.construct(
410
            id = '1234',
411
            start = start1.replace(microsecond=0),
412
            end = end1.replace(microsecond=0),
413
            switches = [
414
                '00:00:00:00:00:00:12:23'
415
            ],
416
        )
417
        start_new = datetime.now(pytz.utc) + timedelta(days=1, hours=3)
418
        end_new = start_new - timedelta(hours=5)
419
        payload = {
420
            "start": start_new.strftime(TIME_FMT),
421
            "end": end_new.strftime(TIME_FMT)
422
        }
423
        url = f'{self.server_name_url}/1234'
424
        response = self.api.patch(url, data=json.dumps(payload),
425
                                  content_type='application/json')
426
        current_data = json.loads(response.data)
427
        self.assertEqual(response.status_code, 400)
428
        self.assertEqual(current_data['description'],
429
                         'End before start not allowed')
430
        self.scheduler.get_maintenance.assert_called_once_with('1234')
431
        self.scheduler.update.assert_not_called()
432
433
    def test_update_mw_case_6(self):
434
        """Test successful update."""
435
        start1 = datetime.now(pytz.utc) + timedelta(days=1)
436
        end1 = start1 + timedelta(hours=6)
437
        self.scheduler.get_maintenance.return_value = MW.construct(
438
            id = '1234',
439
            start = start1.replace(microsecond=0),
440
            end = end1.replace(microsecond=0),
441
            switches = [
442
                '00:00:00:00:00:00:12:23'
443
            ],
444
        )
445
        start_new = datetime.now(pytz.utc) + timedelta(days=1, hours=3)
446
        payload = {
447
            "start": start_new.strftime(TIME_FMT),
448
            "switches": [],
449
            'interfaces': [],
450
            'links': [],
451
        }
452
453
        url = f'{self.server_name_url}/1234'
454
        response = self.api.patch(url, data=json.dumps(payload),
455
                                  content_type='application/json')
456
        current_data = json.loads(response.data)
457
        self.assertEqual(response.status_code, 400)
458
        self.assertEqual(current_data['description'],
459
                         'At least one item must be provided')
460
        self.scheduler.get_maintenance.assert_called_once_with('1234')
461
        self.scheduler.update.assert_not_called()
462
463
    def test_end_mw_case_1(self):
464
        """Test method that finishes the maintenance now."""
465
        self.scheduler.get_maintenance.return_value = None
466
        url = f'{self.server_name_url}/2345/end'
467
        response = self.api.patch(url)
468
        current_data = json.loads(response.data)
469
        self.assertEqual(response.status_code, 404)
470
        self.assertEqual(current_data['description'],
471
                         'Maintenance with id 2345 not found')
472
473
    def test_end_mw_case_2(self):
474
        """Test method that finishes the maintenance now."""
475
        start1 = datetime.now(pytz.utc) - timedelta(hours=1)
476
        end1 = start1 + timedelta(hours=6)
477
        self.scheduler.get_maintenance.return_value = MW.construct(
478
            id = '1234',
479
            start = start1.replace(microsecond=0),
480
            end = end1.replace(microsecond=0),
481
            switches = [
482
                '00:00:00:00:00:00:12:23'
483
            ],
484
            status = 'running',
485
        )
486
        url = f'{self.server_name_url}/1234/end'
487
        response = self.api.patch(url)
488
        current_data = json.loads(response.data)
489
        self.scheduler.get.asssert_called_once_with('1234')
490
        self.scheduler.end_maintenance_early.assert_called_once_with('1234')
491
        self.assertEqual(response.status_code, 200)
492
        self.assertEqual(current_data,
493
                         {'response': 'Maintenance window 1234 finished'})
494
495
    def test_end_mw_case_3(self):
496
        """Test method that finishes the maintenance now."""
497
        start1 = datetime.now(pytz.utc) + timedelta(hours=1)
498
        end1 = start1 + timedelta(hours=6)
499
        self.scheduler.get_maintenance.return_value = MW.construct(
500
            id = '1234',
501
            start = start1.replace(microsecond=0),
502
            end = end1.replace(microsecond=0),
503
            switches = [
504
                '00:00:00:00:00:00:12:23'
505
            ],
506
            status = 'pending',
507
        )
508
        url = f'{self.server_name_url}/1234/end'
509
        response = self.api.patch(url)
510
        current_data = json.loads(response.data)
511
        self.scheduler.get.asssert_called_once_with('1234')
512
        self.scheduler.end_maintenance_early.assert_not_called()
513
        self.assertEqual(response.status_code, 400)
514
        self.assertEqual(current_data['description'],
515
                         'Maintenance window 1234 has not yet started')
516
517
    def test_end_mw_case_4(self):
518
        """Test method that finishes the maintenance now."""
519
        start1 = datetime.now(pytz.utc) - timedelta(hours=5)
520
        end1 = start1 + timedelta(hours=4)
521
        self.scheduler.get_maintenance.return_value = MW.construct(
522
            id = '1234',
523
            start = start1.replace(microsecond=0),
524
            end = end1.replace(microsecond=0),
525
            switches = [
526
                '00:00:00:00:00:00:12:23'
527
            ],
528
            status = 'finished',
529
        )
530
        url = f'{self.server_name_url}/1234/end'
531
        response = self.api.patch(url)
532
        current_data = json.loads(response.data)
533
        self.scheduler.get.asssert_called_once_with('1234')
534
        self.scheduler.end_maintenance_early.assert_not_called()
535
        self.assertEqual(response.status_code, 400)
536
        self.assertEqual(current_data['description'],
537
                         'Maintenance window 1234 has already finished')
538
539
    def test_extend_case_1(self):
540
        """Test successful extension."""
541
        start1 = datetime.now(pytz.utc) - timedelta(hours=3)
542
        end1 = start1 + timedelta(hours=4)
543
        self.scheduler.get_maintenance.return_value = MW.construct(
544
            id = '1234',
545
            start = start1.replace(microsecond=0),
546
            end = end1.replace(microsecond=0),
547
            switches = [
548
                '00:00:00:00:00:00:12:23'
549
            ],
550
            status = 'running',
551
        )
552
        url = f'{self.server_name_url}/1234/extend'
553
        payload = {
554
            'minutes': 45
555
        }
556
        response = self.api.patch(url, data=json.dumps(payload),
557
                                  content_type='application/json')
558
        self.assertEqual(response.status_code, 200)
559
        self.scheduler.get_maintenance.called_with('1234')
560
        self.scheduler.update.assert_called_with(MW.construct(
561
            id = '1234',
562
            start = start1.replace(microsecond=0),
563
            end = end1.replace(microsecond=0) + timedelta(minutes=45),
564
            switches = [
565
                '00:00:00:00:00:00:12:23'
566
            ],
567
            status = 'running',
568
        ))
569
570
    def test_extend_case_2(self):
571
        """Test no payload error."""
572
        url = f'{self.server_name_url}/1234/extend'
573
        response = self.api.patch(url)
574
        self.assertEqual(response.status_code, 415)
575
        current_data = json.loads(response.data)
576
        self.assertEqual(current_data['description'],
577
                         'The request does not have a json')
578
        self.scheduler.update.assert_not_called()
579
580
    def test_extend_case_3(self):
581
        """Test payload without minutes."""
582
        url = f'{self.server_name_url}/1234/extend'
583
        payload = {
584
            'seconds': 240
585
        }
586
        response = self.api.patch(url, data=json.dumps(payload),
587
                                  content_type='application/json')
588
        self.assertEqual(response.status_code, 400)
589
        current_data = json.loads(response.data)
590
        self.assertEqual(current_data['description'],
591
                         'Minutes of extension must be sent')
592
        self.scheduler.update.assert_not_called()
593
594
    def test_extend_case_4(self):
595
        """Test no integer extension minutes."""
596
        url = f'{self.server_name_url}/1234/extend'
597
        payload = {
598
            'minutes': '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 integer')
606
        self.scheduler.update.assert_not_called()
607
608 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...
609
        """Test maintenance did not start."""
610
        start1 = datetime.now(pytz.utc) + timedelta(hours=3)
611
        end1 = start1 + timedelta(hours=4)
612
        self.scheduler.get_maintenance.return_value = MW.construct(
613
            id = '1234',
614
            start = start1.replace(microsecond=0),
615
            end = end1.replace(microsecond=0),
616
            switches = [
617
                '00:00:00:00:00:00:12:23'
618
            ],
619
            status = 'pending',
620
        )
621
        url = f'{self.server_name_url}/1234/extend'
622
        payload = {
623
            'minutes': 240
624
        }
625
        response = self.api.patch(url, data=json.dumps(payload),
626
                                  content_type='application/json')
627
        self.assertEqual(response.status_code, 400)
628
        current_data = json.loads(response.data)
629
        self.assertEqual(current_data['description'],
630
                         'Maintenance window 1234 has not yet started')
631
        self.scheduler.get_maintenance.assert_called_once_with('1234')
632
        self.scheduler.update.assert_not_called()
633
634 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...
635
        """Test maintenance already finished."""
636
        start1 = datetime.now(pytz.utc) - timedelta(hours=3)
637
        end1 = start1 + timedelta(hours=2)
638
        self.scheduler.get_maintenance.return_value = MW.construct(
639
            id = '1234',
640
            start = start1.replace(microsecond=0),
641
            end = end1.replace(microsecond=0),
642
            switches = [
643
                '00:00:00:00:00:00:12:23'
644
            ],
645
            status = 'finished',
646
        )
647
        url = f'{self.server_name_url}/1234/extend'
648
        payload = {
649
            'minutes': 240
650
        }
651
        response = self.api.patch(url, data=json.dumps(payload),
652
                                  content_type='application/json')
653
        self.assertEqual(response.status_code, 400)
654
        current_data = json.loads(response.data)
655
        self.assertEqual(current_data['description'],
656
                         'Maintenance window 1234 has already finished')
657
        self.scheduler.get_maintenance.assert_called_once_with('1234')
658
        self.scheduler.update.assert_not_called()
659
660
    def test_extend_case_7(self):
661
        """Test no maintenace found."""
662
        self.scheduler.get_maintenance.return_value = None
663
        url = f'{self.server_name_url}/1235/extend'
664
        payload = {
665
            'minutes': 240
666
        }
667
        response = self.api.patch(url, data=json.dumps(payload),
668
                                  content_type='application/json')
669
        self.assertEqual(response.status_code, 404)
670
        current_data = json.loads(response.data)
671
        self.assertEqual(current_data['description'],
672
                         'Maintenance with id 1235 not found')
673
        self.scheduler.get_maintenance.assert_called_once_with('1235')
674
        self.scheduler.update.assert_not_called()
675