'Tests a basic dependency graph:
app_a:  0001 <-- 0002 <--- 0003 <-- 0004
app_b:  0001 <-- 0002 <-/'

def test_simple_graph(self):

    graph = MigrationGraph()
    graph.add_node(('app_a', '0001'), None)
    graph.add_node(('app_a', '0002'), None)
    graph.add_node(('app_a', '0003'), None)
    graph.add_node(('app_a', '0004'), None)
    graph.add_node(('app_b', '0001'), None)
    graph.add_node(('app_b', '0002'), None)
    graph.add_dependency('app_a.0004', ('app_a', '0004'), ('app_a', '0003'))
    graph.add_dependency('app_a.0003', ('app_a', '0003'), ('app_a', '0002'))
    graph.add_dependency('app_a.0002', ('app_a', '0002'), ('app_a', '0001'))
    graph.add_dependency('app_a.0003', ('app_a', '0003'), ('app_b', '0002'))
    graph.add_dependency('app_b.0002', ('app_b', '0002'), ('app_b', '0001'))
    self.assertEqual(graph.forwards_plan(('app_a', '0001')), [('app_a', '0001')])
    self.assertEqual(graph.forwards_plan(('app_b', '0002')), [('app_b', '0001'), ('app_b', '0002')])
    self.assertEqual(graph.forwards_plan(('app_a', '0004')), [('app_b', '0001'), ('app_b', '0002'), ('app_a', '0001'), ('app_a', '0002'), ('app_a', '0003'), ('app_a', '0004')])
    self.assertEqual(graph.backwards_plan(('app_b', '0002')), [('app_a', '0004'), ('app_a', '0003'), ('app_b', '0002')])
    self.assertEqual(graph.root_nodes(), [('app_a', '0001'), ('app_b', '0001')])
    self.assertEqual(graph.leaf_nodes(), [('app_a', '0004'), ('app_b', '0002')])
