Skip to content

Commit 9dd87c0

Browse files
committed
test: HeadlineCardTest
1 parent 5d9b50e commit 9dd87c0

File tree

2 files changed

+275
-8
lines changed

2 files changed

+275
-8
lines changed
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
package to.bitkit.ui.screens.widgets.headlines
2+
3+
import androidx.compose.ui.test.assertTextEquals
4+
import androidx.compose.ui.test.junit4.createComposeRule
5+
import androidx.compose.ui.test.onNodeWithTag
6+
import org.junit.Rule
7+
import org.junit.Test
8+
import to.bitkit.ui.theme.AppThemeSurface
9+
10+
class HeadlineCardTest {
11+
12+
@get:Rule
13+
val composeTestRule = createComposeRule()
14+
15+
private val testHeadline = "Bitcoin Price Reaches New All-Time High Amid Institutional Adoption"
16+
private val testTime = "2 hours ago"
17+
private val testSource = "bitcoinmagazine.com"
18+
private val testLink = "https://bitcoinmagazine.com/test-article"
19+
20+
@Test
21+
fun testHeadlineCardWithAllElements() {
22+
// Arrange & Act
23+
composeTestRule.setContent {
24+
AppThemeSurface {
25+
HeadlineCard(
26+
showWidgetTitle = true,
27+
showTime = true,
28+
showSource = true,
29+
time = testTime,
30+
headline = testHeadline,
31+
source = testSource,
32+
link = testLink
33+
)
34+
}
35+
}
36+
37+
// Assert all elements exist
38+
composeTestRule.onNodeWithTag("widget_title_row", useUnmergedTree = true).assertExists()
39+
composeTestRule.onNodeWithTag("widget_title_icon", useUnmergedTree = true).assertExists()
40+
composeTestRule.onNodeWithTag("widget_title_text", useUnmergedTree = true).assertExists()
41+
composeTestRule.onNodeWithTag("time_text", useUnmergedTree = true).assertExists()
42+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertExists()
43+
composeTestRule.onNodeWithTag("source_row", useUnmergedTree = true).assertExists()
44+
composeTestRule.onNodeWithTag("source_label", useUnmergedTree = true).assertExists()
45+
composeTestRule.onNodeWithTag("source_text", useUnmergedTree = true).assertExists()
46+
47+
// Verify text content
48+
composeTestRule.onNodeWithTag("time_text", useUnmergedTree = true).assertTextEquals(testTime)
49+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertTextEquals(testHeadline)
50+
composeTestRule.onNodeWithTag("source_text", useUnmergedTree = true).assertTextEquals(testSource)
51+
}
52+
53+
@Test
54+
fun testHeadlineCardWithoutWidgetTitle() {
55+
// Arrange & Act
56+
composeTestRule.setContent {
57+
AppThemeSurface {
58+
HeadlineCard(
59+
showWidgetTitle = false,
60+
showTime = true,
61+
showSource = true,
62+
time = testTime,
63+
headline = testHeadline,
64+
source = testSource,
65+
link = testLink
66+
)
67+
}
68+
}
69+
70+
// Assert main elements exist
71+
composeTestRule.onNodeWithTag("time_text", useUnmergedTree = true).assertExists()
72+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertExists()
73+
composeTestRule.onNodeWithTag("source_row", useUnmergedTree = true).assertExists()
74+
75+
// Assert widget title elements do not exist
76+
composeTestRule.onNodeWithTag("widget_title_row", useUnmergedTree = true).assertDoesNotExist()
77+
composeTestRule.onNodeWithTag("widget_title_icon", useUnmergedTree = true).assertDoesNotExist()
78+
composeTestRule.onNodeWithTag("widget_title_text", useUnmergedTree = true).assertDoesNotExist()
79+
}
80+
81+
@Test
82+
fun testHeadlineCardWithoutTime() {
83+
// Arrange & Act
84+
composeTestRule.setContent {
85+
AppThemeSurface {
86+
HeadlineCard(
87+
showWidgetTitle = true,
88+
showTime = false,
89+
showSource = true,
90+
time = testTime,
91+
headline = testHeadline,
92+
source = testSource,
93+
link = testLink
94+
)
95+
}
96+
}
97+
98+
// Assert main elements exist
99+
composeTestRule.onNodeWithTag("widget_title_row", useUnmergedTree = true).assertExists()
100+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertExists()
101+
composeTestRule.onNodeWithTag("source_row", useUnmergedTree = true).assertExists()
102+
103+
// Assert time element does not exist
104+
composeTestRule.onNodeWithTag("time_text", useUnmergedTree = true).assertDoesNotExist()
105+
}
106+
107+
@Test
108+
fun testHeadlineCardWithoutSource() {
109+
// Arrange & Act
110+
composeTestRule.setContent {
111+
AppThemeSurface {
112+
HeadlineCard(
113+
showWidgetTitle = true,
114+
showTime = true,
115+
showSource = false,
116+
time = testTime,
117+
headline = testHeadline,
118+
source = testSource,
119+
link = testLink
120+
)
121+
}
122+
}
123+
124+
// Assert main elements exist
125+
composeTestRule.onNodeWithTag("widget_title_row", useUnmergedTree = true).assertExists()
126+
composeTestRule.onNodeWithTag("time_text", useUnmergedTree = true).assertExists()
127+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertExists()
128+
129+
// Assert source elements do not exist
130+
composeTestRule.onNodeWithTag("source_row", useUnmergedTree = true).assertDoesNotExist()
131+
composeTestRule.onNodeWithTag("source_label", useUnmergedTree = true).assertDoesNotExist()
132+
composeTestRule.onNodeWithTag("source_text", useUnmergedTree = true).assertDoesNotExist()
133+
}
134+
135+
@Test
136+
fun testHeadlineCardMinimal() {
137+
// Arrange & Act - Only headline shown
138+
composeTestRule.setContent {
139+
AppThemeSurface {
140+
HeadlineCard(
141+
showWidgetTitle = false,
142+
showTime = false,
143+
showSource = false,
144+
time = testTime,
145+
headline = testHeadline,
146+
source = testSource,
147+
link = testLink
148+
)
149+
}
150+
}
151+
152+
// Assert only essential elements exist
153+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertExists()
154+
155+
// Assert optional elements do not exist
156+
composeTestRule.onNodeWithTag("widget_title_row", useUnmergedTree = true).assertDoesNotExist()
157+
composeTestRule.onNodeWithTag("time_text", useUnmergedTree = true).assertDoesNotExist()
158+
composeTestRule.onNodeWithTag("source_row", useUnmergedTree = true).assertDoesNotExist()
159+
160+
// Verify headline text
161+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertTextEquals(testHeadline)
162+
}
163+
164+
@Test
165+
fun testHeadlineCardWithEmptyTime() {
166+
// Arrange & Act - Time is empty string
167+
composeTestRule.setContent {
168+
AppThemeSurface {
169+
HeadlineCard(
170+
showWidgetTitle = true,
171+
showTime = true,
172+
showSource = true,
173+
time = "", // Empty time
174+
headline = testHeadline,
175+
source = testSource,
176+
link = testLink
177+
)
178+
}
179+
}
180+
181+
// Assert main elements exist
182+
composeTestRule.onNodeWithTag("widget_title_row", useUnmergedTree = true).assertExists()
183+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertExists()
184+
composeTestRule.onNodeWithTag("source_row", useUnmergedTree = true).assertExists()
185+
186+
// Assert time element does not exist when time is empty
187+
composeTestRule.onNodeWithTag("time_text", useUnmergedTree = true).assertDoesNotExist()
188+
}
189+
190+
@Test
191+
fun testHeadlineCardWithLongHeadline() {
192+
// Arrange
193+
val longHeadline =
194+
"This is a very long headline that should be truncated because it exceeds the maximum number of lines allowed in the headline card component and should show ellipsis"
195+
196+
// Act
197+
composeTestRule.setContent {
198+
AppThemeSurface {
199+
HeadlineCard(
200+
showWidgetTitle = true,
201+
showTime = true,
202+
showSource = true,
203+
time = testTime,
204+
headline = longHeadline,
205+
source = testSource,
206+
link = testLink
207+
)
208+
}
209+
}
210+
211+
// Assert headline exists and contains the text (may be truncated)
212+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertExists()
213+
}
214+
215+
@Test
216+
fun testAllElementsExistInFullConfiguration() {
217+
// Arrange & Act
218+
composeTestRule.setContent {
219+
AppThemeSurface {
220+
HeadlineCard(
221+
showWidgetTitle = true,
222+
showTime = true,
223+
showSource = true,
224+
time = testTime,
225+
headline = testHeadline,
226+
source = testSource,
227+
link = testLink
228+
)
229+
}
230+
}
231+
232+
// Assert all tagged elements exist
233+
composeTestRule.onNodeWithTag("widget_title_row", useUnmergedTree = true).assertExists()
234+
composeTestRule.onNodeWithTag("widget_title_icon", useUnmergedTree = true).assertExists()
235+
composeTestRule.onNodeWithTag("widget_title_text", useUnmergedTree = true).assertExists()
236+
composeTestRule.onNodeWithTag("time_text", useUnmergedTree = true).assertExists()
237+
composeTestRule.onNodeWithTag("headline_text", useUnmergedTree = true).assertExists()
238+
composeTestRule.onNodeWithTag("source_row", useUnmergedTree = true).assertExists()
239+
composeTestRule.onNodeWithTag("source_label", useUnmergedTree = true).assertExists()
240+
composeTestRule.onNodeWithTag("source_text", useUnmergedTree = true).assertExists()
241+
}
242+
}

app/src/main/java/to/bitkit/ui/screens/widgets/headlines/HeadlineCard.kt

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.compose.ui.Modifier
2222
import androidx.compose.ui.draw.clip
2323
import androidx.compose.ui.graphics.Color
2424
import androidx.compose.ui.platform.LocalContext
25+
import androidx.compose.ui.platform.testTag
2526
import androidx.compose.ui.res.painterResource
2627
import androidx.compose.ui.res.stringResource
2728
import androidx.compose.ui.text.style.TextOverflow
@@ -65,36 +66,60 @@ fun HeadlineCard(
6566
) {
6667
if (showWidgetTitle) {
6768
Row(
68-
verticalAlignment = Alignment.CenterVertically
69+
verticalAlignment = Alignment.CenterVertically,
70+
modifier = Modifier.testTag("widget_title_row")
6971
) {
7072
Icon(
7173
painter = painterResource(R.drawable.widget_newspaper),
7274
contentDescription = null,
73-
modifier = Modifier.size(32.dp),
75+
modifier = Modifier
76+
.size(32.dp)
77+
.testTag("widget_title_icon"),
7478
tint = Color.Unspecified
7579
)
7680
Spacer(modifier = Modifier.width(16.dp))
77-
BodyMSB(stringResource(R.string.widgets__news__name))
81+
BodyMSB(
82+
text = stringResource(R.string.widgets__news__name),
83+
modifier = Modifier.testTag("widget_title_text")
84+
)
7885
}
7986
Spacer(modifier = Modifier.height(16.dp))
8087
}
8188

8289
if (showTime && time.isNotEmpty()) {
83-
BodyM(text = time)
90+
BodyM(
91+
text = time,
92+
modifier = Modifier.testTag("time_text")
93+
)
8494
Spacer(modifier = Modifier.height(16.dp))
8595
}
8696

87-
BodyMB(text = headline, maxLines = 2, overflow = TextOverflow.Ellipsis)
97+
BodyMB(
98+
text = headline,
99+
maxLines = 2,
100+
overflow = TextOverflow.Ellipsis,
101+
modifier = Modifier.testTag("headline_text")
102+
)
88103

89104
if (showSource) {
90105
Spacer(modifier = Modifier.height(16.dp))
91106

92107
Row(
93-
modifier = Modifier.fillMaxWidth(),
108+
modifier = Modifier
109+
.fillMaxWidth()
110+
.testTag("source_row"),
94111
horizontalArrangement = Arrangement.SpaceBetween
95112
) {
96-
BodyS(text = stringResource(R.string.widgets__widget__source), color = Colors.White64)
97-
BodyS(text = source, color = Colors.White64)
113+
BodyS(
114+
text = stringResource(R.string.widgets__widget__source),
115+
color = Colors.White64,
116+
modifier = Modifier.testTag("source_label")
117+
)
118+
BodyS(
119+
text = source,
120+
color = Colors.White64,
121+
modifier = Modifier.testTag("source_text")
122+
)
98123
}
99124
}
100125
}

0 commit comments

Comments
 (0)