Test Cases by API

142 test cases across 9 APIs · parsed from unit_tests/test_*.py · generated 2026-10-06

CIM /cim/* 7

unit_tests/test_cim.py
test_echo_with_path_param
test_event_callback_validates_keys
test_event_callback_with_keys
test_event_dispatches_no_subscribers An event with no matching subscriber returns 'no-subscribers'.
test_event_requires_auth
test_kit_callback_unknown_sku_returns_404
test_publish_endpoint

Config App /config/* 82

unit_tests/test_config_app.py
test_app_dynamic_kit_create
test_app_part_create_and_delete
test_cloud_keys_add_edit_persist_in_db Cloud keys must actually LAND in the DB — every assertion below is a
test_cloud_keys_partial_create_rejected First-time cloud-creds create must be complete — a partial payload
test_common_user_create_full_fields
test_common_user_create_minimum_fields
test_common_user_list_requires_auth
test_common_user_list_with_admin
test_common_user_role_edit_with_react_key_persists Ravi's 'updates are not storing' class: UsersCOD sends the role
test_company_config_rejects_blank_key_and_value
test_company_create_with_atomic_cloud_storage Every new company can carry its storage in the SAME create call —
test_device_rejects_junk_media_type_and_capture_fields
test_event_types_not_editable_anywhere Events come only from the bundle archive (events.json): the old
test_infra_client_create_and_delete
test_infra_client_create_rejects_unknown_user
test_infra_client_delete_missing_returns_404
test_infra_client_list
test_infra_company_config_overwrite Second POST for the same key should overwrite, not stack duplicates.
test_infra_company_config_roundtrip
test_infra_company_create_and_delete
test_infra_company_create_with_admin_user ICD onboarding flow — company + first DORI_ADMIN user in one call.
test_infra_company_delete_missing_returns_404
test_infra_company_edit_does_not_mint_new_admin Editing a company while the payload happens to carry admin_email
test_infra_company_list
test_infra_credentials_get
test_infra_credentials_upsert
test_infra_mlc_config_assign_and_unassign_companies
test_infra_mlc_config_assign_missing_config_returns_404
test_infra_mlc_config_assign_replace_mode merge=False wipes the existing membership set.
test_infra_mlc_config_create_list_and_delete
test_infra_mlc_config_create_rejects_unknown_mlc
test_infra_mlc_config_delete_missing_returns_404
test_infra_mlc_config_patch_missing_returns_404
test_infra_mlc_config_patch_updates_fields
test_infra_mlc_config_unassign_missing_returns_404
test_infra_mlc_create_list_and_delete
test_infra_mlc_delete_missing_returns_404
test_infra_mlc_initialized_toggle The ICD initialized switch flips is_configured + is_deployed together.
test_infra_mlc_list_company_filter feature-list #3: ?company_id= returns only MLCs associated with that
test_infra_mlc_list_exposes_cameras_key feature-list #17b: each MLC row carries a `cameras` array of the
test_infra_mlc_list_status_filter feature-list #18: ?status= narrows the MLC list by mlc.status
test_infra_mlc_update_can_disassociate_service_bundle feature-list #8: posting serviceBundleId:null on an update clears the
test_infra_service_bundle_company_filter feature-list #15: ?company_id= narrows the bundle list to bundles
test_infra_service_bundle_create_list_and_delete
test_infra_service_bundle_delete_missing_returns_404
test_infra_system_event_returns_501
test_infra_user_create_and_delete
test_infra_user_create_rejects_unknown_company
test_infra_user_delete_missing_returns_404
test_infra_user_list
test_infra_user_list_filtered_by_company
test_location_rejects_junk_timezone_and_bogus_company
test_login_rejects_bad_password
test_login_rejects_unknown_email
test_login_returns_company_name The dashboard header shows the tenant the user is logged into — the
test_login_succeeds_returns_jwt
test_mlc_config_rejects_negative_operational_params
test_mlc_rejects_junk_url_and_zero_capacity
test_ops_camera_create_rejects_unknown_location
test_ops_camera_create_under_location_and_delete Camera (device) attaches to a location; deleting the location
test_ops_client_user_list
test_ops_devices_list
test_ops_employees_list_hides_platform_admin COD's Employees tab (plain tenant-scoped call) must not surface
test_ops_event_types_readonly_view Events are platform-owned (loaded in ICD from the bundle archive) but
test_ops_location_create_and_delete Hierarchy is company → location → camera: a location needs nothing but
test_ops_location_update_persists_ui_shaped_payload Ravi's report: editing a location's timezone in the React UI said
test_ops_locations_list
test_ops_service_bundles_and_events_scoped_to_company COD sees only the bundles attached to the caller's company (and only
test_ops_subscriber_create
test_ops_subscriber_delete_cascades_subscriptions COD owns the whole subscriber lifecycle: deleting a subscriber
test_ops_subscriber_edit_updates_instead_of_duplicating An edit-save with `id` must UPDATE the subscriber row — it used to
test_ops_subscription_rejects_foreign_subscriber
test_ops_subscriptions_crud_roundtrip Subscriptions are customer-specific → they live in COD (/ops), not
test_service_bundle_inline_event_types The programmatic JSON POST still takes inline event_types (that's
test_service_bundle_tar_upload_loads_events ICD flow: POST a .tar.gz to /infra/service_bundle/upload → the
test_service_bundle_upload_loads_events_from_labelmap Canonical bundle flow: POST a .tar.gz containing
test_service_bundle_upload_rejects_bad_archives
test_subscriber_rejects_junk_type_and_missing_fields
test_subscription_requires_subscriber
test_subscription_scope_company_location_camera A subscription scopes to company (always) + an optional location +
test_user_rejects_junk_role
test_v1_mlc_aliases_resolve The /v1/ MLC-management aliases must resolve alongside the legacy

DIM /dim/* 4

unit_tests/test_dim.py
test_echo
test_stats_endpoint
test_ws_fanout_end_to_end DIM WS fan-out: a notification event (isNotification=true) enqueued to the
test_ws_ping_pong Round-trip ping/pong via the WebSocket endpoint.

Edge Simulator /sim/* 5

unit_tests/test_edge_simulator.py
test_echo
test_inject_inference
test_inject_order
test_loop_start_stop
test_status

Health /*/echo 3

unit_tests/test_health.py
test_dashboard_html
test_root_serves_launcher
test_service_echo

Job App /jobs/* 25

unit_tests/test_job_app.py
test_abort_pending_job Abort forces a stuck pending job to STOPPED without a callback.
test_auth_callback_no_args
test_clove_trigger_starts_job
test_device_camera_config_is_sent_to_mlc The camera_config the operator sets on the device must reach the MLC
test_dynamic_kit_create_via_jobs
test_dynamic_kit_update
test_failed_start_stores_reason_and_allows_retry A start the MLC rejects must leave the job FAILED with the reason
test_file_upload
test_getjobslist_exposes_mlc_and_device feature-list #17a: each getjobslist row surfaces the MLC it's
test_image_job_fails_when_mlc_unreachable Image job + dead MLC → FAILED immediately (no pending, no callback).
test_image_job_running_immediately_no_pending Image-type cameras have NO pending state: the MLC push/pull init
test_image_pull_uses_json_contract Ravi's real-MLC failure: wrapperv2's /api/v2/pull_image REJECTS
test_job_status_callback_transitions The MLC's async callback drives PENDING → RUNNING / FAILED, and a
test_jobs_list_empty_ok
test_jobs_list_requires_auth
test_manual_job_status_override Operator escape hatch: PATCH /jobs/v1/job/{id}/status forces a job's
test_mlc_health_monitor_reconciles_dead_mlc The health sweep marks a down MLC NOT ACTIVE and moves its in-flight
test_mlc_initialized_before_first_job_and_state_persisted apprunner init-before-start: a fresh MLC (is_configured=False,
test_start_job_auto_selects_mlc_by_service_bundle apprunner getconfig parity: a device with NO pinned mlc_id gets
test_start_job_fails_when_mlc_unreachable STRICT semantics — the user's expectation: no running MLC = the API
test_start_job_falls_through_to_next_mlc_when_pinned_is_full Capacity-aware selection: a device pinned to an MLC that has hit its
test_start_job_round_trips_through_mlc Full apprunner-shaped round-trip against the mock cluster: start →
test_start_job_without_mlc_fails_strict No MLC assigned to the device → strict refuses to start (apprunner's
test_v1_job_aliases_resolve The /v1/ job-management aliases must resolve alongside the legacy
test_v2_add_benchmark_result

Monitor /monitor/* 4

unit_tests/test_monitor.py
test_echo_no_path
test_echo_with_path
test_system_event_requires_auth
test_system_event_with_auth A system event is now enqueued into inference.inference_event (doc

Outbox Relay unit: DIM relay 6

unit_tests/test_outbox_relay.py
test_backoff_is_exponential_and_capped
test_drain_dead_letters_at_cap
test_drain_marks_dispatched_on_success
test_drain_retries_with_backoff_on_cim_failure
test_fanout_failure_does_not_block_cim_delivery Ephemeral UI lane failure must not stop the durable alert lane.
test_retry_sql_casts_params_for_asyncpg Regression: `$2 >= $4` without casts makes asyncpg raise

System Event Alerts pipeline: DB→outbox→CIM 6

unit_tests/test_system_event_alerts.py
test_event_process_customer_event_hits_all_channels
test_event_process_system_event_publishes_mqtt Deterministic companion to the full-path MQTT test: POST a system event
test_event_process_system_event_smses_admin
test_mlc_down_insert_alerts_admin_via_sms An MLC_DOWN event (enqueued to the outbox → DIM relay → CIM) SMSes the
test_mlc_down_insert_publishes_mqtt Inserting an MLC_DOWN event publishes an MQTT system alert, captured by
test_mlc_up_insert_is_silent MLC_UP is not an alert (is_alert=false), so emit_event enqueues it with
No test cases match.