delete option staff varizi
This commit is contained in:
1 parent
d99e47ecce
commit
b53a3e0c5c
14 files changed
+383
-3
No files matched your search
@@ -0,0 +1,47 @@
|
||||
"""PostgreSQL-only regression for simultaneous notice deletion/receipt submission."""
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from threading import Barrier
|
||||
|
||||
import pytest
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db import close_old_connections, connection
|
||||
|
||||
from apps.payments import services
|
||||
from apps.payments.forms import ReceiptForm
|
||||
from apps.payments.models import PaymentReceipt
|
||||
from tests.test_payments import case, data, upload
|
||||
|
||||
pytestmark = [pytest.mark.django_db(transaction=True),
|
||||
pytest.mark.skipif(connection.vendor != 'postgresql', reason='Requires PostgreSQL row locks')]
|
||||
|
||||
|
||||
def test_simultaneous_delete_and_receipt_allow_exactly_one_operation(case):
|
||||
form = ReceiptForm(data(case), {'receipt_image': upload()}, customer=case['customer'])
|
||||
assert form.is_valid(), form.errors
|
||||
barrier = Barrier(2)
|
||||
|
||||
def operate(operation):
|
||||
close_old_connections()
|
||||
try:
|
||||
barrier.wait(timeout=10)
|
||||
try:
|
||||
if operation == 'delete':
|
||||
services.delete_notice(case['creator'], case['notice'])
|
||||
else:
|
||||
services.submit_receipt(case['customer'], case['customer'], form.cleaned_data)
|
||||
return operation
|
||||
except ValidationError:
|
||||
return 'blocked'
|
||||
finally:
|
||||
connection.close()
|
||||
|
||||
with ThreadPoolExecutor(max_workers=2) as pool:
|
||||
outcomes = list(pool.map(operate, ['delete', 'receipt']))
|
||||
case['notice'].refresh_from_db()
|
||||
assert outcomes.count('blocked') == 1
|
||||
if case['notice'].deleted_at:
|
||||
assert not PaymentReceipt.objects.filter(notice=case['notice']).exists()
|
||||
assert 'delete' in outcomes
|
||||
else:
|
||||
assert PaymentReceipt.objects.filter(notice=case['notice']).count() == 1
|
||||
assert 'receipt' in outcomes
|
||||
Reference in new issue
Block a user