Skip to content

Commit 5d9b50e

Browse files
committed
test: HeadlinesEditContentTest
1 parent fe40a13 commit 5d9b50e

File tree

2 files changed

+403
-23
lines changed

2 files changed

+403
-23
lines changed
Lines changed: 333 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,333 @@
1+
package to.bitkit.ui.screens.widgets.headlines
2+
3+
import androidx.compose.ui.test.assertIsEnabled
4+
import androidx.compose.ui.test.assertIsNotEnabled
5+
import androidx.compose.ui.test.junit4.createComposeRule
6+
import androidx.compose.ui.test.onNodeWithTag
7+
import androidx.compose.ui.test.performClick
8+
import org.junit.Rule
9+
import org.junit.Test
10+
import to.bitkit.models.widget.ArticleModel
11+
import to.bitkit.models.widget.HeadlinePreferences
12+
import to.bitkit.ui.theme.AppThemeSurface
13+
14+
class HeadlinesEditContentTest {
15+
16+
@get:Rule
17+
val composeTestRule = createComposeRule()
18+
19+
private val mockArticle = ArticleModel(
20+
title = "Test Article Title for Testing Very Long Headlines That Might Wrap",
21+
timeAgo = "3 hours ago",
22+
publisher = "Test News Publisher",
23+
link = "https://example.com/test-article"
24+
)
25+
26+
private val defaultPreferences = HeadlinePreferences(
27+
showTime = true,
28+
showSource = true
29+
)
30+
31+
@Test
32+
fun testHeadlinesEditScreenWithDefaultPreferences() {
33+
// Arrange
34+
var closeClicked = false
35+
var backClicked = false
36+
var timeClicked = false
37+
var resetClicked = false
38+
var previewClicked = false
39+
var sourceClicked = false
40+
41+
// Act
42+
composeTestRule.setContent {
43+
AppThemeSurface {
44+
HeadlinesEditContent(
45+
onClose = { closeClicked = true },
46+
onBack = { backClicked = true },
47+
onClickTime = { timeClicked = true },
48+
onClickReset = { resetClicked = true },
49+
onClickPreview = { previewClicked = true },
50+
onClickShowSource = { sourceClicked = true },
51+
headlinePreferences = defaultPreferences,
52+
article = mockArticle
53+
)
54+
}
55+
}
56+
57+
// Assert main elements exist
58+
composeTestRule.onNodeWithTag("headlines_edit_screen").assertExists()
59+
composeTestRule.onNodeWithTag("main_content").assertExists()
60+
61+
// Verify description
62+
composeTestRule.onNodeWithTag("edit_description").assertExists()
63+
64+
// Verify time setting row
65+
composeTestRule.onNodeWithTag("time_setting_row").assertExists()
66+
composeTestRule.onNodeWithTag("time_text").assertExists()
67+
composeTestRule.onNodeWithTag("time_toggle_button").assertExists()
68+
composeTestRule.onNodeWithTag("time_toggle_icon").assertExists()
69+
70+
// Verify title setting row
71+
composeTestRule.onNodeWithTag("title_setting_row").assertExists()
72+
composeTestRule.onNodeWithTag("title_text").assertExists()
73+
composeTestRule.onNodeWithTag("title_toggle_button").assertExists()
74+
composeTestRule.onNodeWithTag("title_toggle_icon").assertExists()
75+
76+
// Verify source setting row
77+
composeTestRule.onNodeWithTag("source_setting_row").assertExists()
78+
composeTestRule.onNodeWithTag("source_label").assertExists()
79+
composeTestRule.onNodeWithTag("source_text").assertExists()
80+
composeTestRule.onNodeWithTag("source_toggle_button").assertExists()
81+
composeTestRule.onNodeWithTag("source_toggle_icon").assertExists()
82+
83+
// Verify dividers
84+
composeTestRule.onNodeWithTag("time_divider").assertExists()
85+
composeTestRule.onNodeWithTag("title_divider").assertExists()
86+
composeTestRule.onNodeWithTag("source_divider").assertExists()
87+
88+
// Verify buttons
89+
composeTestRule.onNodeWithTag("buttons_row").assertExists()
90+
composeTestRule.onNodeWithTag("reset_button").assertExists()
91+
composeTestRule.onNodeWithTag("preview_button").assertExists()
92+
93+
// Test button clicks
94+
composeTestRule.onNodeWithTag("time_toggle_button").performClick()
95+
assert(timeClicked)
96+
97+
composeTestRule.onNodeWithTag("source_toggle_button").performClick()
98+
assert(sourceClicked)
99+
100+
composeTestRule.onNodeWithTag("preview_button").performClick()
101+
assert(previewClicked)
102+
103+
// Reset button should be disabled when both options are enabled (default state)
104+
composeTestRule.onNodeWithTag("reset_button").assertIsNotEnabled()
105+
}
106+
107+
@Test
108+
fun testHeadlinesEditScreenWithCustomPreferences() {
109+
// Arrange - Only time enabled, source disabled
110+
val customPreferences = HeadlinePreferences(
111+
showTime = true,
112+
showSource = false
113+
)
114+
115+
var resetClicked = false
116+
117+
// Act
118+
composeTestRule.setContent {
119+
AppThemeSurface {
120+
HeadlinesEditContent(
121+
onClose = {},
122+
onBack = {},
123+
onClickTime = {},
124+
onClickReset = { resetClicked = true },
125+
onClickPreview = {},
126+
onClickShowSource = {},
127+
headlinePreferences = customPreferences,
128+
article = mockArticle
129+
)
130+
}
131+
}
132+
133+
// Assert reset button should be enabled when not all options are enabled
134+
composeTestRule.onNodeWithTag("reset_button").assertIsEnabled()
135+
136+
// Test reset button click
137+
composeTestRule.onNodeWithTag("reset_button").performClick()
138+
assert(resetClicked)
139+
}
140+
141+
@Test
142+
fun testHeadlinesEditScreenWithMinimalPreferences() {
143+
// Arrange - Both options disabled
144+
val minimalPreferences = HeadlinePreferences(
145+
showTime = false,
146+
showSource = false
147+
)
148+
149+
// Act
150+
composeTestRule.setContent {
151+
AppThemeSurface {
152+
HeadlinesEditContent(
153+
onClose = {},
154+
onBack = {},
155+
onClickTime = {},
156+
onClickReset = {},
157+
onClickPreview = {},
158+
onClickShowSource = {},
159+
headlinePreferences = minimalPreferences,
160+
article = mockArticle
161+
)
162+
}
163+
}
164+
165+
// Assert reset button should be enabled when not all options are enabled
166+
composeTestRule.onNodeWithTag("reset_button").assertIsEnabled()
167+
168+
// Verify all elements still exist
169+
composeTestRule.onNodeWithTag("headlines_edit_screen").assertExists()
170+
composeTestRule.onNodeWithTag("time_toggle_button").assertExists()
171+
composeTestRule.onNodeWithTag("source_toggle_button").assertExists()
172+
}
173+
174+
@Test
175+
fun testTitleToggleButtonIsDisabled() {
176+
// Act
177+
composeTestRule.setContent {
178+
AppThemeSurface {
179+
HeadlinesEditContent(
180+
onClose = {},
181+
onBack = {},
182+
onClickTime = {},
183+
onClickReset = {},
184+
onClickPreview = {},
185+
onClickShowSource = {},
186+
headlinePreferences = defaultPreferences,
187+
article = mockArticle
188+
)
189+
}
190+
}
191+
192+
// Assert title toggle button is always disabled (title is always shown)
193+
composeTestRule.onNodeWithTag("title_toggle_button").assertIsNotEnabled()
194+
}
195+
196+
@Test
197+
fun testAllElementsExist() {
198+
// Arrange
199+
composeTestRule.setContent {
200+
AppThemeSurface {
201+
HeadlinesEditContent(
202+
onClose = {},
203+
onBack = {},
204+
onClickTime = {},
205+
onClickReset = {},
206+
onClickPreview = {},
207+
onClickShowSource = {},
208+
headlinePreferences = defaultPreferences,
209+
article = mockArticle
210+
)
211+
}
212+
}
213+
214+
// Assert all tagged elements exist
215+
composeTestRule.onNodeWithTag("headlines_edit_screen").assertExists()
216+
composeTestRule.onNodeWithTag("main_content").assertExists()
217+
composeTestRule.onNodeWithTag("edit_description").assertExists()
218+
composeTestRule.onNodeWithTag("time_setting_row").assertExists()
219+
composeTestRule.onNodeWithTag("time_text").assertExists()
220+
composeTestRule.onNodeWithTag("time_toggle_button").assertExists()
221+
composeTestRule.onNodeWithTag("time_divider").assertExists()
222+
composeTestRule.onNodeWithTag("title_setting_row").assertExists()
223+
composeTestRule.onNodeWithTag("title_text").assertExists()
224+
composeTestRule.onNodeWithTag("title_toggle_button").assertExists()
225+
composeTestRule.onNodeWithTag("title_toggle_icon").assertExists()
226+
composeTestRule.onNodeWithTag("title_divider").assertExists()
227+
composeTestRule.onNodeWithTag("source_setting_row").assertExists()
228+
composeTestRule.onNodeWithTag("source_label").assertExists()
229+
composeTestRule.onNodeWithTag("source_text").assertExists()
230+
composeTestRule.onNodeWithTag("source_toggle_button").assertExists()
231+
composeTestRule.onNodeWithTag("source_toggle_icon").assertExists()
232+
composeTestRule.onNodeWithTag("source_divider").assertExists()
233+
composeTestRule.onNodeWithTag("buttons_row").assertExists()
234+
composeTestRule.onNodeWithTag("reset_button").assertExists()
235+
composeTestRule.onNodeWithTag("preview_button").assertExists()
236+
}
237+
238+
@Test
239+
fun testResetButtonEnabledState() {
240+
// Test when reset should be enabled (source disabled)
241+
val preferencesSourceDisabled = HeadlinePreferences(
242+
showTime = true,
243+
showSource = false
244+
)
245+
246+
composeTestRule.setContent {
247+
AppThemeSurface {
248+
HeadlinesEditContent(
249+
onClose = {},
250+
onBack = {},
251+
onClickTime = {},
252+
onClickReset = {},
253+
onClickPreview = {},
254+
onClickShowSource = {},
255+
headlinePreferences = preferencesSourceDisabled,
256+
article = mockArticle
257+
)
258+
}
259+
}
260+
261+
composeTestRule.onNodeWithTag("reset_button").assertIsEnabled()
262+
}
263+
264+
@Test
265+
fun testResetButtonDisabledState() {
266+
// Test when reset should be disabled (both options enabled)
267+
val preferencesAllEnabled = HeadlinePreferences(
268+
showTime = true,
269+
showSource = true
270+
)
271+
272+
composeTestRule.setContent {
273+
AppThemeSurface {
274+
HeadlinesEditContent(
275+
onClose = {},
276+
onBack = {},
277+
onClickTime = {},
278+
onClickReset = {},
279+
onClickPreview = {},
280+
onClickShowSource = {},
281+
headlinePreferences = preferencesAllEnabled,
282+
article = mockArticle
283+
)
284+
}
285+
}
286+
287+
composeTestRule.onNodeWithTag("reset_button").assertIsNotEnabled()
288+
}
289+
290+
@Test
291+
fun testAllCallbacksTriggered() {
292+
// Arrange
293+
var closeClicked = false
294+
var backClicked = false
295+
var timeClicked = false
296+
var resetClicked = false
297+
var previewClicked = false
298+
var sourceClicked = false
299+
300+
val customPreferences = HeadlinePreferences(
301+
showTime = false,
302+
showSource = true
303+
)
304+
305+
composeTestRule.setContent {
306+
AppThemeSurface {
307+
HeadlinesEditContent(
308+
onClose = { closeClicked = true },
309+
onBack = { backClicked = true },
310+
onClickTime = { timeClicked = true },
311+
onClickReset = { resetClicked = true },
312+
onClickPreview = { previewClicked = true },
313+
onClickShowSource = { sourceClicked = true },
314+
headlinePreferences = customPreferences,
315+
article = mockArticle
316+
)
317+
}
318+
}
319+
320+
// Test all clickable elements
321+
composeTestRule.onNodeWithTag("time_toggle_button").performClick()
322+
assert(timeClicked)
323+
324+
composeTestRule.onNodeWithTag("source_toggle_button").performClick()
325+
assert(sourceClicked)
326+
327+
composeTestRule.onNodeWithTag("reset_button").performClick()
328+
assert(resetClicked)
329+
330+
composeTestRule.onNodeWithTag("preview_button").performClick()
331+
assert(previewClicked)
332+
}
333+
}

0 commit comments

Comments
 (0)