SmokeScan / tests /test_samples.py
KinetoLabs's picture
Fix critical model implementations and add sample scenarios
f3ebc82
raw
history blame
10.4 kB
"""Tests for sample room data module."""
import pytest
from pathlib import Path
from ui.samples import (
SAMPLE_SCENARIOS,
SAMPLE_SCENARIOS_BY_ID,
SAMPLE_IMAGES_DIR,
get_sample_choices,
load_sample,
load_sample_images,
get_scenario_by_id,
)
from ui.state import SessionState
from ui.components import image_store
class TestSampleScenarios:
"""Test sample scenario definitions."""
def test_four_scenarios_defined(self):
"""Verify exactly 4 sample scenarios are defined."""
assert len(SAMPLE_SCENARIOS) == 4
def test_scenario_ids_unique(self):
"""Verify all scenario IDs are unique."""
ids = [s.id for s in SAMPLE_SCENARIOS]
assert len(ids) == len(set(ids))
def test_scenario_ids_expected(self):
"""Verify expected scenario IDs exist."""
expected_ids = {"bar_dining", "bar_area", "kitchen", "factory"}
actual_ids = set(SAMPLE_SCENARIOS_BY_ID.keys())
assert actual_ids == expected_ids
def test_all_scenarios_have_required_fields(self):
"""Verify all scenarios have required data fields."""
for scenario in SAMPLE_SCENARIOS:
# Basic fields
assert scenario.id
assert scenario.name
assert scenario.description
assert scenario.image_files
# Project data required fields
assert "project_name" in scenario.project_data
assert "address" in scenario.project_data
assert "city" in scenario.project_data
assert "state" in scenario.project_data
assert "zip_code" in scenario.project_data
assert "client_name" in scenario.project_data
assert "fire_date" in scenario.project_data
assert "assessment_date" in scenario.project_data
assert "facility_classification" in scenario.project_data
assert "construction_era" in scenario.project_data
assert "assessor_name" in scenario.project_data
# Room data required fields
assert "name" in scenario.room_data
assert "length_ft" in scenario.room_data
assert "width_ft" in scenario.room_data
assert "ceiling_height_ft" in scenario.room_data
# Observations should have smoke/fire odor at minimum
assert "smoke_fire_odor" in scenario.observations_data
class TestSampleImages:
"""Test sample image file existence."""
def test_sample_images_dir_exists(self):
"""Verify sample images directory exists."""
assert SAMPLE_IMAGES_DIR.exists()
assert SAMPLE_IMAGES_DIR.is_dir()
def test_all_referenced_images_exist(self):
"""Verify all images referenced in scenarios exist on disk."""
missing_files = []
for scenario in SAMPLE_SCENARIOS:
for filename in scenario.image_files:
filepath = SAMPLE_IMAGES_DIR / filename
if not filepath.exists():
missing_files.append(f"{scenario.id}: {filename}")
assert not missing_files, f"Missing image files: {missing_files}"
def test_bar_dining_has_3_images(self):
"""Verify Bar & Dining scenario has 3 images."""
scenario = SAMPLE_SCENARIOS_BY_ID["bar_dining"]
assert len(scenario.image_files) == 3
def test_bar_area_has_3_images(self):
"""Verify Bar Area scenario has 3 images."""
scenario = SAMPLE_SCENARIOS_BY_ID["bar_area"]
assert len(scenario.image_files) == 3
def test_kitchen_has_6_images(self):
"""Verify Kitchen scenario has 6 images."""
scenario = SAMPLE_SCENARIOS_BY_ID["kitchen"]
assert len(scenario.image_files) == 6
def test_factory_has_1_image(self):
"""Verify Factory scenario has 1 image."""
scenario = SAMPLE_SCENARIOS_BY_ID["factory"]
assert len(scenario.image_files) == 1
class TestGetSampleChoices:
"""Test get_sample_choices function."""
def test_returns_list_of_tuples(self):
"""Verify function returns list of (label, value) tuples."""
choices = get_sample_choices()
assert isinstance(choices, list)
for choice in choices:
assert isinstance(choice, tuple)
assert len(choice) == 2
def test_first_choice_is_placeholder(self):
"""Verify first choice is the placeholder."""
choices = get_sample_choices()
label, value = choices[0]
assert "Select" in label
assert value == ""
def test_returns_5_choices(self):
"""Verify returns 5 choices (1 placeholder + 4 scenarios)."""
choices = get_sample_choices()
assert len(choices) == 5
def test_all_scenario_ids_in_choices(self):
"""Verify all scenario IDs appear in choices."""
choices = get_sample_choices()
values = [v for _, v in choices]
assert "bar_dining" in values
assert "bar_area" in values
assert "kitchen" in values
assert "factory" in values
class TestLoadSample:
"""Test load_sample function."""
def test_load_valid_scenario_returns_session(self):
"""Verify loading valid scenario returns SessionState."""
session = load_sample("bar_dining")
assert session is not None
assert isinstance(session, SessionState)
# Cleanup
image_store.clear()
def test_load_invalid_scenario_returns_none(self):
"""Verify loading invalid scenario returns None."""
session = load_sample("nonexistent_scenario")
assert session is None
def test_loaded_session_has_project_data(self):
"""Verify loaded session has correct project data."""
session = load_sample("bar_dining")
assert session.project.project_name == "Sample: Bar & Dining Fire Assessment"
assert session.project.city == "Springfield"
assert session.project.state == "IL"
# Cleanup
image_store.clear()
def test_loaded_session_has_room(self):
"""Verify loaded session has room data."""
session = load_sample("kitchen")
assert len(session.rooms) == 1
assert session.rooms[0].name == "Commercial Kitchen"
assert session.rooms[0].length_ft == 30.0
assert session.rooms[0].width_ft == 25.0
# Cleanup
image_store.clear()
def test_loaded_session_has_images(self):
"""Verify loaded session has images loaded into store."""
session = load_sample("bar_area")
assert len(session.images) == 3
# Verify images are in store
for img in session.images:
assert image_store.get(img.id) is not None
# Cleanup
image_store.clear()
def test_loaded_session_has_observations(self):
"""Verify loaded session has observations data."""
session = load_sample("factory")
assert session.observations.smoke_fire_odor is True
assert session.observations.odor_intensity == "strong"
assert session.observations.large_char_particles is True
# Cleanup
image_store.clear()
def test_loaded_session_tabs_marked_complete(self):
"""Verify loaded session has tabs marked as complete."""
session = load_sample("bar_dining")
assert session.tab1_complete is True
assert session.tab2_complete is True
assert session.tab3_complete is True
assert session.tab4_complete is True
# Cleanup
image_store.clear()
def test_facility_classification_correct(self):
"""Verify facility classifications are set correctly."""
# Restaurant scenarios should be non-operational
session = load_sample("bar_dining")
assert session.project.facility_classification == "non-operational"
image_store.clear()
# Factory should be operational
session = load_sample("factory")
assert session.project.facility_classification == "operational"
image_store.clear()
def test_construction_era_correct(self):
"""Verify construction eras are set correctly."""
# Bar scenarios should be pre-1980
session = load_sample("bar_area")
assert session.project.construction_era == "pre-1980"
image_store.clear()
# Kitchen should be 1980-2000
session = load_sample("kitchen")
assert session.project.construction_era == "1980-2000"
image_store.clear()
class TestGetScenarioById:
"""Test get_scenario_by_id function."""
def test_returns_scenario_for_valid_id(self):
"""Verify returns scenario for valid ID."""
scenario = get_scenario_by_id("kitchen")
assert scenario is not None
assert scenario.id == "kitchen"
assert scenario.name == "Kitchen"
def test_returns_none_for_invalid_id(self):
"""Verify returns None for invalid ID."""
scenario = get_scenario_by_id("invalid_id")
assert scenario is None
class TestLoadSampleImages:
"""Test load_sample_images function."""
def test_loads_images_into_store(self):
"""Verify images are loaded into image_store."""
scenario = SAMPLE_SCENARIOS_BY_ID["bar_dining"]
room_id = "test-room-123"
image_metas = load_sample_images(scenario, room_id)
assert len(image_metas) == 3
for meta in image_metas:
assert meta.room_id == room_id
assert image_store.get(meta.id) is not None
# Cleanup
image_store.clear()
def test_image_metadata_has_correct_room_id(self):
"""Verify image metadata has correct room ID."""
scenario = SAMPLE_SCENARIOS_BY_ID["factory"]
room_id = "factory-room-456"
image_metas = load_sample_images(scenario, room_id)
assert len(image_metas) == 1
assert image_metas[0].room_id == room_id
# Cleanup
image_store.clear()
def test_image_ids_are_unique(self):
"""Verify each loaded image gets a unique ID."""
scenario = SAMPLE_SCENARIOS_BY_ID["kitchen"]
room_id = "kitchen-room"
image_metas = load_sample_images(scenario, room_id)
ids = [meta.id for meta in image_metas]
assert len(ids) == len(set(ids)) # All unique
# Cleanup
image_store.clear()