diff --git a/app/src/test/java/io/github/wulkanowy/data/db/dao/StudentDaoTest.kt b/app/src/test/java/io/github/wulkanowy/data/db/dao/StudentDaoTest.kt new file mode 100644 index 00000000..1a059070 --- /dev/null +++ b/app/src/test/java/io/github/wulkanowy/data/db/dao/StudentDaoTest.kt @@ -0,0 +1,103 @@ +package io.github.wulkanowy.data.db.dao + +import android.content.Context +import android.os.Build +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import dagger.hilt.android.testing.HiltTestApplication +import io.github.wulkanowy.data.db.AppDatabase +import io.github.wulkanowy.getSemesterEntity +import io.github.wulkanowy.getStudentEntity +import kotlinx.coroutines.test.runTest +import org.junit.After +import org.junit.Before +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import kotlin.test.Test +import kotlin.test.assertEquals + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [Build.VERSION_CODES.O_MR1], application = HiltTestApplication::class) +class StudentDaoTest { + + private lateinit var studentDao: StudentDao + private lateinit var semesterDao: SemesterDao + private lateinit var db: AppDatabase + + @Before + fun createDb() { + val context: Context = ApplicationProvider.getApplicationContext() + db = Room.inMemoryDatabaseBuilder( + context = context, + klass = AppDatabase::class.java + ).build() + studentDao = db.studentDao + semesterDao = db.semesterDao + } + + @Test + fun `get students associated with correct semester`() = runTest { + val notEduOneStudent = getStudentEntity() + .copy( + isEduOne = false, + classId = 42, + studentId = 100 + ) + .apply { id = 1 } + val eduOneStudent = getStudentEntity() + .copy( + isEduOne = true, + classId = 0, + studentId = 100 + ) + .apply { id = 2 } + + val semesterAssociatedWithNotEduOneStudent = getSemesterEntity() + .copy( + studentId = notEduOneStudent.studentId, + classId = notEduOneStudent.classId, + diaryId = 1 // make semester unique + ) + .apply { id = 0 } + val semesterAssociatedWithEduOneStudent = getSemesterEntity() + .copy( + studentId = eduOneStudent.studentId, + classId = eduOneStudent.classId, + diaryId = 2 // make semester unique + ) + .apply { id = 0 } + + studentDao.insertAll(listOf(notEduOneStudent, eduOneStudent)) + semesterDao.insertAll( + listOf( + semesterAssociatedWithNotEduOneStudent, + semesterAssociatedWithEduOneStudent + ) + ) + + val studentsWithSemesters = studentDao.loadStudentsWithSemesters() + val notEduOneSemestersResult = studentsWithSemesters.entries + .find { (student, _) -> student.id == notEduOneStudent.id } + ?.value + val eduOneSemestersResult = studentsWithSemesters.entries + .find { (student, _) -> student.id == eduOneStudent.id } + ?.value + + assertEquals(2, studentsWithSemesters.size) + + assertEquals(1, notEduOneSemestersResult?.size) + assertEquals(1, eduOneSemestersResult?.size) + + assertEquals(semesterAssociatedWithEduOneStudent, eduOneSemestersResult?.firstOrNull()) + assertEquals( + semesterAssociatedWithNotEduOneStudent, + notEduOneSemestersResult?.firstOrNull() + ) + } + + @After + fun closeDb() { + db.close() + } +}