============================= test session starts ============================= platform win32 -- Python 3.14.3, pytest-8.3.3, pluggy-1.6.0 -- C:\Users\bruno\scoop\apps\python\current\python.exe cachedir: .pytest_cache rootdir: C:\dev\git\python\imago configfile: pytest.ini plugins: anyio-4.12.0, asyncio-0.24.0, cov-5.0.0, mock-3.15.1, respx-0.22.0 asyncio: mode=Mode.AUTO, default_loop_scope=None collecting ... collected 8 items tests/test_websocket.py::TestWSPipelineNoToken::test_no_token_rejected PASSED [ 12%] tests/test_websocket.py::TestWSPipelineAuth::test_invalid_token_rejected PASSED [ 25%] tests/test_websocket.py::TestWSPipelineAuth::test_valid_token_accepted PASSED [ 37%] tests/test_websocket.py::TestWSPipelineAuth::test_wrong_owner_rejected PASSED [ 50%] tests/test_websocket.py::TestWSPipelineSynthetic::test_done_image_sends_synthetic PASSED [ 62%] tests/test_websocket.py::TestWSPipelineSynthetic::test_error_image_sends_synthetic PASSED [ 75%] tests/test_websocket.py::TestWSAdminMonitor::test_admin_no_token_rejected FAILED [ 87%] tests/test_websocket.py::TestWSAdminMonitor::test_admin_non_admin_rejected PASSED [100%] ================================== FAILURES =================================== _______________ TestWSAdminMonitor.test_admin_no_token_rejected _______________ tests\test_websocket.py:143: in test_admin_no_token_rejected with pytest.raises(Exception): E Failed: DID NOT RAISE ---------------------------- Captured stdout setup ---------------------------- 2026-02-25T02:38:15.285340Z [debug ] Using proactor: IocpProactor [asyncio] 2026-02-25T02:38:15.286531Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.286857Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.287360Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("images")', ()) [aiosqlite] 2026-02-25T02:38:15.287769Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite] 2026-02-25T02:38:15.288230Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.288450Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.288777Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.289040Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.289539Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.289723Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.290052Z [debug ] executing functools.partial(, 'PRAGMA temp.table_info("images")', ()) [aiosqlite] 2026-02-25T02:38:15.290410Z [debug ] operation functools.partial(, 'PRAGMA temp.table_info("images")', ()) completed [aiosqlite] 2026-02-25T02:38:15.290742Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.290914Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.291251Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.291472Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.291877Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.292054Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.292386Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T02:38:15.292671Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T02:38:15.293078Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.293254Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.293569Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.293750Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.294209Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.294386Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.294725Z [debug ] executing functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T02:38:15.294917Z [debug ] operation functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T02:38:15.295321Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.295856Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.300241Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.302520Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.309713Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.310650Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.312266Z [debug ] executing functools.partial(, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) [aiosqlite] 2026-02-25T02:38:15.313252Z [debug ] operation functools.partial(, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) completed [aiosqlite] 2026-02-25T02:38:15.314205Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.314618Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.315781Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.316185Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.316876Z [debug ] executing functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) [aiosqlite] 2026-02-25T02:38:15.317375Z [debug ] operation functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed [aiosqlite] 2026-02-25T02:38:15.317900Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.318223Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.318861Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.319120Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.319601Z [debug ] executing functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) [aiosqlite] 2026-02-25T02:38:15.319996Z [debug ] operation functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed [aiosqlite] 2026-02-25T02:38:15.320515Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.320794Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.321887Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.322145Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.322488Z [debug ] executing functools.partial(, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) [aiosqlite] 2026-02-25T02:38:15.323002Z [debug ] operation functools.partial(, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) completed [aiosqlite] 2026-02-25T02:38:15.323554Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.323774Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.324326Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.324573Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.324879Z [debug ] executing functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) [aiosqlite] 2026-02-25T02:38:15.325187Z [debug ] operation functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed [aiosqlite] 2026-02-25T02:38:15.325498Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.325694Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.326112Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.326299Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.326574Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) [aiosqlite] 2026-02-25T02:38:15.326817Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) completed [aiosqlite] 2026-02-25T02:38:15.327095Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.327255Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.327602Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.327779Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.328061Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) [aiosqlite] 2026-02-25T02:38:15.328288Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed [aiosqlite] 2026-02-25T02:38:15.328654Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.328922Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.329457Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.329652Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.329976Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) [aiosqlite] 2026-02-25T02:38:15.330254Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed [aiosqlite] 2026-02-25T02:38:15.330595Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.330767Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.331132Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.331302Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.331734Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.331931Z [debug ] operation functools.partial() completed [aiosqlite] ----------------------------- Captured log setup ------------------------------ DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'PRAGMA main.table_info("images")', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'PRAGMA temp.table_info("images")', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'PRAGMA temp.table_info("images")', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, '\nCREATE TABLE api_clients (\n\tid VARCHAR(36) NOT NULL, \n\tname VARCHAR(256) NOT NULL, \n\tapi_key_hash VARCHAR(64) NOT NULL, \n\tscopes JSON NOT NULL, \n\t"plan" VARCHAR(8) NOT NULL, \n\tis_active BOOLEAN NOT NULL, \n\tstorage_used_bytes BIGINT NOT NULL, \n\tquota_storage_mb INTEGER NOT NULL, \n\tquota_images INTEGER NOT NULL, \n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tPRIMARY KEY (id)\n)\n\n', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, '\nCREATE TABLE images (\n\tid INTEGER NOT NULL, \n\tuuid VARCHAR(36) NOT NULL, \n\tclient_id VARCHAR(36) NOT NULL, \n\toriginal_name VARCHAR(512) NOT NULL, \n\tfilename VARCHAR(512) NOT NULL, \n\tfile_path VARCHAR(1024) NOT NULL, \n\tthumbnail_path VARCHAR(1024), \n\tmime_type VARCHAR(128), \n\tfile_size BIGINT, \n\twidth INTEGER, \n\theight INTEGER, \n\tuploaded_at DATETIME, \n\tprocessing_status VARCHAR(10) NOT NULL, \n\tprocessing_error TEXT, \n\tprocessing_started_at DATETIME, \n\tprocessing_done_at DATETIME, \n\texif_raw JSON, \n\texif_make VARCHAR(256), \n\texif_model VARCHAR(256), \n\texif_lens VARCHAR(256), \n\texif_taken_at DATETIME, \n\texif_gps_lat FLOAT, \n\texif_gps_lon FLOAT, \n\texif_altitude FLOAT, \n\texif_iso INTEGER, \n\texif_aperture VARCHAR(32), \n\texif_shutter VARCHAR(32), \n\texif_focal VARCHAR(32), \n\texif_flash BOOLEAN, \n\texif_orientation INTEGER, \n\texif_software VARCHAR(256), \n\tocr_text TEXT, \n\tocr_language VARCHAR(64), \n\tocr_confidence FLOAT, \n\tocr_has_text BOOLEAN, \n\tai_description TEXT, \n\tai_tags JSON, \n\tai_confidence FLOAT, \n\tai_model_used VARCHAR(128), \n\tai_processed_at DATETIME, \n\tai_prompt_tokens INTEGER, \n\tai_output_tokens INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(client_id) REFERENCES api_clients (id)\n)\n\n', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed ---------------------------- Captured stdout call ----------------------------- 2026-02-25T02:38:15.333814Z [debug ] Using proactor: IocpProactor [asyncio] 2026-02-25T02:38:15.336157Z [error ] ws.admin_error [app.routers.websocket] error='coroutine' object has no attribute 'unsubscribe' ------------------------------ Captured log call ------------------------------ DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor ERROR app.routers.websocket:websocket.py:249 ws.admin_error -------------------------- Captured stdout teardown --------------------------- 2026-02-25T02:38:15.832958Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.833285Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.833662Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("images")', ()) [aiosqlite] 2026-02-25T02:38:15.833873Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite] 2026-02-25T02:38:15.834268Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.834614Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.834880Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.835027Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.835384Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.835535Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.835760Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T02:38:15.835952Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T02:38:15.836184Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.836337Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.836573Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.836754Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.837182Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.837415Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.837836Z [debug ] executing functools.partial(, '\nDROP TABLE images', ()) [aiosqlite] 2026-02-25T02:38:15.838467Z [debug ] operation functools.partial(, '\nDROP TABLE images', ()) completed [aiosqlite] 2026-02-25T02:38:15.838780Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.838939Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.839392Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.839675Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.840128Z [debug ] executing functools.partial(, '\nDROP TABLE api_clients', ()) [aiosqlite] 2026-02-25T02:38:15.840395Z [debug ] operation functools.partial(, '\nDROP TABLE api_clients', ()) completed [aiosqlite] 2026-02-25T02:38:15.840657Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.840802Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.841316Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.841604Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.842071Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T02:38:15.842234Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T02:38:15.842808Z [debug ] Using proactor: IocpProactor [asyncio] ---------------------------- Captured log teardown ---------------------------- DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'PRAGMA main.table_info("images")', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, '\nDROP TABLE images', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, '\nDROP TABLE images', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial(, '\nDROP TABLE api_clients', ()) DEBUG aiosqlite:core.py:116 operation functools.partial(, '\nDROP TABLE api_clients', ()) completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG aiosqlite:core.py:114 executing functools.partial() DEBUG aiosqlite:core.py:116 operation functools.partial() completed DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor ============================== warnings summary =============================== tests/test_websocket.py::TestWSAdminMonitor::test_admin_no_token_rejected C:\dev\git\python\imago\app\routers\websocket.py:210: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited if not client.has_scope("admin"): Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. tests/test_websocket.py::TestWSAdminMonitor::test_admin_no_token_rejected C:\Users\bruno\scoop\apps\python\current\Lib\site-packages\fastapi\routing.py:383: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited await dependant.call(**solved_result.values) Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED tests/test_websocket.py::TestWSAdminMonitor::test_admin_no_token_rejected =================== 1 failed, 7 passed, 2 warnings in 1.13s ===================