@@ -342,6 +342,49 @@ def test__on_config_changed_no_flush(
342342 harness .charm ._manager_client .flush_runner .assert_not_called ()
343343
344344
345+ def test_on_secret_changed_flushes_runners (monkeypatch : pytest .MonkeyPatch ):
346+ """
347+ arrange: Charm configured with a GitHub App private key secret.
348+ act: Update the secret content (triggers secret-changed event).
349+ assert: Runners are flushed and service is reconciled.
350+ """
351+ harness = Harness (GithubRunnerCharm )
352+ secret_id = harness .add_user_secret (content = {"private-key" : "old-pem" })
353+ harness .update_config ({GITHUB_APP_PRIVATE_KEY_SECRET_ID_CONFIG_NAME : secret_id })
354+ harness .begin ()
355+ state_mock = MagicMock ()
356+ monkeypatch .setattr ("charm.manager_service" , MagicMock ())
357+ harness .charm ._manager_client = MagicMock (spec = GitHubRunnerManagerClient )
358+ harness .charm ._setup_state = MagicMock (return_value = state_mock )
359+ harness .charm ._check_image_ready = MagicMock (return_value = True )
360+
361+ harness .set_secret_content (secret_id , {"private-key" : "new-pem" })
362+
363+ harness .charm ._manager_client .flush_runner .assert_called_once ()
364+
365+
366+ def test_on_secret_changed_reconciles_on_any_secret (monkeypatch : pytest .MonkeyPatch ):
367+ """
368+ arrange: Charm configured with a GitHub App private key secret.
369+ act: Update an unrelated secret's content.
370+ assert: Runners are still flushed (holistic reconcile on any secret change).
371+ """
372+ harness = Harness (GithubRunnerCharm )
373+ secret_id = harness .add_user_secret (content = {"private-key" : "pem-data" })
374+ unrelated_secret_id = harness .add_user_secret (content = {"some-key" : "some-value" })
375+ harness .update_config ({GITHUB_APP_PRIVATE_KEY_SECRET_ID_CONFIG_NAME : secret_id })
376+ harness .begin ()
377+ state_mock = MagicMock ()
378+ monkeypatch .setattr ("charm.manager_service" , MagicMock ())
379+ harness .charm ._manager_client = MagicMock (spec = GitHubRunnerManagerClient )
380+ harness .charm ._setup_state = MagicMock (return_value = state_mock )
381+ harness .charm ._check_image_ready = MagicMock (return_value = True )
382+
383+ harness .set_secret_content (unrelated_secret_id , {"some-key" : "new-value" })
384+
385+ harness .charm ._manager_client .flush_runner .assert_called_once ()
386+
387+
345388def test_on_stop_busy_flush_and_cleanup_service (harness : Harness , monkeypatch : pytest .MonkeyPatch ):
346389 """
347390 arrange: Set up charm with Openstack mode and runner scaler mock.
0 commit comments