Files
vyatsu-schedule/app/src/test/java/agzam/vyatsu/TeachersPipelineMemoryTest.kt
T

76 lines
2.8 KiB
Kotlin

package agzam.vyatsu
import agzam.vyatsu.data.remote.TeachersParser
import agzam.vyatsu.domain.model.DateRange
import agzam.vyatsu.domain.model.Season
import java.io.InputStream
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
class TeachersPipelineMemoryTest {
private fun fixture(): InputStream =
checkNotNull(javaClass.getResourceAsStream("/teacher.html")) {
"Fixture teacher.html not found in src/test/resources"
}
@Test
fun parsesDepartmentsAndFaculties() {
val result = fixture().use(TeachersParser::parseStream)
assertTrue("expected >=4 departments", result.departments.size >= 4)
val ids = result.departments.map { it.departmentId }.toSet()
assertEquals(setOf("11111", "22222", "33333", "44444"), ids)
val names = result.departments.map { it.name }
assertTrue(
"nested tags must be stripped from kafPeriod names",
names.contains("Кафедра технологий и конструирования машин и аппаратов")
)
val avt = result.departments.first { it.departmentId == "11111" }
assertTrue("faculty must be mapped via shortname", avt.faculty.contains("ФАВТ"))
}
@Test
fun chunkBoundarySafe() {
val full = fixture().use(TeachersParser::parseStream)
val limited = limitReads(fixture(), 64).use(TeachersParser::parseStream)
assertEquals(full, limited)
}
@Test
fun seasonAndRanges() {
val result = fixture().use(TeachersParser::parseStream)
val hasAutumn = result.dateRanges.values.any { it[Season.AUTUMN]?.isNotEmpty() == true }
val hasSpring = result.dateRanges.values.any { it[Season.SPRING]?.isNotEmpty() == true }
assertTrue("AUTUMN season must be present", hasAutumn)
assertTrue("SPRING season must be present", hasSpring)
val autumn = result.dateRanges["11111"]?.get(Season.AUTUMN).orEmpty()
assertTrue(
"DateRange must be parsed from URL groups",
autumn.contains(DateRange("01092026", "13092026"))
)
assertTrue(
"second AUTUMN range must be present",
autumn.contains(DateRange("14092026", "27092026"))
)
val spring = result.dateRanges["44444"]?.get(Season.SPRING).orEmpty()
assertTrue(
"SPRING DateRange must be parsed from URL groups",
spring.contains(DateRange("02022026", "27022026"))
)
}
private fun limitReads(input: InputStream, maxBytes: Int): InputStream =
object : InputStream() {
override fun read(): Int = input.read()
override fun read(b: ByteArray, off: Int, len: Int): Int =
input.read(b, off, minOf(len, maxBytes))
}
}