def test_resource_manager_generated_flow_structure(api): manager = resource_manager(MyResource) if api == "functional": with Flow("test") as flow: a = inc(1) context = manager(a) with context as resource: b = add(resource, a) c = inc(b) d = inc(2) e = inc(d) f = inc(3) g = inc(f) else: flow = Flow("test") a = inc(1, flow=flow) context = manager(a, flow=flow) with context as resource: b = add(resource, a, flow=flow) c = inc(b, flow=flow) d = inc(2, flow=flow) e = inc(d, flow=flow) f = inc(3, flow=flow) g = inc(f, flow=flow) # task kwargs successfully forwarded to tasks assert context.init_task.name == "MyResource" assert context.setup_task.name == "MyResource.setup" assert context.cleanup_task.name == "MyResource.cleanup" assert not context.cleanup_task.skip_on_upstream_skip # Reference tasks setup properly assert flow.reference_tasks() == {c, e, g} # Check that: # - Tasks with no upstream dependency in the resource context have # the setup task set as an upstream dependency # - Tasks with no downstream dependency in the resource context have # the cleanup task set as a downstream dependency # - All other tasks only have explicit dependencies assert flow.upstream_tasks(a) == set() assert flow.upstream_tasks(context.init_task) == {a} assert flow.upstream_tasks(context.setup_task) == {context.init_task} assert flow.upstream_tasks(b) == {context.setup_task, a} assert flow.upstream_tasks(c) == {b} assert flow.upstream_tasks(d) == {context.setup_task} assert flow.upstream_tasks(e) == {d} assert flow.upstream_tasks(f) == {context.setup_task} assert flow.upstream_tasks(g) == {f} assert flow.upstream_tasks(context.cleanup_task) == { context.init_task, context.setup_task, c, e, f, }