c:\Users\bruno\scoop\apps\python\3.14.3\Lib\site-packages\pytest_asyncio\plugin.py:208: PytestDeprecationWarning: The configuration option "asyncio_default_fixture_loop_scope" is unset. The event loop scope for asynchronous fixtures will default to the fixture caching scope. Future versions of pytest-asyncio will default the loop scope for asynchronous fixtures to function scope. Set the default fixture loop scope explicitly in order to avoid unexpected behavior in the future. Valid fixture loop scopes are: "function", "class", "module", "package", "session" warnings.warn(PytestDeprecationWarning(_DEFAULT_FIXTURE_LOOP_SCOPE_UNSET)) ============================= test session starts ============================= platform win32 -- Python 3.14.3, pytest-8.3.3, pluggy-1.6.0 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 collected 7 items tests\test_services.py F.F...F [100%] ================================== FAILURES =================================== ___________________________ test_exif_missing_file ____________________________ def test_exif_missing_file(): from app.services.exif_service import extract_exif result = extract_exif("/tmp/non_existant.jpg") > assert result["make"] is None E TypeError: 'coroutine' object is not subscriptable tests\test_services.py:15: TypeError ---------------------------- Captured stdout setup ---------------------------- 2026-02-25T15:57:39.485432Z [debug ] Using proactor: IocpProactor [asyncio] 2026-02-25T15:57:39.487781Z [debug ] executing .connector at 0x0000026E92512140> [aiosqlite] 2026-02-25T15:57:39.488325Z [debug ] operation .connector at 0x0000026E92512140> completed [aiosqlite] 2026-02-25T15:57:39.489029Z [debug ] executing functools.partial(, 'regexp', 2, .regexp at 0x0000026E923D8510>, deterministic=True) [aiosqlite] 2026-02-25T15:57:39.489748Z [debug ] operation functools.partial(, 'regexp', 2, .regexp at 0x0000026E923D8510>, deterministic=True) completed [aiosqlite] 2026-02-25T15:57:39.490128Z [debug ] executing functools.partial(, 'floor', 1, , deterministic=True) [aiosqlite] 2026-02-25T15:57:39.490300Z [debug ] operation functools.partial(, 'floor', 1, , deterministic=True) completed [aiosqlite] 2026-02-25T15:57:39.490606Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.490744Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.491000Z [debug ] executing functools.partial(, 'PRAGMA read_uncommitted', []) [aiosqlite] 2026-02-25T15:57:39.491204Z [debug ] operation functools.partial(, 'PRAGMA read_uncommitted', []) completed [aiosqlite] 2026-02-25T15:57:39.491475Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.491620Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.491863Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.492016Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.492326Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.492582Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.493265Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.493424Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.493673Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:39.493968Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:39.494194Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.494327Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.494538Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.494786Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.495367Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.495569Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.495865Z [debug ] executing functools.partial(, 'PRAGMA temp.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:39.496043Z [debug ] operation functools.partial(, 'PRAGMA temp.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:39.496307Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.496439Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.496668Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.496807Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.497235Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.497386Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.497635Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:39.497807Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:39.498038Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.498191Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.498471Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.498708Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.499082Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.499276Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.499533Z [debug ] executing functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:39.499692Z [debug ] operation functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:39.499962Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.500096Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.500329Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.500531Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.501477Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.501613Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.501858Z [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-25T15:57:39.502175Z [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-25T15:57:39.502454Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.502595Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.503027Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.503275Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.503627Z [debug ] executing functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) [aiosqlite] 2026-02-25T15:57:39.504042Z [debug ] operation functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed [aiosqlite] 2026-02-25T15:57:39.504463Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.504684Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.505114Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.505355Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.505645Z [debug ] executing functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) [aiosqlite] 2026-02-25T15:57:39.506013Z [debug ] operation functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.506286Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.506440Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.507240Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.507386Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.507615Z [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-25T15:57:39.507985Z [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-25T15:57:39.508279Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.508429Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.508876Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.509020Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.509267Z [debug ] executing functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) [aiosqlite] 2026-02-25T15:57:39.509554Z [debug ] operation functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed [aiosqlite] 2026-02-25T15:57:39.509826Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.509964Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.510327Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.510462Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.510678Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) [aiosqlite] 2026-02-25T15:57:39.510870Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.511090Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.511223Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.511502Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.511632Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.511835Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) [aiosqlite] 2026-02-25T15:57:39.512035Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.512287Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.512529Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.512901Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.513036Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.513259Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) [aiosqlite] 2026-02-25T15:57:39.513450Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed [aiosqlite] 2026-02-25T15:57:39.513759Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.514011Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.514429Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.514579Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.514874Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.515006Z [debug ] operation functools.partial() completed [aiosqlite] ----------------------------- Captured log setup ------------------------------ DEBUG asyncio:proactor_events.py:633 Using proactor: IocpProactor DEBUG aiosqlite:core.py:114 executing .connector at 0x0000026E92512140> DEBUG aiosqlite:core.py:116 operation .connector at 0x0000026E92512140> completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'regexp', 2, .regexp at 0x0000026E923D8510>, deterministic=True) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'regexp', 2, .regexp at 0x0000026E923D8510>, deterministic=True) completed DEBUG aiosqlite:core.py:114 executing functools.partial(, 'floor', 1, , deterministic=True) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'floor', 1, , deterministic=True) 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 read_uncommitted', []) DEBUG aiosqlite:core.py:116 operation functools.partial(, 'PRAGMA read_uncommitted', []) 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() 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 teardown --------------------------- 2026-02-25T15:57:39.810739Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.811135Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.811538Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:39.811843Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:39.812178Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.812474Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.812833Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.813069Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.813600Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.813825Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.814204Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:39.814427Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:39.814655Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.814794Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.815104Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.815256Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.815717Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.815863Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.816132Z [debug ] executing functools.partial(, '\nDROP TABLE images', ()) [aiosqlite] 2026-02-25T15:57:39.816494Z [debug ] operation functools.partial(, '\nDROP TABLE images', ()) completed [aiosqlite] 2026-02-25T15:57:39.816770Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.816906Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.817272Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.817417Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.817632Z [debug ] executing functools.partial(, '\nDROP TABLE api_clients', ()) [aiosqlite] 2026-02-25T15:57:39.817897Z [debug ] operation functools.partial(, '\nDROP TABLE api_clients', ()) completed [aiosqlite] 2026-02-25T15:57:39.818156Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.818289Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.818710Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.818846Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.819133Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.819274Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.819819Z [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 ______________________________ test_ocr_disabled ______________________________ monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x0000026E924BD810> def test_ocr_disabled(monkeypatch): monkeypatch.setattr("app.services.ocr_service.settings.OCR_ENABLED", False) from app.services.ocr_service import extract_text result = extract_text("/tmp/test.jpg") > assert result["has_text"] is False E TypeError: 'coroutine' object is not subscriptable tests\test_services.py:39: TypeError ---------------------------- Captured stdout setup ---------------------------- 2026-02-25T15:57:39.853582Z [debug ] Using proactor: IocpProactor [asyncio] 2026-02-25T15:57:39.854582Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.854833Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.855073Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:39.855273Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:39.855511Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.855662Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.855916Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.856173Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.856651Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.856796Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.857216Z [debug ] executing functools.partial(, 'PRAGMA temp.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:39.857509Z [debug ] operation functools.partial(, 'PRAGMA temp.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:39.857828Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.858057Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.858382Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.858618Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.859044Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.859190Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.859491Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:39.859773Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:39.860110Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.860247Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.860443Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.860573Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.860839Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.860968Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.861171Z [debug ] executing functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:39.861314Z [debug ] operation functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:39.861535Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.861681Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.861899Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.862047Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.862577Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.862714Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.862929Z [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-25T15:57:39.863197Z [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-25T15:57:39.863452Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.863582Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.863942Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.864072Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.864323Z [debug ] executing functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) [aiosqlite] 2026-02-25T15:57:39.864526Z [debug ] operation functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed [aiosqlite] 2026-02-25T15:57:39.864787Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.864922Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.865257Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.865398Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.865630Z [debug ] executing functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) [aiosqlite] 2026-02-25T15:57:39.865838Z [debug ] operation functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.866062Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.866190Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.866771Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.866904Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.867118Z [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-25T15:57:39.867430Z [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-25T15:57:39.867718Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.867848Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.868158Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.868286Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.868485Z [debug ] executing functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) [aiosqlite] 2026-02-25T15:57:39.868680Z [debug ] operation functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed [aiosqlite] 2026-02-25T15:57:39.868891Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.869019Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.869282Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.869413Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.869610Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) [aiosqlite] 2026-02-25T15:57:39.869791Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.869993Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.870121Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.870385Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.870514Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.870725Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) [aiosqlite] 2026-02-25T15:57:39.870912Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.871117Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.871245Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.871479Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.871611Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.871840Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) [aiosqlite] 2026-02-25T15:57:39.872022Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed [aiosqlite] 2026-02-25T15:57:39.872250Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.872379Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.872628Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.872771Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.873043Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.873169Z [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 teardown --------------------------- 2026-02-25T15:57:39.877391Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.877724Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.878080Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:39.878238Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:39.878465Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.878627Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.878824Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.878949Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.879253Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.879381Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.879585Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:39.879729Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:39.879930Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.880067Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.880254Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.880392Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.880835Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.880969Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.881166Z [debug ] executing functools.partial(, '\nDROP TABLE images', ()) [aiosqlite] 2026-02-25T15:57:39.881432Z [debug ] operation functools.partial(, '\nDROP TABLE images', ()) completed [aiosqlite] 2026-02-25T15:57:39.881710Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.881837Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.882207Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.882333Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.882555Z [debug ] executing functools.partial(, '\nDROP TABLE api_clients', ()) [aiosqlite] 2026-02-25T15:57:39.882793Z [debug ] operation functools.partial(, '\nDROP TABLE api_clients', ()) completed [aiosqlite] 2026-02-25T15:57:39.883030Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.883157Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.883590Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.883734Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.884041Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.884165Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.884790Z [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 __________________________ test_image_detail_schema ___________________________ def test_image_detail_schema(): from app.schemas import ImageDetail from app.models.image import ProcessingStatus # Simule un objet Image ORM mock_img = MagicMock() mock_img.id = 1 mock_img.uuid = "abc-123" mock_img.original_name = "test.jpg" mock_img.mime_type = "image/jpeg" mock_img.file_size = 1024 mock_img.width = 800 mock_img.height = 600 mock_img.uploaded_at = None mock_img.processing_status = ProcessingStatus.DONE mock_img.thumbnail_path = None mock_img.exif_make = "Canon" mock_img.exif_model = "EOS R5" mock_img.exif_lens = None mock_img.exif_iso = 400 mock_img.exif_aperture = "f/2.8" mock_img.exif_shutter = "1/250" mock_img.exif_focal = "50mm" mock_img.exif_flash = False mock_img.exif_orientation = 1 mock_img.exif_software = None mock_img.exif_taken_at = None mock_img.exif_gps_lat = 48.857 mock_img.exif_gps_lon = 2.295 mock_img.exif_altitude = 35.0 mock_img.exif_raw = {} mock_img.has_gps = True mock_img.ocr_text = "Bonjour monde" mock_img.ocr_language = "fr" mock_img.ocr_confidence = 0.95 mock_img.ocr_has_text = True mock_img.ai_description = "Une belle photo" mock_img.ai_tags = ["nature", "paysage"] mock_img.ai_confidence = 0.92 mock_img.ai_model_used = "gemini-1.5-pro" mock_img.ai_processed_at = None mock_img.ai_prompt_tokens = 500 mock_img.ai_output_tokens = 200 mock_img.processing_error = None mock_img.processing_started_at = None mock_img.processing_done_at = None > detail = ImageDetail.from_orm_full(mock_img) tests\test_services.py:116: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ cls = , img = @classmethod def from_orm_full(cls, img) -> "ImageDetail": > return cls( id=img.id, uuid=img.uuid, original_name=img.original_name, mime_type=img.mime_type, file_size=img.file_size, width=img.width, height=img.height, uploaded_at=img.uploaded_at, processing_status=img.processing_status, client_id=img.client_id, client_name=img.client.name if img.client else None, thumbnail_path=img.thumbnail_path, exif=ExifData( camera=ExifCamera( make=img.exif_make, model=img.exif_model, lens=img.exif_lens, iso=img.exif_iso, aperture=img.exif_aperture, shutter_speed=img.exif_shutter, focal_length=img.exif_focal, flash=img.exif_flash, orientation=img.exif_orientation, software=img.exif_software, taken_at=img.exif_taken_at, ), gps=ExifGPS( latitude=img.exif_gps_lat, longitude=img.exif_gps_lon, altitude=img.exif_altitude, has_gps=img.has_gps, ), raw=img.exif_raw, ), ocr=OcrData( text=img.ocr_text, language=img.ocr_language, confidence=img.ocr_confidence, has_text=img.ocr_has_text or False, ), ai=AiData( description=img.ai_description, tags=img.ai_tags, confidence=img.ai_confidence, model_used=img.ai_model_used, processed_at=img.ai_processed_at, prompt_tokens=img.ai_prompt_tokens, output_tokens=img.ai_output_tokens, ), processing=ProcessingInfo( status=img.processing_status, error=img.processing_error, started_at=img.processing_started_at, done_at=img.processing_done_at, ), ) E pydantic_core._pydantic_core.ValidationError: 2 validation errors for ImageDetail E client_id E Input should be a valid string [type=string_type, input_value=, input_type=MagicMock] E For further information visit https://errors.pydantic.dev/2.12/v/string_type E client_name E Input should be a valid string [type=string_type, input_value=, input_type=MagicMock] E For further information visit https://errors.pydantic.dev/2.12/v/string_type app\schemas\__init__.py:102: ValidationError ---------------------------- Captured stdout setup ---------------------------- 2026-02-25T15:57:39.971817Z [debug ] Using proactor: IocpProactor [asyncio] 2026-02-25T15:57:39.973007Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.973251Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.973568Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:39.973741Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:39.973977Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.974151Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.974409Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.974541Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.974887Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.975016Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.975239Z [debug ] executing functools.partial(, 'PRAGMA temp.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:39.975393Z [debug ] operation functools.partial(, 'PRAGMA temp.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:39.975621Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.975748Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.975957Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.976082Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.976415Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.976545Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.976764Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:39.976910Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:39.977197Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.977459Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.977783Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.977923Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.978237Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.978375Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.978712Z [debug ] executing functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:39.978970Z [debug ] operation functools.partial(, 'PRAGMA temp.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:39.979269Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.979656Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.979913Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.980051Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.980613Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.980761Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.981007Z [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-25T15:57:39.981299Z [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-25T15:57:39.981621Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.981786Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.982116Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.982285Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.982546Z [debug ] executing functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) [aiosqlite] 2026-02-25T15:57:39.982766Z [debug ] operation functools.partial(, 'CREATE UNIQUE INDEX ix_api_clients_api_key_hash ON api_clients (api_key_hash)', ()) completed [aiosqlite] 2026-02-25T15:57:39.983033Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.983192Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.983500Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.983634Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.983849Z [debug ] executing functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) [aiosqlite] 2026-02-25T15:57:39.984055Z [debug ] operation functools.partial(, 'CREATE INDEX ix_api_clients_id ON api_clients (id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.984277Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.984407Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.984987Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.985113Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.985328Z [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-25T15:57:39.985641Z [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-25T15:57:39.985900Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.986030Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.986431Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.986784Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.987147Z [debug ] executing functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) [aiosqlite] 2026-02-25T15:57:39.987397Z [debug ] operation functools.partial(, 'CREATE UNIQUE INDEX ix_images_uuid ON images (uuid)', ()) completed [aiosqlite] 2026-02-25T15:57:39.987678Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.987814Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.988142Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.988280Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.988505Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) [aiosqlite] 2026-02-25T15:57:39.988733Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_id ON images (id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.988972Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.989116Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.989396Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.989525Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.989736Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) [aiosqlite] 2026-02-25T15:57:39.989950Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_client_id ON images (client_id)', ()) completed [aiosqlite] 2026-02-25T15:57:39.990162Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.990290Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.990565Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.990706Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.990904Z [debug ] executing functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) [aiosqlite] 2026-02-25T15:57:39.991088Z [debug ] operation functools.partial(, 'CREATE INDEX ix_images_processing_status ON images (processing_status)', ()) completed [aiosqlite] 2026-02-25T15:57:39.991300Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.991441Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.991700Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.991829Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:39.992119Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:39.992249Z [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 teardown --------------------------- 2026-02-25T15:57:40.000120Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.000459Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.000702Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("images")', ()) [aiosqlite] 2026-02-25T15:57:40.000868Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("images")', ()) completed [aiosqlite] 2026-02-25T15:57:40.001070Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.001228Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.001430Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.001555Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.001964Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.002215Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.002528Z [debug ] executing functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) [aiosqlite] 2026-02-25T15:57:40.002686Z [debug ] operation functools.partial(, 'PRAGMA main.table_info("api_clients")', ()) completed [aiosqlite] 2026-02-25T15:57:40.002942Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.003090Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.003281Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.003425Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.003745Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.003872Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.004073Z [debug ] executing functools.partial(, '\nDROP TABLE images', ()) [aiosqlite] 2026-02-25T15:57:40.004420Z [debug ] operation functools.partial(, '\nDROP TABLE images', ()) completed [aiosqlite] 2026-02-25T15:57:40.004632Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.004759Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.005040Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.005167Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.005416Z [debug ] executing functools.partial(, '\nDROP TABLE api_clients', ()) [aiosqlite] 2026-02-25T15:57:40.005629Z [debug ] operation functools.partial(, '\nDROP TABLE api_clients', ()) completed [aiosqlite] 2026-02-25T15:57:40.005852Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.005978Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.006305Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.006439Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.006732Z [debug ] executing functools.partial() [aiosqlite] 2026-02-25T15:57:40.006982Z [debug ] operation functools.partial() completed [aiosqlite] 2026-02-25T15:57:40.007572Z [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 =============================== ..\..\..\..\Users\bruno\scoop\apps\python\current\Lib\site-packages\_pytest\config\__init__.py:1441 C:\Users\bruno\scoop\apps\python\current\Lib\site-packages\_pytest\config\__init__.py:1441: PytestConfigWarning: Unknown config option: env self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info =========================== FAILED tests/test_services.py::test_exif_missing_file - TypeError: 'coroutine... FAILED tests/test_services.py::test_ocr_disabled - TypeError: 'coroutine' obj... FAILED tests/test_services.py::test_image_detail_schema - pydantic_core._pyda... =================== 3 failed, 4 passed, 1 warning in 0.55s ==================== :0: RuntimeWarning: coroutine 'extract_exif' was never awaited RuntimeWarning: Enable tracemalloc to get the object allocation traceback :0: RuntimeWarning: coroutine 'extract_text' was never awaited RuntimeWarning: Enable tracemalloc to get the object allocation traceback