@@ -558,3 +558,105 @@ def test_get_gcp_region_from_gcloud_fail(
558558 ),
559559 )
560560 assert _onboarding .get_gcp_region_from_gcloud () == ""
561+
562+
563+ # express_mode_action telemetry
564+ def _onboard_and_get_root_meta () -> Dict [str , Any ]:
565+ """Runs onboarding under a nested context and returns the *root* context meta.
566+
567+ `TelemetryGroup` reads `express_mode_action` off the root context, so the
568+ assertion has to be made there rather than on the subcommand context the
569+ onboarding code happens to run under.
570+ """
571+ root_ctx = click .Context (click .Command ("adk" ))
572+ sub_ctx = click .Context (click .Command ("create" ), parent = root_ctx )
573+ with root_ctx , sub_ctx :
574+ try :
575+ _onboarding .handle_login_with_google ()
576+ except click .Abort :
577+ pass
578+ return root_ctx .meta
579+
580+
581+ def test_express_action_recorded_for_existing_express (
582+ monkeypatch : pytest .MonkeyPatch ,
583+ ) -> None :
584+ """Reusing an existing Express project records EXISTING_EXPRESS."""
585+ monkeypatch .setattr (gcp_utils , "check_adc" , lambda : True )
586+ monkeypatch .setattr (
587+ gcp_utils ,
588+ "retrieve_express_project" ,
589+ lambda : {"api_key" : "key" , "project_id" : "proj" , "region" : "us-central1" },
590+ )
591+
592+ meta = _onboard_and_get_root_meta ()
593+ assert meta .get ("express_mode_action" ) == "EXISTING_EXPRESS"
594+
595+
596+ def test_express_action_recorded_for_manual_project (
597+ monkeypatch : pytest .MonkeyPatch ,
598+ ) -> None :
599+ """Entering a project ID by hand records MANUAL_PROJECT."""
600+ monkeypatch .setattr (gcp_utils , "check_adc" , lambda : True )
601+ monkeypatch .setattr (gcp_utils , "retrieve_express_project" , lambda : None )
602+ monkeypatch .setattr (gcp_utils , "list_gcp_projects" , lambda limit : [])
603+ prompts = iter (["1" , "test-proj" , "us-east1" ])
604+ monkeypatch .setattr (click , "prompt" , lambda * a , ** k : next (prompts ))
605+
606+ meta = _onboard_and_get_root_meta ()
607+ assert meta .get ("express_mode_action" ) == "MANUAL_PROJECT"
608+
609+
610+ def test_express_action_recorded_for_manual_project_from_list (
611+ monkeypatch : pytest .MonkeyPatch ,
612+ ) -> None :
613+ """Opting out of the project list to type an ID records MANUAL_PROJECT."""
614+ monkeypatch .setattr (gcp_utils , "check_adc" , lambda : True )
615+ monkeypatch .setattr (gcp_utils , "retrieve_express_project" , lambda : None )
616+ monkeypatch .setattr (
617+ gcp_utils , "list_gcp_projects" , lambda limit : [("p1" , "Project 1" )]
618+ )
619+ prompts = iter ([0 , "manual-proj" , "us-east1" ])
620+ monkeypatch .setattr (click , "prompt" , lambda * a , ** k : next (prompts ))
621+
622+ meta = _onboard_and_get_root_meta ()
623+ assert meta .get ("express_mode_action" ) == "MANUAL_PROJECT"
624+
625+
626+ def test_express_action_recorded_for_create_express (
627+ monkeypatch : pytest .MonkeyPatch ,
628+ ) -> None :
629+ """Signing up for a new Express project records CREATE_EXPRESS."""
630+ monkeypatch .setattr (gcp_utils , "check_adc" , lambda : True )
631+ monkeypatch .setattr (gcp_utils , "retrieve_express_project" , lambda : None )
632+ monkeypatch .setattr (gcp_utils , "list_gcp_projects" , lambda limit : [])
633+ monkeypatch .setattr (gcp_utils , "check_express_eligibility" , lambda : True )
634+ monkeypatch .setattr (click , "confirm" , lambda * a , ** k : True )
635+ prompts = iter (["2" , "1" ])
636+ monkeypatch .setattr (click , "prompt" , lambda * a , ** k : next (prompts ))
637+ monkeypatch .setattr (
638+ gcp_utils ,
639+ "sign_up_express" ,
640+ lambda location = "us-central1" : {
641+ "api_key" : "new-key" ,
642+ "project_id" : "new-proj" ,
643+ "region" : location ,
644+ },
645+ )
646+ monkeypatch .setattr (_onboarding , "get_gcp_project_from_gcloud" , lambda : "" )
647+
648+ meta = _onboard_and_get_root_meta ()
649+ assert meta .get ("express_mode_action" ) == "CREATE_EXPRESS"
650+
651+
652+ def test_express_action_recorded_for_abandon (
653+ monkeypatch : pytest .MonkeyPatch ,
654+ ) -> None :
655+ """Choosing to abandon onboarding records ABANDON."""
656+ monkeypatch .setattr (gcp_utils , "check_adc" , lambda : True )
657+ monkeypatch .setattr (gcp_utils , "retrieve_express_project" , lambda : None )
658+ monkeypatch .setattr (gcp_utils , "list_gcp_projects" , lambda limit : [])
659+ monkeypatch .setattr (click , "prompt" , lambda * a , ** k : "3" )
660+
661+ meta = _onboard_and_get_root_meta ()
662+ assert meta .get ("express_mode_action" ) == "ABANDON"
0 commit comments