Bug 1720752 - Fix stripe import for custom_field array (#2193)
* Add failing test for custom_fields in invoice object * bug 1720752 - Fix failed stripe import due to custom_fields
This commit is contained in:
Родитель
42aba8436b
Коммит
c8cae2dfbb
|
@ -3,7 +3,7 @@
|
||||||
import re
|
import re
|
||||||
from hashlib import sha256
|
from hashlib import sha256
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Tuple, Type
|
from typing import Any, Tuple, Type, List
|
||||||
|
|
||||||
import click
|
import click
|
||||||
import stripe
|
import stripe
|
||||||
|
@ -89,6 +89,18 @@ class FilteredSchema:
|
||||||
"""Format stripe object for BigQuery, and validate against original schema."""
|
"""Format stripe object for BigQuery, and validate against original schema."""
|
||||||
return self._format_helper(row, self.allowed, self.root, (self.type,))
|
return self._format_helper(row, self.allowed, self.root, (self.type,))
|
||||||
|
|
||||||
|
def _hash_kv_userid(self, arr: List[dict], key_name: str) -> List[dict]:
|
||||||
|
"""Hash a userid key if it exists in a key-value list."""
|
||||||
|
res = []
|
||||||
|
for field in arr:
|
||||||
|
key, value = field[key_name], field["value"]
|
||||||
|
if key == "userid":
|
||||||
|
# hash fxa uid before it reaches BigQuery
|
||||||
|
key = "fxa_uid"
|
||||||
|
value = sha256(value.encode("UTF-8")).hexdigest()
|
||||||
|
res.append({key_name: key, "value": value})
|
||||||
|
return res
|
||||||
|
|
||||||
def _format_helper(
|
def _format_helper(
|
||||||
self,
|
self,
|
||||||
obj: Any,
|
obj: Any,
|
||||||
|
@ -97,12 +109,16 @@ class FilteredSchema:
|
||||||
path: Tuple[str, ...],
|
path: Tuple[str, ...],
|
||||||
is_list_item: bool = False,
|
is_list_item: bool = False,
|
||||||
) -> Any:
|
) -> Any:
|
||||||
if path[-1] in ("metadata", "custom_fields"):
|
if path[-1] == "metadata":
|
||||||
if "userid" in obj:
|
|
||||||
# hash fxa uid before it reaches BigQuery
|
|
||||||
obj["fxa_uid"] = sha256(obj.pop("userid").encode("UTF-8")).hexdigest()
|
|
||||||
# format metadata as a key-value list
|
# format metadata as a key-value list
|
||||||
obj = [{"key": key, "value": value} for key, value in obj.items()]
|
obj = self._hash_kv_userid(
|
||||||
|
[{"key": key, "value": value} for key, value in obj.items()], "key"
|
||||||
|
)
|
||||||
|
elif path[-1] == "custom_fields":
|
||||||
|
# NOTE: We treat the custom field like metadata, but does the
|
||||||
|
# invoice custom field contain the userid?
|
||||||
|
# https://stripe.com/docs/api/invoices/create#create_invoice-custom_fields
|
||||||
|
obj = self._hash_kv_userid(obj, "name")
|
||||||
if isinstance(obj, list):
|
if isinstance(obj, list):
|
||||||
# enforce schema
|
# enforce schema
|
||||||
if field.mode != "REPEATED":
|
if field.mode != "REPEATED":
|
||||||
|
|
|
@ -64,6 +64,21 @@ def test_format_row():
|
||||||
}
|
}
|
||||||
assert filtered_schema.format_row(dispute) == dispute
|
assert filtered_schema.format_row(dispute) == dispute
|
||||||
|
|
||||||
|
filtered_schema = FilteredSchema(stripe.Invoice)
|
||||||
|
invoice = {
|
||||||
|
"amount_due": 5,
|
||||||
|
"custom_fields": [
|
||||||
|
{"name": "userid", "value": "raw_user_id"},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
expect = {
|
||||||
|
"amount_due": 5,
|
||||||
|
"custom_fields": [
|
||||||
|
{"name": "fxa_uid", "value": sha256(b"raw_user_id").hexdigest()}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
assert filtered_schema.format_row(invoice) == expect
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"row,message",
|
"row,message",
|
||||||
|
|
Загрузка…
Ссылка в новой задаче