22from __future__ import annotations
33
44import json
5+ import subprocess
6+ import sys
57import tempfile
68import unittest
79from pathlib import Path
@@ -78,13 +80,116 @@ def test_non_guide_changes_return_empty_task_list(self) -> None:
7880
7981 self .assertEqual ([], tasks )
8082
83+ def test_default_python_build_remains_unchanged (self ) -> None :
84+ with tempfile .TemporaryDirectory () as temp_dir :
85+ guides_dir = Path (temp_dir )
86+ write_metadata (guides_dir , "python-guide" , languages = ["JAVA" , "PYTHON" ])
87+
88+ self .assertEqual (
89+ ["pythonGuideBuild" ],
90+ guide_ci_tasks .tasks_for_changed_files (
91+ ["guides/python-guide/metadata.json" ], guides_dir ,
92+ ),
93+ )
94+
95+ def test_jvm_only_excludes_python_runner_for_implicit_apps (self ) -> None :
96+ with tempfile .TemporaryDirectory () as temp_dir :
97+ guides_dir = Path (temp_dir )
98+ write_metadata (guides_dir , "python-guide" , languages = ["JAVA" , "PYTHON" ])
99+
100+ self .assertEqual (
101+ ["pythonGuideBuild -x pythonGuideRunPythonTestScript" ],
102+ guide_ci_tasks .tasks_for_changed_files (
103+ ["guides/python-guide/metadata.json" ], guides_dir , jvm_only = True ,
104+ ),
105+ )
106+
107+ def test_jvm_only_excludes_python_runner_for_explicit_apps (self ) -> None :
108+ with tempfile .TemporaryDirectory () as temp_dir :
109+ guides_dir = Path (temp_dir )
110+ write_metadata (
111+ guides_dir , "python-guide" , languages = ["JAVA" , "PYTHON" ],
112+ apps = [{"name" : "books" }, {"name" : "inventory" }],
113+ )
114+
115+ self .assertEqual (
116+ ["pythonGuideBuild -x pythonGuideRunPythonTestScript" ],
117+ guide_ci_tasks .tasks_for_changed_files (
118+ ["guides/python-guide/python/tests/test_books.py" ], guides_dir , jvm_only = True ,
119+ ),
120+ )
121+
122+ def test_jvm_only_docs_only_guide_has_no_absent_runner_exclusion (self ) -> None :
123+ with tempfile .TemporaryDirectory () as temp_dir :
124+ guides_dir = Path (temp_dir )
125+ write_metadata (guides_dir , "docs-guide" , languages = ["JAVA" , "PYTHON" ], apps = [])
126+
127+ self .assertEqual (
128+ ["docsGuideBuild" ],
129+ guide_ci_tasks .tasks_for_changed_files (
130+ ["guides/docs-guide/docs-guide.adoc" ], guides_dir , jvm_only = True ,
131+ ),
132+ )
133+
134+ def test_jvm_only_retains_jvm_guide_build (self ) -> None :
135+ with tempfile .TemporaryDirectory () as temp_dir :
136+ guides_dir = Path (temp_dir )
137+ write_metadata (guides_dir , "jvm-guide" , languages = ["JAVA" , "GROOVY" , "KOTLIN" ])
138+
139+ self .assertEqual (
140+ ["jvmGuideBuild" ],
141+ guide_ci_tasks .tasks_for_changed_files (
142+ ["guides/jvm-guide/metadata.json" ], guides_dir , jvm_only = True ,
143+ ),
144+ )
145+
146+ def test_jvm_only_preserves_transitive_base_impacts_and_deduplication (self ) -> None :
147+ with tempfile .TemporaryDirectory () as temp_dir :
148+ guides_dir = Path (temp_dir )
149+ write_metadata (guides_dir , "root-base" , publish = False )
150+ write_metadata (guides_dir , "middle-base" , publish = False , base = "root-base" )
151+ write_metadata (
152+ guides_dir , "python-guide" , base = "middle-base" , languages = ["JAVA" , "PYTHON" ],
153+ )
154+
155+ self .assertEqual (
156+ ["pythonGuideBuild -x pythonGuideRunPythonTestScript" ],
157+ guide_ci_tasks .tasks_for_changed_files (
158+ ["guides/root-base/common.adoc" , "guides/python-guide/metadata.json" ],
159+ guides_dir , jvm_only = True ,
160+ ),
161+ )
162+
163+ def test_cli_jvm_only_flag (self ) -> None :
164+ with tempfile .TemporaryDirectory () as temp_dir :
165+ repo = Path (temp_dir )
166+ guides_dir = repo / "guides"
167+ guides_dir .mkdir ()
168+ write_metadata (guides_dir , "python-guide" , languages = ["JAVA" , "PYTHON" ])
169+
170+ for flags , task in (
171+ ([], "pythonGuideBuild" ),
172+ (["--jvm-only" ], "pythonGuideBuild -x pythonGuideRunPythonTestScript" ),
173+ ):
174+ with self .subTest (flags = flags ):
175+ result = subprocess .run (
176+ [sys .executable , str (Path (guide_ci_tasks .__file__ ).resolve ()),
177+ "--repo" , str (repo ), "--changed-file" , "guides/python-guide/metadata.json" , * flags ],
178+ capture_output = True , text = True ,
179+ )
180+
181+ self .assertEqual (0 , result .returncode , result .stderr )
182+ self .assertEqual ({"group_test_tasks" : [task ]}, json .loads (result .stdout ))
183+
81184
82185def write_metadata (
83186 guides_dir : Path ,
84187 slug : str ,
85188 * ,
86189 publish : bool = True ,
87190 base : str | None = None ,
191+ languages : list [str ] | None = None ,
192+ apps : list [dict [str , str ]] | None = None ,
88193) -> None :
89194 guide_dir = guides_dir / slug
90195 guide_dir .mkdir ()
@@ -93,6 +198,10 @@ def write_metadata(
93198 metadata ["publish" ] = publish
94199 if base is not None :
95200 metadata ["base" ] = base
201+ if languages is not None :
202+ metadata ["languages" ] = languages
203+ if apps is not None :
204+ metadata ["apps" ] = apps
96205 (guide_dir / "metadata.json" ).write_text (json .dumps (metadata ), encoding = "utf-8" )
97206
98207
0 commit comments