|
13 | 13 |
|
14 | 14 |
|
15 | 15 | @pytest.mark.asyncio |
16 | | -async def test_init_interactive_mode(monkeypatch: pytest.MonkeyPatch) -> None: |
| 16 | +async def test_init_interactive_mode(mock_init_dependencies) -> None: |
17 | 17 | """Test interactive mode (default behavior).""" |
18 | | - mock_config_manager = Mock() |
19 | | - mock_workato_client = Mock() |
20 | | - workato_context = AsyncMock() |
| 18 | + mocks = mock_init_dependencies(profile="default", token="token") |
21 | 19 |
|
22 | | - with ( |
23 | | - patch.object( |
24 | | - mock_config_manager, "load_config", return_value=Mock(profile="default") |
25 | | - ), |
26 | | - patch.object( |
27 | | - mock_config_manager, |
28 | | - "get_project_directory", |
29 | | - return_value=None, |
30 | | - ), |
31 | | - patch.object( |
32 | | - mock_config_manager.profile_manager, |
33 | | - "resolve_environment_variables", |
34 | | - return_value=("token", "https://api.workato.com"), |
35 | | - ), |
36 | | - patch.object(workato_context, "__aenter__", return_value=mock_workato_client), |
37 | | - patch.object(workato_context, "__aexit__", return_value=False), |
38 | | - ): |
39 | | - mock_initialize = AsyncMock(return_value=mock_config_manager) |
40 | | - monkeypatch.setattr( |
41 | | - init_module.ConfigManager, |
42 | | - "initialize", |
43 | | - mock_initialize, |
44 | | - ) |
45 | | - |
46 | | - mock_pull = AsyncMock() |
47 | | - monkeypatch.setattr(init_module, "_pull_project", mock_pull) |
48 | | - |
49 | | - monkeypatch.setattr(init_module, "Workato", lambda **_: workato_context) |
50 | | - monkeypatch.setattr(init_module, "Configuration", lambda **_: Mock()) |
51 | | - |
52 | | - monkeypatch.setattr(init_module.click, "echo", lambda _="": None) |
53 | | - |
54 | | - assert init_module.init.callback |
55 | | - await init_module.init.callback() |
56 | | - |
57 | | - # Should call initialize with no parameters (interactive mode) |
58 | | - mock_initialize.assert_awaited_once_with( |
59 | | - profile_name=None, |
60 | | - region=None, |
61 | | - api_token=None, |
62 | | - api_url=None, |
63 | | - project_name=None, |
64 | | - project_id=None, |
65 | | - output_mode="table", |
66 | | - non_interactive=False, |
67 | | - ) |
68 | | - mock_pull.assert_awaited_once() |
| 20 | + assert init_module.init.callback |
| 21 | + await init_module.init.callback() |
| 22 | + |
| 23 | + # Should call initialize with no parameters (interactive mode) |
| 24 | + mocks["initialize_mock"].assert_awaited_once_with( |
| 25 | + profile_name=None, |
| 26 | + region=None, |
| 27 | + api_token=None, |
| 28 | + api_url=None, |
| 29 | + project_name=None, |
| 30 | + project_id=None, |
| 31 | + output_mode="table", |
| 32 | + non_interactive=False, |
| 33 | + folder_name=None, |
| 34 | + ) |
| 35 | + mocks["pull_mock"].assert_awaited_once() |
69 | 36 |
|
70 | 37 |
|
71 | 38 | @pytest.mark.asyncio |
@@ -137,6 +104,7 @@ async def test_init_non_interactive_success(monkeypatch: pytest.MonkeyPatch) -> |
137 | 104 | project_id=None, |
138 | 105 | output_mode="table", |
139 | 106 | non_interactive=True, |
| 107 | + folder_name=None, |
140 | 108 | ) |
141 | 109 | mock_pull.assert_awaited_once() |
142 | 110 |
|
@@ -205,6 +173,7 @@ async def test_init_non_interactive_custom_region( |
205 | 173 | project_id=123, |
206 | 174 | output_mode="table", |
207 | 175 | non_interactive=True, |
| 176 | + folder_name=None, |
208 | 177 | ) |
209 | 178 |
|
210 | 179 |
|
@@ -369,6 +338,7 @@ async def test_init_non_interactive_with_region_and_token( |
369 | 338 | project_id=None, |
370 | 339 | output_mode="table", |
371 | 340 | non_interactive=True, |
| 341 | + folder_name=None, |
372 | 342 | ) |
373 | 343 |
|
374 | 344 |
|
@@ -1553,3 +1523,88 @@ async def test_init_non_interactive_new_profile_with_region_and_token( |
1553 | 1523 |
|
1554 | 1524 | # Should proceed without error and not check credentials |
1555 | 1525 | mock_pull.assert_awaited_once() |
| 1526 | + |
| 1527 | + |
| 1528 | +@pytest.mark.asyncio |
| 1529 | +async def test_init_with_custom_folder_name_non_interactive( |
| 1530 | + mock_init_dependencies, |
| 1531 | +) -> None: |
| 1532 | + """Test non-interactive mode with custom folder name.""" |
| 1533 | + mocks = mock_init_dependencies(profile="test-profile", token="test-token") |
| 1534 | + |
| 1535 | + assert init_module.init.callback |
| 1536 | + await init_module.init.callback( |
| 1537 | + profile="test-profile", |
| 1538 | + project_name="test-project", |
| 1539 | + non_interactive=True, |
| 1540 | + folder_name="custom-folder", |
| 1541 | + ) |
| 1542 | + |
| 1543 | + # Should call initialize with custom folder name |
| 1544 | + mocks["initialize_mock"].assert_awaited_once_with( |
| 1545 | + profile_name="test-profile", |
| 1546 | + region=None, |
| 1547 | + api_token=None, |
| 1548 | + api_url=None, |
| 1549 | + project_name="test-project", |
| 1550 | + project_id=None, |
| 1551 | + output_mode="table", |
| 1552 | + non_interactive=True, |
| 1553 | + folder_name="custom-folder", |
| 1554 | + ) |
| 1555 | + mocks["pull_mock"].assert_awaited_once() |
| 1556 | + |
| 1557 | + |
| 1558 | +@pytest.mark.asyncio |
| 1559 | +async def test_init_with_empty_folder_name_non_interactive( |
| 1560 | + mock_init_dependencies, |
| 1561 | +) -> None: |
| 1562 | + """Test non-interactive mode with empty string folder_name falls back to None.""" |
| 1563 | + mocks = mock_init_dependencies(profile="test-profile", token="test-token") |
| 1564 | + |
| 1565 | + assert init_module.init.callback |
| 1566 | + await init_module.init.callback( |
| 1567 | + profile="test-profile", |
| 1568 | + project_name="test-project", |
| 1569 | + non_interactive=True, |
| 1570 | + folder_name="", # Empty string should be treated as None |
| 1571 | + ) |
| 1572 | + |
| 1573 | + # Should call initialize with folder_name="" (empty string is passed through) |
| 1574 | + mocks["initialize_mock"].assert_awaited_once_with( |
| 1575 | + profile_name="test-profile", |
| 1576 | + region=None, |
| 1577 | + api_token=None, |
| 1578 | + api_url=None, |
| 1579 | + project_name="test-project", |
| 1580 | + project_id=None, |
| 1581 | + output_mode="table", |
| 1582 | + non_interactive=True, |
| 1583 | + folder_name="", # Empty string is passed as-is to ConfigManager.initialize |
| 1584 | + ) |
| 1585 | + mocks["pull_mock"].assert_awaited_once() |
| 1586 | + |
| 1587 | + |
| 1588 | +@pytest.mark.asyncio |
| 1589 | +async def test_init_with_custom_folder_name_interactive( |
| 1590 | + mock_init_dependencies, |
| 1591 | +) -> None: |
| 1592 | + """Test interactive mode with custom folder name.""" |
| 1593 | + mocks = mock_init_dependencies(profile="default", token="token") |
| 1594 | + |
| 1595 | + assert init_module.init.callback |
| 1596 | + await init_module.init.callback(folder_name="my-custom-folder") |
| 1597 | + |
| 1598 | + # Should call initialize with custom folder name |
| 1599 | + mocks["initialize_mock"].assert_awaited_once_with( |
| 1600 | + profile_name=None, |
| 1601 | + region=None, |
| 1602 | + api_token=None, |
| 1603 | + api_url=None, |
| 1604 | + project_name=None, |
| 1605 | + project_id=None, |
| 1606 | + output_mode="table", |
| 1607 | + non_interactive=False, |
| 1608 | + folder_name="my-custom-folder", |
| 1609 | + ) |
| 1610 | + mocks["pull_mock"].assert_awaited_once() |
0 commit comments