114 lines
3.6 KiB
Nix
114 lines
3.6 KiB
Nix
|
{ system ? builtins.currentSystem
|
||
|
, config ? { }
|
||
|
, pkgs ? import ../../.. { inherit system config; }
|
||
|
}:
|
||
|
|
||
|
with pkgs.lib;
|
||
|
|
||
|
let
|
||
|
baseModule = { config, ... }: {
|
||
|
imports = [
|
||
|
{
|
||
|
options.test-helpers = {
|
||
|
rclone = mkOption { type = types.str; };
|
||
|
upload-sample = mkOption { type = types.str; };
|
||
|
check-sample = mkOption { type = types.str; };
|
||
|
init = mkOption { type = types.str; default = ""; };
|
||
|
extraTests = mkOption { type = types.either types.str (types.functionTo types.str); default = ""; };
|
||
|
};
|
||
|
options.adminuser = mkOption { type = types.str; };
|
||
|
options.adminpass = mkOption { type = types.str; };
|
||
|
}
|
||
|
];
|
||
|
|
||
|
adminuser = "root";
|
||
|
adminpass = "hunter2";
|
||
|
|
||
|
test-helpers.rclone = "${pkgs.writeShellScript "rclone" ''
|
||
|
set -euo pipefail
|
||
|
export PATH="${pkgs.rclone}/bin:$PATH"
|
||
|
export RCLONE_CONFIG_NEXTCLOUD_TYPE=webdav
|
||
|
export RCLONE_CONFIG_NEXTCLOUD_URL="http://nextcloud/remote.php/dav/files/${config.adminuser}"
|
||
|
export RCLONE_CONFIG_NEXTCLOUD_VENDOR="nextcloud"
|
||
|
export RCLONE_CONFIG_NEXTCLOUD_USER="${config.adminuser}"
|
||
|
export RCLONE_CONFIG_NEXTCLOUD_PASS="$(rclone obscure ${config.adminpass})"
|
||
|
exec "$@"
|
||
|
''}";
|
||
|
test-helpers.upload-sample = "${pkgs.writeShellScript "rclone-upload" ''
|
||
|
<<<'hi' rclone rcat nextcloud:test-shared-file
|
||
|
''}";
|
||
|
test-helpers.check-sample = "${pkgs.writeShellScript "check-sample" ''
|
||
|
set -e
|
||
|
diff <(echo 'hi') <(rclone cat nextcloud:test-shared-file)
|
||
|
''}";
|
||
|
|
||
|
nodes = {
|
||
|
client = { ... }: {};
|
||
|
nextcloud = { lib, ... }: {
|
||
|
networking.firewall.allowedTCPPorts = [ 80 ];
|
||
|
services.nextcloud = {
|
||
|
enable = true;
|
||
|
hostName = "nextcloud";
|
||
|
https = false;
|
||
|
database.createLocally = lib.mkDefault true;
|
||
|
config = {
|
||
|
adminpassFile = "${pkgs.writeText "adminpass" config.adminpass}"; # Don't try this at home!
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
testScript = args@{ nodes, ... }: let
|
||
|
inherit (config) test-helpers;
|
||
|
in mkBefore ''
|
||
|
nextcloud.start()
|
||
|
client.start()
|
||
|
nextcloud.wait_for_unit("multi-user.target")
|
||
|
|
||
|
${test-helpers.init}
|
||
|
|
||
|
with subtest("Ensure nextcloud-occ is working"):
|
||
|
nextcloud.succeed("nextcloud-occ status")
|
||
|
nextcloud.succeed("curl -sSf http://nextcloud/login")
|
||
|
|
||
|
with subtest("Upload/Download test"):
|
||
|
nextcloud.succeed(
|
||
|
"${test-helpers.rclone} ${test-helpers.upload-sample}"
|
||
|
)
|
||
|
client.wait_for_unit("multi-user.target")
|
||
|
client.succeed(
|
||
|
"${test-helpers.rclone} ${test-helpers.check-sample}"
|
||
|
)
|
||
|
|
||
|
${if builtins.isFunction test-helpers.extraTests then test-helpers.extraTests args else test-helpers.extraTests}
|
||
|
'';
|
||
|
};
|
||
|
|
||
|
genTests = version:
|
||
|
let
|
||
|
testBase.imports = [
|
||
|
baseModule
|
||
|
{
|
||
|
nodes.nextcloud = { pkgs, ... }: {
|
||
|
services.nextcloud.package = pkgs.${"nextcloud${toString version}"};
|
||
|
};
|
||
|
}
|
||
|
];
|
||
|
|
||
|
callNextcloudTest = path:
|
||
|
let
|
||
|
name = "${removeSuffix ".nix" (baseNameOf path)}${toString version}";
|
||
|
in nameValuePair name (import path {
|
||
|
inherit system pkgs testBase;
|
||
|
name = "nextcloud-${name}";
|
||
|
});
|
||
|
in map callNextcloudTest [
|
||
|
./basic.nix
|
||
|
./with-declarative-redis-and-secrets.nix
|
||
|
./with-mysql-and-memcached.nix
|
||
|
./with-postgresql-and-redis.nix
|
||
|
./with-objectstore.nix
|
||
|
];
|
||
|
in
|
||
|
listToAttrs (concatMap genTests [ 28 29 30 ])
|