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
|
{ pkgs
|
||||||
, utils
|
, utils
|
||||||
}:
|
}:
|
||||||
{
|
rec {
|
||||||
|
all = [keycloak];
|
||||||
|
|
||||||
keycloak = pkgs.callPackage ./keycloak.nix {};
|
keycloak = pkgs.callPackage ./keycloak.nix {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,14 +8,27 @@
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
configcreator = pkgs.callPackage ./../haproxy/configcreator.nix { inherit utils; };
|
configcreator = pkgs.callPackage ./../../haproxy/configcreator.nix { inherit utils; };
|
||||||
mksiteconfig = pkgs.callPackage ./../haproxy/siteconfig.nix {};
|
mksiteconfig = pkgs.callPackage ./../../haproxy/siteconfig.nix {};
|
||||||
|
|
||||||
diff = testResult:
|
diff = testResult:
|
||||||
with builtins;
|
with builtins;
|
||||||
with lib.strings;
|
with lib.strings;
|
||||||
if isString testResult.expected && isString testResult.result then
|
if isString testResult.expected && isString testResult.result then
|
||||||
let
|
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;
|
p = commonPrefixLength testResult.expected testResult.result;
|
||||||
s = commonSuffixLength testResult.expected testResult.result;
|
s = commonSuffixLength testResult.expected testResult.result;
|
||||||
expectedSuffixLen = stringLength testResult.expected - s - p;
|
expectedSuffixLen = stringLength testResult.expected - s - p;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
configcreator = pkgs.callPackage ./../keycloak-cli-config/configcreator.nix { };
|
configcreator = pkgs.callPackage ./../../keycloak-cli-config/configcreator.nix {};
|
||||||
|
|
||||||
default_config = {
|
default_config = {
|
||||||
realm = "myrealm";
|
realm = "myrealm";
|
||||||
|
|
|
@ -7,7 +7,70 @@
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
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
|
in
|
||||||
|
|
||||||
with lib.attrsets;
|
with lib.attrsets;
|
||||||
|
|
Loading…
Reference in a new issue