"""Unit tests for devx.tools.create_task.""" from unittest.mock import MagicMock, patch from click.testing import CliRunner from devx.tools.create_task import cli class TestCreateTaskCli: @patch("devx.tools.create_task.VikunjaClient") @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}) def test_success(self, mock_client_cls: MagicMock) -> None: mock_client = MagicMock() mock_client.create_task.return_value = {"identifier": "DEVX-60", "id": 60} mock_client_cls.return_value = mock_client runner = CliRunner() result = runner.invoke(cli, ["--title", "Add feature X"]) assert result.exit_code == 0 assert "DEVX-60" in result.output mock_client.create_task.assert_called_once() @patch.dict("os.environ", {}, clear=True) def test_missing_token(self) -> None: runner = CliRunner() result = runner.invoke(cli, ["--title", "Add feature X"]) assert result.exit_code != 0 assert "VIKUNJA_TOKEN" in result.output @patch("devx.tools.create_task.VikunjaClient") @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}) def test_with_description(self, mock_client_cls: MagicMock) -> None: mock_client = MagicMock() mock_client.create_task.return_value = {"identifier": "DEVX-61", "id": 61} mock_client_cls.return_value = mock_client runner = CliRunner() result = runner.invoke( cli, ["--title", "Add feature Y", "--description", "

desc

"], ) assert result.exit_code == 0 call_args = mock_client.create_task.call_args assert call_args.args[1] == "Add feature Y" assert call_args.args[2] == "

desc

" @patch("devx.tools.create_task.VikunjaClient") @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}) def test_description_from_stdin(self, mock_client_cls: MagicMock) -> None: mock_client = MagicMock() mock_client.create_task.return_value = {"identifier": "DEVX-62", "id": 62} mock_client_cls.return_value = mock_client runner = CliRunner() result = runner.invoke( cli, ["--title", "Add feature Z", "--description", "-"], input="

stdin desc

", ) assert result.exit_code == 0 mock_client.create_task.assert_called_once() call_args = mock_client.create_task.call_args assert call_args.args[2] == "

stdin desc

" @patch("devx.tools.create_task.VikunjaClient") @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}) def test_custom_project_id(self, mock_client_cls: MagicMock) -> None: mock_client = MagicMock() mock_client.create_task.return_value = {"identifier": "GRM-10", "id": 10} mock_client_cls.return_value = mock_client runner = CliRunner() result = runner.invoke(cli, ["--title", "Task", "--project-id", "3"]) assert result.exit_code == 0 mock_client.create_task.assert_called_once_with(3, "Task", "") @patch("devx.tools.create_task.VikunjaClient") @patch.dict("os.environ", {"VIKUNJA_TOKEN": "tok"}) def test_no_identifier_in_response(self, mock_client_cls: MagicMock) -> None: mock_client = MagicMock() mock_client.create_task.return_value = {"id": 99} mock_client_cls.return_value = mock_client runner = CliRunner() result = runner.invoke(cli, ["--title", "Task"]) assert result.exit_code == 0 assert "id=99" in result.output