{ pkgs, lib, self, }: pkgs.testers.runNixOSTest { name = "arr-init-naming"; nodes.machine = { pkgs, lib, ... }: { imports = [ self.nixosModules.default ]; system.stateVersion = "24.11"; virtualisation.memorySize = 4096; environment.systemPackages = with pkgs; [ curl jq gnugrep ]; services.sonarr = { enable = true; dataDir = "/var/lib/sonarr/.config/NzbDrone"; settings.server.port = lib.mkDefault 8989; }; services.arrInit.sonarr = { enable = true; serviceName = "sonarr"; dataDir = "/var/lib/sonarr/.config/NzbDrone"; port = 8989; naming = { renameEpisodes = true; standardEpisodeFormat = "{Series Title} - S{season:00}E{episode:00} - {Episode Title} {Quality Full}"; seasonFolderFormat = "Season {season}"; }; }; }; testScript = '' start_all() machine.wait_for_unit("sonarr.service") machine.wait_until_succeeds( "API_KEY=$(grep -oP '(?<=)[^<]+' /var/lib/sonarr/.config/NzbDrone/config.xml) && " "curl -sf http://localhost:8989/api/v3/system/status -H \"X-Api-Key: $API_KEY\"", timeout=120, ) machine.succeed("systemctl restart sonarr-init.service") machine.wait_for_unit("sonarr-init.service") with subtest("Naming configuration was applied"): machine.succeed( "API_KEY=$(grep -oP '(?<=)[^<]+' /var/lib/sonarr/.config/NzbDrone/config.xml) && " "curl -sf http://localhost:8989/api/v3/config/naming -H \"X-Api-Key: $API_KEY\" | " "jq -e '.renameEpisodes == true'" ) machine.succeed( "API_KEY=$(grep -oP '(?<=)[^<]+' /var/lib/sonarr/.config/NzbDrone/config.xml) && " "curl -sf http://localhost:8989/api/v3/config/naming -H \"X-Api-Key: $API_KEY\" | " "jq -e '.seasonFolderFormat == \"Season {season}\"'" ) with subtest("Naming idempotency - second run does not change anything"): machine.succeed("systemctl restart sonarr-init.service") machine.wait_for_unit("sonarr-init.service") journal = machine.succeed("journalctl -u sonarr-init.service --no-pager") assert "already correct" in journal.lower(), \ f"Expected 'already correct' on idempotent run, got: {journal[-500:]}" ''; }