1
0
Fork 0

fix tests

This commit is contained in:
ibizaman 2023-03-16 23:47:43 -07:00
parent c12f65b5df
commit b6288d3592
4 changed files with 83 additions and 5 deletions

View file

@ -1,6 +1,8 @@
{ pkgs
, utils
}:
{
rec {
all = [keycloak];
keycloak = pkgs.callPackage ./keycloak.nix {};
}

View file

@ -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;

View file

@ -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";

View file

@ -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;