From aa568cb6285b972badcbc77eaafef0ad289155cd Mon Sep 17 00:00:00 2001 From: vantablackTea Date: Wed, 16 Sep 2026 00:15:33 +0300 Subject: [PATCH] tests: added last unit tests, removed unused ui test dependencies --- app/build.gradle.kts | 4 -- .../vyatsu/data/remote/VyatsuUrlsTest.kt | 43 +++++++++++ .../agzam/vyatsu/domain/model/ScheduleTest.kt | 72 +++++++++++++++++++ gradle/libs.versions.toml | 4 -- 4 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 app/src/test/java/agzam/vyatsu/data/remote/VyatsuUrlsTest.kt create mode 100644 app/src/test/java/agzam/vyatsu/domain/model/ScheduleTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f167f71..7d1e2b7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -110,9 +110,5 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.androidx.compose.ui.test.junit4) debugImplementation(libs.androidx.compose.ui.tooling) - debugImplementation(libs.androidx.compose.ui.test.manifest) } diff --git a/app/src/test/java/agzam/vyatsu/data/remote/VyatsuUrlsTest.kt b/app/src/test/java/agzam/vyatsu/data/remote/VyatsuUrlsTest.kt new file mode 100644 index 0000000..f6a4392 --- /dev/null +++ b/app/src/test/java/agzam/vyatsu/data/remote/VyatsuUrlsTest.kt @@ -0,0 +1,43 @@ +package agzam.vyatsu.data.remote + +import agzam.vyatsu.domain.model.DateRange +import agzam.vyatsu.domain.model.Season +import org.junit.Assert.assertEquals +import org.junit.Test + +class VyatsuUrlsTest { + + private val autumnRange = DateRange("14092026", "27092026") + + @Test + fun groupPdfUrl_usesAutumnKey() { + assertEquals( + "https://www.vyatsu.ru/reports/schedule/Group/12345_1_14092026_27092026.pdf", + VyatsuUrls.groupPdfUrl("12345", Season.AUTUMN, autumnRange) + ) + } + + @Test + fun groupPdfUrl_usesSpringKey() { + assertEquals( + "https://www.vyatsu.ru/reports/schedule/Group/765432_2_09022027_22022027.pdf", + VyatsuUrls.groupPdfUrl("765432", Season.SPRING, DateRange("09022027", "22022027")) + ) + } + + @Test + fun season_apiKeysMatchUrlScheme() { + assertEquals("1", Season.AUTUMN.apiKey) + assertEquals("2", Season.SPRING.apiKey) + } + + @Test + fun generatedUrl_isRecognizedByGroupsParser() { + val url = VyatsuUrls.groupPdfUrl("12345", Season.AUTUMN, autumnRange) + val html = """x""" + + val parsed = GroupsParser.parseStream(html.byteInputStream(Charsets.UTF_8)) + + assertEquals(listOf(autumnRange), parsed.dateRanges["12345"]?.get(Season.AUTUMN)) + } +} \ No newline at end of file diff --git a/app/src/test/java/agzam/vyatsu/domain/model/ScheduleTest.kt b/app/src/test/java/agzam/vyatsu/domain/model/ScheduleTest.kt new file mode 100644 index 0000000..f071a14 --- /dev/null +++ b/app/src/test/java/agzam/vyatsu/domain/model/ScheduleTest.kt @@ -0,0 +1,72 @@ +package agzam.vyatsu.domain.model + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Test +import java.time.LocalDate + +class ScheduleTest { + + private val autumnPeriod = SchedulePeriod( + weekStart = LocalDate.of(2026, 9, 14), + weekEnd = LocalDate.of(2026, 9, 27), + season = Season.AUTUMN + ) + private val nextPeriod = SchedulePeriod( + weekStart = LocalDate.of(2026, 9, 28), + weekEnd = LocalDate.of(2026, 10, 11), + season = Season.AUTUMN + ) + private val dayInFirstPeriod = Day(LocalDate.of(2026, 9, 15), emptyList()) + private val dayInSecondPeriod = Day(LocalDate.of(2026, 9, 29), emptyList()) + private val dayOutsidePeriods = Day(LocalDate.of(2026, 10, 20), emptyList()) + + private val schedule = Schedule( + groupId = "12345", + periods = listOf(autumnPeriod, nextPeriod), + days = listOf(dayInFirstPeriod, dayInSecondPeriod, dayOutsidePeriods) + ) + + @Test + fun periodOf_matchesDateInsidePeriod() { + assertEquals(autumnPeriod, schedule.periodOf(LocalDate.of(2026, 9, 15))) + } + + @Test + fun periodOf_includesBothBounds() { + assertEquals(autumnPeriod, schedule.periodOf(autumnPeriod.weekStart)) + assertEquals(autumnPeriod, schedule.periodOf(autumnPeriod.weekEnd)) + assertEquals(nextPeriod, schedule.periodOf(nextPeriod.weekStart)) + assertEquals(nextPeriod, schedule.periodOf(nextPeriod.weekEnd)) + } + + @Test + fun periodOf_returnsNullForDateOutsideAllPeriods() { + assertNull(schedule.periodOf(LocalDate.of(2026, 10, 20))) + } + + @Test + fun daysOf_returnsOnlyDaysWithinPeriod() { + assertEquals(listOf(dayInFirstPeriod), schedule.daysOf(autumnPeriod)) + assertEquals(listOf(dayInSecondPeriod), schedule.daysOf(nextPeriod)) + } + + @Test + fun daysOf_returnsEmptyWhenPeriodHasNoDays() { + val emptyPeriod = SchedulePeriod( + weekStart = LocalDate.of(2027, 1, 4), + weekEnd = LocalDate.of(2027, 1, 17), + season = Season.SPRING + ) + + assertEquals(emptyList(), schedule.daysOf(emptyPeriod)) + } + + @Test + fun daysOf_neverReturnsDayOutsideEveryPeriod() { + val collected = schedule.periods.flatMap { schedule.daysOf(it) } + + assertFalse(collected.contains(dayOutsidePeriods)) + } +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9732167..ecd3a11 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,6 @@ agp = "9.1.1" coreKtx = "1.10.1" junit = "4.13.2" junitVersion = "1.1.5" -espressoCore = "3.5.1" lifecycleRuntimeKtx = "2.6.1" activityCompose = "1.8.0" kotlin = "2.2.10" @@ -22,7 +21,6 @@ monitor = "1.8.0" androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } -androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } @@ -30,8 +28,6 @@ androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } -androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } -androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-compose-material-icons-core = { group = "androidx.compose.material", name = "material-icons-core" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }