Skip to content

Commit acc1f92

Browse files
Feature/add product testing methods (#104)
* Add missing schema imports, fix incorrect type usage/type signatures * Testing: fix product variants and add changeMasterVariant action Co-authored-by: David Weterings <d.weterings@labdigital.nl>
1 parent c399d1c commit acc1f92

File tree

9 files changed

+44
-15
lines changed

9 files changed

+44
-15
lines changed

src/commercetools/testing/custom_objects.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ def get_by_container_key(self, request, container: str, key: str):
6969
message=f"The CustomObject with ID '({container},{key})'",
7070
errors=[
7171
types.InvalidSubjectError(
72-
code="InvalidSubject",
73-
message=f"The CustomObject with ID '({container},{key}' was not found.", # noqa E501
72+
message=f"The CustomObject with ID '({container},{key}' was not found." # noqa E501
7473
)
7574
],
7675
)

src/commercetools/testing/customers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ def _create_from_draft(
2222
self, draft: types.CustomerDraft, id: Optional[str] = None
2323
) -> types.Customer:
2424
object_id = uuid.UUID(id) if id is not None else uuid.uuid4()
25+
now = datetime.datetime.now(datetime.timezone.utc)
2526

2627
return types.Customer(
2728
id=str(object_id),
2829
version=1,
29-
created_at=datetime.datetime.now(datetime.timezone.utc),
30-
last_modified_at=None,
30+
created_at=now,
31+
last_modified_at=now,
3132
customer_number=draft.customer_number,
3233
email=draft.email,
3334
password=draft.password,

src/commercetools/testing/orders.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import uuid
55

66
from commercetools import types
7-
from commercetools._schemas._cart import CartSchema
7+
from commercetools._schemas._cart import CartSchema, ShippingInfoSchema
88
from commercetools._schemas._order import (
99
DeliverySchema,
1010
OrderFromCartDraftSchema,

src/commercetools/testing/payments.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from commercetools._schemas._type import CustomFieldsSchema
1515
from commercetools.testing import utils
1616
from commercetools.testing.abstract import BaseModel, ServiceBackend
17-
from commercetools.testing.utils import update_attribute_add_item
1817

1918

2019
class PaymentsModel(BaseModel):

src/commercetools/testing/product_projections.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def get_by_key(self, request, key):
111111

112112
def _convert_product_projection(
113113
self, product: types.Product, staged: bool = False
114-
) -> typing.Optional[typing.Dict]:
114+
) -> typing.Optional[types.ProductProjection]:
115115
"""Convert a Product object to a ProductProjection object"""
116116
if product.master_data is None:
117117
return None

src/commercetools/testing/products.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import copy
22
import datetime
33
import uuid
4-
from typing import List, Optional, Union
4+
from typing import Dict, List, Optional, Union
55

66
from marshmallow import Schema
77
from marshmallow import fields as schema_fields
88

99
from commercetools import types
1010
from commercetools._schemas._common import ImageSchema, PriceSchema
1111
from commercetools._schemas._product import (
12+
AttributeSchema,
1213
ProductDraftSchema,
1314
ProductPagedQueryResponseSchema,
1415
ProductSchema,
1516
ProductUpdateSchema,
17+
ProductVariantSchema,
1618
)
1719
from commercetools.services.products import _ProductQuerySchema
1820
from commercetools.testing import utils
@@ -45,7 +47,9 @@ def _create_from_draft(
4547
category_order_hints=draft.category_order_hints,
4648
description=draft.description,
4749
master_variant=master_variant,
48-
variants=[master_variant] if master_variant else [],
50+
variants=[self._create_variant_from_draft(vd) for vd in draft.variants]
51+
if draft.variants
52+
else [],
4953
slug=draft.slug or types.LocalizedString(),
5054
search_keywords=types.SearchKeywords(),
5155
)
@@ -375,6 +379,33 @@ def updater(self, obj: dict, action: types.ProductAddPriceAction):
375379
return updater
376380

377381

382+
def _change_master_variant():
383+
def updater(self, obj: Dict, action: types.ProductChangeMasterVariantAction):
384+
new = copy.deepcopy(obj)
385+
staged = action.staged
386+
if staged is None:
387+
staged = True
388+
target_obj = _get_target_obj(new, staged)
389+
master_variant = target_obj["masterVariant"]
390+
if master_variant and master_variant["sku"] == action.sku:
391+
return obj
392+
found_sku = False
393+
for variant in get_product_variants(target_obj):
394+
if variant["sku"] == action.sku:
395+
target_obj["variants"].append(target_obj["masterVariant"])
396+
target_obj["masterVariant"] = variant
397+
target_obj["variants"].remove(variant)
398+
found_sku = True
399+
break
400+
if not found_sku:
401+
raise ValueError("Could not find sku %s" % action.sku)
402+
if staged:
403+
new["masterData"]["hasStagedChanges"] = True
404+
return new
405+
406+
return updater
407+
408+
378409
class UploadImageQuerySchema(Schema):
379410
staged = schema_fields.Bool()
380411
filename = schema_fields.Field()
@@ -410,6 +441,7 @@ def urls(self):
410441
"setPrices": _set_product_prices(),
411442
"changePrice": _change_price(),
412443
"addPrice": _add_price(),
444+
"changeMasterVariant": _change_master_variant(),
413445
"publish": _publish_product_action(),
414446
}
415447

src/commercetools/testing/server.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from requests_mock.request import _RequestObjectProxy
99

1010
from commercetools.testing import BackendRepository
11-
from commercetools.testing.internal import InternalBackend
1211

1312
logger = logging.getLogger(__name__)
1413

src/commercetools/testing/shipping_methods.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
ShippingMethodPagedQueryResponseSchema,
1010
ShippingMethodSchema,
1111
ShippingMethodUpdateSchema,
12+
ShippingRateSchema,
13+
ZoneRateSchema,
1214
)
15+
from commercetools._schemas._tax_category import TaxCategoryResourceIdentifierSchema
1316
from commercetools.testing import utils
1417
from commercetools.testing.abstract import BaseModel, ServiceBackend
1518
from commercetools.testing.utils import InternalUpdateError, update_attribute
@@ -65,14 +68,12 @@ def create_shipping_rate_from_draft(
6568
free_above = types.CentPrecisionMoney(
6669
cent_amount=draft.free_above.cent_amount,
6770
currency_code=draft.free_above.currency_code,
68-
type=types.MoneyType.CENT_PRECISION,
6971
fraction_digits=2,
7072
)
7173
shipping_rate = types.ShippingRate(
7274
price=types.CentPrecisionMoney(
7375
cent_amount=draft.price.cent_amount,
7476
currency_code=draft.price.currency_code,
75-
type=types.MoneyType.CENT_PRECISION,
7677
fraction_digits=2,
7778
),
7879
free_above=free_above,

src/commercetools/testing/utils.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ def create_from_draft(draft):
5454

5555
if isinstance(draft, types.CustomFieldsDraft):
5656
return types.CustomFields(
57-
type=types.TypeReference(type_id=draft.type.type_id, id=draft.type.id),
58-
fields=draft.fields,
57+
type=types.TypeReference(id=draft.type.id), fields=draft.fields
5958
)
6059
if isinstance(draft, types.PriceTierDraft):
6160
return types.PriceTier(
@@ -164,7 +163,6 @@ def updater(self, obj, action):
164163
return new
165164
else:
166165
raise InternalUpdateError("No item found with id %r" % (obj["id"]))
167-
return obj
168166

169167
return updater
170168

0 commit comments

Comments
 (0)