Skip to content

Commit

Permalink
test: JdslSubjectQueryRepository 테스트 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
jxmen committed Aug 8, 2024
1 parent 03c6a47 commit 42a3b4b
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,33 +14,33 @@ class JdslSubjectQueryRepository(
private val entityManager: EntityManager,
) : SubjectQueryRepository {
private val context = JpqlRenderContext()
private val renderer = JpqlRenderer()

override fun findByCategory(category: SubjectCategory): List<Subject> {
val query =
jpql {
selectNew<Subject>(
path(Subject::id),
path(Subject::title),
path(Subject::question),
path(Subject::category),
).from(
entity(Subject::class),
).where(
path(Subject::category).eq(category),
)
}
val rendered =
renderer.render(
jpql {
selectNew<Subject>(
path(Subject::id),
path(Subject::title),
path(Subject::question),
path(Subject::category),
).from(
entity(Subject::class),
).where(
path(Subject::category).eq(category),
)
},
context,
)

val renderer = JpqlRenderer()
val rendered = renderer.render(query, context)

val apply =
entityManager.createQuery(rendered.query, Subject::class.java).apply {
return entityManager
.createQuery(rendered.query, Subject::class.java)
.apply {
rendered.params.forEach { (name, value) ->
setParameter(name, value)
}
}

return apply.resultList
}.resultList
}

override fun findByIdOrNull(id: Long): Subject? = entityManager.find(Subject::class.java, id)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package dev.jxmen.cs.ai.interviewer.adapter.output

import dev.jxmen.cs.ai.interviewer.adapter.output.persistence.JdslSubjectQueryRepository
import dev.jxmen.cs.ai.interviewer.domain.subject.Subject
import dev.jxmen.cs.ai.interviewer.domain.subject.SubjectCategory
import dev.jxmen.cs.ai.interviewer.domain.subject.SubjectCommandRepository
import dev.jxmen.cs.ai.interviewer.domain.subject.SubjectQueryRepository
import io.kotest.matchers.shouldBe
import jakarta.persistence.EntityManager
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.test.context.TestConstructor

@DataJpaTest
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
class JdslSubjectQueryRepositoryTest(
private val entityManager: EntityManager,
private val subjectCommandRepository: SubjectCommandRepository,
) {
private var savedSubjectId: Long = 0

private lateinit var subjectQueryRepository: SubjectQueryRepository

@BeforeEach
fun setUp() {
subjectQueryRepository = JdslSubjectQueryRepository(entityManager)
savedSubjectId =
subjectCommandRepository
.save(
Subject(
title = "test",
question = "test",
category = SubjectCategory.OS,
),
).id
}

@Test
fun findByCategory() {
val findByCategory = subjectQueryRepository.findByCategory(SubjectCategory.OS)

findByCategory.size shouldBe 1
findByCategory[0].id shouldBe savedSubjectId
findByCategory[0].title shouldBe "test"
findByCategory[0].question shouldBe "test"
findByCategory[0].category shouldBe SubjectCategory.OS
}

@Test
fun findByCategoryNotExist() {
listOf(SubjectCategory.NETWORK, SubjectCategory.DSA, SubjectCategory.DATABASE).forEach {
val findByCategory = subjectQueryRepository.findByCategory(SubjectCategory.NETWORK)

findByCategory.size shouldBe 0
}
}

@Test
fun findById() {
subjectQueryRepository.findByIdOrNull(savedSubjectId)?.let {
it.id shouldBe savedSubjectId
it.title shouldBe "test"
it.category shouldBe SubjectCategory.OS
it.question shouldBe "test"
} ?: throw Exception("Subject not found")
}

@Test
fun findByIdNotExist() {
subjectQueryRepository.findByIdOrNull(-1) shouldBe null
subjectQueryRepository.findByIdOrNull(99999) shouldBe null
}
}

0 comments on commit 42a3b4b

Please sign in to comment.