Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/workato_platform_cli/cli/commands/connectors/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,23 +61,44 @@ 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
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()
Expand Down Expand Up @@ -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 <PROVIDER> "
"--name 'My Connection'"
Expand Down
96 changes: 96 additions & 0 deletions tests/unit/commands/connectors/test_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)

Expand All @@ -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,
)

Expand All @@ -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,
)

Expand All @@ -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,
)

Expand All @@ -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"
)