105 lines
3.7 KiB
Python
105 lines
3.7 KiB
Python
import json
|
|
import sqlite3
|
|
|
|
from services import homescreen_editor
|
|
|
|
|
|
def _make_db(path):
|
|
conn = sqlite3.connect(path)
|
|
conn.execute("CREATE TABLE Users (Id INTEGER PRIMARY KEY, Name TEXT, Guid TEXT)")
|
|
conn.execute("CREATE TABLE UserSettingsKeys (UserSettingsKeyId INTEGER PRIMARY KEY, Name TEXT)")
|
|
conn.execute("CREATE TABLE UserSettings (UserId INTEGER, UserSettingsKeyId INTEGER, Value TEXT)")
|
|
conn.execute("INSERT INTO UserSettingsKeys (UserSettingsKeyId, Name) VALUES (1, 'homescreensettings')")
|
|
conn.execute("INSERT INTO Users (Id, Name, Guid) VALUES (1, 'Alice', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')")
|
|
conn.execute("INSERT INTO Users (Id, Name, Guid) VALUES (2, 'Bob', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb')")
|
|
conn.execute(
|
|
"INSERT INTO UserSettings (UserId, UserSettingsKeyId, Value) VALUES (?, ?, ?)",
|
|
(
|
|
1,
|
|
1,
|
|
json.dumps(
|
|
{
|
|
"Sections": [
|
|
{
|
|
"Id": "one",
|
|
"Name": "Watchlist",
|
|
"CustomName": "Watchlist",
|
|
"UserId": "WRONG",
|
|
"SectionType": "items",
|
|
}
|
|
]
|
|
}
|
|
),
|
|
),
|
|
)
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
|
|
def test_read_db_normalizes_section_user_ids(tmp_path):
|
|
db_path = tmp_path / "users.db"
|
|
_make_db(db_path)
|
|
|
|
result = homescreen_editor.read_db(str(db_path))
|
|
|
|
assert result["validation"]["userCount"] == 2
|
|
alice = next(user for user in result["users"] if user["name"] == "Alice")
|
|
assert alice["embyGuid"] == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
|
assert alice["sections"][0]["UserId"] == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
|
|
|
|
|
def test_write_db_persists_normalized_sections(tmp_path):
|
|
db_path = tmp_path / "users.db"
|
|
_make_db(db_path)
|
|
|
|
payload = homescreen_editor.write_db(
|
|
str(db_path),
|
|
[
|
|
{
|
|
"userId": 2,
|
|
"sections": [
|
|
{
|
|
"Id": "two",
|
|
"Name": "Recent",
|
|
"CustomName": "Recent",
|
|
"UserId": "SHOULD_BE_NORMALIZED",
|
|
"SectionType": "items",
|
|
}
|
|
],
|
|
}
|
|
],
|
|
)
|
|
|
|
assert payload["ok"] is True
|
|
conn = sqlite3.connect(db_path)
|
|
value = conn.execute("SELECT Value FROM UserSettings WHERE UserId = 2").fetchone()[0]
|
|
conn.close()
|
|
parsed = json.loads(value)
|
|
assert parsed["Sections"][0]["UserId"] == "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
|
|
|
|
|
|
def test_generate_sql_includes_only_changed_users():
|
|
original = [{"id": 1, "name": "Alice", "sections": [{"Id": "one"}]}]
|
|
updated = [{"id": 1, "name": "Alice", "sections": [{"Id": "two"}]}]
|
|
|
|
sql = homescreen_editor.generate_sql(updated, original)
|
|
|
|
assert "Alice" in sql
|
|
assert "UPDATE UserSettings" in sql
|
|
assert "COMMIT;" in sql
|
|
|
|
|
|
def test_uploaded_db_becomes_active_source(tmp_path, monkeypatch):
|
|
upload_dir = tmp_path / "uploads"
|
|
state_path = tmp_path / "upload-state.json"
|
|
monkeypatch.setattr(homescreen_editor, "HOMESCREEN_UPLOAD_DIR", upload_dir)
|
|
monkeypatch.setattr(homescreen_editor, "HOMESCREEN_UPLOAD_STATE_PATH", state_path)
|
|
|
|
meta = homescreen_editor.save_uploaded_db("users.db", b"sqlite-bytes")
|
|
active = homescreen_editor.get_active_upload()
|
|
resolved_path, resolved_meta = homescreen_editor.resolve_db_source()
|
|
|
|
assert meta["upload_id"] == active["upload_id"]
|
|
assert resolved_meta["upload_id"] == meta["upload_id"]
|
|
assert resolved_path.endswith(f"{meta['upload_id']}.db")
|