feat: improve coverage
This commit is contained in:
+6
-44
@@ -1,45 +1,7 @@
|
|||||||
import random
|
class Response:
|
||||||
import string
|
def __init__(self, data, status_code, *args, **kwargs):
|
||||||
|
self.data = data
|
||||||
|
self.status_code = status_code
|
||||||
|
|
||||||
from django.contrib.auth.models import Permission, User
|
def json(self):
|
||||||
|
return self.data
|
||||||
|
|
||||||
class TestUserAuthenticationMixin:
|
|
||||||
model_name = ""
|
|
||||||
|
|
||||||
def create_user(self):
|
|
||||||
self.password = "".join(
|
|
||||||
[random.choice(string.ascii_letters) for _ in range(16)]
|
|
||||||
)
|
|
||||||
self.user = User.objects.create(
|
|
||||||
username="vader",
|
|
||||||
email="darth@vader.com",
|
|
||||||
is_staff=True,
|
|
||||||
is_active=True,
|
|
||||||
)
|
|
||||||
self.user.set_password(self.password)
|
|
||||||
self.user.save()
|
|
||||||
self.setup_user_permissions()
|
|
||||||
|
|
||||||
def login(self):
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
|
|
||||||
def setup_user_permissions(self):
|
|
||||||
self.create_permission = Permission.objects.get(
|
|
||||||
codename=f"add_{self.model_name}"
|
|
||||||
)
|
|
||||||
self.delete_permission = Permission.objects.get(
|
|
||||||
codename=f"delete_{self.model_name}"
|
|
||||||
)
|
|
||||||
self.list_permission = Permission.objects.get(
|
|
||||||
codename=f"view_{self.model_name}"
|
|
||||||
)
|
|
||||||
self.update_permission = Permission.objects.get(
|
|
||||||
codename=f"change_{self.model_name}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Grant access and permissions
|
|
||||||
self.user.user_permissions.add(self.create_permission)
|
|
||||||
self.user.user_permissions.add(self.delete_permission)
|
|
||||||
self.user.user_permissions.add(self.list_permission)
|
|
||||||
self.user.user_permissions.add(self.update_permission)
|
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
import pytest
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.test import APITestCase
|
from rest_framework.test import APITestCase
|
||||||
|
|
||||||
|
from config.tests.mixins import Response
|
||||||
|
from shop.exceptions import RedsysPaymentException
|
||||||
from shop.models import CustomerAddress, Order, ShopSettings, Tax
|
from shop.models import CustomerAddress, Order, ShopSettings, Tax
|
||||||
from shop.redsys import RedsysClient
|
from shop.redsys import RedsysClient
|
||||||
from shop.tests.mixins import CreateProductsMixin
|
from shop.tests.mixins import CreateProductsMixin
|
||||||
@@ -16,6 +20,21 @@ from shop.utils import create_order, create_order_line_for_product, validate_exp
|
|||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
|
def redsys_response_ok(*args, **kwargs):
|
||||||
|
response = {
|
||||||
|
"Ds_SignatureVersion": "HMAC_SHA256_V1",
|
||||||
|
"Ds_MerchantParameters": "eyJEc19BbW91bnQiOiIxNDUiLCJEc19DdXJyZW5jeSI6Ijk3OCIsIkRzX09yZGVyIjoiMTQ0NjA2ODU4MSIsIkRzX01lcmNoYW50Q29kZSI6Ijk5OTAwODg4MSIsIkRzX1Rlcm1pbmFsIjoiMSIsIkRzX1Jlc3BvbnNlIjoiMDAwMCIsIkRzX0F1dGhvcmlzYXRpb25Db2RlIjoiNTAxNjAyIiwiRHNfVHJhbnNhY3Rpb25UeXBlIjoiMCIsIkRzX1NlY3VyZVBheW1lbnQiOiIwIiwiRHNfTGFuZ3VhZ2UiOiIxIiwiRHNfQ2FyZE51bWJlciI6IjQ1NDg4MSoqKioqKioqMDQiLCJEc19NZXJjaGFudERhdGEiOiIiLCJEc19DYXJkX0NvdW50cnkiOiI3MjQiLCJEc19DYXJkX0JyYW5kIjoiMSJ9",
|
||||||
|
"Ds_Signature": "QVxoXwwp919v7XYjyBjhr1VXozESRosHPb3PDW-rcME=",
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response(response, status_code=200)
|
||||||
|
|
||||||
|
|
||||||
|
def redsys_response_error(*args, **kwargs):
|
||||||
|
response = {"errorCode": "SIS00001"}
|
||||||
|
return Response(response, status_code=200)
|
||||||
|
|
||||||
|
|
||||||
class TestRedsysTPV(APITestCase, CreateProductsMixin):
|
class TestRedsysTPV(APITestCase, CreateProductsMixin):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.tax = Tax.objects.create(
|
self.tax = Tax.objects.create(
|
||||||
@@ -53,6 +72,7 @@ class TestRedsysTPV(APITestCase, CreateProductsMixin):
|
|||||||
self.order = self.create_order()
|
self.order = self.create_order()
|
||||||
self.order.calculate_total_from_lines()
|
self.order.calculate_total_from_lines()
|
||||||
self.settings = ShopSettings.load()
|
self.settings = ShopSettings.load()
|
||||||
|
self.settings.merchant_code = "999008881"
|
||||||
self.settings.shared_secret = "sq7HjrUOBfKmC576ILgskD5srU870gJ7" # Debug secret
|
self.settings.shared_secret = "sq7HjrUOBfKmC576ILgskD5srU870gJ7" # Debug secret
|
||||||
self.settings.save()
|
self.settings.save()
|
||||||
|
|
||||||
@@ -184,3 +204,29 @@ class TestRedsysTPV(APITestCase, CreateProductsMixin):
|
|||||||
assert not validate_expiry_date(f"{previous_year}{current_month}")
|
assert not validate_expiry_date(f"{previous_year}{current_month}")
|
||||||
|
|
||||||
assert validate_expiry_date(f"{current_year}{current_month}")
|
assert validate_expiry_date(f"{current_year}{current_month}")
|
||||||
|
|
||||||
|
@patch("requests.post", redsys_response_ok)
|
||||||
|
def test_redsys_rest_client(self):
|
||||||
|
client = RedsysClient()
|
||||||
|
|
||||||
|
params = client.pay_order_rest(
|
||||||
|
self.order,
|
||||||
|
pan="4548810000000003",
|
||||||
|
expiry_date="122049",
|
||||||
|
cvv2="285",
|
||||||
|
)
|
||||||
|
|
||||||
|
assert params.get("Ds_Order") == "1446068581"
|
||||||
|
assert params.get("Ds_MerchantCode") == self.settings.merchant_code
|
||||||
|
|
||||||
|
@patch("requests.post", redsys_response_error)
|
||||||
|
def test_redsys_rest_client_error(self):
|
||||||
|
client = RedsysClient()
|
||||||
|
|
||||||
|
with pytest.raises(RedsysPaymentException):
|
||||||
|
client.pay_order_rest(
|
||||||
|
self.order,
|
||||||
|
pan="4548810000000003",
|
||||||
|
expiry_date="122049",
|
||||||
|
cvv2="285",
|
||||||
|
)
|
||||||
|
|||||||
@@ -26,9 +26,7 @@ class Command(BaseCommand):
|
|||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
web_settings = WebSettings.load()
|
web_settings = WebSettings.load()
|
||||||
path = os.path.join(
|
path = os.path.join(settings.BASE_DIR, "theme", "static", "css", "main.css")
|
||||||
settings.BASE_DIR, "theme", "static", "css", "main.css"
|
|
||||||
)
|
|
||||||
|
|
||||||
colors = []
|
colors = []
|
||||||
for color_name, data in web_settings.theme_colors.items():
|
for color_name, data in web_settings.theme_colors.items():
|
||||||
@@ -38,18 +36,21 @@ class Command(BaseCommand):
|
|||||||
|
|
||||||
result = str(
|
result = str(
|
||||||
render_to_string(
|
render_to_string(
|
||||||
"theme/main.css.template", context={"colors": colors},
|
"theme/main.css.template",
|
||||||
|
context={"colors": colors},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
with open(path, "w") as f:
|
with open(path, "w") as f:
|
||||||
f.write(result)
|
f.write(result)
|
||||||
|
|
||||||
subprocess.run([
|
subprocess.run(
|
||||||
|
[
|
||||||
"tailwindcss",
|
"tailwindcss",
|
||||||
"-i",
|
"-i",
|
||||||
"theme/static/css/main.css",
|
"theme/static/css/main.css",
|
||||||
"-o",
|
"-o",
|
||||||
"theme/static/css/styles.css",
|
"theme/static/css/styles.css",
|
||||||
"--minify",
|
"--minify",
|
||||||
])
|
]
|
||||||
|
)
|
||||||
call_command("collectstatic", "--no-input")
|
call_command("collectstatic", "--no-input")
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user