Minor fixes to sync protocol

This commit is contained in:
2020-11-28 11:32:28 -06:00
parent 1787c0e74e
commit 9c0951ae58
13 changed files with 135 additions and 78 deletions

View File

@@ -19,33 +19,34 @@
package org.isoron.uhabits.sync
import kotlinx.coroutines.*
import org.junit.Test
import kotlin.test.*
class MemorySyncServerTest {
private val server = MemorySyncServer()
private val key = server.register()
private val key = runBlocking { server.register() }
@Test
fun testUsage() {
fun testUsage(): Unit = runBlocking {
val data0 = SyncData(0, "")
assertEquals(server.get(key), data0)
assertEquals(server.getData(key), data0)
val data1 = SyncData(1, "Hello world")
server.put(key, data1)
assertEquals(server.get(key), data1)
assertEquals(server.getData(key), data1)
val data2 = SyncData(2, "Hello new world")
server.put(key, data2)
assertEquals(server.get(key), data2)
assertEquals(server.getData(key), data2)
assertFailsWith<EditConflictException> {
server.put(key, data2)
}
assertFailsWith<KeyNotFoundException> {
server.get("INVALID")
server.getData("INVALID")
}
assertFailsWith<KeyNotFoundException> {

View File

@@ -21,6 +21,7 @@ package org.isoron.uhabits.sync.app
import io.ktor.http.*
import io.ktor.server.testing.*
import kotlinx.coroutines.*
import org.isoron.uhabits.sync.*
import org.junit.Test
import org.mockito.*
@@ -29,7 +30,7 @@ import kotlin.test.*
class RegistrationModuleTest : BaseApplicationTest() {
@Test
fun `when register succeeds should return generated key`() {
fun `when register succeeds should return generated key`():Unit = runBlocking {
`when`(server.register()).thenReturn("ABCDEF")
withTestApplication(app()) {
val call = handleRequest(HttpMethod.Post, "/register")
@@ -39,8 +40,8 @@ class RegistrationModuleTest : BaseApplicationTest() {
}
@Test
fun `when registration is unavailable should return 503`() {
`when`(server.register()).thenThrow(RegistrationUnavailableException())
fun `when registration is unavailable should return 503`():Unit = runBlocking {
`when`(server.register()).thenThrow(ServiceUnavailable())
withTestApplication(app()) {
val call = handleRequest(HttpMethod.Post, "/register")
assertEquals(HttpStatusCode.ServiceUnavailable, call.response.status())

View File

@@ -21,6 +21,7 @@ package org.isoron.uhabits.sync.app
import io.ktor.http.*
import io.ktor.server.testing.*
import kotlinx.coroutines.*
import org.isoron.uhabits.sync.*
import org.junit.Test
import org.mockito.Mockito.*
@@ -31,8 +32,8 @@ class StorageModuleTest : BaseApplicationTest() {
private val data2 = SyncData(2, "Hello new world")
@Test
fun `when get succeeds should return data`() {
`when`(server.get("k1")).thenReturn(data1)
fun `when get succeeds should return data`(): Unit = runBlocking {
`when`(server.getData("k1")).thenReturn(data1)
withTestApplication(app()) {
handleGet("/db/k1").apply {
assertEquals(HttpStatusCode.OK, response.status())
@@ -42,19 +43,19 @@ class StorageModuleTest : BaseApplicationTest() {
}
@Test
fun `when get version succeeds should return version`() {
`when`(server.get("k1")).thenReturn(data1)
fun `when get version succeeds should return version`(): Unit = runBlocking {
`when`(server.getDataVersion("k1")).thenReturn(30)
withTestApplication(app()) {
handleGet("/db/k1/version").apply {
assertEquals(HttpStatusCode.OK, response.status())
assertEquals("1", response.content)
assertEquals(GetDataVersionResponse(30).toJson(), response.content)
}
}
}
@Test
fun `when get with invalid key should return 404`() {
`when`(server.get("k1")).thenThrow(KeyNotFoundException())
fun `when get with invalid key should return 404`(): Unit = runBlocking {
`when`(server.getData("k1")).thenThrow(KeyNotFoundException())
withTestApplication(app()) {
handleGet("/db/k1").apply {
assertEquals(HttpStatusCode.NotFound, response.status())
@@ -64,17 +65,19 @@ class StorageModuleTest : BaseApplicationTest() {
@Test
fun `when put succeeds should return OK`() {
fun `when put succeeds should return OK`(): Unit = runBlocking {
withTestApplication(app()) {
handlePut("/db/k1", data1).apply {
assertEquals(HttpStatusCode.OK, response.status())
verify(server).put("k1", data1)
runBlocking {
assertEquals(HttpStatusCode.OK, response.status())
verify(server).put("k1", data1)
}
}
}
}
@Test
fun `when put with invalid key should return 404`() {
fun `when put with invalid key should return 404`(): Unit = runBlocking {
`when`(server.put("k1", data1)).thenThrow(KeyNotFoundException())
withTestApplication(app()) {
handlePut("/db/k1", data1).apply {
@@ -84,13 +87,12 @@ class StorageModuleTest : BaseApplicationTest() {
}
@Test
fun `when put with invalid version should return 409 and current data`() {
fun `when put with invalid version should return 409 and current data`(): Unit = runBlocking {
`when`(server.put("k1", data1)).thenThrow(EditConflictException())
`when`(server.get("k1")).thenReturn(data2)
`when`(server.getData("k1")).thenReturn(data2)
withTestApplication(app()) {
handlePut("/db/k1", data1).apply {
assertEquals(HttpStatusCode.Conflict, response.status())
assertEquals(data2.toJson(), response.content)
}
}
}