Skip to content

Commit 113b7be

Browse files
committed
cli: unit tests for displaying announcements
1 parent 44c69d9 commit 113b7be

1 file changed

Lines changed: 86 additions & 0 deletions

File tree

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
"""
2+
unit tests for displaying announcements
3+
"""
4+
5+
from unittest.mock import MagicMock, call, patch
6+
7+
from divbase_cli.services.announcements import get_and_display_announcements
8+
9+
10+
@patch("divbase_cli.services.announcements.make_unauthenticated_request")
11+
@patch("divbase_cli.services.announcements.print")
12+
def test_get_and_display_announcements_no_announcements(mock_print: MagicMock, mock_request: MagicMock) -> None:
13+
"""Test that nothing is printed if the API returns an empty list."""
14+
mock_response = MagicMock()
15+
mock_response.json.return_value = []
16+
mock_request.return_value = mock_response
17+
18+
get_and_display_announcements("https://divbase.com")
19+
20+
mock_request.assert_called_once_with(
21+
method="GET",
22+
divbase_base_url="https://divbase.com",
23+
api_route="/v1/core/announcements",
24+
)
25+
mock_print.assert_not_called()
26+
27+
28+
@patch("divbase_cli.services.announcements.make_unauthenticated_request")
29+
@patch("divbase_cli.services.announcements.print")
30+
def test_get_and_display_announcements_single_announcement(mock_print: MagicMock, mock_request: MagicMock) -> None:
31+
"""Test that a single announcement is printed correctly."""
32+
mock_response = MagicMock()
33+
mock_response.json.return_value = [
34+
{"heading": "Test Heading", "message": "Test Message", "level": "info"},
35+
]
36+
mock_request.return_value = mock_response
37+
38+
get_and_display_announcements("https://divbase.com")
39+
40+
expected_calls = [
41+
call("[bold blue]Test Heading[/bold blue]"),
42+
call("Test Message\n"),
43+
]
44+
mock_print.assert_has_calls(expected_calls)
45+
46+
47+
@patch("divbase_cli.services.announcements.make_unauthenticated_request")
48+
@patch("divbase_cli.services.announcements.print")
49+
def test_get_and_display_announcements_multiple_announcements(mock_print: MagicMock, mock_request: MagicMock) -> None:
50+
"""Test that multiple announcements are printed correctly as a numbered list."""
51+
mock_response = MagicMock()
52+
mock_response.json.return_value = [
53+
{"heading": "Heading 1", "message": "Message 1", "level": "success"},
54+
{"heading": "Heading 2", "message": "Message 2", "level": "danger"},
55+
]
56+
mock_request.return_value = mock_response
57+
58+
get_and_display_announcements("https://divbase.com")
59+
60+
expected_calls = [
61+
call("[bold green]1) Heading 1[/bold green]"),
62+
call("Message 1\n"),
63+
call("[bold red]2) Heading 2[/bold red]"),
64+
call("Message 2\n"),
65+
]
66+
mock_print.assert_has_calls(expected_calls)
67+
68+
69+
@patch("divbase_cli.services.announcements.make_unauthenticated_request")
70+
@patch("divbase_cli.services.announcements.print")
71+
def test_get_and_display_announcements_unexpected_level(mock_print: MagicMock, mock_request: MagicMock) -> None:
72+
"""Test that an announcement with an unexpected level defaults to no color."""
73+
mock_response = MagicMock()
74+
mock_response.json.return_value = [
75+
{"heading": "Weird Level", "message": "No color message", "level": "critical"},
76+
]
77+
mock_request.return_value = mock_response
78+
79+
get_and_display_announcements("https://divbase.com")
80+
81+
# The color mapping will return None, resulting in rich using default styling.
82+
expected_calls = [
83+
call("[bold None]Weird Level[/bold None]"),
84+
call("No color message\n"),
85+
]
86+
mock_print.assert_has_calls(expected_calls)

0 commit comments

Comments
 (0)