@@ -715,3 +715,74 @@ def test_deploy_passes_inference_config_to_model_customization(self):
715715 call_kwargs = mock_deploy_mc .call_args [1 ]
716716 self .assertEqual (call_kwargs ['inference_config' ], inference_config )
717717 self .assertEqual (result , mock_endpoint )
718+
719+
720+ class TestLoraAcceptEula (unittest .TestCase ):
721+ """Tests for accept_eula handling in the LoRA deployment path."""
722+
723+ def _make_mb (self , accept_eula = None ):
724+ mb = ModelBuilder .__new__ (ModelBuilder )
725+ mb .accept_eula = accept_eula
726+ mb .image_uri = "some-image-uri"
727+ mb .env_vars = {}
728+ mb .model_name = None
729+ mb .role_arn = "arn:aws:iam::123456789012:role/role"
730+ mb .model = MagicMock ()
731+ mb ._adapter_s3_uri = None
732+ return mb
733+
734+ def _patch_lora_deps (self , mb , hosting_uri = "s3://bucket/hosting/" ):
735+ """Patch all dependencies needed to reach the LoRA ContainerDefinition block."""
736+ patches = [
737+ patch .object (mb , "_fetch_peft" , return_value = "LORA" ),
738+ patch .object (mb , "_fetch_hub_document_for_custom_model" ,
739+ return_value = {"HostingArtifactUri" : hosting_uri }),
740+ patch .object (mb , "_get_model_package_for_training_job" ,
741+ return_value = MagicMock ()),
742+ ]
743+ return patches
744+
745+ def test_lora_build_raises_when_accept_eula_false (self ):
746+ mb = self ._make_mb (accept_eula = False )
747+ patches = self ._patch_lora_deps (mb )
748+ for p in patches :
749+ p .start ()
750+ try :
751+ with self .assertRaises (ValueError ) as ctx :
752+ mb ._build_single_modelbuilder ()
753+ self .assertIn ("accept_eula" , str (ctx .exception ))
754+ finally :
755+ for p in patches :
756+ p .stop ()
757+
758+ def test_lora_build_raises_when_accept_eula_not_set (self ):
759+ mb = self ._make_mb (accept_eula = None )
760+ patches = self ._patch_lora_deps (mb )
761+ for p in patches :
762+ p .start ()
763+ try :
764+ with self .assertRaises (ValueError ) as ctx :
765+ mb ._build_single_modelbuilder ()
766+ self .assertIn ("accept_eula" , str (ctx .exception ))
767+ finally :
768+ for p in patches :
769+ p .stop ()
770+
771+ @patch ("sagemaker.serve.model_builder.ContainerDefinition" )
772+ @patch ("sagemaker.serve.model_builder.Model" )
773+ def test_lora_build_passes_accept_eula_true (self , mock_model , mock_container_def ):
774+ mb = self ._make_mb (accept_eula = True )
775+ mock_model .create .return_value = MagicMock ()
776+ patches = self ._patch_lora_deps (mb )
777+ for p in patches :
778+ p .start ()
779+ try :
780+ mb ._build_single_modelbuilder ()
781+ call_kwargs = mock_container_def .call_args [1 ]
782+ eula_val = (
783+ call_kwargs ["model_data_source" ]["s3_data_source" ]["model_access_config" ]["accept_eula" ]
784+ )
785+ self .assertTrue (eula_val )
786+ finally :
787+ for p in patches :
788+ p .stop ()
0 commit comments