2016-12-29 14:13:22 +01:00
|
|
|
from unittest import mock
|
2022-03-17 17:37:33 +01:00
|
|
|
from urllib import parse as urlparse
|
|
|
|
|
2016-08-25 21:13:50 +02:00
|
|
|
import pytest
|
2016-12-29 14:13:22 +01:00
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
from requests.exceptions import HTTPError
|
2016-08-25 21:13:50 +02:00
|
|
|
|
2017-11-23 12:11:55 +01:00
|
|
|
from passerelle.apps.clicrdv.models import ClicRdv
|
2020-12-14 18:53:04 +01:00
|
|
|
from passerelle.base.models import AccessRight, ApiUser
|
2022-03-18 09:46:37 +01:00
|
|
|
from tests.test_manager import login
|
2020-11-30 15:28:42 +01:00
|
|
|
|
2016-08-25 21:13:50 +02:00
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def connector(db):
|
2016-08-30 17:38:39 +02:00
|
|
|
return ClicRdv.objects.create(
|
|
|
|
slug='test', group_id='5242', apikey='test', username='test', password='test'
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2020-11-30 15:28:42 +01:00
|
|
|
def test_connector_is_legacy(connector, app, admin_user):
|
|
|
|
app = login(app)
|
|
|
|
|
|
|
|
# check the existing instance is displayed on homepage
|
|
|
|
resp = app.get('/manage/', status=200)
|
|
|
|
assert 'Clicrdv Agenda' in resp
|
|
|
|
|
|
|
|
# and check it's not available on "add connector" page
|
|
|
|
resp = resp.click('Add Connector')
|
|
|
|
assert 'Clicrdv Agenda' not in resp
|
|
|
|
|
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
@mock.patch('passerelle.utils.Request.request')
|
|
|
|
def test_request_call(mocked_request, app, connector):
|
|
|
|
mocked_request.json.return_value = 'foo'
|
|
|
|
connector.request('bar')
|
|
|
|
assert mocked_request.call_count == 1
|
|
|
|
req = mocked_request.call_args[0][1]
|
|
|
|
assert req.startswith('https://sandbox.clicrdv.com/api/v1/groups/5242/bar')
|
2016-08-30 17:38:39 +02:00
|
|
|
|
2016-08-25 21:13:50 +02:00
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
@mock.patch('passerelle.utils.Request.request')
|
|
|
|
def test_interventionsets(mocked_request, app, connector):
|
|
|
|
response = mock.Mock()
|
|
|
|
response.json.return_value = {
|
2016-08-25 21:13:50 +02:00
|
|
|
'totalRecords': 2,
|
|
|
|
'records': [
|
|
|
|
{
|
|
|
|
'sort': 1,
|
|
|
|
'publicname': 'Une Demande de Passeport',
|
|
|
|
'name': 'Demande',
|
|
|
|
'id': 7032,
|
|
|
|
'group_id': 5242,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'sort': 2,
|
|
|
|
'publicname': 'Un Retrait de Passeport',
|
|
|
|
'name': 'Retrait',
|
|
|
|
'id': 7033,
|
|
|
|
'group_id': 5242,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
}
|
2016-12-29 14:13:22 +01:00
|
|
|
mocked_request.return_value = response
|
2016-08-25 21:13:50 +02:00
|
|
|
resp = app.get('/clicrdv/test/interventionsets/')
|
|
|
|
assert len(resp.json.get('data')) == 2
|
|
|
|
assert resp.json.get('data')[0]['text'] == 'Une Demande de Passeport'
|
|
|
|
|
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
@mock.patch('passerelle.utils.Request.request')
|
|
|
|
def test_interventionsets_details(mocked_request, app, connector):
|
|
|
|
response = mock.Mock()
|
|
|
|
response.json.return_value = {
|
2016-08-25 21:13:50 +02:00
|
|
|
'totalRecords': 2,
|
|
|
|
'records': [
|
|
|
|
{
|
|
|
|
'sort': 1,
|
|
|
|
'publicname': 'pour une personne',
|
|
|
|
'description': None,
|
|
|
|
'name': '1 personne',
|
|
|
|
'interventionset_id': 7032,
|
|
|
|
'group_id': 5242,
|
|
|
|
'id': 63258,
|
|
|
|
'abbr': '1 demande',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'sort': 2,
|
|
|
|
'publicname': 'pour deuxs personnes',
|
|
|
|
'description': None,
|
|
|
|
'name': '2 personnes',
|
|
|
|
'interventionset_id': 7032,
|
|
|
|
'group_id': 5242,
|
|
|
|
'id': 63259,
|
|
|
|
'abbr': '2 demandes',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
}
|
2016-12-29 14:13:22 +01:00
|
|
|
mocked_request.return_value = response
|
2016-08-25 21:13:50 +02:00
|
|
|
resp = app.get('/clicrdv/test/interventionsets/7032/')
|
|
|
|
assert len(resp.json.get('data')) == 2
|
|
|
|
assert resp.json.get('data')[0]['text'] == 'pour une personne'
|
2016-08-30 17:38:39 +02:00
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
|
|
|
|
@mock.patch('passerelle.utils.Request.request')
|
|
|
|
def test_interventions_get_datetimes(mocked_request, app, connector):
|
|
|
|
response = mock.Mock()
|
|
|
|
response.json.return_value = {'availabletimeslots': []}
|
|
|
|
mocked_request.return_value = response
|
2016-08-30 17:38:39 +02:00
|
|
|
resp = app.get('/clicrdv/test/interventions/63258/dates/')
|
|
|
|
assert resp.json.get('data') == []
|
|
|
|
assert resp.json.get('err') == 0
|
2016-12-29 14:13:22 +01:00
|
|
|
assert mocked_request.call_count == 1
|
|
|
|
url = mocked_request.call_args[0][1]
|
2016-08-30 17:38:39 +02:00
|
|
|
# https://sandbox.clicrdv.com/api/v1/groups/5242/availabletimeslots?
|
|
|
|
# intervention_ids[]=63258&start=2016-09-21&end=2017-09-22&apikey=test&format=json
|
|
|
|
scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
|
|
|
|
query = urlparse.parse_qs(query, keep_blank_values=True)
|
|
|
|
assert scheme == 'https'
|
|
|
|
assert netloc == 'sandbox.clicrdv.com'
|
|
|
|
assert path == '/api/v1/groups/5242/availabletimeslots'
|
|
|
|
assert params == ''
|
|
|
|
assert fragment == ''
|
|
|
|
assert query['intervention_ids[]'] == ['63258']
|
|
|
|
assert 'start' in query
|
|
|
|
assert 'end' in query
|
|
|
|
assert query['apikey'] == ['test']
|
|
|
|
assert query['format'] == ['json']
|
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
response.json.return_value = {
|
|
|
|
'availabletimeslots': [{'start': '2016-09-21 12:34:56'}, {'start': '2016-09-22 11:22:33'}]
|
|
|
|
}
|
|
|
|
mocked_request.return_value = response
|
2016-08-30 17:38:39 +02:00
|
|
|
resp = app.get('/clicrdv/test/interventions/63258/dates/').json
|
2016-12-29 14:13:22 +01:00
|
|
|
assert mocked_request.call_count == 2
|
2016-08-30 17:38:39 +02:00
|
|
|
assert resp.get('err') == 0
|
|
|
|
assert len(resp.get('data')) == 2
|
|
|
|
assert resp['data'][0] == {'id': '2016-09-21', 'text': '21 September 2016'}
|
|
|
|
assert resp['data'][1] == {'id': '2016-09-22', 'text': '22 September 2016'}
|
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
response.json.return_value = {
|
2016-08-30 17:38:39 +02:00
|
|
|
'availabletimeslots': [{'start': '2016-09-22 11:22:33'}, {'start': '2016-09-21 12:34:56'}]
|
2016-12-29 14:13:22 +01:00
|
|
|
} # will be sorted
|
|
|
|
mocked_request.return_value = response
|
2016-08-30 17:38:39 +02:00
|
|
|
resp = app.get('/clicrdv/test/interventions/63258/datetimes/').json
|
2016-12-29 14:13:22 +01:00
|
|
|
assert mocked_request.call_count == 3
|
2016-08-30 17:38:39 +02:00
|
|
|
assert resp.get('err') == 0
|
|
|
|
assert len(resp.get('data')) == 2
|
|
|
|
assert resp['data'][0] == {'id': '2016-09-21-12:34:56', 'text': '21 September 2016 12:34'}
|
|
|
|
assert resp['data'][1] == {'id': '2016-09-22-11:22:33', 'text': '22 September 2016 11:22'}
|
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
response.json.return_value = {
|
2016-08-30 17:38:39 +02:00
|
|
|
'availabletimeslots': [{'start': '2016-09-21 12:34:56'}, {'start': '2016-09-21 11:22:33'}]
|
2016-12-29 14:13:22 +01:00
|
|
|
} # will be sorted
|
|
|
|
mocked_request.return_value = response
|
2016-08-30 17:38:39 +02:00
|
|
|
resp = app.get('/clicrdv/test/interventions/63258/2016-09-21/times').json
|
2016-12-29 14:13:22 +01:00
|
|
|
assert mocked_request.call_count == 4
|
|
|
|
url = mocked_request.call_args[0][1]
|
2016-08-30 17:38:39 +02:00
|
|
|
scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
|
|
|
|
query = urlparse.parse_qs(query, keep_blank_values=True)
|
|
|
|
assert query['start'] == ['2016-09-21 00:00:00']
|
|
|
|
assert query['end'] == ['2016-09-21 23:59:59']
|
|
|
|
assert resp.get('err') == 0
|
|
|
|
assert len(resp.get('data')) == 2
|
|
|
|
assert resp['data'][0] == {'id': '11:22:33', 'text': '11:22'}
|
|
|
|
assert resp['data'][1] == {'id': '12:34:56', 'text': '12:34'}
|
2016-12-29 14:13:22 +01:00
|
|
|
|
2020-01-30 10:26:22 +01:00
|
|
|
|
|
|
|
@mock.patch('passerelle.utils.Request.request')
|
|
|
|
def test_interventions_get_datetimes_error(mocked_request, app, connector):
|
|
|
|
def raise_for_status():
|
|
|
|
raise HTTPError('400 Client Error: Bad Request for url: xxx')
|
|
|
|
|
|
|
|
response = mock.Mock()
|
|
|
|
response.json.return_value = [
|
|
|
|
{'error': 'The intervention_ids parameter contains at least one invalid id'}
|
|
|
|
]
|
|
|
|
response.raise_for_status = raise_for_status
|
|
|
|
mocked_request.return_value = response
|
|
|
|
|
|
|
|
resp = app.get('/clicrdv/test/interventions/63258/datetimes/').json
|
|
|
|
assert len(resp.get('data')) == 0
|
|
|
|
|
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
@mock.patch('passerelle.utils.Request.request')
|
|
|
|
def test_cancel_appointment(mocked_request, app, connector):
|
|
|
|
obj_type = ContentType.objects.get_for_model(ClicRdv)
|
|
|
|
apiuser = ApiUser.objects.create(username='apiuser', keytype='API', key='apiuser')
|
|
|
|
AccessRight.objects.create(
|
|
|
|
codename='can_manage_appointment', resource_type=obj_type, resource_pk=connector.pk, apiuser=apiuser
|
|
|
|
)
|
|
|
|
|
|
|
|
resp = app.get('/clicrdv/test/63258/cancel?apikey=apiuser').json
|
|
|
|
assert mocked_request.call_count == 1
|
|
|
|
assert resp['data']['success']
|
|
|
|
|
2021-02-20 16:26:01 +01:00
|
|
|
|
2020-01-28 18:16:03 +01:00
|
|
|
@mock.patch('passerelle.utils.Request.request')
|
2016-12-29 14:13:22 +01:00
|
|
|
def test_failed_cancel_appointment(mocked_request, app, connector):
|
2020-01-28 18:16:03 +01:00
|
|
|
def raise_for_status():
|
|
|
|
raise HTTPError('400 Client Error: Bad Request for url: xxx')
|
|
|
|
|
|
|
|
response = mock.Mock()
|
|
|
|
response.json.return_value = [{'msg': 'cancel failed'}]
|
|
|
|
response.raise_for_status = raise_for_status
|
|
|
|
mocked_request.return_value = response
|
2016-12-29 14:13:22 +01:00
|
|
|
obj_type = ContentType.objects.get_for_model(ClicRdv)
|
|
|
|
apiuser = ApiUser.objects.create(username='apiuser', keytype='API', key='apiuser')
|
|
|
|
AccessRight.objects.create(
|
|
|
|
codename='can_manage_appointment', resource_type=obj_type, resource_pk=connector.pk, apiuser=apiuser
|
|
|
|
)
|
|
|
|
resp = app.get('/clicrdv/test/63258/cancel?apikey=apiuser').json
|
|
|
|
assert mocked_request.call_count == 1
|
|
|
|
assert resp.get('err') == 0
|
|
|
|
assert resp['data']
|
2020-01-28 18:16:03 +01:00
|
|
|
assert 'cancel failed' in resp['data']['error']
|
2016-12-29 14:13:22 +01:00
|
|
|
|
|
|
|
|
2020-01-28 18:16:03 +01:00
|
|
|
@mock.patch('passerelle.utils.Request.request')
|
2016-12-29 14:13:22 +01:00
|
|
|
def test_failed_appointment_creation(mocked_request, app, connector):
|
2020-01-28 18:16:03 +01:00
|
|
|
def raise_for_status():
|
|
|
|
raise HTTPError('400 Client Error: Bad Request for url: xxx')
|
|
|
|
|
|
|
|
response = mock.Mock()
|
|
|
|
response.json.return_value = [{'msg': 'creation failed'}]
|
|
|
|
response.raise_for_status = raise_for_status
|
|
|
|
mocked_request.return_value = response
|
2016-12-29 14:13:22 +01:00
|
|
|
obj_type = ContentType.objects.get_for_model(ClicRdv)
|
|
|
|
apiuser = ApiUser.objects.create(username='apiuser', keytype='API', key='apiuser')
|
|
|
|
AccessRight.objects.create(
|
|
|
|
codename='can_manage_appointment', resource_type=obj_type, resource_pk=connector.pk, apiuser=apiuser
|
|
|
|
)
|
2021-02-20 16:26:01 +01:00
|
|
|
|
2016-12-29 14:13:22 +01:00
|
|
|
data = {
|
|
|
|
'fields': {
|
|
|
|
'clicrdv_date_raw': '2017-01-01',
|
|
|
|
'clicrdv_time_raw': '12:00:00',
|
2020-01-27 18:54:39 +01:00
|
|
|
'clicrdv_fiche_str10': 'Test',
|
2016-12-29 14:13:22 +01:00
|
|
|
'firstname': 'Foo',
|
|
|
|
'lastname': 'Bar',
|
|
|
|
'email': 'foobar@example.com',
|
|
|
|
}
|
2021-02-20 16:26:01 +01:00
|
|
|
}
|
2016-12-29 14:13:22 +01:00
|
|
|
resp = app.post_json('/clicrdv/test/interventions/63258/create?apikey=apiuser', params=data).json
|
|
|
|
assert resp['data']
|
|
|
|
assert not resp['data']['success']
|
2020-01-28 18:16:03 +01:00
|
|
|
assert 'creation failed' in resp['data']['error']
|