Added other test to the navigation
This commit is contained in:
parent
255c035797
commit
0135421655
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user