Add tests for qr-sync method
This commit is contained in:
parent
d5d659811d
commit
1a0319e0b4
@ -32,6 +32,7 @@ dependencies {
|
|||||||
testImplementation("org.springframework.boot:spring-boot-starter-test")
|
testImplementation("org.springframework.boot:spring-boot-starter-test")
|
||||||
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
|
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
|
||||||
testImplementation("org.springframework.security:spring-security-test")
|
testImplementation("org.springframework.security:spring-security-test")
|
||||||
|
testImplementation("org.testcontainers:postgresql")
|
||||||
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
|
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package ru.vyatsu.qr_access_api.repository
|
|||||||
import org.springframework.jdbc.core.JdbcTemplate
|
import org.springframework.jdbc.core.JdbcTemplate
|
||||||
import org.springframework.stereotype.Repository
|
import org.springframework.stereotype.Repository
|
||||||
import ru.vyatsu.models.QrCode
|
import ru.vyatsu.models.QrCode
|
||||||
import java.time.ZoneOffset
|
import java.time.ZoneId
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
private const val GET_ACTUAL_QRS_BY_UNIT_ID = """
|
private const val GET_ACTUAL_QRS_BY_UNIT_ID = """
|
||||||
@ -16,16 +16,16 @@ private const val GET_ACTUAL_QRS_BY_UNIT_ID = """
|
|||||||
@Repository
|
@Repository
|
||||||
class QrRepository(private val template: JdbcTemplate) {
|
class QrRepository(private val template: JdbcTemplate) {
|
||||||
|
|
||||||
fun getActualQrCodesByUnitId(unitId: UUID): List<QrCode> {
|
fun getActualQrCodesByUnitId(unitId: String): List<QrCode> {
|
||||||
val query = GET_ACTUAL_QRS_BY_UNIT_ID.trimIndent()
|
val query = GET_ACTUAL_QRS_BY_UNIT_ID.trimIndent()
|
||||||
return template.query({ conn ->
|
return template.query({ conn ->
|
||||||
val stmt = conn.prepareStatement(query)
|
val stmt = conn.prepareStatement(query)
|
||||||
stmt.setString(1, unitId.toString())
|
stmt.setString(1, unitId)
|
||||||
stmt
|
stmt
|
||||||
}, { rs, _ ->
|
}, { rs, _ ->
|
||||||
QrCode(
|
QrCode(
|
||||||
rs.getTimestamp("start_date_time").toLocalDateTime().atOffset(ZoneOffset.UTC),
|
rs.getTimestamp("start_date_time").toLocalDateTime().atZone(ZoneId.systemDefault()).toOffsetDateTime(),
|
||||||
rs.getTimestamp("end_date_time").toLocalDateTime().atOffset(ZoneOffset.UTC),
|
rs.getTimestamp("end_date_time").toLocalDateTime().atZone(ZoneId.systemDefault()).toOffsetDateTime(),
|
||||||
UUID.fromString(rs.getString("door_id")),
|
UUID.fromString(rs.getString("door_id")),
|
||||||
UUID.fromString(rs.getString("key_code"))
|
UUID.fromString(rs.getString("key_code"))
|
||||||
)
|
)
|
||||||
|
@ -3,13 +3,12 @@ package ru.vyatsu.qr_access_api.service
|
|||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import ru.vyatsu.models.QrCode
|
import ru.vyatsu.models.QrCode
|
||||||
import ru.vyatsu.qr_access_api.repository.QrRepository
|
import ru.vyatsu.qr_access_api.repository.QrRepository
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
class QrSyncService(val qrRepository: QrRepository) {
|
class QrSyncService(val qrRepository: QrRepository) {
|
||||||
fun getQrCodes(): List<QrCode> {
|
fun getQrCodes(): List<QrCode> {
|
||||||
// TODO: Тут логика с извлечением клайма из jwt в котором идентификатор клиента лежит
|
// TODO: Тут логика с извлечением клайма из jwt в котором идентификатор клиента лежит
|
||||||
val extractedUnitId = UUID.fromString("945c8621-9adc-4a49-bc56-10253d27c581")
|
val extractedUnitId = "945c8621-9adc-4a49-bc56-10253d27c581"
|
||||||
return qrRepository.getActualQrCodesByUnitId(extractedUnitId)
|
return qrRepository.getActualQrCodesByUnitId(extractedUnitId)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,5 +9,4 @@ class QrAccessApiApplicationTests {
|
|||||||
@Test
|
@Test
|
||||||
fun contextLoads() {
|
fun contextLoads() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
package ru.vyatsu.qr_access_api.database.utils
|
||||||
|
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
|
||||||
|
private const val INSERT_CLIENT_QUERY =
|
||||||
|
"""INSERT INTO oauth2_authorized_client(client_registration_id, principal_name, access_token_type, access_token_value, access_token_issued_at, access_token_expires_at, created_at)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?)"""
|
||||||
|
|
||||||
|
class InsertDatabaseHelper(private val template: JdbcTemplate) {
|
||||||
|
fun insertQr(
|
||||||
|
keyCode: String,
|
||||||
|
doorId: String,
|
||||||
|
startDateTime: OffsetDateTime,
|
||||||
|
endDateTime: OffsetDateTime
|
||||||
|
): Int {
|
||||||
|
return template.update("INSERT INTO qrs(key_code, door_id, start_date_time, end_date_time) VALUES (?, ?, ?, ?)") { ps ->
|
||||||
|
ps.setString(1, keyCode)
|
||||||
|
ps.setString(2, doorId)
|
||||||
|
ps.setObject(3, startDateTime)
|
||||||
|
ps.setObject(4, endDateTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun insertDoor(id: String, unitId: String, principalName: String = ""): Int {
|
||||||
|
return template.update("INSERT INTO doors(id, unit_id, principal_name) VALUES (?, ?, ?)") { ps ->
|
||||||
|
ps.setString(1, id)
|
||||||
|
ps.setString(2, unitId)
|
||||||
|
ps.setString(3, principalName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun insertClient(id: String, principalName: String = ""): Int {
|
||||||
|
return template.update(INSERT_CLIENT_QUERY) { ps ->
|
||||||
|
ps.setString(1, id)
|
||||||
|
ps.setString(2, principalName)
|
||||||
|
ps.setString(3, "Bearer")
|
||||||
|
ps.setString(4, "Tokenasfgerseawvg")
|
||||||
|
ps.setObject(5, LocalDateTime.now())
|
||||||
|
ps.setObject(6, LocalDateTime.now())
|
||||||
|
ps.setObject(7, LocalDateTime.now())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,137 @@
|
|||||||
|
package ru.vyatsu.qr_access_api.repository
|
||||||
|
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.jupiter.api.BeforeEach
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.springframework.transaction.annotation.Transactional
|
||||||
|
import ru.vyatsu.models.QrCode
|
||||||
|
import java.time.OffsetDateTime
|
||||||
|
import java.time.temporal.ChronoUnit
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
class QrRepositoryTest : RepositoryTest() {
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
fun setUp() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun checkThatQrCodesReturnedWhenGetActualQrCodesByUnitIdMappingCheck() {
|
||||||
|
val clientId = "9c0cc999-53b1-4ff1-b13c-5cd1514fec3a"
|
||||||
|
val doorId = "430141c2-858f-481e-93d9-2dffaf83ea2e"
|
||||||
|
val keyCode = "e1148f54-96aa-4355-b7f8-6eb0f549f5eb"
|
||||||
|
val startDateTime = OffsetDateTime.now().minusMinutes(30).truncatedTo(ChronoUnit.MICROS)
|
||||||
|
val endDateTime = OffsetDateTime.now().plusMinutes(30).truncatedTo(ChronoUnit.MICROS)
|
||||||
|
insertDatabaseHelper.insertClient(clientId)
|
||||||
|
insertDatabaseHelper.insertDoor(doorId, clientId)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
keyCode,
|
||||||
|
doorId,
|
||||||
|
startDateTime,
|
||||||
|
endDateTime
|
||||||
|
)
|
||||||
|
|
||||||
|
val codes = qrRepository.getActualQrCodesByUnitId(clientId)
|
||||||
|
|
||||||
|
assertThat(codes).containsOnly(
|
||||||
|
QrCode(
|
||||||
|
startDateTime,
|
||||||
|
endDateTime,
|
||||||
|
UUID.fromString(doorId),
|
||||||
|
UUID.fromString(keyCode)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun checkThatQrCodesReturnedWhenGetActualQrCodesByUnitIdForOneDoor() {
|
||||||
|
val clientId = "9c0cc999-53b1-4ff1-b13c-5cd1514fec3a"
|
||||||
|
val doorId = "430141c2-858f-481e-93d9-2dffaf83ea2e"
|
||||||
|
insertDatabaseHelper.insertClient(clientId)
|
||||||
|
insertDatabaseHelper.insertDoor(doorId, clientId)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"e1148f54-96aa-4355-b7f8-6eb0f549f5eb",
|
||||||
|
doorId,
|
||||||
|
OffsetDateTime.now().minusMinutes(20),
|
||||||
|
OffsetDateTime.now().plusMinutes(20)
|
||||||
|
)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"a9fc474b-1871-4257-b174-1b6e36d393a8",
|
||||||
|
doorId,
|
||||||
|
OffsetDateTime.now().minusMinutes(30),
|
||||||
|
OffsetDateTime.now().plusMinutes(30)
|
||||||
|
)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"b3bfe837-de12-4c07-b39a-4296266f2a8c",
|
||||||
|
doorId,
|
||||||
|
OffsetDateTime.now().minusMinutes(30),
|
||||||
|
OffsetDateTime.now().minusMinutes(20)
|
||||||
|
)
|
||||||
|
|
||||||
|
val codes = qrRepository.getActualQrCodesByUnitId(clientId)
|
||||||
|
|
||||||
|
assertThat(codes).hasSize(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun checkThatQrCodesReturnedWhenGetActualQrCodesByUnitIdForFewDoors() {
|
||||||
|
val clientId = "9c0cc999-53b1-4ff1-b13c-5cd1514fec3a"
|
||||||
|
insertDatabaseHelper.insertClient(clientId)
|
||||||
|
insertDatabaseHelper.insertDoor("430141c2-858f-481e-93d9-2dffaf83ea2e", clientId)
|
||||||
|
insertDatabaseHelper.insertDoor("259411de-6d90-46a4-92fb-4028a33ad48e", clientId)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"e1148f54-96aa-4355-b7f8-6eb0f549f5eb",
|
||||||
|
"430141c2-858f-481e-93d9-2dffaf83ea2e",
|
||||||
|
OffsetDateTime.now().minusMinutes(20),
|
||||||
|
OffsetDateTime.now().plusMinutes(20)
|
||||||
|
)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"a9fc474b-1871-4257-b174-1b6e36d393a8",
|
||||||
|
"259411de-6d90-46a4-92fb-4028a33ad48e",
|
||||||
|
OffsetDateTime.now().minusMinutes(30),
|
||||||
|
OffsetDateTime.now().plusMinutes(30)
|
||||||
|
)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"b3bfe837-de12-4c07-b39a-4296266f2a8c",
|
||||||
|
"430141c2-858f-481e-93d9-2dffaf83ea2e",
|
||||||
|
OffsetDateTime.now().minusMinutes(30),
|
||||||
|
OffsetDateTime.now().minusMinutes(20)
|
||||||
|
)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"90a3de92-33ed-4752-8eff-d425778e1381",
|
||||||
|
"259411de-6d90-46a4-92fb-4028a33ad48e",
|
||||||
|
OffsetDateTime.now().minusMinutes(30),
|
||||||
|
OffsetDateTime.now().minusMinutes(20)
|
||||||
|
)
|
||||||
|
|
||||||
|
val codes = qrRepository.getActualQrCodesByUnitId(clientId)
|
||||||
|
|
||||||
|
assertThat(codes).hasSize(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun checkThatQrCodesEmptyWhenGetActualQrCodesByUnitIdForOneDoor() {
|
||||||
|
val clientId = "9c0cc999-53b1-4ff1-b13c-5cd1514fec3a"
|
||||||
|
insertDatabaseHelper.insertClient(clientId)
|
||||||
|
insertDatabaseHelper.insertDoor("430141c2-858f-481e-93d9-2dffaf83ea2e", clientId)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"e1148f54-96aa-4355-b7f8-6eb0f549f5eb",
|
||||||
|
"430141c2-858f-481e-93d9-2dffaf83ea2e",
|
||||||
|
OffsetDateTime.now().minusMinutes(30),
|
||||||
|
OffsetDateTime.now().minusMinutes(20)
|
||||||
|
)
|
||||||
|
insertDatabaseHelper.insertQr(
|
||||||
|
"b3bfe837-de12-4c07-b39a-4296266f2a8c",
|
||||||
|
"430141c2-858f-481e-93d9-2dffaf83ea2e",
|
||||||
|
OffsetDateTime.now().minusMinutes(30),
|
||||||
|
OffsetDateTime.now().minusMinutes(20)
|
||||||
|
)
|
||||||
|
|
||||||
|
val codes = qrRepository.getActualQrCodesByUnitId(clientId)
|
||||||
|
|
||||||
|
assertThat(codes).hasSize(0)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package ru.vyatsu.qr_access_api.repository
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
|
import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest
|
||||||
|
import org.springframework.boot.test.context.TestConfiguration
|
||||||
|
import org.springframework.context.annotation.Bean
|
||||||
|
import org.springframework.context.annotation.Import
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate
|
||||||
|
import ru.vyatsu.qr_access_api.database.utils.InsertDatabaseHelper
|
||||||
|
|
||||||
|
@JdbcTest
|
||||||
|
@Import(RepositoryTest.Configuration::class)
|
||||||
|
class RepositoryTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
protected lateinit var insertDatabaseHelper: InsertDatabaseHelper
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
protected lateinit var qrRepository: QrRepository
|
||||||
|
|
||||||
|
@TestConfiguration
|
||||||
|
class Configuration {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private lateinit var template: JdbcTemplate
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
fun qrRepository(): QrRepository {
|
||||||
|
return QrRepository(template)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
fun dbUtils(): InsertDatabaseHelper {
|
||||||
|
return InsertDatabaseHelper(template)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1
src/test/resources/application.properties
Normal file
1
src/test/resources/application.properties
Normal file
@ -0,0 +1 @@
|
|||||||
|
spring.datasource.url=jdbc:tc:postgresql:17.2:///qr_access
|
Loading…
Reference in New Issue
Block a user