diff --git a/src/pumpfun_cli/commands/launch.py b/src/pumpfun_cli/commands/launch.py index 5e32549..ec0cd39 100644 --- a/src/pumpfun_cli/commands/launch.py +++ b/src/pumpfun_cli/commands/launch.py @@ -19,6 +19,12 @@ def launch( ): """Launch a new token on pump.fun (create_v2 + extend_account).""" state = ctx.obj + if not name or not name.strip(): + error("Token name cannot be empty.") + if not ticker or not ticker.strip(): + error("Token ticker cannot be empty.") + if not desc or not desc.strip(): + error("Token description cannot be empty.") if not state or not state.rpc: error("RPC endpoint not configured.", hint="Run: pumpfun config set rpc ") diff --git a/tests/test_commands/test_launch_cmd.py b/tests/test_commands/test_launch_cmd.py new file mode 100644 index 0000000..d990536 --- /dev/null +++ b/tests/test_commands/test_launch_cmd.py @@ -0,0 +1,28 @@ +from unittest.mock import Mock + +import pytest +from typer.testing import CliRunner + +from pumpfun_cli.cli import app + +runner = CliRunner() + + +@pytest.mark.parametrize(("name", "ticker", "desc", "expected_error"), [ + ("", "TST", "test", "token name cannot be empty."), + (" ", "TST", "test", "token name cannot be empty."), + ("MyToken", "", "test", "token ticker cannot be empty."), + ("MyToken", " ", "test", "token ticker cannot be empty."), + ("MyToken", "TST", "", "token description cannot be empty."), + ("MyToken", "TST", " ", "token description cannot be empty."), +]) +def test_launch_rejects_empty_inputs(tmp_path, monkeypatch, name, ticker, desc, expected_error): + """launch rejects empty or whitespace-only name, ticker, or description.""" + monkeypatch.setenv("XDG_CONFIG_HOME", str(tmp_path)) + launch_token_mock = Mock(side_effect=AssertionError("launch_token must not be called for invalid input")) + monkeypatch.setattr("pumpfun_cli.commands.launch.launch_token", launch_token_mock) + + result = runner.invoke(app, ["launch", "--name", name, "--ticker", ticker, "--desc", desc]) + assert result.exit_code != 0 + assert expected_error in result.output.lower() + launch_token_mock.assert_not_called() \ No newline at end of file