Skip to content

Commit 16114bb

Browse files
authored
Merge pull request #173 from synonymdev/feat/headlines-settings
Widgets - Headlines edit and preview
2 parents 9a75488 + 0aed85f commit 16114bb

File tree

15 files changed

+1684
-24
lines changed

15 files changed

+1684
-24
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+
}

0 commit comments

Comments
 (0)