Skip to content

Commit 9e646f6

Browse files
authored
Merge pull request #181 from synonymdev/feat/widgets-weather
Widgets - Weather
2 parents 4c22656 + 0327e91 commit 9e646f6

File tree

20 files changed

+2268
-18
lines changed

20 files changed

+2268
-18
lines changed
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
package to.bitkit.ui.screens.widgets.weather
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.R
9+
import to.bitkit.data.dto.FeeCondition
10+
import to.bitkit.models.widget.WeatherPreferences
11+
import to.bitkit.ui.screens.widgets.blocks.WeatherModel
12+
import to.bitkit.ui.theme.AppThemeSurface
13+
14+
class WeatherCardTest {
15+
16+
@get:Rule
17+
val composeTestRule = createComposeRule()
18+
19+
private val testGoodWeatherModel = WeatherModel(
20+
title = R.string.widgets__weather__condition__good__title,
21+
description = R.string.widgets__weather__condition__good__description,
22+
currentFee = "15 sat/vB",
23+
nextBlockFee = "12 sat/vB",
24+
icon = FeeCondition.GOOD.icon
25+
)
26+
27+
private val testAverageWeatherModel = WeatherModel(
28+
title = R.string.widgets__weather__condition__average__title,
29+
description = R.string.widgets__weather__condition__average__description,
30+
currentFee = "45 sat/vB",
31+
nextBlockFee = "50 sat/vB",
32+
icon = FeeCondition.AVERAGE.icon
33+
)
34+
35+
private val testAllEnabledPreferences = WeatherPreferences(
36+
showTitle = true,
37+
showDescription = true,
38+
showCurrentFee = true,
39+
showNextBlockFee = true
40+
)
41+
42+
@Test
43+
fun testWeatherCardWithAllElementsAndWidgetTitle() {
44+
// Arrange & Act
45+
composeTestRule.setContent {
46+
AppThemeSurface {
47+
WeatherCard(
48+
showWidgetTitle = true,
49+
weatherModel = testGoodWeatherModel,
50+
preferences = testAllEnabledPreferences
51+
)
52+
}
53+
}
54+
55+
// Assert all elements exist
56+
composeTestRule.onNodeWithTag("weather_card_widget_title_row", useUnmergedTree = true).assertExists()
57+
composeTestRule.onNodeWithTag("weather_card_condition_icon", useUnmergedTree = true).assertExists()
58+
composeTestRule.onNodeWithTag("weather_card_widget_title_text", useUnmergedTree = true).assertExists()
59+
composeTestRule.onNodeWithTag("weather_card_title_row", useUnmergedTree = true).assertExists()
60+
composeTestRule.onNodeWithTag("weather_card_description_text", useUnmergedTree = true).assertExists()
61+
composeTestRule.onNodeWithTag("weather_card_current_fee_row", useUnmergedTree = true).assertExists()
62+
composeTestRule.onNodeWithTag("weather_card_next_block_row", useUnmergedTree = true).assertExists()
63+
64+
// Verify text content
65+
composeTestRule.onNodeWithTag("weather_card_current_fee_value", useUnmergedTree = true)
66+
.assertTextEquals(testGoodWeatherModel.currentFee)
67+
composeTestRule.onNodeWithTag("weather_card_next_block_fee_value", useUnmergedTree = true)
68+
.assertTextEquals(testGoodWeatherModel.nextBlockFee)
69+
}
70+
71+
@Test
72+
fun testWeatherCardWithoutWidgetTitle() {
73+
// Arrange & Act
74+
composeTestRule.setContent {
75+
AppThemeSurface {
76+
WeatherCard(
77+
showWidgetTitle = false,
78+
weatherModel = testGoodWeatherModel,
79+
preferences = testAllEnabledPreferences
80+
)
81+
}
82+
}
83+
84+
// Assert main elements exist
85+
composeTestRule.onNodeWithTag("weather_card_title_row", useUnmergedTree = true).assertExists()
86+
composeTestRule.onNodeWithTag("weather_card_description_text", useUnmergedTree = true).assertExists()
87+
88+
// Assert widget title elements do not exist
89+
composeTestRule.onNodeWithTag("weather_card_widget_title_row", useUnmergedTree = true).assertDoesNotExist()
90+
composeTestRule.onNodeWithTag("weather_card_condition_icon", useUnmergedTree = true).assertDoesNotExist()
91+
composeTestRule.onNodeWithTag("weather_card_widget_title_text", useUnmergedTree = true).assertDoesNotExist()
92+
}
93+
94+
@Test
95+
fun testWeatherCardWithoutNextBlockFee() {
96+
// Arrange & Act
97+
composeTestRule.setContent {
98+
AppThemeSurface {
99+
WeatherCard(
100+
showWidgetTitle = true,
101+
weatherModel = testGoodWeatherModel,
102+
preferences = testAllEnabledPreferences.copy(showNextBlockFee = false)
103+
)
104+
}
105+
}
106+
107+
// Assert main elements exist
108+
composeTestRule.onNodeWithTag("weather_card_widget_title_row", useUnmergedTree = true).assertExists()
109+
composeTestRule.onNodeWithTag("weather_card_title_row", useUnmergedTree = true).assertExists()
110+
composeTestRule.onNodeWithTag("weather_card_current_fee_row", useUnmergedTree = true).assertExists()
111+
112+
// Assert next block fee elements do not exist
113+
composeTestRule.onNodeWithTag("weather_card_next_block_row", useUnmergedTree = true).assertDoesNotExist()
114+
composeTestRule.onNodeWithTag("weather_card_next_block_fee_label", useUnmergedTree = true).assertDoesNotExist()
115+
composeTestRule.onNodeWithTag("weather_card_next_block_fee_value", useUnmergedTree = true).assertDoesNotExist()
116+
}
117+
118+
@Test
119+
fun testWeatherCardMinimalConfiguration() {
120+
// Arrange & Act - Only title shown
121+
composeTestRule.setContent {
122+
AppThemeSurface {
123+
WeatherCard(
124+
showWidgetTitle = false,
125+
weatherModel = testGoodWeatherModel,
126+
preferences = WeatherPreferences(
127+
showTitle = true,
128+
showDescription = false,
129+
showCurrentFee = false,
130+
showNextBlockFee = false
131+
)
132+
)
133+
}
134+
}
135+
136+
// Assert only title row exists
137+
composeTestRule.onNodeWithTag("weather_card_title_row", useUnmergedTree = true).assertExists()
138+
139+
// Assert other elements do not exist
140+
composeTestRule.onNodeWithTag("weather_card_widget_title_row", useUnmergedTree = true).assertDoesNotExist()
141+
composeTestRule.onNodeWithTag("weather_card_description_text", useUnmergedTree = true).assertDoesNotExist()
142+
composeTestRule.onNodeWithTag("weather_card_current_fee_row", useUnmergedTree = true).assertDoesNotExist()
143+
composeTestRule.onNodeWithTag("weather_card_next_block_row", useUnmergedTree = true).assertDoesNotExist()
144+
}
145+
146+
@Test
147+
fun testWeatherCardWithDifferentConditions() {
148+
// Arrange & Act - Test with average condition
149+
composeTestRule.setContent {
150+
AppThemeSurface {
151+
WeatherCard(
152+
showWidgetTitle = true,
153+
weatherModel = testAverageWeatherModel,
154+
preferences = testAllEnabledPreferences
155+
)
156+
}
157+
}
158+
159+
// Assert elements exist with average condition data
160+
composeTestRule.onNodeWithTag("weather_card_title_row", useUnmergedTree = true).assertExists()
161+
composeTestRule.onNodeWithTag("weather_card_current_fee_value", useUnmergedTree = true)
162+
.assertTextEquals(testAverageWeatherModel.currentFee)
163+
composeTestRule.onNodeWithTag("weather_card_next_block_fee_value", useUnmergedTree = true)
164+
.assertTextEquals(testAverageWeatherModel.nextBlockFee)
165+
}
166+
167+
@Test
168+
fun testAllElementsExistInFullConfiguration() {
169+
// Arrange & Act
170+
composeTestRule.setContent {
171+
AppThemeSurface {
172+
WeatherCard(
173+
showWidgetTitle = true,
174+
weatherModel = testGoodWeatherModel,
175+
preferences = testAllEnabledPreferences
176+
)
177+
}
178+
}
179+
180+
// Assert all tagged elements exist
181+
composeTestRule.onNodeWithTag("weather_card_widget_title_row", useUnmergedTree = true).assertExists()
182+
composeTestRule.onNodeWithTag("weather_card_condition_icon", useUnmergedTree = true).assertExists()
183+
composeTestRule.onNodeWithTag("weather_card_widget_title_text", useUnmergedTree = true).assertExists()
184+
composeTestRule.onNodeWithTag("weather_card_title_row", useUnmergedTree = true).assertExists()
185+
composeTestRule.onNodeWithTag("weather_card_description_text", useUnmergedTree = true).assertExists()
186+
composeTestRule.onNodeWithTag("weather_card_current_fee_row", useUnmergedTree = true).assertExists()
187+
composeTestRule.onNodeWithTag("weather_card_current_fee_label", useUnmergedTree = true).assertExists()
188+
composeTestRule.onNodeWithTag("weather_card_current_fee_value", useUnmergedTree = true).assertExists()
189+
composeTestRule.onNodeWithTag("weather_card_next_block_row", useUnmergedTree = true).assertExists()
190+
composeTestRule.onNodeWithTag("weather_card_next_block_fee_label", useUnmergedTree = true).assertExists()
191+
composeTestRule.onNodeWithTag("weather_card_next_block_fee_value", useUnmergedTree = true).assertExists()
192+
}
193+
194+
@Test
195+
fun testWeatherCardWithTitleAndDescriptionOnly() {
196+
// Arrange & Act
197+
composeTestRule.setContent {
198+
AppThemeSurface {
199+
WeatherCard(
200+
showWidgetTitle = false,
201+
weatherModel = testGoodWeatherModel,
202+
preferences = WeatherPreferences(
203+
showTitle = true,
204+
showDescription = true,
205+
showCurrentFee = false,
206+
showNextBlockFee = false
207+
)
208+
)
209+
}
210+
}
211+
212+
// Assert title and description exist
213+
composeTestRule.onNodeWithTag("weather_card_title_row", useUnmergedTree = true).assertExists()
214+
composeTestRule.onNodeWithTag("weather_card_description_text", useUnmergedTree = true).assertExists()
215+
216+
// Assert fee elements do not exist
217+
composeTestRule.onNodeWithTag("weather_card_current_fee_row", useUnmergedTree = true).assertDoesNotExist()
218+
composeTestRule.onNodeWithTag("weather_card_next_block_row", useUnmergedTree = true).assertDoesNotExist()
219+
}
220+
}

0 commit comments

Comments
 (0)