chore(finance/tests): add rules tests
parent
25ec55d731
commit
b613dc70c2
@ -1,2 +1,3 @@
|
|||||||
from .admin import *
|
from .admin import *
|
||||||
from .models import *
|
from .models import *
|
||||||
|
from .rules import *
|
||||||
|
|||||||
@ -0,0 +1,102 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
from django.utils import timezone
|
||||||
|
from django.conf import settings
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from unittest.mock import Mock
|
||||||
|
from finance.rules import is_creator, not_submitted, leads_excursion
|
||||||
|
from finance.models import Statement, Ledger
|
||||||
|
from members.models import Member, Group, Freizeit, GEMEINSCHAFTS_TOUR, MUSKELKRAFT_ANREISE, MALE, FEMALE
|
||||||
|
|
||||||
|
|
||||||
|
class FinanceRulesTestCase(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.group = Group.objects.create(name="Test Group")
|
||||||
|
self.ledger = Ledger.objects.create(name="Test Ledger")
|
||||||
|
|
||||||
|
self.user1 = User.objects.create_user(username="alice", password="test123")
|
||||||
|
self.member1 = Member.objects.create(
|
||||||
|
prename="Alice", lastname="Smith", birth_date=timezone.now().date(),
|
||||||
|
email=settings.TEST_MAIL, gender=FEMALE, user=self.user1
|
||||||
|
)
|
||||||
|
self.member1.group.add(self.group)
|
||||||
|
|
||||||
|
self.user2 = User.objects.create_user(username="bob", password="test123")
|
||||||
|
self.member2 = Member.objects.create(
|
||||||
|
prename="Bob", lastname="Jones", birth_date=timezone.now().date(),
|
||||||
|
email=settings.TEST_MAIL, gender=MALE, user=self.user2
|
||||||
|
)
|
||||||
|
self.member2.group.add(self.group)
|
||||||
|
|
||||||
|
self.freizeit = Freizeit.objects.create(
|
||||||
|
name="Test Excursion",
|
||||||
|
kilometers_traveled=100,
|
||||||
|
tour_type=GEMEINSCHAFTS_TOUR,
|
||||||
|
tour_approach=MUSKELKRAFT_ANREISE,
|
||||||
|
difficulty=2
|
||||||
|
)
|
||||||
|
self.freizeit.jugendleiter.add(self.member1)
|
||||||
|
|
||||||
|
self.statement = Statement.objects.create(
|
||||||
|
short_description="Test Statement",
|
||||||
|
explanation="Test explanation",
|
||||||
|
night_cost=27,
|
||||||
|
created_by=self.member1,
|
||||||
|
excursion=self.freizeit
|
||||||
|
)
|
||||||
|
self.statement.allowance_to.add(self.member1)
|
||||||
|
|
||||||
|
def test_is_creator_true(self):
|
||||||
|
"""Test is_creator predicate returns True when user created the statement"""
|
||||||
|
self.assertTrue(is_creator(self.user1, self.statement))
|
||||||
|
self.assertFalse(is_creator(self.user2, self.statement))
|
||||||
|
|
||||||
|
def test_not_submitted_statement(self):
|
||||||
|
"""Test not_submitted predicate returns True when statement is not submitted"""
|
||||||
|
self.statement.submitted = False
|
||||||
|
self.assertTrue(not_submitted(self.user1, self.statement))
|
||||||
|
self.statement.submitted = True
|
||||||
|
self.assertFalse(not_submitted(self.user1, self.statement))
|
||||||
|
|
||||||
|
def test_not_submitted_freizeit_with_statement(self):
|
||||||
|
"""Test not_submitted predicate with Freizeit having unsubmitted statement"""
|
||||||
|
self.freizeit.statement = self.statement
|
||||||
|
self.statement.submitted = False
|
||||||
|
self.assertTrue(not_submitted(self.user1, self.freizeit))
|
||||||
|
|
||||||
|
def test_not_submitted_freizeit_without_statement(self):
|
||||||
|
"""Test not_submitted predicate with Freizeit having no statement attribute"""
|
||||||
|
# Create a mock Freizeit that truly doesn't have the statement attribute
|
||||||
|
mock_freizeit = Mock(spec=Freizeit)
|
||||||
|
# Remove the statement attribute entirely
|
||||||
|
if hasattr(mock_freizeit, 'statement'):
|
||||||
|
delattr(mock_freizeit, 'statement')
|
||||||
|
self.assertTrue(not_submitted(self.user1, mock_freizeit))
|
||||||
|
|
||||||
|
def test_leads_excursion_freizeit_user_is_leader(self):
|
||||||
|
"""Test leads_excursion predicate returns True when user leads the Freizeit"""
|
||||||
|
self.assertTrue(leads_excursion(self.user1, self.freizeit))
|
||||||
|
self.assertFalse(leads_excursion(self.user2, self.freizeit))
|
||||||
|
|
||||||
|
def test_leads_excursion_statement_with_excursion(self):
|
||||||
|
"""Test leads_excursion predicate with statement having excursion led by user"""
|
||||||
|
result = leads_excursion(self.user1, self.statement)
|
||||||
|
self.assertTrue(result)
|
||||||
|
|
||||||
|
def test_leads_excursion_statement_no_excursion_attribute(self):
|
||||||
|
"""Test leads_excursion predicate with statement having no excursion attribute"""
|
||||||
|
mock_statement = Mock()
|
||||||
|
del mock_statement.excursion
|
||||||
|
result = leads_excursion(self.user1, mock_statement)
|
||||||
|
self.assertFalse(result)
|
||||||
|
|
||||||
|
def test_leads_excursion_statement_excursion_is_none(self):
|
||||||
|
"""Test leads_excursion predicate with statement having None excursion"""
|
||||||
|
statement_no_excursion = Statement.objects.create(
|
||||||
|
short_description="Test Statement No Excursion",
|
||||||
|
explanation="Test explanation",
|
||||||
|
night_cost=27,
|
||||||
|
created_by=self.member1,
|
||||||
|
excursion=None
|
||||||
|
)
|
||||||
|
result = leads_excursion(self.user1, statement_no_excursion)
|
||||||
|
self.assertFalse(result)
|
||||||
Loading…
Reference in New Issue