24 |
24 |
|
25 |
25 |
import httmock
|
26 |
26 |
import lxml.etree as ET
|
27 |
27 |
import mock
|
28 |
28 |
import pytest
|
29 |
29 |
import utils
|
30 |
30 |
from test_manager import login
|
31 |
31 |
|
|
32 |
from passerelle.base.models import Job
|
32 |
33 |
from passerelle.contrib.toulouse_smart.models import ToulouseSmartResource, WcsRequest
|
33 |
34 |
|
34 |
35 |
TEST_BASE_DIR = os.path.join(os.path.dirname(__file__), 'data', 'toulouse_smart')
|
35 |
36 |
|
36 |
37 |
|
37 |
38 |
@pytest.fixture
|
38 |
39 |
def smart(db):
|
39 |
40 |
return utils.make_resource(
|
... | ... | |
42 |
43 |
slug='test',
|
43 |
44 |
description='Test',
|
44 |
45 |
webservice_base_url='https://smart.example.com/',
|
45 |
46 |
basic_auth_username='username',
|
46 |
47 |
basic_auth_password='password',
|
47 |
48 |
)
|
48 |
49 |
|
49 |
50 |
|
|
51 |
@pytest.fixture
|
|
52 |
def wcs_service(settings):
|
|
53 |
wcs_service = {
|
|
54 |
'default': {
|
|
55 |
'title': 'test',
|
|
56 |
'url': 'https://wcs.example.com',
|
|
57 |
'secret': 'xxx',
|
|
58 |
'orig': 'passerelle',
|
|
59 |
},
|
|
60 |
}
|
|
61 |
settings.KNOWN_SERVICES = {'wcs': wcs_service}
|
|
62 |
return wcs_service
|
|
63 |
|
|
64 |
|
50 |
65 |
def mock_response(*path_contents):
|
51 |
66 |
def decorator(func):
|
52 |
67 |
@httmock.urlmatch()
|
53 |
68 |
def error(url, request):
|
54 |
69 |
assert False, 'request to %s' % url.geturl()
|
55 |
70 |
|
56 |
71 |
def register(path, payload, content, status_code=200):
|
57 |
72 |
@httmock.urlmatch(path=path)
|
... | ... | |
440 |
455 |
|
441 |
456 |
assert smart.wcs_requests.count() == 1
|
442 |
457 |
wcs_request = smart.wcs_requests.get(uuid=UUID)
|
443 |
458 |
assert wcs_request.status == 'received'
|
444 |
459 |
|
445 |
460 |
# same uuid is re-used after an error
|
446 |
461 |
resp = app.post_json(URL + 'create-intervention/', params=CREATE_INTERVENTION_PAYLOAD)
|
447 |
462 |
assert smart.wcs_requests.count() == 1
|
|
463 |
|
|
464 |
|
|
465 |
WCS_RESPONSE_SUCCESS = '{"err": 0, "url": null}'
|
|
466 |
WCS_RESPONSE_ERROR = '{"err": 1, "err_class": "Access denied", "err_desc": null}'
|
|
467 |
|
|
468 |
|
|
469 |
@mock_response(
|
|
470 |
['/v1/type-intervention', None, INTERVENTION_TYPES],
|
|
471 |
['/v1/intervention', CREATE_INTERVENTION_QUERY, get_json_file('create_intervention')],
|
|
472 |
['/foo/2/jump/trigger/my-trigger-slug', None, WCS_RESPONSE_SUCCESS],
|
|
473 |
)
|
|
474 |
@mock.patch("django.db.models.fields.UUIDField.get_default", return_value=UUID)
|
|
475 |
def test_update_intervention(mocked_uuid, app, freezer, smart, wcs_service):
|
|
476 |
resp = app.post_json(URL + 'create-intervention/', params=CREATE_INTERVENTION_PAYLOAD)
|
|
477 |
assert not resp.json['err']
|
|
478 |
assert CREATE_INTERVENTION_QUERY['notificationUrl'] == 'update-intervention?uuid=%s' % str(UUID)
|
|
479 |
|
|
480 |
freezer.move_to('2021-07-08 00:00:00')
|
|
481 |
assert Job.objects.filter(method_name='update_intervention_job').count() == 0
|
|
482 |
url = URL + 'update-intervention?uuid=%s&trigger=my-trigger-slug' % str(UUID)
|
|
483 |
resp = app.post_json(url)
|
|
484 |
assert not resp.json['err']
|
|
485 |
assert Job.objects.filter(method_name='update_intervention_job').count() == 1
|
|
486 |
job = Job.objects.get(method_name='update_intervention_job')
|
|
487 |
assert job.status == 'registered'
|
|
488 |
wcs_request = smart.wcs_requests.get(uuid=UUID)
|
|
489 |
assert wcs_request.status == 'updating'
|
|
490 |
assert wcs_request.trigger == 'my-trigger-slug'
|
|
491 |
|
|
492 |
freezer.move_to('2021-07-08 00:00:03')
|
|
493 |
smart.jobs()
|
|
494 |
job = Job.objects.get(method_name='update_intervention_job')
|
|
495 |
assert job.status == 'completed'
|
|
496 |
wcs_request = smart.wcs_requests.get(uuid=UUID)
|
|
497 |
assert wcs_request.status == 'updated'
|
|
498 |
assert wcs_request.trigger == 'my-trigger-slug'
|
|
499 |
|
|
500 |
|
|
501 |
def test_update_intervention_wrong_uuid(app, smart):
|
|
502 |
with pytest.raises(WcsRequest.DoesNotExist):
|
|
503 |
smart.wcs_requests.get(uuid=UUID)
|
|
504 |
|
|
505 |
url = URL + 'update-intervention?uuid=%s&trigger=my-trigger-slug' % str(UUID)
|
|
506 |
resp = app.post_json(url)
|
|
507 |
assert resp.json['err']
|
|
508 |
assert 'Cannot find intervention' in resp.json['err_desc']
|
|
509 |
|
|
510 |
|
|
511 |
@mock_response(
|
|
512 |
['/v1/type-intervention', None, INTERVENTION_TYPES],
|
|
513 |
['/v1/intervention', CREATE_INTERVENTION_QUERY, get_json_file('create_intervention')],
|
|
514 |
)
|
|
515 |
@mock.patch("django.db.models.fields.UUIDField.get_default", return_value=UUID)
|
|
516 |
def test_update_intervention_wrong_service(mocked_uuid, app, freezer, smart, wcs_service):
|
|
517 |
wcs_service['default']['url'] = 'http://wrong.example.com'
|
|
518 |
|
|
519 |
resp = app.post_json(URL + 'create-intervention/', params=CREATE_INTERVENTION_PAYLOAD)
|
|
520 |
assert not resp.json['err']
|
|
521 |
|
|
522 |
freezer.move_to('2021-07-08 00:00:00')
|
|
523 |
url = URL + 'update-intervention?uuid=%s&trigger=my-trigger-slug' % str(UUID)
|
|
524 |
resp = app.post_json(url)
|
|
525 |
assert not resp.json['err']
|
|
526 |
assert Job.objects.filter(method_name='update_intervention_job').count() == 1
|
|
527 |
|
|
528 |
freezer.move_to('2021-07-08 00:00:03')
|
|
529 |
smart.jobs()
|
|
530 |
job = Job.objects.get(method_name='update_intervention_job')
|
|
531 |
assert job.status == 'failed'
|
|
532 |
assert 'Cannot find wcs service' in job.status_details['error_summary']
|
|
533 |
wcs_request = smart.wcs_requests.get(uuid=UUID)
|
|
534 |
assert wcs_request.status == 'failed'
|
|
535 |
|
|
536 |
|
|
537 |
@mock_response(
|
|
538 |
['/v1/type-intervention', None, INTERVENTION_TYPES],
|
|
539 |
['/v1/intervention', CREATE_INTERVENTION_QUERY, get_json_file('create_intervention')],
|
|
540 |
['/foo/2/jump/trigger/my-trigger-slug', None, WCS_RESPONSE_ERROR, 403],
|
|
541 |
)
|
|
542 |
@mock.patch("django.db.models.fields.UUIDField.get_default", return_value=UUID)
|
|
543 |
def test_update_intervention_wrong_trigger(mocked_uuid, app, freezer, smart, wcs_service):
|
|
544 |
resp = app.post_json(URL + 'create-intervention/', params=CREATE_INTERVENTION_PAYLOAD)
|
|
545 |
assert not resp.json['err']
|
|
546 |
|
|
547 |
freezer.move_to('2021-07-08 00:00:00')
|
|
548 |
url = URL + 'update-intervention?uuid=%s&trigger=my-trigger-slug' % str(UUID)
|
|
549 |
resp = app.post_json(url)
|
|
550 |
assert not resp.json['err']
|
|
551 |
|
|
552 |
freezer.move_to('2021-07-08 00:00:03')
|
|
553 |
smart.jobs()
|
|
554 |
job = Job.objects.get(method_name='update_intervention_job')
|
|
555 |
assert job.status == 'failed'
|
|
556 |
assert 'Access denied' in job.status_details['error_summary']
|
|
557 |
wcs_request = smart.wcs_requests.get(uuid=UUID)
|
|
558 |
assert wcs_request.status == 'failed'
|
|
559 |
|
|
560 |
|
|
561 |
@mock_response(
|
|
562 |
['/v1/type-intervention', None, INTERVENTION_TYPES],
|
|
563 |
['/v1/intervention', CREATE_INTERVENTION_QUERY, get_json_file('create_intervention')],
|
|
564 |
['/foo/2/jump/trigger/my-trigger-slug', None, None, 500],
|
|
565 |
)
|
|
566 |
@mock.patch("django.db.models.fields.UUIDField.get_default", return_value=UUID)
|
|
567 |
def test_update_intervention_error_wcs(mocked_uuid, app, freezer, smart, wcs_service):
|
|
568 |
resp = app.post_json(URL + 'create-intervention/', params=CREATE_INTERVENTION_PAYLOAD)
|
|
569 |
assert not resp.json['err']
|
|
570 |
|
|
571 |
freezer.move_to('2021-07-08 00:00:00')
|
|
572 |
url = URL + 'update-intervention?uuid=%s&trigger=my-trigger-slug' % str(UUID)
|
|
573 |
resp = app.post_json(url)
|
|
574 |
assert not resp.json['err']
|
|
575 |
|
|
576 |
freezer.move_to('2021-07-08 00:00:03')
|
|
577 |
smart.jobs()
|
|
578 |
job = Job.objects.get(method_name='update_intervention_job')
|
|
579 |
assert job.status == 'registered'
|
|
580 |
assert job.update_timestamp > job.creation_timestamp
|
|
581 |
wcs_request = smart.wcs_requests.get(uuid=UUID)
|
|
582 |
assert wcs_request.status == 'updating'
|
|
583 |
|
|
584 |
|
|
585 |
@mock_response(
|
|
586 |
['/v1/type-intervention', None, INTERVENTION_TYPES],
|
|
587 |
['/v1/intervention', CREATE_INTERVENTION_QUERY, get_json_file('create_intervention')],
|
|
588 |
['/foo/2/jump/trigger/trigger-1', None, None, 500],
|
|
589 |
)
|
|
590 |
@mock.patch("django.db.models.fields.UUIDField.get_default", return_value=UUID)
|
|
591 |
def test_update_intervention_pending(mocked_uuid, app, freezer, smart, wcs_service):
|
|
592 |
resp = app.post_json(URL + 'create-intervention/', params=CREATE_INTERVENTION_PAYLOAD)
|
|
593 |
assert not resp.json['err']
|
|
594 |
|
|
595 |
freezer.move_to('2021-07-08 00:00:00')
|
|
596 |
url = URL + 'update-intervention?uuid=%s&trigger=trigger-1' % str(UUID)
|
|
597 |
resp = app.post_json(url)
|
|
598 |
assert not resp.json['err']
|
|
599 |
|
|
600 |
freezer.move_to('2021-07-08 00:00:03')
|
|
601 |
smart.jobs()
|
|
602 |
job = Job.objects.get(method_name='update_intervention_job')
|
|
603 |
assert job.status == 'registered'
|
|
604 |
assert job.update_timestamp > job.creation_timestamp
|
|
605 |
wcs_request = smart.wcs_requests.get(uuid=UUID)
|
|
606 |
assert wcs_request.status == 'updating'
|
|
607 |
|
|
608 |
url = URL + 'update-intervention?uuid=%s&trigger=trigger-2' % str(UUID)
|
|
609 |
resp = app.post_json(url)
|
|
610 |
assert resp.json['err']
|
|
611 |
assert "still triggering on 'trigger-1'" in resp.json['err_desc']
|
448 |
|
-
|