8000 Merge pull request #9 from norbert-sebok/master · brumar/wc-api-python@10c0002 · GitHub
[go: up one dir, main page]

Skip to content

Commit 10c0002

Browse files
Merge pull request woocommerce#9 from norbert-sebok/master
Keeps the filter[*] parameters in the original order, closes woocommerce#8
2 parents baf03ca + e4092b4 commit 10c0002

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

tests.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" API Tests """
22
import unittest
33
import woocommerce
4+
from woocommerce import oauth
45
from httmock import all_requests, HTTMock
56

67

@@ -116,3 +117,20 @@ def woo_test_mock(*args, **kwargs):
116117
# call requests
117118
status = self.api.delete("products").status_code
118119
self.assertEqual(status, 200)
120+
121+
def test_oauth_sorted_params(self):
122+
""" Test order of parameters for OAuth signature """
123+
def check_sorted(keys, expected):
124+
params = oauth.OrderedDict()
125+
for key in keys:
126+
params[key] = ''
127+
128+
ordered = list(oauth.OAuth.sorted_params(params).keys())
129+
self.assertEqual(ordered, expected)
130+
131+
check_sorted(['a', 'b'], ['a', 'b'])
132+
check_sorted(['b', 'a'], ['a', 'b'])
133+
check_sorted(['a', 'b[a]', 'b[b]', 'b[c]', 'c'], ['a', 'b[a]', 'b[b]', 'b[c]', 'c'])
134+
check_sorted(['a', 'b[c]', 'b[a]', 'b[b]', 'c'], ['a', 'b[c]', 'b[a]', 'b[b]', 'c'])
135+
check_sorted(['d', 'b[c]', 'b[a]', 'b[b]', 'c'], ['b[c]', 'b[a]', 'b[b]', 'c', 'd'])
136+
check_sorted(['a1', 'b[c]', 'b[a]', 'b[b]', 'a2'], ['a1', 'a2', 'b[c]', 'b[a]', 'b[b]'])

woocommerce/oauth.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def __init__(self, url, consumer_key, consumer_secret, **kwargs):
3939

4040
def get_oauth_url(self):
4141
""" Returns the URL with OAuth params """
42-
params = {}
42+
params = OrderedDict()
4343

4444
if "?" in self.url:
4545
url = self.url[:self.url.find("?")]
@@ -68,8 +68,8 @@ def generate_oauth_signature(self, params, url):
6868
del params["oauth_signature"]
6969

7070
base_request_uri = quote(url, "")
71+
params = self.sorted_params(params)
7172
params = self.normalize_parameters(params)
72-
params = OrderedDict(sorted(params.items()))
7373
query_params = ["{param_key}%3D{param_value}".format(param_key=key, param_value=value)
7474
for key, value in params.items()]
7575

@@ -88,11 +88,23 @@ def generate_oauth_signature(self, params, url):
8888

8989
return b64encode(hash_signature).decode("utf-8").replace("\n", "")
9090

91+
@staticmethod
92+
def sorted_params(params):
93+
ordered = OrderedDict()
94+
base_keys = sorted(set(k.split('[')[0] for k in params.keys()))
95+
96+
for base in base_keys:
97+
for key in params.keys():
98+
if key == base or key.startswith(base + '['):
99+
ordered[key] = params[key]
100+
101+
return ordered
102+
91103
@staticmethod
92104
def normalize_parameters(params):
93105
""" Normalize parameters """
94106
params = params or {}
95-
normalized_parameters = {}
107+
normalized_parameters = OrderedDict()
96108

97109
def get_value_like_as_php(val):
98110
""" Prepare value for quote """

0 commit comments

Comments
 (0)
0