blob: 8b27d4de1514a2bdee99f607e8df1b77f6ca83f7 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import json
from mock import patch
from allura.lib.phone.nexmo import NexmoPhoneService
class TestPhoneService:
def setup_method(self, method):
config = {'phone.api_key': 'test-api-key',
'phone.api_secret': 'test-api-secret',
'site_name': 'Very loooooooooong site name'}
self.phone = NexmoPhoneService(config)
def test_add_common_params(self):
params = {'number': '1234567890', 'brand': 'Allura'}
res = self.phone.add_common_params(params)
expected = {'number': '1234567890',
'brand': 'Allura',
'api_key': 'test-api-key',
'api_secret': 'test-api-secret'}
assert expected == res
self.phone.config['phone.lang'] = 'it-it'
res = self.phone.add_common_params(params)
expected['lg'] = 'it-it'
assert expected == res
def test_error(self):
res = self.phone.error()
expected = {'status': 'error',
'error': 'Failed sending request to Nexmo'}
assert expected == res
# not allowed code
res = self.phone.error(code='2', msg='text')
assert expected == res
# allowed code
res = self.phone.error(code='15', msg='text')
expected = {'status': 'error', 'error': 'text'}
assert expected == res
# invalid format, possibly US
res = self.phone.error(code='3', msg='Invalid value for parameter: number', number='8005551234')
assert res['status'] == 'error'
assert 'Invalid value for parameter: number' in res['error']
assert 'country code' in res['error']
assert 'US' in res['error']
# invalid format, not US
res = self.phone.error(code='3', msg='Invalid value for parameter: number', number='738005551234')
assert res['status'] == 'error'
assert 'Invalid value for parameter: number' in res['error']
assert 'country code' in res['error']
assert 'US' not in res['error']
def test_ok(self):
res = self.phone.ok(request_id='123', other='smth')
expected = {'status': 'ok', 'request_id': '123', 'other': 'smth'}
assert expected == res
@patch('allura.lib.phone.nexmo.requests', autospec=True)
def test_verify(self, req):
req.post.return_value.json.return_value = {
'request_id': 'test-req-id',
'status': '0',
}
data = json.dumps({
'number': '1234567890',
'api_key': 'test-api-key',
'api_secret': 'test-api-secret',
'brand': 'Very loooooooooong',
}, sort_keys=True)
headers = {'Content-Type': 'application/json'}
resp = self.phone.verify('1234567890')
expected = {'status': 'ok', 'request_id': 'test-req-id'}
assert expected == resp
req.post.assert_called_once_with(
'https://api.nexmo.com/verify/json',
data=data,
headers=headers,
timeout=30,
)
req.post.reset_mock()
req.post.return_value.json.return_value = {
'status': '3',
'error_text': 'Something went wrong',
}
resp = self.phone.verify('1234567890')
expected = {'status': 'error', 'error': 'Something went wrong'}
assert expected == resp
req.post.assert_called_once_with(
'https://api.nexmo.com/verify/json',
data=data,
headers=headers,
timeout=30,
)
@patch('allura.lib.phone.nexmo.requests', autospec=True)
def test_verify_exception(self, req):
req.post.side_effect = Exception('Boom!')
resp = self.phone.verify('1234567890')
expected = {'status': 'error',
'error': 'Failed sending request to Nexmo'}
assert expected == resp
@patch('allura.lib.phone.nexmo.requests', autospec=True)
def test_check(self, req):
req.post.return_value.json.return_value = {
'request_id': 'test-req-id',
'status': '0',
}
data = json.dumps({
'request_id': 'test-req-id',
'code': '1234',
'api_key': 'test-api-key',
'api_secret': 'test-api-secret',
}, sort_keys=True)
headers = {'Content-Type': 'application/json'}
resp = self.phone.check('test-req-id', '1234')
expected = {'status': 'ok', 'request_id': 'test-req-id'}
assert expected == resp
req.post.assert_called_once_with(
'https://api.nexmo.com/verify/check/json',
data=data,
headers=headers,
timeout=30,
)
req.post.reset_mock()
req.post.return_value.json.return_value = {
'status': '3',
'error_text': 'Something went wrong',
}
resp = self.phone.check('test-req-id', '1234')
expected = {'status': 'error', 'error': 'Something went wrong'}
assert expected == resp
req.post.assert_called_once_with(
'https://api.nexmo.com/verify/check/json',
data=data,
headers=headers,
timeout=30,
)
@patch('allura.lib.phone.nexmo.requests', autospec=True)
def test_check_exception(self, req):
req.post.side_effect = Exception('Boom!')
resp = self.phone.check('req-id', '1234')
expected = {'status': 'error',
'error': 'Failed sending request to Nexmo'}
assert expected == resp