Skip to content

Commit 03b4298

Browse files
committed
extract response model for sms send result
1 parent cf7ecb1 commit 03b4298

8 files changed

Lines changed: 78 additions & 19 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,4 @@ dist: clean
4040

4141

4242
release: dist
43-
python -m twine upload dist/*
43+
. venv/bin/activate; python -m twine upload dist/*

smsapi/endpoint.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def send_request(self):
8888
'timeout': self.parameters.get('timeout', 10)
8989
}
9090

91-
if self.method is 'GET':
91+
if self.method == 'GET':
9292
kwargs.update({'params': self.compiled_parameters})
9393
else:
9494
kwargs.update({'data': self.compiled_parameters})

smsapi/sms/api.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from smsapi.exception import EndpointException, SendException
66
from smsapi.models import ResultCollection, SendResult, RemoveMessageResult
77
from smsapi.sms import response_format_param
8+
from smsapi.sms.model import SmsSendResult
89
from smsapi.utils import join_params
910

1011
sms_parameters = [
@@ -60,7 +61,7 @@ class Sms(Api):
6061
send = bind_api_endpoint(
6162
method='POST',
6263
path=path,
63-
mapping=(SendResult, ResultCollection),
64+
mapping=(SendResult, SmsSendResult),
6465
accept_parameters=sms_parameters + ['to'],
6566
force_parameters=response_format_param,
6667
exception_class=SendException,
@@ -70,7 +71,7 @@ class Sms(Api):
7071
send_fast = bind_api_endpoint(
7172
method='GET',
7273
path=path,
73-
mapping=(SendResult, ResultCollection),
74+
mapping=(SendResult, SmsSendResult),
7475
accept_parameters=sms_parameters + ['to'],
7576
force_parameters=fast_force_params,
7677
exception_class=SendException,
@@ -80,7 +81,7 @@ class Sms(Api):
8081
send_flash = bind_api_endpoint(
8182
method='GET',
8283
path=path,
83-
mapping=(SendResult, ResultCollection),
84+
mapping=(SendResult, SmsSendResult),
8485
accept_parameters=sms_parameters + ['to'],
8586
force_parameters=flash_force_params,
8687
exception_class=SendException,
@@ -90,7 +91,7 @@ class Sms(Api):
9091
send_to_group = bind_api_endpoint(
9192
method='GET',
9293
path=path,
93-
mapping=(SendResult, ResultCollection),
94+
mapping=(SendResult, SmsSendResult),
9495
accept_parameters=sms_parameters + ['group'],
9596
force_parameters=response_format_param,
9697
exception_class=SendException,

smsapi/sms/model.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from smsapi.models import ResultCollection
2+
3+
4+
class SmsSendResult(ResultCollection):
5+
6+
def __init__(self, count, results, message=None, length=None, parts=None):
7+
super(SmsSendResult, self).__init__(count, results)
8+
9+
self.message = message
10+
self.parts = parts
11+
self.length = length
12+
13+
@classmethod
14+
def parse(cls, json_response, model):
15+
count = json_response.get('count')
16+
message = json_response.get('message')
17+
length = json_response.get('length')
18+
parts = json_response.get('parts')
19+
20+
sms_list = json_response.get('list', [])
21+
22+
collection = []
23+
24+
for sms in sms_list:
25+
m = model.from_dict(sms)
26+
collection.append(m)
27+
28+
return cls(count, collection, message=message, length=length, parts=parts)

tests/__init__.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from smsapi.client import SmsApiPlClient
1111
from smsapi.models import ResultCollection
1212
from smsapi.sms import response_format_param
13+
from smsapi.sms.model import SmsSendResult
1314

1415
from tests.unit.doubles import ApiSpy, request_fake
1516
from tests.unit.fixtures import create_send_result
@@ -38,20 +39,22 @@ def assertParamsForwardedToRequestEquals(self, params, *args):
3839

3940
params.update(response_format_param)
4041

41-
if self.request_fake.http_method is 'GET':
42-
data_sent = self.request_fake.params
43-
else:
44-
data_sent = self.request_fake.data
42+
self.assertEqual(params, self.request_fake.payload)
4543

46-
self.assertEqual(params, data_sent)
44+
def assertRequestPayloadContains(self, key, value):
45+
self.assertIn(key, self.request_fake.payload.keys())
46+
self.assertIn(value, self.request_fake.payload.values())
4747

48-
def assertSendResultForNumberEquals(self, number, result):
48+
def assertSendResultForNumberEquals(self, number, result, result_class=ResultCollection):
4949
numbers = number if isinstance(number, list) else [number]
5050

51-
expected_result = ResultCollection(len(numbers), [create_send_result(n) for n in numbers])
51+
expected_result = result_class(len(numbers), [create_send_result(n) for n in numbers])
5252

5353
self.assertEqual(expected_result, result)
5454

55+
def assertSmsSendResultForNumberEquals(self, number, result):
56+
self.assertSendResultForNumberEquals(number, result, result_class=SmsSendResult)
57+
5558

5659
def spy_endpoints(client):
5760

tests/unit/doubles.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ def __call__(self, *args, **kwargs):
4141

4242
return ResponseMock(status_code, content, headers)
4343

44+
@property
45+
def payload(self):
46+
return self.params if self.http_method == 'GET' else self.data
47+
4448

4549
class ResponseMock(object):
4650

tests/unit/sms/api_test.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_send_sms(self):
2020

2121
result = self.client.sms.send(**kwargs)
2222

23-
self.assertSendResultForNumberEquals(number, result)
23+
self.assertSmsSendResultForNumberEquals(number, result)
2424
self.assertParamsForwardedToRequestEquals(kwargs)
2525

2626
@api_response_fixture('send')
@@ -30,7 +30,7 @@ def test_send_sms_with_custom_sender(self):
3030

3131
result = self.client.sms.send(to=number, from_=any_sender_name)
3232

33-
self.assertSendResultForNumberEquals(number, result)
33+
self.assertSmsSendResultForNumberEquals(number, result)
3434
self.assertParamsForwardedToRequestEquals({'to': number, 'from': any_sender_name})
3535

3636
@api_response_fixture('send_to_many_recipients')
@@ -39,7 +39,7 @@ def test_send_sms_to_many_numbers(self):
3939

4040
result = self.client.sms.send(to=[number_1, number_2])
4141

42-
self.assertSendResultForNumberEquals([number_1, number_2], result)
42+
self.assertSmsSendResultForNumberEquals([number_1, number_2], result)
4343
self.assertParamsForwardedToRequestEquals({'to': '%s,%s' % (number_1, number_2)})
4444

4545
@api_response_fixture('send_to_invalid_number')
@@ -63,7 +63,7 @@ def test_send_fast(self):
6363

6464
result = self.client.sms.send_fast(**args)
6565

66-
self.assertSendResultForNumberEquals(number, result)
66+
self.assertSmsSendResultForNumberEquals(number, result)
6767
self.assertParamsForwardedToRequestEquals(args, fast_force_params)
6868

6969
def test_send_flash(self):
@@ -72,7 +72,7 @@ def test_send_flash(self):
7272

7373
result = self.client.sms.send_flash(**args)
7474

75-
self.assertSendResultForNumberEquals(number, result)
75+
self.assertSmsSendResultForNumberEquals(number, result)
7676
self.assertParamsForwardedToRequestEquals(args, flash_force_params)
7777

7878
def test_remove_scheduled_sms(self):
@@ -127,7 +127,7 @@ def test_send_sms_as_utf8(self):
127127

128128
result = self.client.sms.send(**args)
129129

130-
self.assertSendResultForNumberEquals(number, result)
130+
self.assertSmsSendResultForNumberEquals(number, result)
131131
self.assertParamsForwardedToRequestEquals(args)
132132

133133
def test_send_test_sms(self):
@@ -138,6 +138,15 @@ def test_send_test_sms(self):
138138

139139
self.assertParamsForwardedToRequestEquals(args)
140140

141+
@api_response_fixture('detailed_response')
142+
def test_send_sms_with_detailed_response(self):
143+
result = self.client.sms.send(details=1)
144+
145+
self.assertEqual(4, result.length)
146+
self.assertEqual(1, result.parts)
147+
self.assertEqual("test", result.message)
148+
self.assertRequestPayloadContains("details", "1")
149+
141150

142151
def create_sms_exception_for_number(number):
143152
e = SendException(u'No correct phone numbers', 13)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"status_code": 201,
3+
"response": {
4+
"count": 1,
5+
"message": "test",
6+
"length": 4,
7+
"parts": 1,
8+
"list": [
9+
{
10+
"id": "1"
11+
}
12+
]
13+
}
14+
}

0 commit comments

Comments
 (0)