From b6288d35920fd72c0479eab5a8aa8f4310e5ba0d Mon Sep 17 00:00:00 2001 From: ibizaman Date: Thu, 16 Mar 2023 23:47:43 -0700 Subject: [PATCH] fix tests --- tests/integration/default.nix | 4 +- tests/unit/haproxy.nix | 17 +++++++- tests/unit/keycloak-cli-config.nix | 2 +- tests/unit/keycloak.nix | 65 +++++++++++++++++++++++++++++- 4 files changed, 83 insertions(+), 5 deletions(-) diff --git a/tests/integration/default.nix b/tests/integration/default.nix index 76b0ab0..d106d1c 100644 --- a/tests/integration/default.nix +++ b/tests/integration/default.nix @@ -1,6 +1,8 @@ { pkgs , utils }: -{ +rec { + all = [keycloak]; + keycloak = pkgs.callPackage ./keycloak.nix {}; } diff --git a/tests/unit/haproxy.nix b/tests/unit/haproxy.nix index 41a73ec..ded2fb2 100644 --- a/tests/unit/haproxy.nix +++ b/tests/unit/haproxy.nix @@ -8,14 +8,27 @@ }: let - configcreator = pkgs.callPackage ./../haproxy/configcreator.nix { inherit utils; }; - mksiteconfig = pkgs.callPackage ./../haproxy/siteconfig.nix {}; + configcreator = pkgs.callPackage ./../../haproxy/configcreator.nix { inherit utils; }; + mksiteconfig = pkgs.callPackage ./../../haproxy/siteconfig.nix {}; diff = testResult: with builtins; with lib.strings; if isString testResult.expected && isString testResult.result then let + # Taken from nixpkgs master + commonPrefixLength = a: b: + let + m = lib.min (stringLength a) (stringLength b); + go = i: if i >= m then m else if substring i 1 a == substring i 1 b then go (i + 1) else i; + in go 0; + # Taken from nixpkgs master + commonSuffixLength = a: b: + let + m = lib.min (stringLength a) (stringLength b); + go = i: if i >= m then m else if substring (stringLength a - i - 1) 1 a == substring (stringLength b - i - 1) 1 b then go (i + 1) else i; + in go 0; + p = commonPrefixLength testResult.expected testResult.result; s = commonSuffixLength testResult.expected testResult.result; expectedSuffixLen = stringLength testResult.expected - s - p; diff --git a/tests/unit/keycloak-cli-config.nix b/tests/unit/keycloak-cli-config.nix index 2b22f60..b657144 100644 --- a/tests/unit/keycloak-cli-config.nix +++ b/tests/unit/keycloak-cli-config.nix @@ -7,7 +7,7 @@ }: let - configcreator = pkgs.callPackage ./../keycloak-cli-config/configcreator.nix { }; + configcreator = pkgs.callPackage ./../../keycloak-cli-config/configcreator.nix {}; default_config = { realm = "myrealm"; diff --git a/tests/unit/keycloak.nix b/tests/unit/keycloak.nix index 7279922..6a25c3c 100644 --- a/tests/unit/keycloak.nix +++ b/tests/unit/keycloak.nix @@ -7,7 +7,70 @@ }: let - configcreator = pkgs.callPackage ./../keycloak-cli-config/configcreator.nix {}; + configcreator = pkgs.callPackage ./../../keycloak-cli-config/configcreator.nix {}; + + # Taken from https://github.com/NixOS/nixpkgs/blob/master/lib/attrsets.nix + updateManyAttrsByPath = + with builtins; + with lib.lists; + let + # When recursing into attributes, instead of updating the `path` of each + # update using `tail`, which needs to allocate an entirely new list, + # we just pass a prefix length to use and make sure to only look at the + # path without the prefix length, so that we can reuse the original list + # entries. + go = prefixLength: hasValue: value: updates: + let + # Splits updates into ones on this level (split.right) + # And ones on levels further down (split.wrong) + split = partition (el: length el.path == prefixLength) updates; + + # Groups updates on further down levels into the attributes they modify + nested = groupBy (el: elemAt el.path prefixLength) split.wrong; + + # Applies only nested modification to the input value + withNestedMods = + # Return the value directly if we don't have any nested modifications + if split.wrong == [] then + if hasValue then value + else + # Throw an error if there is no value. This `head` call here is + # safe, but only in this branch since `go` could only be called + # with `hasValue == false` for nested updates, in which case + # it's also always called with at least one update + let updatePath = (head split.right).path; in + throw + ( "updateManyAttrsByPath: Path '${showAttrPath updatePath}' does " + + "not exist in the given value, but the first update to this " + + "path tries to access the existing value.") + else + # If there are nested modifications, try to apply them to the value + if ! hasValue then + # But if we don't have a value, just use an empty attribute set + # as the value, but simplify the code a bit + mapAttrs (name: go (prefixLength + 1) false null) nested + else if isAttrs value then + # If we do have a value and it's an attribute set, override it + # with the nested modifications + value // + mapAttrs (name: go (prefixLength + 1) (value ? ${name}) value.${name}) nested + else + # However if it's not an attribute set, we can't apply the nested + # modifications, throw an error + let updatePath = (head split.wrong).path; in + throw + ( "updateManyAttrsByPath: Path '${showAttrPath updatePath}' needs to " + + "be updated, but path '${showAttrPath (take prefixLength updatePath)}' " + + "of the given value is not an attribute set, so we can't " + + "update an attribute inside of it."); + + # We get the final result by applying all the updates on this level + # after having applied all the nested updates + # We use foldl instead of foldl' so that in case of multiple updates, + # intermediate values aren't evaluated if not needed + in foldl (acc: el: el.update acc) withNestedMods split.right; + + in updates: value: go 0 true value updates; in with lib.attrsets;