chore: test for checkout flow

This commit is contained in:
Livio Bieri 2023-11-20 15:57:53 +01:00 committed by Christian Cueni
parent 2bb62a2b4f
commit 809c45235f
3 changed files with 87 additions and 10 deletions

View File

@ -62,10 +62,6 @@ def init_transaction(
webhook_url = overwrite
payload = {
# See https://api-reference.datatrans.ch/#tag/v1transactions:
# -> It _should_ be unique for each transaction (according to docs)
# -> We use transaction id for checking transaction state
"refno": str(uuid.uuid4()),
# We use autoSettle=True, so that we don't have to settle the transaction:
# -> Be aware that autoSettle has implications of the possible transaction states
# -> see CheckoutState docstring.
@ -73,6 +69,7 @@ def init_transaction(
"amount": amount_chf_centimes,
"currency": "CHF",
"language": user.language,
"refno": str(uuid.uuid4()),
"webhook": {"url": webhook_url},
"redirect": {
"successUrl": redirect_url_success,

View File

@ -0,0 +1,84 @@
from unittest.mock import patch
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from vbv_lernwelt.core.admin import User
from vbv_lernwelt.shop.models import (
CheckoutInformation,
CheckoutState,
Product,
VV_PRODUCT_SKU,
)
from vbv_lernwelt.shop.services import get_payment_url
USER_USERNAME = "testuser"
USER_EMAIL = "test@example.com"
USER_PASSWORD = "testpassword"
TEST_ADDRESS_DATA = {
"first_name": "Test",
"last_name": "User",
"street": "Test Street",
"street_number": "1",
"postal_code": "1234",
"city": "Test City",
"country": "Test Country",
"company_name": "Test Company",
"company_street": "Test Company Street",
"company_street_number": "1",
"company_postal_code": "1234",
"company_city": "Test Company City",
"company_country": "Test Company Country",
}
class CheckoutAPIView(APITestCase):
def setUp(self) -> None:
Product.objects.create(
sku=VV_PRODUCT_SKU,
price=300_00,
description="VV",
name="VV",
)
self.user = User.objects.create_user(
username=USER_USERNAME,
email=USER_EMAIL,
password=USER_PASSWORD,
is_active=True,
)
self.client.login(username=USER_USERNAME, password=USER_PASSWORD)
@patch("vbv_lernwelt.shop.views.init_transaction")
def test_checkout(self, mock_init_transaction):
# GIVEN
mock_init_transaction.return_value = "1234567890"
redirect_url = "http://testserver/redirect-url"
# WHEN
response = self.client.post(
path=reverse("checkout-vv"),
format="json",
data={
"redirect_url": redirect_url,
"address": TEST_ADDRESS_DATA,
},
)
# THEN
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
response.json()["next_step_url"],
get_payment_url("1234567890"),
)
self.assertTrue(
CheckoutInformation.objects.filter(
user=self.user,
product_sku=VV_PRODUCT_SKU,
state=CheckoutState.INITIALIZED.value,
).exists()
)

View File

@ -32,8 +32,8 @@ def get_billing_address(request):
data = BillingAddressSerializer(billing_address).data
except BillingAddress.DoesNotExist:
data = BillingAddressSerializer().data
data["first_name"] = request.user.first_name
data["last_name"] = request.user.last_name
data["first_name"] = request.user.first_name # noqa
data["last_name"] = request.user.last_name # noqa
return Response(data)
@ -128,10 +128,6 @@ def checkout_vv(request):
# already initialized -> redirect to payment page again
if checkout := checkouts.filter(state=CheckoutState.INITIALIZED).first():
# FIXME: Ask datatrans how they advice to handle this case:
# - 1. Why is the payment url not reusable? Calling the payment url again
# with the same transaction id results in a blank page.
# - 2. After 30 minutes, the transaction is fails but our webhook is not called?
return JsonResponse({"next_step_url": get_payment_url(checkout.transaction_id)})
# not yet initialized at all, or canceled/failed