Merge branch 'release/1.7.4'

This commit is contained in:
Mikołaj Pich 2022-09-01 17:57:24 +02:00
commit 1033be4503
7 changed files with 175 additions and 13 deletions

View File

@ -23,8 +23,8 @@ android {
testApplicationId "io.github.tests.wulkanowy" testApplicationId "io.github.tests.wulkanowy"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 32 targetSdkVersion 32
versionCode 112 versionCode 113
versionName "1.7.3" versionName "1.7.4"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resValue "string", "app_name", "Wulkanowy" resValue "string", "app_name", "Wulkanowy"
@ -186,7 +186,7 @@ ext {
} }
dependencies { dependencies {
implementation "io.github.wulkanowy:sdk:1.7.3" implementation "io.github.wulkanowy:sdk:1.7.4"
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.8' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.8'

View File

@ -47,7 +47,37 @@ class MailboxRepository @Inject constructor(
} else mailbox } else mailbox
} }
private fun List<Mailbox>.filterByStudent(student: Student): Mailbox? = find { private fun List<Mailbox>.filterByStudent(student: Student): Mailbox? {
it.studentName.trim() == student.studentName.trim() val normalizedStudentName = student.studentName.normalizeStudentName()
return find {
it.studentName.normalizeStudentName() == normalizedStudentName
} ?: singleOrNull {
it.studentName.getFirstAndLastPart() == normalizedStudentName.getFirstAndLastPart()
} ?: singleOrNull {
it.studentName.getUnauthorizedVersion() == normalizedStudentName
}
}
private fun String.normalizeStudentName(): String {
return trim().split(" ").joinToString(" ") { part ->
part.lowercase().replaceFirstChar { it.uppercase() }
}
}
private fun String.getFirstAndLastPart(): String {
val parts = normalizeStudentName().split(" ")
val endParts = parts.filterIndexed { i, _ ->
i == 0 || parts.size == i - 1
}
return endParts.joinToString(" ")
}
private fun String.getUnauthorizedVersion(): String {
return normalizeStudentName().split(" ")
.joinToString(" ") {
it.first() + "*".repeat(it.length - 1)
}
} }
} }

View File

@ -3,7 +3,6 @@ package io.github.wulkanowy.ui.modules.grade.details
import io.github.wulkanowy.data.* import io.github.wulkanowy.data.*
import io.github.wulkanowy.data.db.entities.Grade import io.github.wulkanowy.data.db.entities.Grade
import io.github.wulkanowy.data.enums.GradeExpandMode import io.github.wulkanowy.data.enums.GradeExpandMode
import io.github.wulkanowy.data.enums.GradeSortingMode
import io.github.wulkanowy.data.enums.GradeSortingMode.* import io.github.wulkanowy.data.enums.GradeSortingMode.*
import io.github.wulkanowy.data.repositories.GradeRepository import io.github.wulkanowy.data.repositories.GradeRepository
import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.PreferencesRepository
@ -132,16 +131,17 @@ class GradeDetailsPresenter @Inject constructor(
} }
.logResourceStatus("load grade details") .logResourceStatus("load grade details")
.onResourceData { .onResourceData {
val gradeItems = createGradeItems(it)
view?.run { view?.run {
enableSwipe(true) enableSwipe(true)
showProgress(false) showProgress(false)
showErrorView(false) showErrorView(false)
showContent(it.isNotEmpty()) showContent(gradeItems.isNotEmpty())
showEmpty(it.isEmpty()) showEmpty(gradeItems.isEmpty())
updateNewGradesAmount(it) updateNewGradesAmount(it)
updateMarkAsDoneButton() updateMarkAsDoneButton()
updateData( updateData(
data = createGradeItems(it), data = gradeItems,
expandMode = preferencesRepository.gradeExpandMode, expandMode = preferencesRepository.gradeExpandMode,
preferencesRepository.gradeColorTheme preferencesRepository.gradeColorTheme
) )

View File

@ -15,5 +15,8 @@ fun List<Semester>.getCurrentOrLast(): Semester {
// when there is more than one current semester - find one with higher id // when there is more than one current semester - find one with higher id
singleOrNull { semester -> semester.semesterId == maxByOrNull { it.semesterId }?.semesterId }?.let { return it } singleOrNull { semester -> semester.semesterId == maxByOrNull { it.semesterId }?.semesterId }?.let { return it }
// when there is no active kindergarten semester - get one from last year
singleOrNull { semester -> semester.schoolYear == maxByOrNull { it.schoolYear }?.schoolYear }?.let { return it }
throw IllegalArgumentException("Duplicated last semester! Semesters: ${joinToString(separator = "\n")}") throw IllegalArgumentException("Duplicated last semester! Semesters: ${joinToString(separator = "\n")}")
} }

View File

@ -1,5 +1,6 @@
Wersja 1.7.3 Wersja 1.7.4
- naprawiliśmy kilka błędów w obsłudze nowego modułu wiadomości - naprawiliśmy kilka błędów w obsłudze nowego modułu wiadomości
- naprawiliśmy wyświetlanie napisu "Brak ocen", jesli uczeń nie zdobył w danym semestrze jeszcze żadnych ocen
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases

View File

@ -77,20 +77,76 @@ class MailboxRepositoryTest {
assertEquals(expectedMailbox, selectedMailbox) assertEquals(expectedMailbox, selectedMailbox)
} }
@Test(expected = IllegalArgumentException::class) @Test
fun `get mailbox for student with strange name`() = runTest { fun `get mailbox for unique non-authorized student`() = runTest {
val student = getStudentEntity( val student = getStudentEntity(
userName = "Stanisław Kowalski", userName = "Stanisław Kowalski",
studentName = "J**** K*****", studentName = "J** K*******",
) )
val expectedMailbox = getMailboxEntity("Jan Kowalski") val expectedMailbox = getMailboxEntity("Jan Kowalski")
coEvery { mailboxDao.loadAll(any()) } returns listOf( coEvery { mailboxDao.loadAll(any()) } returns listOf(
expectedMailbox, expectedMailbox,
) )
assertEquals(expectedMailbox, systemUnderTest.getMailbox(student))
}
@Test(expected = IllegalArgumentException::class)
fun `get mailbox for not-unique non-authorized student`() = runTest {
val student = getStudentEntity(
userName = "Stanisław Kowalski",
studentName = "J** K*******",
)
coEvery { mailboxDao.loadAll(any()) } returns listOf(
getMailboxEntity("Jan Kowalski"),
getMailboxEntity("Jan Kurowski"),
)
systemUnderTest.getMailbox(student) systemUnderTest.getMailbox(student)
} }
@Test
fun `get mailbox for student with uppercase name`() = runTest {
val student = getStudentEntity(
userName = "Mochoń Julia",
studentName = "KLAUDIA MOCHOŃ",
)
val expectedMailbox = getMailboxEntity("Klaudia Mochoń")
coEvery { mailboxDao.loadAll(any()) } returns listOf(
expectedMailbox,
)
assertEquals(expectedMailbox, systemUnderTest.getMailbox(student))
}
@Test
fun `get mailbox for student with second name`() = runTest {
val student = getStudentEntity(
userName = "Fistaszek Karolina",
studentName = "Julia Fistaszek",
)
val expectedMailbox = getMailboxEntity("Julia Maria Fistaszek")
coEvery { mailboxDao.loadAll(any()) } returns listOf(
expectedMailbox,
)
assertEquals(expectedMailbox, systemUnderTest.getMailbox(student))
}
@Test
fun `get mailbox for student with second name and uppercase`() = runTest {
val student = getStudentEntity(
userName = "BEDNAREK KAMIL",
studentName = "ALEKSANDRA BEDNAREK",
)
val expectedMailbox = getMailboxEntity("Aleksandra Anna Bednarek")
coEvery { mailboxDao.loadAll(any()) } returns listOf(
expectedMailbox,
)
assertEquals(expectedMailbox, systemUnderTest.getMailbox(student))
}
private fun getMailboxEntity( private fun getMailboxEntity(
studentName: String, studentName: String,
) = Mailbox( ) = Mailbox(

View File

@ -0,0 +1,72 @@
package io.github.wulkanowy.utils
import io.github.wulkanowy.data.db.entities.Semester
import io.github.wulkanowy.getSemesterEntity
import org.junit.Test
import java.time.LocalDate
import kotlin.test.assertEquals
class SemesterExtensionKtTest {
@Test(expected = IllegalArgumentException::class)
fun `get current semester when current is doubled`() {
val semesters = listOf(
getSemesterEntity(1, 1, LocalDate.now(), LocalDate.now()),
getSemesterEntity(1, 1, LocalDate.now(), LocalDate.now())
)
semesters.getCurrentOrLast()
}
@Test(expected = RuntimeException::class)
fun `get current semester when there is empty list`() {
val semesters = listOf<Semester>()
semesters.getCurrentOrLast()
}
@Test
fun `get current kindergarten semester when there is no any current`() {
val semesters = listOf(
createSemesterEntity(
kindergartenDiaryId = 281,
schoolYear = 2020,
semesterId = 0,
start = LocalDate.of(2020, 9, 1),
end = LocalDate.of(2021, 8, 31),
),
createSemesterEntity(
kindergartenDiaryId = 342,
schoolYear = 2021,
semesterId = 0,
start = LocalDate.of(2021, 9, 1),
end = LocalDate.of(2022, 8, 31),
),
)
val res = semesters.getCurrentOrLast()
assertEquals(2021, res.schoolYear)
}
private fun createSemesterEntity(
diaryId: Int = 0,
kindergartenDiaryId: Int = 0,
semesterId: Int = 0,
schoolYear: Int = 0,
start: LocalDate = LocalDate.now(),
end: LocalDate = LocalDate.now().plusMonths(6),
) = Semester(
studentId = 1,
diaryId = diaryId,
kindergartenDiaryId = kindergartenDiaryId,
semesterId = semesterId,
diaryName = "$semesterId",
schoolYear = schoolYear,
classId = 0,
semesterName = semesterId,
unitId = 1,
start = start,
end = end
)
}