219 lines
5.8 KiB
Python
219 lines
5.8 KiB
Python
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 |