1import unittest
2
3from toolz import curried as tlz
4
5from . import test_helpers as th
6
7from .lib import (
8 directed_graph,
9 igraph_to_reference_graph,
10 limit_layers,
11 pick_keys,
12 references_graph_to_igraph,
13 reference_graph_node_keys_to_keep
14)
15
16if __name__ == "__main__":
17 unittest.main()
18
19
20references_graph = [
21 {
22 "closureSize": 3,
23 "narHash": "sha256:d",
24 "narSize": 0,
25 "path": "D",
26 "references": [
27 "D"
28 ]
29 },
30 {
31 "closureSize": 3,
32 "narHash": "sha256:b",
33 "narSize": 4,
34 "path": "B",
35 "references": [
36 "B"
37 ]
38 },
39 {
40 "closureSize": 3,
41 "narHash": "sha256:e",
42 "narSize": 5,
43 "path": "E",
44 "references": [
45 "E"
46 ]
47 },
48 {
49 "closureSize": 1,
50 "narHash": "sha256:a",
51 "narSize": 10,
52 "path": "A",
53 "references": [
54 # most of the time references contain self path, but not always.
55 "C",
56 "B",
57 ]
58 },
59 {
60 "closureSize": 5,
61 "narHash": "sha256:c",
62 "narSize": 6,
63 "path": "C",
64 "references": [
65 "C",
66 "E",
67 "D"
68 ]
69 },
70 {
71 "closureSize": 5,
72 "narHash": "sha256:f",
73 "narSize": 2,
74 "path": "F",
75 "references": [
76 "F"
77 ]
78 }
79]
80
81
82class TestLib(unittest.TestCase, th.CustomAssertions):
83
84 def test_references_graph_to_igraph(self):
85
86 graph = references_graph_to_igraph(references_graph)
87
88 pick_preserved_keys = pick_keys(reference_graph_node_keys_to_keep)
89
90 self.assertGraphEqual(
91 graph,
92 directed_graph(
93 [
94 ("A", "B"),
95 ("A", "C"),
96 ("C", "E"),
97 ("C", "D"),
98 ],
99 ["F"],
100 # Add "narSize" and "closureSize" attributes to each node.
101 map(
102 lambda node: (node["path"], pick_preserved_keys(node)),
103 references_graph
104 )
105 )
106 )
107
108 def test_references_graph_to_igraph_one_node(self):
109
110 references_graph = [
111 {
112 'closureSize': 168,
113 'narHash': 'sha256:0dl4',
114 'narSize': 168,
115 'path': 'A',
116 'references': []
117 }
118 ]
119
120 graph = references_graph_to_igraph(references_graph)
121
122 pick_preserved_keys = pick_keys(reference_graph_node_keys_to_keep)
123
124 self.assertGraphEqual(
125 graph,
126 directed_graph(
127 [],
128 ["A"],
129 # Add "narSize" and "closureSize" attributes to each node.
130 map(
131 lambda node: (node["path"], pick_preserved_keys(node)),
132 references_graph
133 )
134 )
135 )
136
137 def test_references_graph_to_igraph_zero_nodes(self):
138
139 references_graph = []
140
141 graph = references_graph_to_igraph(references_graph)
142
143 self.assertGraphEqual(
144 graph,
145 directed_graph(
146 [],
147 [],
148 []
149 )
150 )
151
152 def test_igraph_to_reference_graph(self):
153
154 graph = references_graph_to_igraph(references_graph)
155
156 nodes_by_path = {
157 node["path"]: node for node in references_graph
158 }
159
160 result = igraph_to_reference_graph(graph)
161
162 self.assertEqual(
163 len(result),
164 len(references_graph)
165 )
166
167 pick_preserved_keys = pick_keys([
168 "path",
169 *reference_graph_node_keys_to_keep
170 ])
171
172 for node in result:
173 original_node = nodes_by_path[node["path"]]
174
175 self.assertDictEqual(
176 pick_preserved_keys(original_node),
177 pick_preserved_keys(node)
178 )
179
180 revove_self_ref = tlz.remove(lambda a: a == node["path"])
181
182 self.assertListEqual(
183 sorted(node["references"]),
184 sorted(revove_self_ref(original_node["references"]))
185 )
186
187 def test_limit_layers_nothing_to_do(self):
188 graph = references_graph_to_igraph(references_graph)
189
190 layers = [graph]
191 result = limit_layers(1, layers)
192 result_list = list(result)
193
194 self.assertEqual(
195 len(result_list),
196 1
197 )
198
199 self.assertGraphEqual(graph, result_list[0])