@@ -200,3 +200,77 @@ def test_lineage_graph_name_qualification(resolved_table_name, show_full_table_n
200200 reference = LineageGraph (profile_database_name = 'elementary_db' , profile_schema_name = 'elementary_sc' ,
201201 full_table_names = show_full_table_names )
202202 assert reference ._name_qualification (Table (resolved_table_name ), '' , '' ) == expected_result
203+
204+
205+ def compare_edges (directed_graph : nx .DiGraph , edges : [set ]) -> bool :
206+ for edge in directed_graph .edges :
207+ if (edge [0 ], edge [1 ]) not in edges :
208+ return False
209+ return True
210+
211+
212+ def create_directed_graph_from_edge_list (edges : [list ]) -> nx .DiGraph :
213+ G = nx .DiGraph ()
214+ for edge in edges :
215+ G .add_node (edge [0 ])
216+ G .add_node (edge [1 ])
217+ G .add_edge (edge [0 ], edge [1 ])
218+ return G
219+
220+
221+ @pytest .mark .parametrize ("edges, selected_node, depth, expected_remaining_edges" , [
222+ (nx .path_graph (5 ).edges , 3 , None , {(3 , 4 )}),
223+ (nx .path_graph (5 ).edges , 3 , 1 , {(3 , 4 )}),
224+ (nx .path_graph (7 ).edges , 3 , 1 , {(3 , 4 )}),
225+ ([(0 , 1 ), (1 , 2 ), (0 , 3 ), (3 , 4 ), (3 , 2 ), (2 , 5 ), (4 , 6 )], 3 , None , {(3 , 4 ), (3 , 2 ), (2 , 5 ), (4 , 6 )}),
226+ ([(0 , 1 ), (1 , 2 ), (0 , 3 ), (3 , 4 ), (3 , 2 ), (2 , 5 ), (4 , 6 )], 3 , 1 , {(3 , 4 ), (3 , 2 )})
227+ ])
228+ def test_lineage_graph_downstream_graph (edges , selected_node , depth , expected_remaining_edges ):
229+ reference = LineageGraph (profile_database_name = 'elementary_db' )
230+ reference ._lineage_graph .add_edges_from (edges )
231+ reference ._lineage_graph = reference ._downstream_graph (selected_node , depth )
232+ assert compare_edges (reference ._lineage_graph , expected_remaining_edges )
233+
234+
235+ @pytest .mark .parametrize ("edges, selected_node, depth, expected_remaining_edges" , [
236+ (nx .path_graph (5 ).edges , 3 , None , {(0 , 1 ), (1 , 2 ), (2 , 3 )}),
237+ (nx .path_graph (5 ).edges , 3 , 1 , {(2 , 3 )}),
238+ (nx .path_graph (7 ).edges , 3 , 1 , {(2 , 3 )}),
239+ ([(0 , 1 ), (1 , 2 ), (2 , 3 ), (0 , 3 ), (3 , 4 ), (2 , 5 ), (4 , 6 )], 3 , None , {(0 , 3 ), (2 , 3 ), (1 , 2 ), (0 , 1 )}),
240+ ([(0 , 1 ), (1 , 2 ), (2 , 3 ), (0 , 3 ), (3 , 4 ), (2 , 5 ), (4 , 6 )], 3 , 1 , {(0 , 3 ), (2 , 3 )}),
241+ ])
242+ def test_lineage_graph_upstream_graph (edges , selected_node , depth , expected_remaining_edges ):
243+ reference = LineageGraph (profile_database_name = 'elementary_db' )
244+ reference ._lineage_graph .add_edges_from (edges )
245+ reference ._lineage_graph = reference ._upstream_graph (selected_node , depth )
246+ assert compare_edges (reference ._lineage_graph , expected_remaining_edges )
247+
248+
249+ @pytest .mark .parametrize ("profile_database_name, profile_schema_name, full_table_names, edges, selected_node, "
250+ "direction, depth, expected_remaining_edges" , [
251+ ('db' , 'sc' , True , [('db.sc.t1' , 'db.sc.t2' ), ('db.sc.t1' , 'db.sc.t3' )],
252+ 't3' , 'upstream' , None ,
253+ {('db.sc.t1' , 'db.sc.t3' )}),
254+ ('db' , 'sc' , True , [('db.sc.t1' , 'db.sc.t2' ), ('db.sc.t1' , 'db.sc.t3' )],
255+ 'db.sc.t3' , 'upstream' , None ,
256+ {('db.sc.t1' , 'db.sc.t3' )}),
257+ ('db' , 'sc' , True , [('db.sc.t1' , 'db.sc.t2' ), ('db.sc.t1' , 'db.sc.t3' ),
258+ ('db.sc.t3' , 'db.sc.t4' )],
259+ 'sc.t1' , 'downstream' , 1 ,
260+ {('db.sc.t1' , 'db.sc.t3' ), ('db.sc.t1' , 'db.sc.t2' )}),
261+ ('db' , 'sc' , False , [('t1' , 't2' ), ('t1' , 't3' )],
262+ 't3' , 'upstream' , None ,
263+ {('t1' , 't3' )}),
264+ ('db' , 'sc' , False , [('t1' , 't2' ), ('t1' , 't3' ), ('t3' , 't4' ), ('t4' , 't5' ), ('t2' , 't4' ),
265+ ('t4' , 't6' ), ('t6' , 't8' )],
266+ 't4' , 'both' , 1 ,
267+ {('t3' , 't4' ), ('t4' , 't5' ), ('t2' , 't4' ), ('t4' , 't6' )}),
268+ ])
269+ def test_lineage_graph_filter_on_table (profile_database_name , profile_schema_name , full_table_names , edges ,
270+ selected_node , direction , depth , expected_remaining_edges ):
271+ reference = LineageGraph (profile_database_name = profile_database_name , profile_schema_name = profile_schema_name ,
272+ full_table_names = full_table_names )
273+ reference ._lineage_graph = create_directed_graph_from_edge_list (edges )
274+ reference .filter_on_table (selected_node , direction , depth )
275+ assert compare_edges (reference ._lineage_graph , expected_remaining_edges )
276+
0 commit comments