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...
This commit is contained in:
Dominique Martinet 2023-09-25 22:01:02 +09:00 committed by Weijia Wang
parent 8fe9c18ed3
commit f0f6c77781
3 changed files with 74 additions and 0 deletions

View file

@ -120,6 +120,7 @@ in {
amazon-ssm-agent = handleTest ./amazon-ssm-agent.nix {}; amazon-ssm-agent = handleTest ./amazon-ssm-agent.nix {};
amd-sev = runTest ./amd-sev.nix; amd-sev = runTest ./amd-sev.nix;
anbox = runTest ./anbox.nix; anbox = runTest ./anbox.nix;
anki-sync-server = handleTest ./anki-sync-server.nix {};
anuko-time-tracker = handleTest ./anuko-time-tracker.nix {}; anuko-time-tracker = handleTest ./anuko-time-tracker.nix {};
apcupsd = handleTest ./apcupsd.nix {}; apcupsd = handleTest ./apcupsd.nix {};
apfs = runTest ./apfs.nix; apfs = runTest ./apfs.nix;

View file

@ -0,0 +1,71 @@
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}")
'';
})

View file

@ -9,6 +9,7 @@
, lame , lame
, mpv-unwrapped , mpv-unwrapped
, ninja , ninja
, nixosTests
, nodejs , nodejs
, nodejs-slim , nodejs-slim
, prefetch-yarn-deps , prefetch-yarn-deps
@ -270,6 +271,7 @@ python3.pkgs.buildPythonApplication {
passthru = { passthru = {
# cargoLock is reused in anki-sync-server # cargoLock is reused in anki-sync-server
inherit cargoLock; inherit cargoLock;
tests.anki-sync-server = nixosTests.anki-sync-server;
}; };
meta = with lib; { meta = with lib; {