class_docstr: Tests that EdgeModifiers work when composed with Tasks (either via >>
  or set_upstream styles)
class_docstr_tok: ["Tests","that","EdgeModifiers","work","when","composed","with","Tasks","(","either","via",">",">","or","set_upstream","styles",")"]
docstr: Tests the set_upstream/downstream style with a TaskGroup
docstr_tok: ["Tests","the","set_upstream\/downstream","style","with","a","TaskGroup"]
code: def test_taskgroup_shift(self, test_taskgroup_dag):
      """Tests the set_upstream/downstream style with a TaskGroup"""
      # Unpack the fixture
      dag, group, (op1, op2, op3, op4) = test_taskgroup_dag
      # Arrange them with a Label in the middle
      op1 >> Label("Group label") >> group >> op4
      # Check that the DAG has the right edge info
      assert dag.get_edge_info(op1.task_id, op2.task_id) == {
          "label": "Group label"
      }
      assert dag.get_edge_info(op1.task_id, op3.task_id) == {
          "label": "Group label"
      }
      assert dag.get_edge_info(op3.task_id, op4.task_id) == {}
  
imports: from __future__ import annotations
  from datetime import datetime, timedelta
  import pytest
  from airflow.models.dag import DAG
  from airflow.models.xcom_arg import XComArg
  from airflow.operators.empty import EmptyOperator
  from airflow.operators.python import PythonOperator
  from airflow.utils.edgemodifier import Label
  from airflow.utils.task_group import TaskGroup
  from airflow.www.views import dag_edges
label_desc: Use image node_id 8 for calling the TestEdgeModifierBuilding obj's underlying member method code with example usage: obj.test_taskgroup_shift(test_taskgroup_dag) without return types