Tests(deferred custom module): add more tests, dissallow nested imports

This commit is contained in:
Johannes Kirschbauer
2025-05-21 18:54:07 +02:00
parent 3951889b74
commit f16cfe68b6
2 changed files with 59 additions and 4 deletions

View File

@@ -2,18 +2,24 @@
{ {
uniqueDeferredSerializableModule = lib.fix ( uniqueDeferredSerializableModule = lib.fix (
self: self:
let
checkDef = loc: def: if def.value ? imports then throw "uniqueDeferredSerializableModule doesn't allow nested imports" else def;
in
# Essentially the "raw" type, but with a custom name and check # Essentially the "raw" type, but with a custom name and check
lib.mkOptionType { lib.mkOptionType {
name = "deferredModule"; name = "deferredModule";
description = "deferred module that has custom check and merge behavior"; description = "deferred custom module. Must be JSON serializable.";
descriptionClass = "noun"; descriptionClass = "noun";
# Unfortunately, tryEval doesn't catch JSON errors # Unfortunately, tryEval doesn't catch JSON errors
check = value: lib.seq (builtins.toJSON value) true; check = value: lib.seq (builtins.toJSON value) (lib.isAttrs value);
merge = lib.options.mergeUniqueOption { merge = lib.options.mergeUniqueOption {
message = "------"; message = "------";
merge = loc: defs: { merge = loc: defs: {
imports = map ( imports = map (
def: lib.setDefaultModuleLocation "${def.file}, via option ${lib.showOption loc}" def.value def:
lib.seq (checkDef loc def)
lib.setDefaultModuleLocation "${def.file}, via option ${lib.showOption loc}" def.value
) defs; ) defs;
}; };
}; };

View File

@@ -14,7 +14,7 @@ let
}; };
in in
{ {
test_1 = test_simple =
let let
eval = evalSettingsModule { eval = evalSettingsModule {
foo = { }; foo = { };
@@ -38,4 +38,53 @@ in
]; ];
}; };
}; };
test_no_nested_imports =
let
eval = evalSettingsModule {
foo = {
imports = [];
};
};
in
{
inherit eval;
expr = eval.config.foo;
expectedError = {
type = "ThrownError";
message = "*nested imports";
};
};
test_no_function_modules =
let
eval = evalSettingsModule {
foo = {...}: {
};
};
in
{
inherit eval;
expr = eval.config.foo;
expectedError = {
type = "TypeError";
message = "cannot convert a function to JSON";
};
};
test_non_attrs_module =
let
eval = evalSettingsModule {
foo = "foo.nix";
};
in
{
inherit eval;
expr = eval.config.foo;
expectedError = {
type = "ThrownError";
message = ".*foo.* is not of type";
};
};
} }