# tests for the nixos options to jsonschema converter # run these tests via `nix-unit ./test.nix` { lib ? (import { }).lib, slib ? (import ./. { inherit lib; }), }: let eval = modules: let evaledConfig = lib.evalModules { inherit modules; }; in evaledConfig; # Return only used attributes, for test stability stableView = set: let mapProps = attrs: lib.intersectAttrs { files = null; prio = null; total = null; } attrs; in lib.mapAttrs ( name: value: if name == "__this" then mapProps value else if name == "__list" then [ ] else if lib.isAttrs value then stableView value else value ) set; in { test_default = { expr = stableView ( slib.getPrios { options = (eval [ { options.foo.bar = lib.mkOption { type = lib.types.bool; description = "Test Description"; default = true; }; } ]).options; } ); expected = { foo = { bar = { __this = { files = [ "" ]; prio = 1500; total = false; }; }; }; }; }; test_no_default = { expr = stableView ( slib.getPrios { options = (eval [ { options.foo.bar = lib.mkOption { type = lib.types.bool; }; } ]).options; } ); expected = { foo = { bar = { __this = { files = [ ]; prio = 9999; total = false; }; }; }; }; }; test_submodule = { expr = stableView ( slib.getPrios { options = (eval [ { options.foo = lib.mkOption { type = lib.types.submodule { options = { bar = lib.mkOption { type = lib.types.bool; }; }; }; }; } ]).options; } ); expected = { foo = { __this = { files = [ ]; prio = 9999; total = true; }; bar = { __this = { files = [ ]; prio = 9999; total = false; }; }; }; }; }; test_submodule_with_merging = let evaluated = ( eval [ { options.foo = lib.mkOption { type = lib.types.submodule { _file = "option"; options = { normal = lib.mkOption { type = lib.types.bool; }; default = lib.mkOption { type = lib.types.bool; }; optionDefault = lib.mkOption { type = lib.types.bool; default = true; }; unset = lib.mkOption { type = lib.types.bool; }; }; }; }; } { _file = "default"; foo.default = lib.mkDefault true; } { _file = "normal"; foo.normal = false; } ] ); in { inherit evaluated; expr = stableView ( slib.getPrios { options = evaluated.options; } ); expected = { foo = { __this = { files = [ "normal" "default" ]; prio = 100; total = true; }; default = { __this = { files = [ "default" ]; prio = 1000; total = false; }; }; normal = { __this = { files = [ "normal" ]; prio = 100; total = false; }; }; optionDefault = { __this = { files = [ "option" ]; prio = 1500; total = false; }; }; unset = { __this = { files = [ ]; prio = 9999; total = false; }; }; }; }; }; test_submoduleWith = let evaluated = ( eval [ { options.foo = lib.mkOption { type = lib.types.submoduleWith { modules = [ { options.bar = lib.mkOption { type = lib.types.bool; }; } ]; }; }; } { foo.bar = false; } ] ); in { inherit evaluated; expr = stableView ( slib.getPrios { options = evaluated.options; } ); expected = { foo = { __this = { files = [ "" ]; prio = 100; total = true; }; bar = { __this = { files = [ "" ]; prio = 100; total = false; }; }; }; }; }; # TODO(@hsjobeki): Cover this edge case # Blocked by: https://github.com/NixOS/nixpkgs/pull/390952 check back once that is merged # test_freeform = # let # evaluated = ( # eval [ # { # freeformType = with lib.types; attrsOf (int); # options = { # foo = lib.mkOption { # type = lib.types.int; # default = 0; # }; # }; # } # { # bar = lib.mkForce 123; # baz = 1; # } # { # bar = 10; # } # ] # ); # in # { # inherit evaluated; # expr = slib.getPrios { # options = evaluated.options; # }; # expected = { # }; # }; test_attrsOf_submodule = let evaluated = eval [ { options.foo = lib.mkOption { type = lib.types.attrsOf ( lib.types.submodule { options = { bar = lib.mkOption { type = lib.types.int; default = 0; }; }; } ); }; config.foo = { "nested" = { "bar" = 2; # <- 100 prio ? }; "other" = { "bar" = lib.mkForce 2; # <- 50 prio ? }; }; } ]; in { expr = stableView (slib.getPrios { options = evaluated.options; }); expected = { foo = { __this = { files = [ "" ]; prio = 100; total = false; }; nested = { bar = { __this = { files = [ "" ]; prio = 100; total = false; }; }; }; other = { bar = { __this = { files = [ "" ]; prio = 50; total = false; }; }; }; }; }; }; test_attrsOf_attrsOf_submodule = let evaluated = eval [ { options.foo = lib.mkOption { type = lib.types.attrsOf ( lib.types.attrsOf ( lib.types.submodule { options = { bar = lib.mkOption { type = lib.types.int; default = 0; }; }; } ) ); }; config.foo = { a.b = { bar = 1; }; a.c = { bar = 1; }; x.y = { bar = 1; }; x.z = { bar = 1; }; }; } ]; in { inherit evaluated; expr = stableView (slib.getPrios { options = evaluated.options; }); expected = { foo = { __this = { files = [ "" ]; prio = 100; total = false; }; a = { b = { bar = { __this = { files = [ "" ]; prio = 100; total = false; }; }; }; c = { bar = { __this = { files = [ "" ]; prio = 100; total = false; }; }; }; }; x = { y = { bar = { __this = { files = [ "" ]; prio = 100; total = false; }; }; }; z = { bar = { __this = { files = [ "" ]; prio = 100; total = false; }; }; }; }; }; }; }; test_attrsOf_submodule_default = let evaluated = eval [ { options.machines = lib.mkOption { type = lib.types.attrsOf ( lib.types.submodule { options = { prim = lib.mkOption { type = lib.types.int; default = 2; }; settings = lib.mkOption { type = lib.types.submodule { }; default = { }; }; fludl = lib.mkOption { type = lib.types.submodule { }; default = { }; }; }; } ); }; } ({ _file = "inventory.json"; machines.jon = { prim = 3; }; }) ({ # _file = "clan.nix"; machines.jon = { }; }) ]; in { inherit evaluated; expr = stableView (slib.getPrios { options = evaluated.options; }); expected = { machines = { __this = { files = [ "" "inventory.json" ]; prio = 100; total = false; }; jon = { fludl = { __this = { files = [ "" ]; prio = 1500; total = true; }; }; prim = { __this = { files = [ "inventory.json" ]; prio = 100; total = false; }; }; settings = { __this = { files = [ "" ]; prio = 1500; total = true; }; }; }; }; }; }; test_listOf_submodule_default = let evaluated = eval [ { options.machines = lib.mkOption { type = lib.types.listOf ( lib.types.submodule { options = { prim = lib.mkOption { type = lib.types.int; default = 2; }; settings = lib.mkOption { type = lib.types.submodule { }; default = { }; }; fludl = lib.mkOption { type = lib.types.submodule { }; default = { }; }; }; } ); }; } ({ _file = "inventory.json"; machines = [ { prim = 10; } ]; }) ({ _file = "clan.nix"; machines = [ { prim = 3; } ]; }) ]; in { inherit evaluated; expr = stableView (slib.getPrios { options = evaluated.options; }); expected = { machines = { __list = [ ]; __this = { files = [ "clan.nix" "inventory.json" ]; prio = 100; total = false; }; }; }; }; }