From fd917fa6157101043c21b77f94eb81688b65bdb6 Mon Sep 17 00:00:00 2001 From: Filippo Morelli Date: Wed, 29 Apr 2026 12:22:33 +0200 Subject: [PATCH] Skip boolean prompts on dump reload using empty-string sentinel --- bootstrap/collector.py | 13 +++++++++++-- tests/test_collector.py | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/bootstrap/collector.py b/bootstrap/collector.py index ae135de..04a3238 100755 --- a/bootstrap/collector.py +++ b/bootstrap/collector.py @@ -321,13 +321,18 @@ def set_domain_and_urls(self): or click.prompt("Production domain prefix", default="www") ) self.project_url_prod = f"https://{self.subdomain_prod}.{self.project_domain}" - if self.subdomain_monitoring is not None or click.confirm( - warning("Do you want to enable the monitoring stack?"), default=False + if self.subdomain_monitoring or ( + self.subdomain_monitoring is None + and click.confirm( + warning("Do you want to enable the monitoring stack?"), default=False + ) ): self.subdomain_monitoring = slugify( self.subdomain_monitoring or click.prompt("Monitoring domain prefix", default="logs") ) + else: + self.subdomain_monitoring = "" def set_letsencrypt(self): """Set Let's Encrypt options.""" @@ -428,6 +433,8 @@ def set_sentry(self): default="", required=False, ) + else: + self.sentry_org = "" def set_pact(self): """Set the Pact options.""" @@ -444,6 +451,8 @@ def set_pact(self): self.pact_broker_password = validate_or_prompt_secret( "Pact broker password", self.pact_broker_password ) + else: + self.pact_broker_url = "" def set_gitlab(self): """Set the GitLab options.""" diff --git a/tests/test_collector.py b/tests/test_collector.py index 01d5556..59cbc31 100755 --- a/tests/test_collector.py +++ b/tests/test_collector.py @@ -427,6 +427,21 @@ def test_set_domain_and_urls_from_options(self): self.assertEqual(collector.subdomain_monitoring, "custom-log") mocked_prompt.assert_not_called() + def test_set_domain_and_urls_monitoring_skipped_on_reload(self): + """Test reloading a dump skips re-asking when monitoring was previously declined.""" + collector = Collector( + project_slug="test-project", + project_domain="test.com", + subdomain_dev="dev", + subdomain_stage="stage", + subdomain_prod="www", + subdomain_monitoring="", + ) + with mock.patch("bootstrap.collector.click.confirm") as mocked_confirm: + collector.set_domain_and_urls() + mocked_confirm.assert_not_called() + self.assertEqual(collector.subdomain_monitoring, "") + def test_letsencrypt_from_input_true(self): """Test collecting the certificate email from user input.""" collector = Collector() @@ -597,7 +612,7 @@ def test_sentry_no(self): self.assertIsNone(collector.sentry_org) with mock_input("n"): collector.set_sentry() - self.assertIsNone(collector.sentry_org) + self.assertEqual(collector.sentry_org, "") def test_sentry_default(self): """Test setting Sentry options from default.""" @@ -640,6 +655,18 @@ def test_sentry_options(self): self.assertEqual(collector.sentry_url, "https://other-sentry-url.com") self.assertEqual(collector.sentry_auth_token, "S0me!tok3n") + def test_sentry_skipped_on_reload(self): + """Test reloading a dump skips re-asking when Sentry was previously declined.""" + collector = Collector( + backend_service_slug="backend-slug", + frontend_service_slug="frontend-slug", + sentry_org="", + ) + with mock.patch("bootstrap.collector.click.confirm") as mocked_confirm: + collector.set_sentry() + mocked_confirm.assert_not_called() + self.assertEqual(collector.sentry_org, "") + def test_pact_default(self): """Test setting Pact options from default.""" collector = Collector() @@ -648,7 +675,7 @@ def test_pact_default(self): self.assertIsNone(collector.pact_broker_password) with mock_input(""): collector.set_pact() - self.assertIsNone(collector.pact_broker_url) + self.assertEqual(collector.pact_broker_url, "") self.assertIsNone(collector.pact_broker_username) self.assertIsNone(collector.pact_broker_password) @@ -681,6 +708,14 @@ def test_pact_options(self): self.assertEqual(collector.pact_broker_username, "options-username") self.assertEqual(collector.pact_broker_password, "PassW0rd FroM opt1ons!") + def test_pact_skipped_on_reload(self): + """Test reloading a dump skips re-asking when Pact was previously declined.""" + collector = Collector(pact_broker_url="") + with mock.patch("bootstrap.collector.click.confirm") as mocked_confirm: + collector.set_pact() + mocked_confirm.assert_not_called() + self.assertEqual(collector.pact_broker_url, "") + def test_gitlab_no(self): """Test not setting Gitlab.""" collector = Collector(gitlab_url="")