forked from agzam/vyatsu-schedule
76 lines
2.8 KiB
Kotlin
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))
|
|
}
|
|
} |