add DeviceController

This commit is contained in:
2024-11-22 15:26:58 +01:00
parent 9b5f2e8d17
commit 3efaaf390b
4 changed files with 106 additions and 4 deletions

7
http/device.http Normal file
View File

@@ -0,0 +1,7 @@
### register device for a type
POST {{hostname}}/device
Content-Type: application/json
{
"type": "00000000-0000-0000-0000-000000000000"
}

View File

@@ -0,0 +1,24 @@
package ltd.hlaeja.controller
import ltd.hlaeja.library.deviceRegistry.Device
import ltd.hlaeja.service.DeviceService
import ltd.hlaeja.service.JwtService
import org.springframework.http.HttpStatus.EXPECTATION_FAILED
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.server.ResponseStatusException
@RestController
class DeviceController(
private val deviceService: DeviceService,
private val jwtService: JwtService,
) {
@PostMapping("/device")
suspend fun addDevice(
@RequestBody request: Device.Request,
): Device.Identity = deviceService.addDevice(request.type)
.let { jwtService.makeIdentity(it.id ?: throw ResponseStatusException(EXPECTATION_FAILED)) }
.let { Device.Identity(it) }
}

View File

@@ -0,0 +1,70 @@
package ltd.hlaeja.controller
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.mockk
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.ZonedDateTime
import java.util.UUID
import kotlinx.coroutines.test.runTest
import ltd.hlaeja.entity.DeviceEntity
import ltd.hlaeja.library.deviceRegistry.Device
import ltd.hlaeja.service.DeviceService
import ltd.hlaeja.service.JwtService
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.springframework.web.server.ResponseStatusException
class DeviceControllerTest {
companion object {
const val PAYLOAD: String = "head.body.signature"
val uuid = UUID.fromString("00000000-0000-0000-0000-000000000000")
val timestamp = ZonedDateTime.of(LocalDateTime.of(2000, 1, 1, 0, 0, 0, 1), ZoneId.of("UTC"))
}
val deviceService: DeviceService = mockk()
val jwtService: JwtService = mockk()
lateinit var controller: DeviceController
@BeforeEach
fun setUp() {
controller = DeviceController(deviceService, jwtService)
}
@Test
fun `add device - success`() = runTest {
// given
val request = Device.Request(uuid)
coEvery { deviceService.addDevice(any()) } returns DeviceEntity(uuid, timestamp, uuid)
coEvery { jwtService.makeIdentity(any()) } returns PAYLOAD
// when
val response = controller.addDevice(request)
// then
coVerify(exactly = 1) { deviceService.addDevice(any()) }
coVerify(exactly = 1) { jwtService.makeIdentity(any()) }
assertThat(response.identity).isEqualTo(PAYLOAD)
}
@Test
fun `add device - device service fail`() = runTest {
// given
val request = Device.Request(uuid)
coEvery { deviceService.addDevice(any()) } returns DeviceEntity(null, timestamp, uuid)
// when exception
val exception = assertThrows<ResponseStatusException> {
controller.addDevice(request)
}
// then
assertThat(exception.message).isEqualTo("417 EXPECTATION_FAILED")
}
}

View File

@@ -13,6 +13,7 @@ import java.util.UUID
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import ltd.hlaeja.entity.DeviceEntity import ltd.hlaeja.entity.DeviceEntity
import ltd.hlaeja.repository.DeviceRepository import ltd.hlaeja.repository.DeviceRepository
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
@@ -20,7 +21,6 @@ import org.junit.jupiter.api.Test
class DeviceServiceTest { class DeviceServiceTest {
companion object { companion object {
val timestamp = ZonedDateTime.ofInstant(Instant.parse("2000-01-01T00:00:00.001Z"), ZoneId.of("UTC")) val timestamp = ZonedDateTime.ofInstant(Instant.parse("2000-01-01T00:00:00.001Z"), ZoneId.of("UTC"))
val device = UUID.fromString("00000000-0000-0000-0000-000000000001") val device = UUID.fromString("00000000-0000-0000-0000-000000000001")
val type = UUID.fromString("00000000-0000-0000-0000-000000000002") val type = UUID.fromString("00000000-0000-0000-0000-000000000002")
} }
@@ -53,8 +53,9 @@ class DeviceServiceTest {
// then // then
coVerify(exactly = 1) { repository.save(any()) } coVerify(exactly = 1) { repository.save(any()) }
kotlin.test.assertEquals(device, result.id)
kotlin.test.assertEquals("2000-01-01T00:00:00.001Z[UTC]", result.timestamp.toString()) assertThat(result.id).isEqualTo(device)
kotlin.test.assertEquals(type, result.type) assertThat(result.timestamp.toString()).isEqualTo("2000-01-01T00:00:00.001Z[UTC]")
assertThat(result.type).isEqualTo(type)
} }
} }