mirror of
https://gitlab.com/TECHNOFAB/nix-gitlab-ci.git
synced 2025-12-12 02:00:13 +01:00
test: copy over most tests, add new tests for soonix
This commit is contained in:
parent
0bd75fd1bb
commit
436e2fde25
7 changed files with 439 additions and 9 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
pkgs,
|
pkgs,
|
||||||
lib,
|
lib,
|
||||||
} @ args: let
|
} @ args: let
|
||||||
inherit (lib) types isAttrs filterAttrs mapAttrs mkOption mkOptionType isType literalExpression;
|
inherit (lib) types isAttrs filterAttrs mapAttrs mkOption mkOptionType isType literalExpression pipe;
|
||||||
in rec {
|
in rec {
|
||||||
prepend = key: arr: job: {
|
prepend = key: arr: job: {
|
||||||
${key} = arr ++ (job.${key} or []);
|
${key} = arr ++ (job.${key} or []);
|
||||||
|
|
@ -15,7 +15,13 @@ in rec {
|
||||||
|
|
||||||
# json is also valid yaml and this removes dependency on jq and/or remarshal
|
# json is also valid yaml and this removes dependency on jq and/or remarshal
|
||||||
# (used in pkgs.formats.json and pkgs.formats.yaml respectively)
|
# (used in pkgs.formats.json and pkgs.formats.yaml respectively)
|
||||||
toYaml = name: value: builtins.toFile name (builtins.toJSON value);
|
toYaml = name: value:
|
||||||
|
pipe value [
|
||||||
|
builtins.toJSON
|
||||||
|
builtins.unsafeDiscardOutputDependency
|
||||||
|
builtins.unsafeDiscardStringContext
|
||||||
|
(builtins.toFile name)
|
||||||
|
];
|
||||||
toYamlPretty = (pkgs.formats.yaml {}).generate;
|
toYamlPretty = (pkgs.formats.yaml {}).generate;
|
||||||
|
|
||||||
customMapAttrs = cb: set: builtins.listToAttrs (builtins.map (key: cb key (builtins.getAttr key set)) (builtins.attrNames set));
|
customMapAttrs = cb: set: builtins.listToAttrs (builtins.map (key: cb key (builtins.getAttr key set)) (builtins.attrNames set));
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
jobSubmodule,
|
jobSubmodule,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
inherit (lib) mkOption types filterAttrs mergeAttrsList pipe mapAttrs;
|
inherit (lib) mkOption types filterAttrs mergeAttrsList mapAttrs;
|
||||||
inherit (cilib.helpers) filterUnset mkUnsetOption toYaml toYamlPretty;
|
inherit (cilib.helpers) filterUnset mkUnsetOption toYaml toYamlPretty;
|
||||||
|
|
||||||
pipelineConfigSubmodule = {rootConfig, ...}: {
|
pipelineConfigSubmodule = {rootConfig, ...}: {
|
||||||
|
|
@ -93,12 +93,7 @@
|
||||||
// mapAttrs (_name: value: value.finalConfig) config.jobs;
|
// mapAttrs (_name: value: value.finalConfig) config.jobs;
|
||||||
packages =
|
packages =
|
||||||
{
|
{
|
||||||
"gitlab-ci:pipeline:${name}" = pipe config.finalConfig [
|
"gitlab-ci:pipeline:${name}" = toYaml "gitlab-ci-config.json" config.finalConfig;
|
||||||
builtins.toJSON
|
|
||||||
builtins.unsafeDiscardOutputDependency
|
|
||||||
builtins.unsafeDiscardStringContext
|
|
||||||
(toYaml "gitlab-ci-config.json")
|
|
||||||
];
|
|
||||||
"gitlab-ci:pipeline:${name}:pretty" = toYamlPretty "gitlab-ci-config.yml" config.finalConfig;
|
"gitlab-ci:pipeline:${name}:pretty" = toYamlPretty "gitlab-ci-config.yml" config.finalConfig;
|
||||||
}
|
}
|
||||||
// mergeAttrsList (map (job: job.packages) (builtins.attrValues config.jobs));
|
// mergeAttrsList (map (job: job.packages) (builtins.attrValues config.jobs));
|
||||||
|
|
|
||||||
171
tests/cilib_test.nix
Normal file
171
tests/cilib_test.nix
Normal file
|
|
@ -0,0 +1,171 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
cilib,
|
||||||
|
ntlib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
suites."CI Lib" = {
|
||||||
|
pos = __curPos;
|
||||||
|
tests = let
|
||||||
|
inherit (cilib) mkJobDeps mkJobRun mkJobPatched mkPipeline;
|
||||||
|
deps = mkJobDeps {
|
||||||
|
key = "test";
|
||||||
|
job = {
|
||||||
|
variables.TEST = "${pkgs.curl}";
|
||||||
|
};
|
||||||
|
nixConfig = {
|
||||||
|
enable = true;
|
||||||
|
deps = [pkgs.hello];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in [
|
||||||
|
{
|
||||||
|
name = "jobDeps";
|
||||||
|
type = "script";
|
||||||
|
script =
|
||||||
|
# sh
|
||||||
|
''
|
||||||
|
${ntlib.helpers.path [pkgs.gnugrep]}
|
||||||
|
${ntlib.helpers.scriptHelpers}
|
||||||
|
assert_file_contains ${deps} "/nix/store" "should contain nix store path"
|
||||||
|
assert_file_contains ${deps} '-hello-.*/bin:$PATH' "should contain hello"
|
||||||
|
assert_file_contains ${deps} "export TEST=" "should export TEST"
|
||||||
|
assert_file_contains ${deps} "curl" "should contain curl"
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "jobRun";
|
||||||
|
type = "script";
|
||||||
|
script = let
|
||||||
|
run = mkJobRun {
|
||||||
|
key = "test";
|
||||||
|
job.script = ["hello"];
|
||||||
|
jobDeps = deps;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
# sh
|
||||||
|
''
|
||||||
|
${ntlib.helpers.path [pkgs.gnugrep]}
|
||||||
|
${ntlib.helpers.scriptHelpers}
|
||||||
|
assert_file_contains ${run}/bin/gitlab-ci-job:test "sandbox-helper" "should contain sandbox-helper"
|
||||||
|
assert_file_contains ${run}/bin/gitlab-ci-job:test "gitlab-ci-job-test-raw" "should contain job name"
|
||||||
|
assert_file_contains ${run.passthru.actualJobScript} "gitlab-ci-job-deps-test" "should contain job name"
|
||||||
|
assert_file_contains ${run.passthru.actualJobScript} "Running script..." "should contain 'Running script...'"
|
||||||
|
assert_file_contains ${run.passthru.actualJobScript} "hello" "should contain hello"
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "jobPatched nix disabled";
|
||||||
|
expected = {};
|
||||||
|
actual = mkJobPatched {
|
||||||
|
key = "test";
|
||||||
|
pipelineName = "test";
|
||||||
|
job = {};
|
||||||
|
nixConfig.enable = false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "jobPatched without runner cache";
|
||||||
|
expected = {
|
||||||
|
after_script = ["finalize_nix_ci"];
|
||||||
|
before_script = ["source setup_nix_ci \"gitlab-ci:pipeline:test:job-deps:test\""];
|
||||||
|
};
|
||||||
|
actual = mkJobPatched {
|
||||||
|
key = "test";
|
||||||
|
pipelineName = "test";
|
||||||
|
job = {};
|
||||||
|
nixConfig = {
|
||||||
|
enable = true;
|
||||||
|
enableRunnerCache = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "jobPatched with runner cache";
|
||||||
|
expected = {
|
||||||
|
after_script = ["finalize_nix_ci"];
|
||||||
|
before_script = ["source setup_nix_ci \"gitlab-ci:pipeline:test:job-deps:test\""];
|
||||||
|
cache = [
|
||||||
|
{
|
||||||
|
key = "test";
|
||||||
|
paths = [".nix-cache/"];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
variables."NIX_CI_CACHE_STRATEGY" = "runner";
|
||||||
|
};
|
||||||
|
actual = mkJobPatched {
|
||||||
|
key = "test";
|
||||||
|
pipelineName = "test";
|
||||||
|
job = {};
|
||||||
|
nixConfig = {
|
||||||
|
enable = true;
|
||||||
|
enableRunnerCache = true;
|
||||||
|
runnerCacheKey = "test";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "mkPipeline empty";
|
||||||
|
expected = {};
|
||||||
|
actual =
|
||||||
|
(mkPipeline {
|
||||||
|
name = "test";
|
||||||
|
nixConfig = {};
|
||||||
|
pipeline.jobs = {};
|
||||||
|
}).finalConfig;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "mkPipeline empty packages";
|
||||||
|
type = "script";
|
||||||
|
script = let
|
||||||
|
pipeline =
|
||||||
|
ntlib.helpers.toJsonFile
|
||||||
|
(mkPipeline {
|
||||||
|
name = "test";
|
||||||
|
nixConfig = {};
|
||||||
|
pipeline.jobs = {};
|
||||||
|
}).packages;
|
||||||
|
in
|
||||||
|
# sh
|
||||||
|
''
|
||||||
|
set -euo pipefail
|
||||||
|
${ntlib.helpers.path [pkgs.jq pkgs.gnugrep pkgs.coreutils]}
|
||||||
|
echo "two keys, one json one pretty"
|
||||||
|
jq 'keys | length == 2' "${pipeline}" | grep -q true
|
||||||
|
echo "key[0] is exactly 'gitlab-ci:pipeline:test'"
|
||||||
|
jq -r 'keys[0]' "${pipeline}" | grep -qx "gitlab-ci:pipeline:test"
|
||||||
|
echo "key[1] is exactly 'gitlab-ci:pipeline:test:pretty'"
|
||||||
|
jq -r 'keys[1]' "${pipeline}" | grep -qx "gitlab-ci:pipeline:test:pretty"
|
||||||
|
echo "value contains '/nix/store/'"
|
||||||
|
jq -r '.["gitlab-ci:pipeline:test"]' "${pipeline}" | grep -q "/nix/store/"
|
||||||
|
echo "value contains 'gitlab-ci-test.yml'"
|
||||||
|
jq -r '.["gitlab-ci:pipeline:test"]' "${pipeline}" | grep -q "gitlab-ci-test.yml"
|
||||||
|
echo "file only contains '{}'"
|
||||||
|
[[ "$(cat $(jq -r '.["gitlab-ci:pipeline:test"]' "${pipeline}"))" == "{}" ]]
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "handle store paths in variables";
|
||||||
|
expected = {
|
||||||
|
stages = ["test"];
|
||||||
|
test = {
|
||||||
|
stage = "test";
|
||||||
|
variables."TEST" = "${pkgs.hello}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
actual =
|
||||||
|
(mkPipeline {
|
||||||
|
name = "test";
|
||||||
|
nixConfig.enable = false;
|
||||||
|
pipeline = {
|
||||||
|
stages = ["test"];
|
||||||
|
jobs.test = {
|
||||||
|
stage = "test";
|
||||||
|
variables."TEST" = "${pkgs.hello}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}).finalConfig;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
68
tests/helpers_test.nix
Normal file
68
tests/helpers_test.nix
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
cilib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
suites."Helpers" = {
|
||||||
|
pos = __curPos;
|
||||||
|
tests = let
|
||||||
|
inherit (cilib) helpers;
|
||||||
|
in [
|
||||||
|
{
|
||||||
|
name = "appendToAfterScript";
|
||||||
|
expected = {
|
||||||
|
after_script = ["echo after_script" "finalize_nix_ci"];
|
||||||
|
};
|
||||||
|
actual = helpers.appendToAfterScript ["finalize_nix_ci"] {
|
||||||
|
after_script = ["echo after_script"];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "prependToBeforeScript";
|
||||||
|
expected = {
|
||||||
|
before_script = ["setup_nix_ci" "echo before_script"];
|
||||||
|
};
|
||||||
|
actual = helpers.prependToBeforeScript ["setup_nix_ci"] {
|
||||||
|
before_script = ["echo before_script"];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "toYaml";
|
||||||
|
expected = ''{"hello":"world"}'';
|
||||||
|
actual = builtins.readFile (helpers.toYaml "test" {hello = "world";});
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "filterAttrsRec";
|
||||||
|
expected = {world = "world";};
|
||||||
|
actual = helpers.filterAttrsRec (_n: v: v != null) {
|
||||||
|
hello = null;
|
||||||
|
world = "world";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "filterJobVariables with store paths";
|
||||||
|
expected = {
|
||||||
|
HELLO = "${pkgs.hello}";
|
||||||
|
MULTIPLE = "${pkgs.hello}:${pkgs.hello}";
|
||||||
|
};
|
||||||
|
actual = helpers.filterJobVariables true {
|
||||||
|
variables = {
|
||||||
|
HELLO = "${pkgs.hello}";
|
||||||
|
WORLD = "world";
|
||||||
|
MULTIPLE = "${pkgs.hello}:${pkgs.hello}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "filterJobVariables without store paths";
|
||||||
|
expected = {WORLD = "world";};
|
||||||
|
actual = helpers.filterJobVariables false {
|
||||||
|
variables = {
|
||||||
|
HELLO = "${pkgs.hello}";
|
||||||
|
WORLD = "world";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
81
tests/modules_test.nix
Normal file
81
tests/modules_test.nix
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
cilib,
|
||||||
|
ntlib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
suites."Modules" = {
|
||||||
|
pos = __curPos;
|
||||||
|
tests = let
|
||||||
|
simplePipeline = cilib.mkCI {
|
||||||
|
pipelines."test" = {
|
||||||
|
stages = ["test"];
|
||||||
|
jobs."test" = {
|
||||||
|
stage = "test";
|
||||||
|
script = ["echo hello world"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in [
|
||||||
|
{
|
||||||
|
name = "empty pipelines";
|
||||||
|
expected = {};
|
||||||
|
actual =
|
||||||
|
(cilib.mkCI {}).pipelines;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "empty packages";
|
||||||
|
expected = {};
|
||||||
|
actual =
|
||||||
|
(cilib.mkCI {}).packages;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "simple pipeline";
|
||||||
|
expected = {
|
||||||
|
stages = [".pre" "test" ".post"];
|
||||||
|
"test" = {
|
||||||
|
stage = "test";
|
||||||
|
before_script = ["source setup_nix_ci \"gitlab-ci:pipeline:test:job-deps:test\""];
|
||||||
|
script = ["echo hello world"];
|
||||||
|
after_script = ["finalize_nix_ci"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
actual = simplePipeline.pipelines."test".finalConfig;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "simple pipeline yaml";
|
||||||
|
type = "script";
|
||||||
|
script = let
|
||||||
|
package = simplePipeline.packages."gitlab-ci:pipeline:test";
|
||||||
|
in
|
||||||
|
# sh
|
||||||
|
''
|
||||||
|
${ntlib.helpers.path [pkgs.gnugrep]}
|
||||||
|
${ntlib.helpers.scriptHelpers}
|
||||||
|
assert_file_contains ${package} 'gitlab-ci:pipeline:test:job-deps:test'
|
||||||
|
assert_file_contains ${package} 'finalize_nix_ci'
|
||||||
|
assert_file_contains ${package} 'echo hello world'
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "dont fail on store paths";
|
||||||
|
type = "script";
|
||||||
|
script = let
|
||||||
|
package =
|
||||||
|
(cilib.mkCI {
|
||||||
|
pipelines."test" = {
|
||||||
|
variables.EXAMPLE = "${pkgs.hello}";
|
||||||
|
};
|
||||||
|
}).packages."gitlab-ci:pipeline:test";
|
||||||
|
in
|
||||||
|
# sh
|
||||||
|
''
|
||||||
|
${ntlib.helpers.path [pkgs.gnugrep]}
|
||||||
|
${ntlib.helpers.scriptHelpers}
|
||||||
|
assert_file_contains ${package} '[".pre",".post"]'
|
||||||
|
assert_file_contains ${package} '"EXAMPLE":"/nix/store/.*-hello-.*"'
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
77
tests/soonix_test.nix
Normal file
77
tests/soonix_test.nix
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
cilib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) trimWith;
|
||||||
|
in {
|
||||||
|
suites."Soonix" = {
|
||||||
|
pos = __curPos;
|
||||||
|
tests = let
|
||||||
|
version = trimWith {
|
||||||
|
start = true;
|
||||||
|
end = true;
|
||||||
|
} (builtins.readFile ../lib/VERSION);
|
||||||
|
in [
|
||||||
|
{
|
||||||
|
name = "default soonix config";
|
||||||
|
expected = {
|
||||||
|
data.include = [
|
||||||
|
{
|
||||||
|
component = "gitlab.com/TECHNOFAB/nix-gitlab-ci/nix-gitlab-ci@${version}";
|
||||||
|
inputs.version = version;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
generator = "nix";
|
||||||
|
opts.format = "yaml";
|
||||||
|
hook = {
|
||||||
|
mode = "copy";
|
||||||
|
gitignore = false;
|
||||||
|
};
|
||||||
|
output = ".gitlab-ci.yml";
|
||||||
|
};
|
||||||
|
actual =
|
||||||
|
(cilib.mkCI {
|
||||||
|
config.soonix = {};
|
||||||
|
}).soonix;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "custom soonix config";
|
||||||
|
expected = {
|
||||||
|
data = {
|
||||||
|
include = [
|
||||||
|
{
|
||||||
|
component = "gitlab.com/example/nix-gitlab-ci/nix-gitlab-ci@abc";
|
||||||
|
inputs = {
|
||||||
|
version = "abc";
|
||||||
|
hello = "world";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
"example".script = ["hello"];
|
||||||
|
};
|
||||||
|
generator = "nix";
|
||||||
|
opts.format = "yaml";
|
||||||
|
hook = {
|
||||||
|
mode = "copy";
|
||||||
|
gitignore = false;
|
||||||
|
};
|
||||||
|
output = ".gitlab-ci.yml";
|
||||||
|
};
|
||||||
|
actual =
|
||||||
|
(cilib.mkCI {
|
||||||
|
config.soonix = {
|
||||||
|
componentVersion = "abc";
|
||||||
|
componentUrl = "gitlab.com/example/nix-gitlab-ci/nix-gitlab-ci";
|
||||||
|
componentInputs = {
|
||||||
|
hello = "world";
|
||||||
|
};
|
||||||
|
extraData = {
|
||||||
|
"example".script = ["hello"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}).soonix;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
32
tests/utils_test.nix
Normal file
32
tests/utils_test.nix
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
ntlib,
|
||||||
|
cilib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
suites."Utils" = {
|
||||||
|
pos = __curPos;
|
||||||
|
tests = [
|
||||||
|
{
|
||||||
|
name = "commitAndPushFiles";
|
||||||
|
type = "script";
|
||||||
|
script = let
|
||||||
|
inherit (cilib) utils;
|
||||||
|
job = ntlib.helpers.toJsonFile (
|
||||||
|
utils.commitAndPushFiles {
|
||||||
|
message = "hello world";
|
||||||
|
files = ["a.md" "b.txt"];
|
||||||
|
} {}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
# sh
|
||||||
|
''
|
||||||
|
${ntlib.helpers.path [pkgs.gnugrep]}
|
||||||
|
${ntlib.helpers.scriptHelpers}
|
||||||
|
assert_file_contains ${job} 'git commit -m \\"hello world\\"'
|
||||||
|
assert_file_contains ${job} 'git add a.md b.txt'
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue