Added other test to the navigation

This commit is contained in:
JKuijperM 2026-07-31 11:03:30 +02:00
parent 255c035797
commit 0135421655

View File

@ -67,3 +67,165 @@ def test_fuel_delete_post_cascades_to_fuelentry(auth_client, user, account, cate
assert not Expense.objects.filter(pk=expense.pk).exists() assert not Expense.objects.filter(pk=expense.pk).exists()
assert not FuelEntry.objects.filter(pk=entry.pk).exists() assert not FuelEntry.objects.filter(pk=entry.pk).exists()
def _edit_payload(account, edit_date, amount, odometer, liters, next_url=None):
payload = {
"date": edit_date.strftime("%Y-%m-%d"),
"amount": str(amount),
"account": account.pk,
"odometer": str(odometer),
"liters": str(liters),
}
if next_url is not None:
payload["next"] = next_url
return payload
def test_fuel_edit_post_updates_expense_and_fuelentry(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"), amount=Decimal("50"))
expense = entry.expense
new_date = date(2024, 3, 1)
response = auth_client.post(
reverse('fuel_edit', args=[expense.pk]),
_edit_payload(account, new_date, Decimal("45.50"), 1200, Decimal("22.5")),
)
assert response.status_code == 302
expense.refresh_from_db()
entry.refresh_from_db()
assert expense.amount == Decimal("45.50")
assert expense.date == new_date
assert expense.account_id == account.pk
assert entry.odometer == 1200
assert entry.liters == Decimal("22.5")
def test_fuel_edit_invalid_post_returns_200_and_does_not_modify(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"), amount=Decimal("50"))
expense = entry.expense
original_date = expense.date
payload = _edit_payload(account, date(2024, 3, 1), Decimal("45.50"), 1200, Decimal("22.5"))
payload["liters"] = ""
response = auth_client.post(reverse('fuel_edit', args=[expense.pk]), payload)
assert response.status_code == 200
expense.refresh_from_db()
entry.refresh_from_db()
assert expense.amount == Decimal("50")
assert expense.date == original_date
assert entry.odometer == 1000
assert entry.liters == Decimal("20")
def test_fuel_edit_redirects_to_next_when_relative(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
next_url = reverse('expense_list')
response = auth_client.post(
reverse('fuel_edit', args=[expense.pk]),
_edit_payload(account, date(2024, 3, 1), Decimal("45.50"), 1200, Decimal("22.5"), next_url=next_url),
)
assert response.status_code == 302
assert response.url == next_url
def test_fuel_edit_ignores_external_next(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
response = auth_client.post(
reverse('fuel_edit', args=[expense.pk]),
_edit_payload(
account, date(2024, 3, 1), Decimal("45.50"), 1200, Decimal("22.5"),
next_url="https://evil.com",
),
)
assert response.status_code == 302
assert response.url == reverse('expense_list')
def test_fuel_delete_get_does_not_delete(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
response = auth_client.get(reverse('fuel_delete', args=[expense.pk]))
assert response.status_code == 200
assert Expense.objects.filter(pk=expense.pk).exists()
assert FuelEntry.objects.filter(pk=entry.pk).exists()
def test_fuel_delete_get_cancel_link_uses_next_when_provided(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
next_url = reverse('expense_list')
response = auth_client.get(reverse('fuel_delete', args=[expense.pk]), {"next": next_url})
assert response.status_code == 200
assert f'<a class="btn btn-secondary" href="{next_url}">Cancelar</a>'.encode() in response.content
def test_fuel_delete_get_cancel_link_falls_back_to_fuel_list_without_next(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
fuel_list_url = reverse('fuel_list')
response = auth_client.get(reverse('fuel_delete', args=[expense.pk]))
assert response.status_code == 200
assert f'<a class="btn btn-secondary" href="{fuel_list_url}">Cancelar</a>'.encode() in response.content
def test_fuel_delete_post_redirects_to_next_when_relative(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
next_url = reverse('expense_list')
response = auth_client.post(reverse('fuel_delete', args=[expense.pk]), {"next": next_url})
assert response.status_code == 302
assert response.url == next_url
def test_fuel_delete_post_ignores_external_next(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
response = auth_client.post(reverse('fuel_delete', args=[expense.pk]), {"next": "https://evil.com"})
assert response.status_code == 302
assert response.url == reverse('fuel_list')
def test_fuel_delete_get_ignores_unsafe_next_in_cancel_link(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
fuel_list_url = reverse('fuel_list')
response = auth_client.get(reverse('fuel_delete', args=[expense.pk]), {"next": "javascript:alert(1)"})
assert response.status_code == 200
assert b"javascript:" not in response.content
assert f'<a class="btn btn-secondary" href="{fuel_list_url}">Cancelar</a>'.encode() in response.content
def test_fuel_edit_get_ignores_unsafe_next_in_cancel_link(auth_client, user, account, category):
entry = _make_fuel_entry(user, account, category, odometer=1000, liters=Decimal("20"))
expense = entry.expense
response = auth_client.get(reverse('fuel_edit', args=[expense.pk]), {"next": "javascript:alert(1)"})
assert response.status_code == 200
assert b"javascript:" not in response.content