mirror of https://github.com/Nezreka/SoulSync.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.6 KiB
99 lines
2.6 KiB
import sqlite3
|
|
|
|
from database.music_database import MusicDatabase
|
|
|
|
|
|
def test_clear_server_data_does_not_fail_when_vacuum_hits_disk_io():
|
|
db = object.__new__(MusicDatabase)
|
|
|
|
class _Cursor:
|
|
rowcount = 0
|
|
|
|
def __init__(self):
|
|
self.calls = []
|
|
|
|
def execute(self, query, params=None):
|
|
self.calls.append((query, params))
|
|
if query == "VACUUM":
|
|
raise sqlite3.OperationalError("disk I/O error")
|
|
if "tracks" in query:
|
|
self.rowcount = 1500
|
|
elif "albums" in query:
|
|
self.rowcount = 200
|
|
elif "artists" in query:
|
|
self.rowcount = 20
|
|
|
|
class _Conn:
|
|
def __init__(self):
|
|
self.cursor_obj = _Cursor()
|
|
self.commits = 0
|
|
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc, tb):
|
|
return False
|
|
|
|
def cursor(self):
|
|
return self.cursor_obj
|
|
|
|
def commit(self):
|
|
self.commits += 1
|
|
|
|
conn = _Conn()
|
|
db._get_connection = lambda: conn
|
|
|
|
db.clear_server_data("jellyfin")
|
|
|
|
assert conn.commits == 1
|
|
assert any(call[0] == "VACUUM" for call in conn.cursor_obj.calls)
|
|
|
|
|
|
def test_clear_server_data_retries_transient_disk_io_before_commit(monkeypatch):
|
|
db = object.__new__(MusicDatabase)
|
|
connections = []
|
|
|
|
class _Cursor:
|
|
rowcount = 0
|
|
|
|
def __init__(self, fail_first_delete=False):
|
|
self.fail_first_delete = fail_first_delete
|
|
self.calls = []
|
|
|
|
def execute(self, query, params=None):
|
|
self.calls.append((query, params))
|
|
if self.fail_first_delete and "DELETE FROM tracks" in query:
|
|
self.fail_first_delete = False
|
|
raise sqlite3.OperationalError("disk I/O error")
|
|
self.rowcount = 1
|
|
|
|
class _Conn:
|
|
def __init__(self, fail_first_delete=False):
|
|
self.cursor_obj = _Cursor(fail_first_delete=fail_first_delete)
|
|
self.commits = 0
|
|
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc, tb):
|
|
return False
|
|
|
|
def cursor(self):
|
|
return self.cursor_obj
|
|
|
|
def commit(self):
|
|
self.commits += 1
|
|
|
|
def _connect():
|
|
conn = _Conn(fail_first_delete=not connections)
|
|
connections.append(conn)
|
|
return conn
|
|
|
|
db._get_connection = _connect
|
|
monkeypatch.setattr("database.music_database.time.sleep", lambda _seconds: None)
|
|
|
|
db.clear_server_data("jellyfin")
|
|
|
|
assert len(connections) == 2
|
|
assert connections[1].commits == 1
|