nixos/tests/anki-sync-server: add anki sync test

Start anki-sync-server service and drive anki manually through its
python lib to test sync.
The anki python part isn't a stable API and might require freqent
rework, let's see if it holds up...

Changed files
+74
nixos
pkgs
games
+1
nixos/tests/all-tests.nix
···
amazon-ssm-agent = handleTest ./amazon-ssm-agent.nix {};
amd-sev = runTest ./amd-sev.nix;
anbox = runTest ./anbox.nix;
+
anki-sync-server = handleTest ./anki-sync-server.nix {};
anuko-time-tracker = handleTest ./anuko-time-tracker.nix {};
apcupsd = handleTest ./apcupsd.nix {};
apfs = runTest ./apfs.nix;
+71
nixos/tests/anki-sync-server.nix
···
+
import ./make-test-python.nix ({ pkgs, ... }:
+
let
+
ankiSyncTest = pkgs.writeScript "anki-sync-test.py" ''
+
#!${pkgs.python3}/bin/python
+
+
import sys
+
+
# get site paths from anki itself
+
from runpy import run_path
+
run_path("${pkgs.anki}/bin/.anki-wrapped")
+
import anki
+
+
col = anki.collection.Collection('test_collection')
+
endpoint = 'http://localhost:27701'
+
+
# Sanity check: verify bad login fails
+
try:
+
col.sync_login('baduser', 'badpass', endpoint)
+
print("bad user login worked?!")
+
sys.exit(1)
+
except anki.errors.SyncError:
+
pass
+
+
# test logging in to users
+
col.sync_login('user', 'password', endpoint)
+
col.sync_login('passfileuser', 'passfilepassword', endpoint)
+
+
# Test actual sync. login apparently doesn't remember the endpoint...
+
login = col.sync_login('user', 'password', endpoint)
+
login.endpoint = endpoint
+
sync = col.sync_collection(login, False)
+
assert sync.required == sync.NO_CHANGES
+
# TODO: create an archive with server content including a test card
+
# and check we got it?
+
'';
+
testPasswordFile = pkgs.writeText "anki-password" "passfilepassword";
+
in
+
{
+
name = "anki-sync-server";
+
meta = with pkgs.lib.maintainers; {
+
maintainers = [ martinetd ];
+
};
+
+
nodes.machine = { pkgs, ...}: {
+
services.anki-sync-server = {
+
enable = true;
+
users = [
+
{ username = "user";
+
password = "password";
+
}
+
{ username = "passfileuser";
+
passwordFile = testPasswordFile;
+
}
+
];
+
};
+
};
+
+
+
testScript =
+
''
+
start_all()
+
+
with subtest("Server starts successfully"):
+
# service won't start without users
+
machine.wait_for_unit("anki-sync-server.service")
+
machine.wait_for_open_port(27701)
+
+
with subtest("Can sync"):
+
machine.succeed("${ankiSyncTest}")
+
'';
+
})
+2
pkgs/games/anki/default.nix
···
, lame
, mpv-unwrapped
, ninja
+
, nixosTests
, nodejs
, nodejs-slim
, prefetch-yarn-deps
···
passthru = {
# cargoLock is reused in anki-sync-server
inherit cargoLock;
+
tests.anki-sync-server = nixosTests.anki-sync-server;
};
meta = with lib; {