1 |
1 |
import mock
|
2 |
2 |
import pytest
|
3 |
3 |
import urlparse
|
4 |
|
from StringIO import StringIO
|
|
4 |
from requests.exceptions import HTTPError
|
|
5 |
|
|
6 |
from django.contrib.contenttypes.models import ContentType
|
5 |
7 |
|
6 |
8 |
from passerelle.base.models import ApiUser, AccessRight
|
7 |
9 |
from passerelle.apps.clicrdv.models import ClicRdv
|
... | ... | |
13 |
15 |
password='test')
|
14 |
16 |
|
15 |
17 |
|
16 |
|
@mock.patch('urllib2.urlopen')
|
17 |
|
def test_urlopen_call(urlopen, app, connector):
|
18 |
|
urlopen.return_value = StringIO('"foo"')
|
19 |
|
rjson = connector.get_json('bar')
|
20 |
|
assert urlopen.call_count == 1
|
21 |
|
req = urlopen.call_args[0][0]
|
22 |
|
assert req.get_full_url().startswith('https://sandbox.clicrdv.com/api/v1/groups/5242/bar')
|
|
18 |
@mock.patch('passerelle.utils.Request.request')
|
|
19 |
def test_request_call(mocked_request, app, connector):
|
|
20 |
mocked_request.json.return_value = "foo"
|
|
21 |
connector.request('bar')
|
|
22 |
assert mocked_request.call_count == 1
|
|
23 |
req = mocked_request.call_args[0][1]
|
|
24 |
assert req.startswith('https://sandbox.clicrdv.com/api/v1/groups/5242/bar')
|
23 |
25 |
|
24 |
26 |
|
25 |
|
@mock.patch('passerelle.apps.clicrdv.models.ClicRdv.get_json')
|
26 |
|
def test_interventionsets(mocked_get, app, connector):
|
27 |
|
mocked_get.return_value = {
|
|
27 |
@mock.patch('passerelle.utils.Request.request')
|
|
28 |
def test_interventionsets(mocked_request, app, connector):
|
|
29 |
response = mock.Mock()
|
|
30 |
response.json.return_value = {
|
28 |
31 |
"totalRecords": 2,
|
29 |
32 |
"records": [
|
30 |
33 |
{
|
... | ... | |
42 |
45 |
"group_id": 5242,
|
43 |
46 |
},
|
44 |
47 |
]}
|
|
48 |
mocked_request.return_value = response
|
45 |
49 |
resp = app.get('/clicrdv/test/interventionsets/')
|
46 |
50 |
assert len(resp.json.get('data')) == 2
|
47 |
51 |
assert resp.json.get('data')[0]['text'] == 'Une Demande de Passeport'
|
48 |
52 |
|
49 |
53 |
|
50 |
|
@mock.patch('passerelle.apps.clicrdv.models.ClicRdv.get_json')
|
51 |
|
def test_interventionsets_details(mocked_get, app, connector):
|
52 |
|
mocked_get.return_value = {
|
|
54 |
@mock.patch('passerelle.utils.Request.request')
|
|
55 |
def test_interventionsets_details(mocked_request, app, connector):
|
|
56 |
response = mock.Mock()
|
|
57 |
response.json.return_value = {
|
53 |
58 |
"totalRecords": 2,
|
54 |
59 |
"records": [
|
55 |
60 |
{
|
... | ... | |
73 |
78 |
"abbr": "2 demandes"
|
74 |
79 |
},
|
75 |
80 |
]}
|
76 |
|
|
|
81 |
mocked_request.return_value = response
|
77 |
82 |
resp = app.get('/clicrdv/test/interventionsets/7032/')
|
78 |
83 |
assert len(resp.json.get('data')) == 2
|
79 |
84 |
assert resp.json.get('data')[0]['text'] == 'pour une personne'
|
80 |
85 |
|
81 |
|
@mock.patch('urllib2.urlopen')
|
82 |
|
def test_interventions_get_datetimes(urlopen, app, connector):
|
83 |
|
urlopen.return_value = StringIO('{"availabletimeslots": []}')
|
|
86 |
@mock.patch('passerelle.utils.Request.request')
|
|
87 |
def test_interventions_get_datetimes(mocked_request, app, connector):
|
|
88 |
response = mock.Mock()
|
|
89 |
response.json.return_value = {"availabletimeslots": []}
|
|
90 |
mocked_request.return_value = response
|
84 |
91 |
resp = app.get('/clicrdv/test/interventions/63258/dates/')
|
85 |
92 |
assert resp.json.get('data') == []
|
86 |
93 |
assert resp.json.get('err') == 0
|
87 |
|
assert urlopen.call_count == 1
|
88 |
|
url = urlopen.call_args[0][0].get_full_url()
|
|
94 |
assert mocked_request.call_count == 1
|
|
95 |
url = mocked_request.call_args[0][1]
|
89 |
96 |
# https://sandbox.clicrdv.com/api/v1/groups/5242/availabletimeslots?
|
90 |
97 |
# intervention_ids[]=63258&start=2016-09-21&end=2017-09-22&apikey=test&format=json
|
91 |
98 |
scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
|
... | ... | |
101 |
108 |
assert query['apikey'] == ['test']
|
102 |
109 |
assert query['format'] == ['json']
|
103 |
110 |
|
104 |
|
urlopen.return_value = StringIO('''{"availabletimeslots": [
|
105 |
|
{ "start": "2016-09-21 12:34:56" },
|
106 |
|
{ "start": "2016-09-22 11:22:33" }
|
107 |
|
]}''')
|
|
111 |
response.json.return_value = {"availabletimeslots": [
|
|
112 |
{ "start": "2016-09-21 12:34:56" },
|
|
113 |
{ "start": "2016-09-22 11:22:33" }
|
|
114 |
]}
|
|
115 |
mocked_request.return_value = response
|
108 |
116 |
resp = app.get('/clicrdv/test/interventions/63258/dates/').json
|
109 |
|
assert urlopen.call_count == 2
|
|
117 |
assert mocked_request.call_count == 2
|
110 |
118 |
assert resp.get('err') == 0
|
111 |
119 |
assert len(resp.get('data')) == 2
|
112 |
120 |
assert resp['data'][0] == {'id': '2016-09-21', 'text': '21 September 2016'}
|
113 |
121 |
assert resp['data'][1] == {'id': '2016-09-22', 'text': '22 September 2016'}
|
114 |
122 |
|
115 |
|
urlopen.return_value = StringIO('''{"availabletimeslots": [
|
|
123 |
response.json.return_value = {"availabletimeslots": [
|
116 |
124 |
{ "start": "2016-09-22 11:22:33" },
|
117 |
125 |
{ "start": "2016-09-21 12:34:56" }
|
118 |
|
]}''') # will be sorted
|
|
126 |
]} # will be sorted
|
|
127 |
mocked_request.return_value = response
|
119 |
128 |
resp = app.get('/clicrdv/test/interventions/63258/datetimes/').json
|
120 |
|
assert urlopen.call_count == 3
|
|
129 |
assert mocked_request.call_count == 3
|
121 |
130 |
assert resp.get('err') == 0
|
122 |
131 |
assert len(resp.get('data')) == 2
|
123 |
132 |
assert resp['data'][0] == {'id': '2016-09-21-12:34:56', 'text': '21 September 2016 12:34'}
|
124 |
133 |
assert resp['data'][1] == {'id': '2016-09-22-11:22:33', 'text': '22 September 2016 11:22'}
|
125 |
134 |
|
126 |
|
urlopen.return_value = StringIO('''{"availabletimeslots": [
|
|
135 |
response.json.return_value = {"availabletimeslots": [
|
127 |
136 |
{ "start": "2016-09-21 12:34:56" },
|
128 |
137 |
{ "start": "2016-09-21 11:22:33" }
|
129 |
|
]}''') # will be sorted
|
|
138 |
]} # will be sorted
|
|
139 |
mocked_request.return_value = response
|
130 |
140 |
resp = app.get('/clicrdv/test/interventions/63258/2016-09-21/times').json
|
131 |
|
assert urlopen.call_count == 4
|
132 |
|
url = urlopen.call_args[0][0].get_full_url()
|
|
141 |
assert mocked_request.call_count == 4
|
|
142 |
url = mocked_request.call_args[0][1]
|
133 |
143 |
scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
|
134 |
144 |
query = urlparse.parse_qs(query, keep_blank_values=True)
|
135 |
145 |
assert query['start'] == ['2016-09-21 00:00:00']
|
... | ... | |
138 |
148 |
assert len(resp.get('data')) == 2
|
139 |
149 |
assert resp['data'][0] == {'id': '11:22:33', 'text': '11:22'}
|
140 |
150 |
assert resp['data'][1] == {'id': '12:34:56', 'text': '12:34'}
|
|
151 |
|
|
152 |
@mock.patch('passerelle.utils.Request.request')
|
|
153 |
def test_cancel_appointment(mocked_request, app, connector):
|
|
154 |
obj_type = ContentType.objects.get_for_model(ClicRdv)
|
|
155 |
apiuser = ApiUser.objects.create(username='apiuser', keytype='API',
|
|
156 |
key='apiuser')
|
|
157 |
AccessRight.objects.create(codename='can_manage_appointment',
|
|
158 |
resource_type=obj_type, resource_pk=connector.pk,
|
|
159 |
apiuser=apiuser)
|
|
160 |
|
|
161 |
resp = app.get('/clicrdv/test/63258/cancel?apikey=apiuser').json
|
|
162 |
assert mocked_request.call_count == 1
|
|
163 |
assert resp['data']['success']
|
|
164 |
|
|
165 |
@mock.patch('passerelle.utils.Request.request',
|
|
166 |
side_effect=HTTPError('{"msg": "cancel failed"}'))
|
|
167 |
def test_failed_cancel_appointment(mocked_request, app, connector):
|
|
168 |
obj_type = ContentType.objects.get_for_model(ClicRdv)
|
|
169 |
apiuser = ApiUser.objects.create(username='apiuser', keytype='API',
|
|
170 |
key='apiuser')
|
|
171 |
AccessRight.objects.create(codename='can_manage_appointment',
|
|
172 |
resource_type=obj_type, resource_pk=connector.pk,
|
|
173 |
apiuser=apiuser)
|
|
174 |
resp = app.get('/clicrdv/test/63258/cancel?apikey=apiuser').json
|
|
175 |
assert mocked_request.call_count == 1
|
|
176 |
assert resp.get('err') == 0
|
|
177 |
assert resp['data']
|
|
178 |
assert resp['data']['error'] == {'msg': 'cancel failed'}
|
|
179 |
|
|
180 |
|
|
181 |
@mock.patch('passerelle.utils.Request.request',
|
|
182 |
side_effect=HTTPError('[{"error": "creation failed"}]'))
|
|
183 |
def test_failed_appointment_creation(mocked_request, app, connector):
|
|
184 |
obj_type = ContentType.objects.get_for_model(ClicRdv)
|
|
185 |
apiuser = ApiUser.objects.create(username='apiuser', keytype='API',
|
|
186 |
key='apiuser')
|
|
187 |
AccessRight.objects.create(codename='can_manage_appointment',
|
|
188 |
resource_type=obj_type, resource_pk=connector.pk,
|
|
189 |
apiuser=apiuser)
|
|
190 |
|
|
191 |
data = {'fields': {'clicrdv_date_raw': '2017-01-01' , 'clicrdv_time_raw': '12:00:00',
|
|
192 |
'firstname': 'Foo', 'lastname': 'Bar', 'email': 'foobar@example.com'}}
|
|
193 |
resp = app.post_json('/clicrdv/test/interventions/63258/create?apikey=apiuser', params=data).json
|
|
194 |
assert resp['data']
|
|
195 |
assert not resp['data']['success']
|
|
196 |
assert resp['data']['error'] == 'creation failed'
|
141 |
|
-
|