Homelabtoolkit v2
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
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")
|
||||
Reference in New Issue
Block a user