import datetime import pytest from app.model.models import ( AccessAuthorizationDB, Card, GroupDB, OneShotAccess, Timetable, ) from app.services.door import checkAccess def test_check_access_with_valid_timetable(db_session): # Setup: create card with valid access group = GroupDB(name="Test Group") db_session.add(group) db_session.commit() card = Card( key="test-key-123", group_id=group.id, enabled=True, name="test_card", card_serial="00:00:00:00:00:00:00", ) db_session.add(card) timetable = Timetable( weekday=datetime.datetime.weekday(datetime.date.today()), starttime=datetime.datetime.now().time(), duration=120, # 2 hours ) db_session.add(timetable) aa = AccessAuthorizationDB(name="Test AA", is_active=True, type="timetable") db_session.add(aa) aa.timetables = [timetable] group.accessauths = [aa] db_session.commit() # Test: access should be granted within time window assert checkAccess("test-key-123", db_session) def test_check_access_outside_hours(db_session): # Test when current time is outside valid hours group = GroupDB(name="Test Group") db_session.add(group) db_session.commit() card = Card( key="test-key-123", group_id=group.id, enabled=True, name="test_card", card_serial="00:00:00:00:00:00:00", ) db_session.add(card) timetable = Timetable( weekday=datetime.datetime.weekday(datetime.date.today()), starttime=datetime.time(1, 0), duration=1, # 2 hours ) db_session.add(timetable) aa = AccessAuthorizationDB(name="Test AA", is_active=True, type="timetable") db_session.add(aa) aa.timetables = [timetable] group.accessauths = [aa] db_session.commit() assert not checkAccess("test-key-123", db_session) def test_check_access_with_valid_oneshot(db_session): # Setup: create card with valid access group = GroupDB(name="Test Group") db_session.add(group) db_session.commit() card = Card( key="test-key-123", group_id=group.id, enabled=True, name="test_card", card_serial="00:00:00:00:00:00:00", ) db_session.add(card) oneshot = OneShotAccess( uses=1, ends_at=datetime.datetime.now() + datetime.timedelta(days=1) ) db_session.add(oneshot) aa = AccessAuthorizationDB(name="Test AA", is_active=True, type="oneshot") db_session.add(aa) aa.oneshot = oneshot group.accessauths = [aa] db_session.commit() # Test: access should be granted within time window assert checkAccess("test-key-123", db_session) assert aa.oneshot.uses == 0 def test_check_access_invalid_card(db_session): # Should raise exception for non-existent card with pytest.raises(Exception): checkAccess("non-existent-key", db_session) def test_check_access_with_inactive_aa(db_session): # Setup: create card with valid access group = GroupDB(name="Test Group") db_session.add(group) db_session.commit() card = Card( key="test-key-123", group_id=group.id, enabled=True, name="test_card", card_serial="00:00:00:00:00:00:00", ) db_session.add(card) timetable = Timetable( weekday=datetime.datetime.weekday(datetime.date.today()), starttime=datetime.datetime.now().time(), duration=120, # 2 hours ) db_session.add(timetable) aa = AccessAuthorizationDB(name="Test AA", is_active=False, type="timetable") db_session.add(aa) aa.timetables = [timetable] group.accessauths = [aa] db_session.commit() assert checkAccess("test-key-123", db_session) == False def test_check_access_with_inactive_card(db_session): # Setup: create card with valid access group = GroupDB(name="Test Group") db_session.add(group) db_session.commit() card = Card( key="test-key-123", group_id=group.id, enabled=False, name="test_card", card_serial="00:00:00:00:00:00:00", ) db_session.add(card) timetable = Timetable( weekday=datetime.datetime.weekday(datetime.date.today()), starttime=datetime.datetime.now().time(), duration=120, # 2 hours ) db_session.add(timetable) aa = AccessAuthorizationDB(name="Test AA", is_active=True, type="timetable") db_session.add(aa) aa.timetables = [timetable] group.accessauths = [aa] db_session.commit() assert checkAccess("test-key-123", db_session) == False def test_regression_check_access_issue_28(db_session): # Having a active aa after a inactive/invalid one denies access group = GroupDB(name="Test Group") db_session.add(group) db_session.commit() card = Card( key="test-key-123", group_id=group.id, enabled=True, name="test_card", card_serial="00:00:00:00:00:00:00", ) db_session.add(card) #Creating timetable with inactive AA timetable1 = Timetable( weekday=datetime.datetime.weekday(datetime.date.today()), starttime=datetime.datetime.now().time(), duration=120, # 2 hours ) db_session.add(timetable1) aa1 = AccessAuthorizationDB(name="First AA", is_active=False, type="timetable") db_session.add(aa1) aa1.timetables = [timetable1] #Creating timetable with active AA timetable2 = Timetable( weekday=datetime.datetime.weekday(datetime.date.today()), starttime=datetime.datetime.now().time(), duration=120, # 2 hours ) db_session.add(timetable2) aa2 = AccessAuthorizationDB(name="Second AA", is_active=True, type="timetable") db_session.add(aa2) aa2.timetables = [timetable2] group.accessauths = [aa1, aa2] db_session.commit() assert checkAccess("test-key-123", db_session) == True