about summary refs log tree commit diff
path: root/nix/readTree/tests/default.nix
blob: 6f9eb02effb9d87ee82bf65fa3fc2d0cc3cc684f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
{ depot, lib, ... }:

let
  inherit (depot.nix.runTestsuite)
    runTestsuite
    it
    assertEq
    assertThrows
    ;

  tree-ex = depot.nix.readTree {
    path = ./test-example;
    args = { };
  };

  example = it "corresponds to the README example" [
    (assertEq "third_party attrset"
      (lib.isAttrs tree-ex.third_party
        && (! lib.isDerivation tree-ex.third_party))
      true)
    (assertEq "third_party attrset other attribute"
      tree-ex.third_party.favouriteColour
      "orange")
    (assertEq "rustpkgs attrset aho-corasick"
      tree-ex.third_party.rustpkgs.aho-corasick
      "aho-corasick")
    (assertEq "rustpkgs attrset serde"
      tree-ex.third_party.rustpkgs.serde
      "serde")
    (assertEq "tools cheddear"
      "cheddar"
      tree-ex.tools.cheddar)
    (assertEq "tools roquefort"
      tree-ex.tools.roquefort
      "roquefort")
  ];

  tree-tl = depot.nix.readTree {
    path = ./test-tree-traversal;
    args = { };
  };

  traversal-logic = it "corresponds to the traversal logic in the README" [
    (assertEq "skip-tree/a is read"
      tree-tl.skip-tree.a
      "a is read normally")
    (assertEq "skip-tree does not contain b"
      (builtins.attrNames tree-tl.skip-tree)
      [ "__readTree" "__readTreeChildren" "a" ])
    (assertEq "skip-tree children list does not contain b"
      tree-tl.skip-tree.__readTreeChildren
      [ "a" ])

    (assertEq "skip subtree default.nix is read"
      tree-tl.skip-subtree.but
      "the default.nix is still read")
    (assertEq "skip subtree a/default.nix is skipped"
      (tree-tl.skip-subtree ? a)
      false)
    (assertEq "skip subtree b/c.nix is skipped"
      (tree-tl.skip-subtree ? b)
      false)
    (assertEq "skip subtree a/default.nix would be read without .skip-subtree"
      (tree-tl.no-skip-subtree.a)
      "am I subtree yet?")
    (assertEq "skip subtree b/c.nix would be read without .skip-subtree"
      (tree-tl.no-skip-subtree.b.c)
      "cool")

    (assertEq "default.nix attrset is merged with siblings"
      tree-tl.default-nix.no
      "siblings should be read")
    (assertEq "default.nix means sibling isn’t read"
      (tree-tl.default-nix ? sibling)
      false)
    (assertEq "default.nix means subdirs are still read and merged into default.nix"
      (tree-tl.default-nix.subdir.a)
      "but I’m picked up")

    (assertEq "default.nix can be not an attrset"
      tree-tl.default-nix.no-merge
      "I’m not merged with any children")
    (assertEq "default.nix is not an attrset -> children are not merged"
      (tree-tl.default-nix.no-merge ? subdir)
      false)

    (assertEq "default.nix can contain a derivation"
      (lib.isDerivation tree-tl.default-nix.can-be-drv)
      true)
    (assertEq "Even if default.nix is a derivation, children are traversed and merged"
      tree-tl.default-nix.can-be-drv.subdir.a
      "Picked up through the drv")
    (assertEq "default.nix drv is not changed by readTree"
      tree-tl.default-nix.can-be-drv
      (import ./test-tree-traversal/default-nix/can-be-drv/default.nix { }))
  ];

  # these each call readTree themselves because the throws have to happen inside assertThrows
  wrong = it "cannot read these files and will complain" [
    (assertThrows "this file is not a function"
      (depot.nix.readTree {
        path = ./test-wrong-not-a-function;
        args = { };
      }).not-a-function)
    # can’t test for that, assertThrows can’t catch this error
    # (assertThrows "this file is a function but doesn’t have dots"
    #   (depot.nix.readTree {} ./test-wrong-no-dots).no-dots-in-function)
  ];

  read-markers = depot.nix.readTree {
    path = ./test-marker;
    args = { };
  };

  assertMarkerByPath = path:
    assertEq "${lib.concatStringsSep "." path} is marked correctly"
      (lib.getAttrFromPath path read-markers).__readTree
      path;

  markers = it "marks nodes correctly" [
    (assertMarkerByPath [ "directory-marked" ])
    (assertMarkerByPath [ "directory-marked" "nested" ])
    (assertMarkerByPath [ "file-children" "one" ])
    (assertMarkerByPath [ "file-children" "two" ])
    (assertEq "nix file children are marked correctly"
      read-markers.file-children.__readTreeChildren [ "one" "two" ])
    (assertEq "directory children are marked correctly"
      read-markers.directory-marked.__readTreeChildren [ "nested" ])
    (assertEq "absence of children is marked"
      read-markers.directory-marked.nested.__readTreeChildren [ ])
  ];

in
runTestsuite "readTree" [
  example
  traversal-logic
  wrong
  markers
]