Skip to content

Commit db8d4a0

Browse files
Merge pull request #110 from VirtoCommerce/VCST-4095
feat: get saved for later
2 parents 4e27c39 + 08fe296 commit db8d4a0

File tree

2 files changed

+218
-0
lines changed

2 files changed

+218
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
from gql import Client
2+
3+
from graphql_client.mutations.move_from_saved_for_later import (
4+
MoveFromSavedForLaterMutation,
5+
)
6+
from graphql_client.mutations.move_to_saved_for_later import MoveToSavedForLaterMutation
7+
from graphql_client.mutations.remove_wishlist_item import RemoveWishlistItemMutation
8+
from graphql_client.queries.get_saved_for_later import GetSavedForLaterQuery
9+
from graphql_client.types.cart_type import CartType
10+
from graphql_client.types.cart_with_list_type import CartWithListType
11+
from graphql_client.types.input_remove_wishlist_item_type import (
12+
InputRemoveWishlistItemType,
13+
)
14+
from graphql_client.types.input_save_for_later_type import InputSaveForLaterType
15+
from graphql_client.types.wishlist_type import WishlistType
16+
from graphql_operations.cart.fragments.cart_fragment import CART_FRAGMENT
17+
18+
19+
class SavedForLaterOperations:
20+
def __init__(self, graphql_client: Client):
21+
self.graphql_client = graphql_client
22+
23+
def move_to_saved_for_later(self, payload: InputSaveForLaterType) -> CartWithListType:
24+
move_to_saved_for_later_mutation = MoveToSavedForLaterMutation(self.graphql_client)
25+
26+
variables = {"command": payload}
27+
28+
return_fields = f"""
29+
cart {{
30+
{CART_FRAGMENT}
31+
}}
32+
list {{
33+
{CART_FRAGMENT}
34+
}}
35+
"""
36+
37+
result = move_to_saved_for_later_mutation.execute(variables=variables, return_fields=return_fields)
38+
39+
return result
40+
41+
def move_from_saved_for_later(self, payload: InputSaveForLaterType) -> CartWithListType:
42+
move_from_saved_for_later_mutation = MoveFromSavedForLaterMutation(self.graphql_client)
43+
44+
variables = {"command": payload}
45+
46+
return_fields = f"""
47+
cart {{
48+
{CART_FRAGMENT}
49+
}}
50+
list {{
51+
{CART_FRAGMENT}
52+
}}
53+
"""
54+
55+
result = move_from_saved_for_later_mutation.execute(variables=variables, return_fields=return_fields)
56+
57+
return result
58+
59+
def get_saved_for_later(
60+
self,
61+
store_id: str,
62+
user_id: str,
63+
currency_code: str,
64+
culture_name: str,
65+
organization_id: str | None = None,
66+
) -> CartType:
67+
get_saved_for_later_query = GetSavedForLaterQuery(self.graphql_client)
68+
69+
variables = {
70+
"storeId": store_id,
71+
"userId": user_id,
72+
"currencyCode": currency_code,
73+
"cultureName": culture_name,
74+
}
75+
76+
if organization_id:
77+
variables["organizationId"] = organization_id
78+
79+
result = get_saved_for_later_query.execute(variables=variables, return_fields=CART_FRAGMENT)
80+
81+
return result
82+
83+
def remove_saved_for_later_item(self, payload: InputRemoveWishlistItemType) -> WishlistType:
84+
"""Remove item from saved for later list."""
85+
remove_wishlist_item_mutation = RemoveWishlistItemMutation(self.graphql_client)
86+
87+
variables = {"command": payload}
88+
89+
return_fields = """
90+
id
91+
items {
92+
id
93+
productId
94+
}
95+
"""
96+
97+
result = remove_wishlist_item_mutation.execute(variables=variables, return_fields=return_fields)
98+
99+
return result
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import os
2+
from typing import Any
3+
4+
import allure
5+
import pytest
6+
7+
from fixtures.auth import Auth
8+
from fixtures.config import Config
9+
from fixtures.graphql_client import GraphQLClient
10+
from graphql_operations.cart.cart_operations import CartOperations
11+
from graphql_operations.saved_for_later.saved_for_later_operations import (
12+
SavedForLaterOperations,
13+
)
14+
from graphql_operations.user.user_operations import UserOperations
15+
16+
17+
@pytest.mark.graphql
18+
@allure.title("Get saved for later (GraphQL)")
19+
def test_get_saved_for_later(
20+
config: Config,
21+
dataset: dict[str, Any],
22+
graphql_client: GraphQLClient,
23+
auth: Auth,
24+
):
25+
print(f"{os.linesep}Running test to get saved for later...", end=" ")
26+
27+
user_operations = UserOperations(graphql_client)
28+
cart_operations = CartOperations(graphql_client)
29+
saved_for_later_operations = SavedForLaterOperations(graphql_client)
30+
31+
currency = dataset["currencies"][0]["code"]
32+
culture = dataset["languages"][0]["allowedValues"][0]
33+
product_id = dataset["products"][2]["id"] # Use product that is in stock
34+
35+
auth.authenticate(
36+
dataset["users"][0]["userName"],
37+
config["USERS_PASSWORD"],
38+
)
39+
40+
user = user_operations.get_me()
41+
42+
# Clean up any existing saved for later items
43+
existing_saved_for_later = saved_for_later_operations.get_saved_for_later(
44+
store_id=config["STORE_ID"],
45+
user_id=user["id"],
46+
currency_code=currency,
47+
culture_name=culture,
48+
)
49+
50+
if existing_saved_for_later and existing_saved_for_later["items"]:
51+
for item in existing_saved_for_later["items"]:
52+
saved_for_later_operations.remove_saved_for_later_item(
53+
payload={
54+
"listId": existing_saved_for_later["id"],
55+
"lineItemId": item["id"],
56+
}
57+
)
58+
59+
cart = cart_operations.add_item_to_cart(
60+
payload={
61+
"storeId": config["STORE_ID"],
62+
"userId": user["id"],
63+
"productId": product_id,
64+
"quantity": 1,
65+
"currencyCode": currency,
66+
"cultureName": culture,
67+
}
68+
)
69+
70+
line_item_id = cart["items"][0]["id"]
71+
72+
move_result = saved_for_later_operations.move_to_saved_for_later(
73+
payload={
74+
"storeId": config["STORE_ID"],
75+
"userId": user["id"],
76+
"cartId": cart["id"],
77+
"lineItemIds": [line_item_id],
78+
"currencyCode": currency,
79+
"cultureName": culture,
80+
}
81+
)
82+
83+
# Get saved for later list
84+
saved_for_later = saved_for_later_operations.get_saved_for_later(
85+
store_id=config["STORE_ID"],
86+
user_id=user["id"],
87+
currency_code=currency,
88+
culture_name=culture,
89+
)
90+
91+
# Test teardown
92+
saved_for_later_operations.remove_saved_for_later_item(
93+
payload={
94+
"listId": saved_for_later["id"],
95+
"lineItemId": saved_for_later["items"][0]["id"],
96+
}
97+
)
98+
99+
auth.clear_token()
100+
101+
# Assertions
102+
assert move_result is not None, "Move to saved for later result is None"
103+
assert move_result["cart"] is not None, "Cart in move result is None"
104+
assert move_result["list"] is not None, "List in move result is None"
105+
106+
# Verify item was removed from cart
107+
assert move_result["cart"]["itemsQuantity"] == 0, "Item should be removed from cart"
108+
109+
# Verify item is in saved for later list
110+
assert move_result["list"]["itemsQuantity"] == 1, "Item should be in saved for later list"
111+
112+
# Verify getSavedForLater query returns the list
113+
assert saved_for_later is not None, "Saved for later list is None"
114+
assert saved_for_later["itemsQuantity"] == 1, "Saved for later should have 1 item"
115+
116+
# Verify the correct product is in saved for later
117+
saved_items = saved_for_later["items"]
118+
assert len(saved_items) == 1, "Should have exactly 1 saved item"
119+
assert saved_items[0]["productId"] == product_id, "Saved item product ID mismatch"

0 commit comments

Comments
 (0)