Skip to content
This repository was archived by the owner on Jan 4, 2025. It is now read-only.
35 changes: 24 additions & 11 deletions mws/mws.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,14 @@ def calc_md5(string):
return base64.b64encode(md.digest()).strip(b'\n')


def calc_request_description(params):
request_description = ''
for key in sorted(params):
encoded_value = quote(params[key], safe='-_.~')
request_description += '&{}={}'.format(key, encoded_value)
return request_description[1:] # don't include leading ampersand


def remove_empty(d):
"""Helper function that removes all keys from a dictionary (d), that have an empty value.

Expand Down Expand Up @@ -165,6 +173,20 @@ def __init__(self, access_key, secret_key, account_id, region='US', domain='', u
}
raise MWSError(error_msg)

def get_params(self):
"""Get the parameters required in all MWS requests"""
params = {
'AWSAccessKeyId': self.access_key,
self.ACCOUNT_TYPE: self.account_id,
'SignatureVersion': '2',
'Timestamp': self.get_timestamp(),
'Version': self.version,
'SignatureMethod': 'HmacSHA256',
}
if self.auth_token:
params['MWSAuthToken'] = self.auth_token
return params

def make_request(self, extra_data, method="GET", **kwargs):
"""Make request to Amazon MWS API with these parameters
"""
Expand All @@ -178,18 +200,9 @@ def make_request(self, extra_data, method="GET", **kwargs):
if isinstance(value, (datetime.datetime, datetime.date)):
extra_data[key] = value.isoformat()

params = {
'AWSAccessKeyId': self.access_key,
self.ACCOUNT_TYPE: self.account_id,
'SignatureVersion': '2',
'Timestamp': self.get_timestamp(),
'Version': self.version,
'SignatureMethod': 'HmacSHA256',
}
if self.auth_token:
params['MWSAuthToken'] = self.auth_token
params = self.get_params()
params.update(extra_data)
request_description = '&'.join(['%s=%s' % (k, quote(params[k], safe='-_.~')) for k in sorted(params)])
request_description = calc_request_description(params)
signature = self.calc_signature(method, request_description)
url = '%s%s?%s&Signature=%s' % (self.domain, self.uri, request_description, quote(signature))
headers = {'User-Agent': 'python-amazon-mws/0.0.1 (Language=Python)'}
Expand Down
31 changes: 31 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import pytest


@pytest.fixture
def access_key():
return "AAAAAAAAAAAAAAAAAAAA"


@pytest.fixture
def secret_key():
return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"


@pytest.fixture
def account_id():
return "AAAAAAAAAAAAAA"


@pytest.fixture
def timestamp():
return '2017-08-12T19:40:35Z'


@pytest.fixture
def credentials(access_key, secret_key, account_id):
"""Fake set of MWS credentials"""
return {
"access_key": access_key,
"secret_key": secret_key,
"account_id": account_id,
}
4 changes: 2 additions & 2 deletions tests/test_service_status.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import mws


def test_get_service_status():
def test_get_service_status(credentials):
# we can get the service status without needing API credentials
# this is a simple smoke test to check that the simplest API request can be successfully made
orders_api = mws.Orders(access_key='', secret_key='', account_id='')
orders_api = mws.Orders(**credentials)
r = orders_api.get_service_status()
assert r.response.status_code == 200
21 changes: 20 additions & 1 deletion tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
from mws.mws import calc_md5
from mws.mws import calc_md5, calc_request_description


def test_calc_md5():
assert calc_md5(b'mws') == b'mA5nPbh1CSx9M3dbkr3Cyg=='


def test_calc_request_description(access_key, account_id):
request_description = calc_request_description({
'AWSAccessKeyId': access_key,
'Markets': account_id,
'SignatureVersion': '2',
'Timestamp': '2017-08-12T19:40:35Z',
'Version': '2017-01-01',
'SignatureMethod': 'HmacSHA256',
})
assert not request_description.startswith('&')
assert request_description == \
'AWSAccessKeyId=' + access_key + \
'&Markets=' + account_id + \
'&SignatureMethod=HmacSHA256' \
'&SignatureVersion=2' \
'&Timestamp=2017-08-12T19%3A40%3A35Z' \
'&Version=2017-01-01'