@@ -269,6 +269,84 @@ def test_non_docker_job_does_not_mutate_parent_pythonpath(self):
269269 finally :
270270 os .environ .pop ("PYTHONPATH" , None )
271271
272+ def test_docker_job_mounts_installed_package_dir (self ):
273+ Path (_TEST_TEMP_DIR ).mkdir (parents = True , exist_ok = True )
274+
275+ import sys
276+ import types
277+ from unittest import mock
278+
279+ with mock .patch .dict (sys .modules , {"requests" : types .ModuleType ("requests" )}):
280+ from praktika import runner
281+
282+ captured = {}
283+
284+ class DummyTeePopen :
285+ def __init__ (self , command , ** kwargs ):
286+ captured ["command" ] = command
287+ self .timeout_exceeded = False
288+
289+ def __enter__ (self ):
290+ return self
291+
292+ def __exit__ (self , exc_type , exc_val , exc_tb ):
293+ return False
294+
295+ def wait (self ):
296+ return 0
297+
298+ def get_latest_log (self , max_lines = 20 ):
299+ return ""
300+
301+ staged_package_dir = Path (runner ._staged_praktika_package_dir ())
302+ staged_praktika_package = staged_package_dir / "praktika"
303+ job = SimpleNamespace (
304+ name = "docker-job" ,
305+ run_in_docker = "example/image:latest" ,
306+ timeout = 1 ,
307+ timeout_shell_cleanup = None ,
308+ enable_gh_auth = False ,
309+ command = "echo ok" ,
310+ )
311+ workflow = SimpleNamespace (name = "workflow" )
312+
313+ with mock .patch .object (runner , "TeePopen" , DummyTeePopen ), mock .patch .object (
314+ runner .Shell , "check" , lambda * args , ** kwargs : False
315+ ), mock .patch .object (
316+ runner .Shell , "run" , lambda * args , ** kwargs : None
317+ ), mock .patch .object (
318+ runner .Result ,
319+ "from_fs" ,
320+ staticmethod (
321+ lambda * args , ** kwargs : SimpleNamespace (
322+ is_completed = lambda : True ,
323+ is_running = lambda : False ,
324+ is_error = lambda : False ,
325+ dump = lambda : None ,
326+ )
327+ ),
328+ ), mock .patch .object (
329+ runner ._Environment ,
330+ "get" ,
331+ staticmethod (
332+ lambda : SimpleNamespace (
333+ WORKFLOW_CONFIG = None ,
334+ dump = lambda : None ,
335+ )
336+ ),
337+ ):
338+ rc = runner .Runner ()._run (workflow = workflow , job = job , no_docker = False )
339+
340+ self .assertEqual (rc , 0 )
341+ self .assertTrue (staged_package_dir .is_dir ())
342+ self .assertTrue (staged_praktika_package .is_dir ())
343+ self .assertIn (
344+ f"--volume { staged_package_dir } :{ staged_package_dir } " ,
345+ captured ["command" ],
346+ )
347+ self .assertIn (f"-e PYTHONPATH={ staged_package_dir } " , captured ["command" ])
348+ self .assertNotIn ("PYTHONPATH=." , captured ["command" ])
349+
272350 def test_exit_code_result_synthesizes_fail_on_nonzero_exit (self ):
273351 """enable_exit_code_result=True + script that exits non-zero
274352 without dumping a Result -> synthesized FAIL Result with the
0 commit comments