74 lines
3.8 KiB
Python
74 lines
3.8 KiB
Python
"""Couverture métier du checkpoint B : profils sans création implicite."""
|
|
from app_new import db
|
|
from app_new.core.models.college import Building, Zone, Room, RoomProfile, RoomProfileItem
|
|
from app_new.core.models.equipment import Equipment
|
|
from app_new.core.services.equipment_creation import create_equipment
|
|
from app_new.core.models.equipment import EquipmentCategory
|
|
from time import perf_counter
|
|
|
|
|
|
def test_room_profile_is_editable_and_application_uses_shared_service(authenticated_client, app):
|
|
with app.app_context():
|
|
building = Building(name="TEST_UI_020_B_BUILDING")
|
|
db.session.add(building)
|
|
db.session.flush()
|
|
zone = Zone(name="TEST_UI_020_B_ZONE", building_id=building.id)
|
|
category = EquipmentCategory(name="TEST_UI_020_B_LUMINAIRE")
|
|
db.session.add_all([zone, category])
|
|
db.session.flush()
|
|
room = Room(name="TEST_UI_020_B101", code="TEST_UI_020_B101", building_id=building.id, zone_id=zone.id)
|
|
db.session.add(room)
|
|
db.session.flush()
|
|
profile = RoomProfile(name="TEST_UI_020_B_CLASSE", description="Profil de validation")
|
|
db.session.add(profile)
|
|
db.session.flush()
|
|
item = RoomProfileItem(profile_id=profile.id, label="Luminaire", category_id=category.id, quantity=10, is_group=True)
|
|
db.session.add(item)
|
|
db.session.commit()
|
|
profile_id, room_id, item_id = profile.id, room.id, item.id
|
|
assert RoomProfile.query.get(profile_id) is not None
|
|
|
|
assert Equipment.query.filter_by(room_id=room_id).count() == 0
|
|
with app.app_context():
|
|
item = RoomProfileItem.query.get(item_id)
|
|
created = create_equipment(name=item.label, category_id=item.category_id,
|
|
room_id=room_id, quantity=4, is_group=item.is_group,
|
|
create_schedule=False)
|
|
db.session.commit()
|
|
assert created.id is not None
|
|
assert Equipment.query.filter_by(room_id=room_id).count() == 1
|
|
assert Equipment.query.filter_by(room_id=room_id).one().quantity == 4
|
|
|
|
|
|
def test_bulk_room_can_reference_profile_without_creating_equipment(authenticated_client, app):
|
|
with app.app_context():
|
|
building = Building(name="TEST_UI_020_B_BULK_BUILDING")
|
|
zone = Zone(name="TEST_UI_020_B_BULK_ZONE", building=building)
|
|
profile = RoomProfile(name="TEST_UI_020_B_BULK_PROFILE")
|
|
db.session.add_all([building, zone, profile])
|
|
db.session.commit()
|
|
building_id, zone_id, profile_id = building.id, zone.id, profile.id
|
|
with app.app_context():
|
|
rooms = [Room(name=name, code=name, building_id=building_id, zone_id=zone_id,
|
|
room_profile_id=profile_id, floor=1)
|
|
for name in ("TEST_UI_020_B101", "TEST_UI_020_B102")]
|
|
db.session.add_all(rooms)
|
|
db.session.commit()
|
|
saved = Room.query.filter(Room.building_id == building_id, Room.room_profile_id == profile_id).all()
|
|
assert len(saved) == 2
|
|
assert Equipment.query.filter(Equipment.room_id.in_([room.id for room in saved])).count() == 0
|
|
|
|
|
|
def test_bulk_200_is_single_batch_and_does_not_duplicate(app):
|
|
with app.app_context():
|
|
building = Building(name="TEST_UI_020_BENCH_BUILDING")
|
|
db.session.add(building); db.session.flush()
|
|
names = [f"B{i:03d}" for i in range(200)]
|
|
started = perf_counter()
|
|
db.session.add_all([Room(name=name, code=name, building_id=building.id, floor=i % 4) for i, name in enumerate(names)])
|
|
db.session.commit()
|
|
elapsed = perf_counter() - started
|
|
assert Room.query.filter(Room.building_id == building.id).count() == 200
|
|
# The isolated fixture is torn down at session end; this assertion is
|
|
# deliberately kept as a measurable smoke benchmark.
|
|
assert elapsed < 10
|