From 5bc9c80c557e6b0a2c1e394ce369167159b6a724 Mon Sep 17 00:00:00 2001 From: Henry Ruhs Date: Fri, 11 Sep 2026 11:53:48 +0200 Subject: [PATCH] fix bug for sessions without assets (#1234) --- facefusion/apis/endpoints/session.py | 19 ++++++------- facefusion/apis/locales.py | 1 + tests/test_api_session.py | 40 ++++++++++++++++++++++------ 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/facefusion/apis/endpoints/session.py b/facefusion/apis/endpoints/session.py index da01daf2..d7414dcd 100644 --- a/facefusion/apis/endpoints/session.py +++ b/facefusion/apis/endpoints/session.py @@ -7,7 +7,7 @@ from starlette.status import HTTP_200_OK, HTTP_201_CREATED, HTTP_401_UNAUTHORIZE from facefusion import session_context, session_manager, state_manager, translator from facefusion.apis import asset_store from facefusion.apis.session_helper import extract_access_token, validate_api_key -from facefusion.filesystem import remove_directory +from facefusion.filesystem import is_directory, remove_directory async def create_session(request : Request) -> JSONResponse: @@ -71,20 +71,21 @@ async def destroy_session(request : Request) -> JSONResponse: if session_id: session_context.set_session_id(session_id) + temp_path = state_manager.get_temp_path() - if remove_directory(state_manager.get_temp_path()): - asset_store.delete_assets(session_id) - session_manager.clear_session(session_id) - + if is_directory(temp_path) and not remove_directory(temp_path): return JSONResponse( { - 'message': translator.get('ok', 'facefusion.apis') - }, status_code = HTTP_200_OK) + 'message': translator.get('directory_not_removed', 'facefusion.apis') + }, status_code = HTTP_404_NOT_FOUND) + + asset_store.delete_assets(session_id) + session_manager.clear_session(session_id) return JSONResponse( { - 'message': translator.get('something_went_wrong', 'facefusion.apis') - }, status_code = HTTP_404_NOT_FOUND) + 'message': translator.get('ok', 'facefusion.apis') + }, status_code = HTTP_200_OK) return JSONResponse( { diff --git a/facefusion/apis/locales.py b/facefusion/apis/locales.py index 2c01b9c7..bcd546f2 100644 --- a/facefusion/apis/locales.py +++ b/facefusion/apis/locales.py @@ -6,6 +6,7 @@ LOCALES : Locales =\ { 'ok': 'ok', 'something_went_wrong': 'something went wrong', + 'directory_not_removed': 'directory not removed', 'invalid_access_token': 'invalid access token', 'invalid_refresh_token': 'invalid refresh token', 'source_asset_not_found': 'source asset not found', diff --git a/tests/test_api_session.py b/tests/test_api_session.py index 868d1462..1e81adb7 100644 --- a/tests/test_api_session.py +++ b/tests/test_api_session.py @@ -2,6 +2,7 @@ import os import tempfile from datetime import timedelta from typing import Iterator +from unittest.mock import patch import pytest from starlette.testclient import TestClient @@ -183,8 +184,28 @@ def test_destroy_session(test_client : TestClient) -> None: { 'client_version': metadata.get('version') }) - create_session_body = create_session_response.json() - access_token = create_session_body.get('access_token') + access_token = create_session_response.json().get('access_token') + + delete_session_response = test_client.delete('/session', headers = + { + 'Authorization': 'Bearer INVALID' + }) + + assert delete_session_response.status_code == 401 + + delete_session_response = test_client.delete('/session', headers = + { + 'Authorization': 'Bearer ' + access_token + }) + + assert session_manager.find_session_id(access_token) is None + assert delete_session_response.status_code == 200 + + create_session_response = test_client.post('/session', json = + { + 'client_version': metadata.get('version') + }) + access_token = create_session_response.json().get('access_token') session_id = session_manager.find_session_id(access_token) source_path = get_test_example_file('source.jpg') @@ -202,16 +223,19 @@ def test_destroy_session(test_client : TestClient) -> None: for asset in asset_store.get_assets(session_id).values(): asset_paths.append(asset.get('path')) - delete_session_response = test_client.delete('/session', headers = - { - 'Authorization': 'Bearer INVALID' - }) - - assert delete_session_response.status_code == 401 + with patch('facefusion.apis.endpoints.session.remove_directory', return_value = False): + delete_session_response = test_client.delete('/session', headers = + { + 'Authorization': 'Bearer ' + access_token + }) for asset_path in asset_paths: assert os.path.exists(asset_path) is True + assert delete_session_response.json().get('message') == 'directory not removed' + assert session_manager.find_session_id(access_token) == session_id + assert delete_session_response.status_code == 404 + delete_session_response = test_client.delete('/session', headers = { 'Authorization': 'Bearer ' + access_token