diff --git a/src/blacki/storage/sqlite.py b/src/blacki/storage/sqlite.py index 97e456f..5f1ef9a 100644 --- a/src/blacki/storage/sqlite.py +++ b/src/blacki/storage/sqlite.py @@ -33,14 +33,14 @@ async def create_connection( path = Path(db_path) path.parent.mkdir(parents=True, exist_ok=True) - conn = await aiosqlite.connect(path) + conn = await aiosqlite.connect(path, isolation_level=None) conn.row_factory = aiosqlite.Row await conn.execute("PRAGMA journal_mode=WAL") await conn.execute(f"PRAGMA busy_timeout={busy_timeout_ms}") await conn.execute("PRAGMA foreign_keys=ON") - logger.info("SQLite connection opened: %s (WAL mode)", path) + logger.info("SQLite connection opened: %s (WAL mode, autocommit)", path) return conn diff --git a/src/blacki/workouts/storage.py b/src/blacki/workouts/storage.py index 3dc2948..1c42712 100644 --- a/src/blacki/workouts/storage.py +++ b/src/blacki/workouts/storage.py @@ -152,10 +152,10 @@ async def create_session(self, session: WorkoutSession) -> int: exercise.notes, ), ) - await self._conn.commit() + await self._conn.execute("COMMIT") return sid except Exception: - await self._conn.rollback() + await self._conn.execute("ROLLBACK") raise async def add_exercise(self, session_id: int, exercise: WorkoutExercise) -> int: diff --git a/tests/calories/test_storage.py b/tests/calories/test_storage.py index 1a5820b..cd96f26 100644 --- a/tests/calories/test_storage.py +++ b/tests/calories/test_storage.py @@ -15,7 +15,7 @@ @pytest.fixture async def conn(): """Create an in-memory SQLite connection for testing.""" - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) conn.row_factory = aiosqlite.Row yield conn await conn.close() diff --git a/tests/reminders/test_storage.py b/tests/reminders/test_storage.py index 14936d3..6599ecf 100644 --- a/tests/reminders/test_storage.py +++ b/tests/reminders/test_storage.py @@ -16,7 +16,7 @@ @pytest.fixture async def conn(): """Create an in-memory SQLite connection for testing.""" - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) conn.row_factory = aiosqlite.Row yield conn await conn.close() diff --git a/tests/storage/test_base.py b/tests/storage/test_base.py index 5f39473..65e7982 100644 --- a/tests/storage/test_base.py +++ b/tests/storage/test_base.py @@ -22,7 +22,7 @@ async def _create_tables(self) -> None: @pytest.fixture async def conn(): """Create an in-memory SQLite connection for testing.""" - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) conn.row_factory = aiosqlite.Row yield conn await conn.close() diff --git a/tests/storage/test_sqlite.py b/tests/storage/test_sqlite.py index 271f588..ab013b1 100644 --- a/tests/storage/test_sqlite.py +++ b/tests/storage/test_sqlite.py @@ -73,7 +73,7 @@ async def test_close_connection_with_memory_db(self) -> None: """Should close an in-memory connection.""" import aiosqlite - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) await close_connection(conn) diff --git a/tests/test_container.py b/tests/test_container.py index bc13fc2..25a4775 100644 --- a/tests/test_container.py +++ b/tests/test_container.py @@ -68,7 +68,7 @@ def teardown_method(self) -> None: @pytest.mark.asyncio async def test_creates_container_from_connection(self) -> None: """Should create and set container from existing connection.""" - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) try: container = set_container_from_connection(conn) @@ -80,7 +80,7 @@ async def test_creates_container_from_connection(self) -> None: @pytest.mark.asyncio async def test_creates_container_with_custom_lock(self) -> None: """Should use provided lock.""" - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) try: custom_lock = asyncio.Lock() container = set_container_from_connection(conn, lock=custom_lock) @@ -150,7 +150,7 @@ def teardown_method(self) -> None: @pytest.fixture async def conn(self): """Create an in-memory SQLite connection for testing.""" - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) yield conn await conn.close() diff --git a/tests/test_preferences.py b/tests/test_preferences.py index b601f34..f66f0a4 100644 --- a/tests/test_preferences.py +++ b/tests/test_preferences.py @@ -12,7 +12,7 @@ @pytest.fixture async def conn(): """Create an in-memory SQLite connection for testing.""" - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) conn.row_factory = aiosqlite.Row yield conn await conn.close() diff --git a/tests/workouts/test_storage.py b/tests/workouts/test_storage.py index b449ac9..58a97df 100644 --- a/tests/workouts/test_storage.py +++ b/tests/workouts/test_storage.py @@ -17,7 +17,7 @@ @pytest.fixture async def conn(): """Create an in-memory SQLite connection for testing.""" - conn = await aiosqlite.connect(":memory:") + conn = await aiosqlite.connect(":memory:", isolation_level=None) conn.row_factory = aiosqlite.Row yield conn await conn.close() @@ -586,8 +586,6 @@ async def test_create_session_raises_when_lastrowid_none(self, conn, lock) -> No mock_cursor = AsyncMock() mock_cursor.lastrowid = None mock_conn.execute.return_value = mock_cursor - mock_conn.commit = AsyncMock() - mock_conn.rollback = AsyncMock() storage = SqliteWorkoutStorage(mock_conn, lock) storage._schema_ready = True @@ -605,7 +603,9 @@ async def test_create_session_raises_when_lastrowid_none(self, conn, lock) -> No ): await storage.create_session(session) - mock_conn.rollback.assert_called_once() + mock_conn.execute.assert_called() + call_args = [call[0][0] for call in mock_conn.execute.call_args_list] + assert "ROLLBACK" in call_args @pytest.mark.asyncio async def test_create_session_rollback_on_exception(self, conn, lock) -> None: @@ -615,11 +615,15 @@ async def test_create_session_rollback_on_exception(self, conn, lock) -> None: import aiosqlite mock_conn = AsyncMock(spec=aiosqlite.Connection) - mock_cursor = AsyncMock() - mock_cursor.lastrowid = 1 - mock_conn.execute.return_value = mock_cursor - mock_conn.commit = AsyncMock(side_effect=Exception("commit failed")) - mock_conn.rollback = AsyncMock() + + async def execute_side_effect(query, *args): + if "COMMIT" in query: + raise Exception("commit failed") + mock_cursor = AsyncMock() + mock_cursor.lastrowid = 1 + return mock_cursor + + mock_conn.execute.side_effect = execute_side_effect storage = SqliteWorkoutStorage(mock_conn, lock) storage._schema_ready = True @@ -635,4 +639,5 @@ async def test_create_session_rollback_on_exception(self, conn, lock) -> None: with pytest.raises(Exception, match="commit failed"): await storage.create_session(session) - mock_conn.rollback.assert_called_once() + call_args = [call[0][0] for call in mock_conn.execute.call_args_list] + assert "ROLLBACK" in call_args