diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt index a22ca920d..4f75d27ad 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt @@ -17,6 +17,7 @@ package com.google.samples.apps.nowinandroid.core.model.data import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Codelab +import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Unknown import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video import kotlinx.datetime.Instant import kotlinx.datetime.LocalDateTime @@ -83,5 +84,16 @@ val previewNewsResources = listOf( publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), type = Video, topics = listOf(previewTopics[2]) + ), + NewsResource( + id = "4", + title = "New Jetpack Release", + content = "New Jetpack release includes updates to libraries such as CameraX, Benchmark, and" + + "more!", + url = "https://developer.android.com/jetpack/androidx/versions/all-channel", + headerImageUrl = "", + publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), + type = Unknown, + topics = listOf(previewTopics[2]) ) ) diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index c76e4bb27..39f9bcff1 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -20,6 +20,9 @@ plugins { } android { + defaultConfig { + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } namespace = "com.google.samples.apps.nowinandroid.core.ui" } @@ -45,4 +48,6 @@ dependencies { api(libs.androidx.compose.runtime.livedata) api(libs.androidx.metrics) api(libs.androidx.tracing.ktx) -} + + androidTestImplementation(project(":core:testing")) +} \ No newline at end of file diff --git a/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt b/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt new file mode 100644 index 000000000..69f919a62 --- /dev/null +++ b/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt @@ -0,0 +1,78 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.ui + +import androidx.activity.ComponentActivity +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText +import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources +import org.junit.Rule +import org.junit.Test + +class NewsResourceCardTest { + @get:Rule + val composeTestRule = createAndroidComposeRule() + + @Test + fun testMetaDataDisplay_withCodelabResource() { + val newsWithKnownResourceType = previewNewsResources[0] + var dateFormatted = "" + + composeTestRule.setContent { + NewsResourceCardExpanded( + newsResource = newsWithKnownResourceType, + isBookmarked = false, + onToggleBookmark = {}, + onClick = {} + ) + + dateFormatted = dateFormatted(publishDate = newsWithKnownResourceType.publishDate) + } + + composeTestRule + .onNodeWithText( + composeTestRule.activity.getString( + R.string.card_meta_data_text, + dateFormatted, + newsWithKnownResourceType.type.displayText + ) + ) + .assertExists() + } + + @Test + fun testMetaDataDisplay_withUnknownResource() { + val newsWithUnknownResourceType = previewNewsResources[3] + var dateFormatted = "" + + composeTestRule.setContent { + NewsResourceCardExpanded( + newsResource = newsWithUnknownResourceType, + isBookmarked = false, + onToggleBookmark = {}, + onClick = {} + ) + + dateFormatted = dateFormatted(publishDate = newsWithUnknownResourceType.publishDate) + } + + composeTestRule + .onNodeWithText(dateFormatted) + .assertIsDisplayed() + } +} diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 2d51b3f79..c7d04680c 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -57,6 +57,7 @@ import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopic import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.model.data.NewsResource +import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources import java.time.ZoneId @@ -109,7 +110,7 @@ fun NewsResourceCardExpanded( BookmarkButton(isBookmarked, onToggleBookmark) } Spacer(modifier = Modifier.height(12.dp)) - NewsResourceDate(newsResource.publishDate) + NewsResourceMetaData(newsResource.publishDate, newsResource.type) Spacer(modifier = Modifier.height(12.dp)) NewsResourceShortDescription(newsResource.content) Spacer(modifier = Modifier.height(12.dp)) @@ -175,7 +176,7 @@ fun BookmarkButton( } @Composable -private fun dateFormatted(publishDate: Instant): String { +fun dateFormatted(publishDate: Instant): String { var zoneId by remember { mutableStateOf(ZoneId.systemDefault()) } val context = LocalContext.current @@ -195,10 +196,19 @@ private fun dateFormatted(publishDate: Instant): String { } @Composable -fun NewsResourceDate( - publishDate: Instant +fun NewsResourceMetaData( + publishDate: Instant, + resourceType: NewsResourceType ) { - Text(dateFormatted(publishDate), style = MaterialTheme.typography.labelSmall) + val formattedDate = dateFormatted(publishDate) + Text( + if (resourceType != NewsResourceType.Unknown) { + stringResource(R.string.card_meta_data_text, formattedDate, resourceType.displayText) + } else { + formattedDate + }, + style = MaterialTheme.typography.labelSmall + ) } @Composable diff --git a/core/ui/src/main/res/values/strings.xml b/core/ui/src/main/res/values/strings.xml index 548ea63ef..6d7c98eb1 100644 --- a/core/ui/src/main/res/values/strings.xml +++ b/core/ui/src/main/res/values/strings.xml @@ -20,4 +20,5 @@ Back Open Resource Link + %1$s • %2$s