Skip to content

Commit 1d80c04

Browse files
committed
BUG: Fix project lock release semantics
1 parent 9698fff commit 1d80c04

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

src/fmu_settings_api/services/session.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,13 @@ async def acquire_project_lock(self) -> bool:
9494

9595
async def release_project_lock(self) -> bool:
9696
"""Attempt to release the project lock for this session."""
97+
project_session = cast("ProjectSession", self._session)
98+
was_acquired = project_session.project_fmu_directory._lock.is_acquired()
99+
97100
updated_session = await release_project_lock(self._session.id)
98101
lock = updated_session.project_fmu_directory._lock
99102

100-
return not lock.is_acquired()
103+
return was_acquired and not lock.is_acquired()
101104

102105
def get_lock_status(self) -> LockStatus:
103106
"""Get the lock status including session-specific error information."""

tests/test_v1/test_project.py

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,43 +2290,48 @@ async def test_post_lock_acquire_unexpected_error(
22902290

22912291
async def test_post_lock_release_success(
22922292
client_with_project_session: TestClient,
2293+
session_id: str,
22932294
) -> None:
22942295
"""Test lock release route returns success when lock is released."""
2295-
with patch(
2296-
"fmu_settings_api.services.session.SessionService.release_project_lock",
2297-
AsyncMock(return_value=True),
2298-
):
2299-
response = client_with_project_session.post(f"{ROUTE}/lock_release")
2296+
from fmu_settings_api.session import session_manager # noqa: PLC0415
2297+
2298+
session = await session_manager.get_session(session_id)
2299+
assert isinstance(session, ProjectSession)
2300+
assert session.project_fmu_directory._lock.is_acquired() is True
2301+
2302+
response = client_with_project_session.post(f"{ROUTE}/lock_release")
23002303

23012304
assert response.status_code == status.HTTP_200_OK
23022305
assert response.json() == {"message": "Project lock released."}
2306+
updated_session = await session_manager.get_session(session_id)
2307+
assert isinstance(updated_session, ProjectSession)
2308+
assert updated_session.project_fmu_directory._lock.is_acquired() is False
23032309

23042310

23052311
async def test_post_lock_release_when_not_held(
23062312
client_with_project_session: TestClient,
2313+
session_id: str,
23072314
) -> None:
23082315
"""Test lock release route when lock is not currently held."""
2309-
with (
2310-
patch(
2311-
"fmu_settings_api.services.session.SessionService.release_project_lock",
2312-
AsyncMock(return_value=False),
2313-
),
2314-
patch(
2315-
"fmu_settings_api.services.session.SessionService.get_lock_status",
2316-
return_value=LockStatus(
2317-
is_lock_acquired=False,
2318-
lock_file_exists=False,
2319-
last_lock_release_error=None,
2320-
),
2321-
),
2322-
):
2323-
response = client_with_project_session.post(f"{ROUTE}/lock_release")
2316+
from fmu_settings_api.session import session_manager # noqa: PLC0415
2317+
2318+
session = await session_manager.get_session(session_id)
2319+
assert isinstance(session, ProjectSession)
2320+
session.project_fmu_directory._lock.release()
2321+
session.lock_errors.release = None
2322+
assert session.project_fmu_directory._lock.is_acquired() is False
2323+
2324+
response = client_with_project_session.post(f"{ROUTE}/lock_release")
23242325

23252326
assert response.status_code == status.HTTP_200_OK
23262327
assert response.json() == {
23272328
"message": "Lock was not released because the lock is not currently held."
23282329
}
23292330

2331+
updated_session = await session_manager.get_session(session_id)
2332+
assert isinstance(updated_session, ProjectSession)
2333+
assert updated_session.project_fmu_directory._lock.is_acquired() is False
2334+
23302335

23312336
async def test_post_lock_release_records_release_error(
23322337
client_with_project_session: TestClient,

0 commit comments

Comments
 (0)