From c9ca7db918b8e8a265517fcf5d3ad0073bd3c8ca Mon Sep 17 00:00:00 2001 From: Chris Miller Date: Mon, 20 Oct 2025 15:17:48 -0700 Subject: [PATCH 1/2] Bug fix: AttributeError: 'coroutine' object has no attribute 'strip' --- .../cli/utils/config/manager.py | 14 +++--- tests/unit/config/test_manager.py | 46 +++++++++++++------ 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/workato_platform/cli/utils/config/manager.py b/src/workato_platform/cli/utils/config/manager.py index 605b109..d4f8280 100644 --- a/src/workato_platform/cli/utils/config/manager.py +++ b/src/workato_platform/cli/utils/config/manager.py @@ -245,7 +245,9 @@ async def _setup_profile(self) -> str: sys.exit(1) if answers["profile_choice"] == "Create new profile": - profile_name = click.prompt("Enter new profile name", type=str).strip() + profile_name = ( + await click.prompt("Enter new profile name", type=str) + ).strip() if not profile_name: click.echo("❌ Profile name cannot be empty") sys.exit(1) @@ -253,8 +255,8 @@ async def _setup_profile(self) -> str: else: profile_name = answers["profile_choice"] else: - profile_name = click.prompt( - "Enter profile name", default="default", type=str + profile_name = ( + await click.prompt("Enter profile name", default="default", type=str) ).strip() if not profile_name: click.echo("❌ Profile name cannot be empty") @@ -301,7 +303,7 @@ async def _create_new_profile(self, profile_name: str) -> None: # Handle custom URL if selected_region.region == "custom": - custom_url = click.prompt( + custom_url = await click.prompt( "Enter your custom Workato base URL", type=str, default="https://www.workato.com", @@ -312,7 +314,7 @@ async def _create_new_profile(self, profile_name: str) -> None: # Get API token click.echo("🔐 Enter your API token") - token = click.prompt("Enter your Workato API token", hide_input=True) + token = await click.prompt("Enter your Workato API token", hide_input=True) if not token.strip(): click.echo("❌ No token provided") sys.exit(1) @@ -412,7 +414,7 @@ async def _setup_project(self, profile_name: str, workspace_root: Path) -> None: selected_project = None if answers["project"] == "Create new project": - project_name = click.prompt("Enter project name", type=str) + project_name = await click.prompt("Enter project name", type=str) if not project_name or not project_name.strip(): click.echo("❌ Project name cannot be empty") sys.exit(1) diff --git a/tests/unit/config/test_manager.py b/tests/unit/config/test_manager.py index 3a59acf..bd36a78 100644 --- a/tests/unit/config/test_manager.py +++ b/tests/unit/config/test_manager.py @@ -1224,7 +1224,7 @@ async def test_setup_profile_and_project_new_flow( "Enter project name": ["DemoProject"], } - def fake_prompt(message: str, **_: object) -> str: + async def fake_prompt(message: str, **_: object) -> str: values = prompt_answers.get(message) assert values, f"Unexpected prompt: {message}" return values.pop(0) @@ -1316,9 +1316,12 @@ async def test_setup_profile_rejects_blank_new_profile( lambda _questions: {"profile_choice": "Create new profile"}, ) + async def mock_prompt(message: str, **_: Any) -> str: + return " " if "profile name" in message else "value" + monkeypatch.setattr( ConfigManager.__module__ + ".click.prompt", - lambda message, **_: " " if "profile name" in message else "value", + mock_prompt, ) with pytest.raises(SystemExit): @@ -1336,9 +1339,13 @@ async def test_setup_profile_requires_nonempty_first_prompt( ConfigManager.__module__ + ".inquirer.prompt", lambda _questions: None, ) + + async def mock_prompt2(message: str, **_: Any) -> str: + return " " if "Enter profile name" in message else "value" + monkeypatch.setattr( ConfigManager.__module__ + ".click.prompt", - lambda message, **_: " " if "Enter profile name" in message else "value", + mock_prompt2, ) with pytest.raises(SystemExit): @@ -1410,7 +1417,7 @@ async def test_create_new_profile_custom_region( "Enter your Workato API token": ["custom-token"], } - def fake_prompt(message: str, **_: Any) -> str: + async def fake_prompt(message: str, **_: Any) -> str: values = prompt_answers.get(message) assert values, f"Unexpected prompt: {message}" return values.pop(0) @@ -1479,7 +1486,7 @@ async def test_create_new_profile_requires_token( lambda _questions: {"region": "US Data Center (https://www.workato.com)"}, ) - def fake_prompt(message: str, **_: Any) -> str: + async def fake_prompt(message: str, **_: Any) -> str: if "API token" in message: return " " return "unused" @@ -1515,9 +1522,13 @@ async def test_setup_profile_existing_create_new_success( ConfigManager.__module__ + ".inquirer.prompt", lambda _questions: {"profile_choice": "Create new profile"}, ) + + async def mock_prompt3(message: str, **_: Any) -> str: + return "newprofile" if "profile name" in message else "value" + monkeypatch.setattr( ConfigManager.__module__ + ".click.prompt", - lambda message, **_: "newprofile" if "profile name" in message else "value", + mock_prompt3, ) create_mock = AsyncMock(return_value=None) @@ -1723,11 +1734,13 @@ async def test_setup_project_in_subdirectory( ConfigManager.__module__ + ".inquirer.prompt", lambda qs: answers[qs[0].message], ) + + async def mock_prompt4(message: str, **_: Any) -> str: + return "NestedProj" if message == "Enter project name" else "token" + monkeypatch.setattr( ConfigManager.__module__ + ".click.prompt", - lambda message, **_: "NestedProj" - if message == "Enter project name" - else "token", + mock_prompt4, ) manager = ConfigManager(config_dir=workspace_root, skip_validation=True) @@ -2066,7 +2079,7 @@ async def test_setup_project_path_validation_failure( def fake_prompt(questions: list[Any]) -> dict[str, str]: return answers[questions[0].message] - def fake_click_prompt(message: str, **_: object) -> str: + async def fake_click_prompt(message: str, **_: object) -> str: if message == "Enter project name": return "NewProj" if "API token" in message: @@ -2143,11 +2156,13 @@ async def test_setup_project_blocks_non_empty_directory( ConfigManager.__module__ + ".inquirer.prompt", lambda qs: answers[qs[0].message], ) + + async def mock_prompt5(message: str, **_: Any) -> str: + return "NewProj" if message == "Enter project name" else "token" + monkeypatch.setattr( ConfigManager.__module__ + ".click.prompt", - lambda message, **_: "NewProj" - if message == "Enter project name" - else "token", + mock_prompt5, ) manager = ConfigManager(config_dir=workspace_root, skip_validation=True) @@ -2175,9 +2190,12 @@ async def test_setup_project_requires_project_name( StubProjectManager, ) + async def mock_prompt6(message: str, **_: Any) -> str: + return " " if message == "Enter project name" else "token" + monkeypatch.setattr( ConfigManager.__module__ + ".click.prompt", - lambda message, **_: " " if message == "Enter project name" else "token", + mock_prompt6, ) def prompt_create_new(questions: list[Any]) -> dict[str, str]: From 9dfbad3dd80c02cda0dd91ad1157c99a49860722 Mon Sep 17 00:00:00 2001 From: Chris Miller Date: Mon, 20 Oct 2025 15:49:51 -0700 Subject: [PATCH 2/2] fix: add issues:write permission for coverage comments --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2dcd5a3..07b922f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,6 +7,7 @@ on: permissions: contents: read pull-requests: write + issues: write jobs: test: