| | import unittest |
| |
|
| | from app import ( |
| | render_mermaid, |
| | extract_lineage_from_text, |
| | extract_lineage_from_bigquery, |
| | extract_lineage_from_url, |
| | ) |
| |
|
| |
|
| | class TestLineageExtractors(unittest.TestCase): |
| | def test_render_mermaid_wraps_and_inits(self): |
| | viz = "graph TD\n A --> B" |
| | html = render_mermaid(viz) |
| | |
| | self.assertIn('mermaid.ink/svg/', html) |
| | self.assertIn('<img', html) |
| | self.assertIn('mermaid.live/edit', html) |
| |
|
| | def test_extract_lineage_from_text_returns_html_and_summary(self): |
| | |
| | sample_json = '{"nodes": [{"id": "a", "name": "A"}], "edges": []}' |
| | html, summary = extract_lineage_from_text(sample_json, "Custom JSON", "Mermaid") |
| | self.assertIsInstance(html, str) |
| | self.assertIsInstance(summary, str) |
| | self.assertIn('mermaid.ink/svg/', html) |
| | self.assertIn('Parsed', summary) |
| |
|
| | def test_extract_lineage_from_text_empty_input(self): |
| | |
| | html, summary = extract_lineage_from_text("", "dbt Manifest", "Mermaid") |
| | self.assertIsInstance(html, str) |
| | self.assertIsInstance(summary, str) |
| | self.assertIn('provide metadata', summary.lower()) |
| |
|
| | def test_extract_lineage_from_bigquery_returns_html_and_summary(self): |
| | html, summary = extract_lineage_from_bigquery("proj", "SELECT 1", "key", "Mermaid") |
| | self.assertIn('mermaid.ink/svg/', html) |
| | self.assertIn('BigQuery', summary) |
| |
|
| | def test_extract_lineage_from_url_returns_html_and_summary(self): |
| | html, summary = extract_lineage_from_url("https://example.com", "Mermaid") |
| | self.assertIn('mermaid.ink/svg/', html) |
| | |
| | self.assertTrue('Lineage' in summary or 'Parsed' in summary) |
| |
|
| |
|
| | class TestExporters(unittest.TestCase): |
| | def test_openlineage_export(self): |
| | from exporters import LineageGraph, LineageNode, LineageEdge, OpenLineageExporter |
| |
|
| | graph = LineageGraph(name="test") |
| | graph.add_node(LineageNode(id="a", name="Node A", type="table")) |
| | graph.add_node(LineageNode(id="b", name="Node B", type="table")) |
| | graph.add_edge(LineageEdge(source="a", target="b", type="transform")) |
| |
|
| | exporter = OpenLineageExporter(graph) |
| | output = exporter.export() |
| |
|
| | self.assertIn("openlineage", output.lower()) |
| | self.assertIn("Node A", output) |
| |
|
| | def test_collibra_export(self): |
| | from exporters import LineageGraph, LineageNode, LineageEdge, CollibraExporter |
| |
|
| | graph = LineageGraph(name="test") |
| | graph.add_node(LineageNode(id="a", name="Node A", type="table")) |
| |
|
| | exporter = CollibraExporter(graph) |
| | output = exporter.export() |
| |
|
| | self.assertIn("Collibra", output) |
| | self.assertIn("Node A", output) |
| |
|
| | def test_purview_export(self): |
| | from exporters import LineageGraph, LineageNode, LineageEdge, PurviewExporter |
| |
|
| | graph = LineageGraph(name="test") |
| | graph.add_node(LineageNode(id="a", name="Node A", type="table")) |
| |
|
| | exporter = PurviewExporter(graph) |
| | output = exporter.export() |
| |
|
| | self.assertIn("Purview", output) |
| | self.assertIn("Node A", output) |
| |
|
| | def test_alation_export(self): |
| | from exporters import LineageGraph, LineageNode, LineageEdge, AlationExporter |
| |
|
| | graph = LineageGraph(name="test") |
| | graph.add_node(LineageNode(id="a", name="Node A", type="table")) |
| |
|
| | exporter = AlationExporter(graph) |
| | output = exporter.export() |
| |
|
| | self.assertIn("Alation", output) |
| | self.assertIn("Node A", output) |
| |
|
| | def test_atlas_export(self): |
| | from exporters import LineageGraph, LineageNode, LineageEdge, AtlasExporter |
| |
|
| | graph = LineageGraph(name="test") |
| | graph.add_node(LineageNode(id="a", name="Node A", type="table")) |
| | graph.add_node(LineageNode(id="b", name="Node B", type="table")) |
| | graph.add_edge(LineageEdge(source="a", target="b", type="transform")) |
| |
|
| | exporter = AtlasExporter(graph) |
| | output = exporter.export() |
| |
|
| | self.assertIn("Atlas", output) |
| | self.assertIn("Node A", output) |
| | self.assertIn("entities", output) |
| |
|
| |
|
| | class TestSampleDataLoading(unittest.TestCase): |
| | def test_load_sample_simple(self): |
| | from app import load_sample |
| | content = load_sample("simple") |
| | self.assertIn("nodes", content) |
| | self.assertIn("edges", content) |
| |
|
| | def test_load_sample_dbt(self): |
| | from app import load_sample |
| | content = load_sample("dbt") |
| | self.assertIn("metadata", content) |
| | self.assertIn("nodes", content) |
| |
|
| | def test_load_sample_airflow(self): |
| | from app import load_sample |
| | content = load_sample("airflow") |
| | self.assertIn("dag_id", content) |
| | self.assertIn("tasks", content) |
| |
|
| |
|
| | if __name__ == '__main__': |
| | unittest.main() |
| |
|