fix tests
This commit is contained in:
parent
c12f65b5df
commit
b6288d3592
4 changed files with 83 additions and 5 deletions
|
@ -1,6 +1,8 @@
|
|||
{ pkgs
|
||||
, utils
|
||||
}:
|
||||
{
|
||||
rec {
|
||||
all = [keycloak];
|
||||
|
||||
keycloak = pkgs.callPackage ./keycloak.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;
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue