diff --git a/src/workato_platform_cli/cli/commands/connectors/command.py b/src/workato_platform_cli/cli/commands/connectors/command.py index 2a3aefa..abf1016 100644 --- a/src/workato_platform_cli/cli/commands/connectors/command.py +++ b/src/workato_platform_cli/cli/commands/connectors/command.py @@ -61,6 +61,10 @@ async def list_connectors( @click.option("--provider", help="Show parameters for a specific provider") @click.option("--oauth-only", is_flag=True, help="Show only OAuth-enabled providers") @click.option("--search", help="Search provider names (case-insensitive)") +@click.option("--all", "show_all", is_flag=True, help="Output full schema as JSON") +@click.option( + "--pretty", is_flag=True, help="Pretty-print JSON output (use with --all)" +) @handle_cli_exceptions @inject @handle_api_exceptions @@ -68,16 +72,33 @@ async def parameters( provider: str, oauth_only: bool, search: str, + show_all: bool, + pretty: bool, connector_manager: ConnectorManager = Provide[Container.connector_manager], ) -> None: """List connection parameters for connectors Shows configuration requirements for creating connections to different services. """ + import json # Load the bundled connection data using the injected manager connection_data = connector_manager.load_connection_data() + # Handle --all flag - output raw schema data as JSON + if show_all: + # Convert ProviderData objects back to dict for JSON serialization + json_data = {} + for key, provider_data in connection_data.items(): + json_data[key] = provider_data.model_dump() + + # Pretty-print if --pretty flag is set + if pretty: + click.echo(json.dumps(json_data, indent=2)) + else: + click.echo(json.dumps(json_data)) + return + if not connection_data: click.echo("❌ Connection parameter data not found.") click.echo() @@ -172,6 +193,8 @@ async def parameters( " • View provider details: workato connectors parameters " "--provider salesforce" ) + click.echo(" • Get JSON schema: workato connectors parameters --all") + click.echo(" • Get pretty JSON: workato connectors parameters --all --pretty") click.echo( " • Create connection: workato connections create --provider " "--name 'My Connection'" diff --git a/tests/unit/commands/connectors/test_command.py b/tests/unit/commands/connectors/test_command.py index 568dd60..b929f85 100644 --- a/tests/unit/commands/connectors/test_command.py +++ b/tests/unit/commands/connectors/test_command.py @@ -85,6 +85,8 @@ async def test_parameters_no_data( provider=None, oauth_only=False, search=None, + show_all=False, + pretty=False, connector_manager=manager, ) @@ -107,6 +109,8 @@ async def test_parameters_specific_provider( provider="salesforce", oauth_only=False, search=None, + show_all=False, + pretty=False, connector_manager=manager, ) @@ -131,6 +135,8 @@ async def test_parameters_provider_not_found( provider="unknown", oauth_only=False, search=None, + show_all=False, + pretty=False, connector_manager=manager, ) @@ -156,6 +162,8 @@ async def test_parameters_filtered_list( provider=None, oauth_only=True, search="ji", + show_all=False, + pretty=False, connector_manager=manager, ) @@ -181,7 +189,95 @@ async def test_parameters_filtered_none( provider=None, oauth_only=False, search="sales", + show_all=False, + pretty=False, connector_manager=manager, ) assert any("No providers" in line for line in capture_echo) + + +@pytest.mark.asyncio +async def test_parameters_all_flag_json_output( + monkeypatch: pytest.MonkeyPatch, capture_echo: list[str] +) -> None: + """Test that --all flag outputs single-line JSON""" + import json + + manager = Mock() + connection_data = { + "jira": ProviderData( + name="Jira", provider="jira", oauth=True, secure_tunnel=True + ), + "mysql": ProviderData(name="MySQL", provider="mysql", oauth=False), + } + + with patch.object(manager, "load_connection_data", return_value=connection_data): + assert command.parameters.callback + + await command.parameters.callback( + provider=None, + oauth_only=False, + search=None, + show_all=True, + pretty=False, + connector_manager=manager, + ) + + # Should output single-line JSON + assert len(capture_echo) == 1, "Should output exactly one line" + output = capture_echo[0] + + # Verify it's valid JSON + parsed = json.loads(output) + assert "jira" in parsed + assert "mysql" in parsed + assert parsed["jira"]["name"] == "Jira" + assert parsed["mysql"]["oauth"] is False + + +@pytest.mark.asyncio +async def test_parameters_all_with_pretty_flag( + monkeypatch: pytest.MonkeyPatch, capture_echo: list[str] +) -> None: + """Test that --all --pretty flags output pretty-printed JSON""" + import json + + manager = Mock() + connection_data = { + "jira": ProviderData( + name="Jira", provider="jira", oauth=True, secure_tunnel=True + ), + } + + with patch.object(manager, "load_connection_data", return_value=connection_data): + assert command.parameters.callback + + await command.parameters.callback( + provider=None, + oauth_only=False, + search=None, + show_all=True, + pretty=True, + connector_manager=manager, + ) + + # Get the output (should be a single echo call with embedded newlines) + assert len(capture_echo) == 1, "Should output exactly one echo call" + output = capture_echo[0] + + # Verify it's valid JSON + parsed = json.loads(output) + assert "jira" in parsed + assert parsed["jira"]["name"] == "Jira" + + # Verify it has proper indentation (pretty-printed with indent=2) + # Pretty-printed JSON should have newlines and indentation + assert "\n" in output, "Pretty-printed JSON should contain newlines" + assert ' "jira"' in output or ' "name"' in output, "Should have indented keys" + + # Verify the non-pretty version would be different (compact) + compact = json.dumps(parsed) + assert len(output) > len(compact), ( + "Pretty-printed should be longer than compact" + )