Replace khttp test library with a fork that is available on maven central

This commit is contained in:
Torsten Grote
2022-10-31 13:53:06 -03:00
parent 02f2fdd4a1
commit 904355b0a6
4 changed files with 100 additions and 57 deletions

View File

@@ -2,7 +2,11 @@ package org.briarproject.briar.headless
import io.javalin.Javalin
import io.javalin.core.util.Header.AUTHORIZATION
import khttp.responses.Response
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import org.briarproject.bramble.BrambleCoreEagerSingletons
import org.briarproject.bramble.api.crypto.CryptoComponent
import org.briarproject.briar.BriarCoreEagerSingletons
@@ -22,6 +26,7 @@ abstract class IntegrationTest {
private val dataDir = File("tmp")
private val client: OkHttpClient = OkHttpClient()
protected lateinit var api: Javalin
protected lateinit var crypto: CryptoComponent
protected lateinit var testDataCreator: TestDataCreator
@@ -48,34 +53,55 @@ abstract class IntegrationTest {
dataDir.deleteRecursively()
}
protected fun get(url: String): Response {
return khttp.get(url, getAuthTokenHeader(token))
protected fun get(url: String, authToken: String = token): Response {
val request: Request = Request.Builder()
.url(url)
.header(AUTHORIZATION, "Bearer $authToken")
.build()
return client.newCall(request).execute()
}
protected fun getWithWrongToken(url: String): Response {
return khttp.get(url, getAuthTokenHeader("wrongToken"))
return get(url, "wrongToken")
}
protected fun post(url: String, data: String): Response {
return khttp.post(url, getAuthTokenHeader(token), data = data)
protected fun post(url: String, data: String, authToken: String = token): Response {
val json = "application/json; charset=utf-8".toMediaType()
val body = data.toRequestBody(json)
val request: Request = Request.Builder()
.url(url)
.header(AUTHORIZATION, "Bearer $authToken")
.post(body)
.build()
return client.newCall(request).execute()
}
protected fun postWithWrongToken(url: String): Response {
return khttp.post(url, getAuthTokenHeader("wrongToken"), data = "")
return post(url, data = "", authToken = "wrongToken")
}
protected fun delete(url: String): Response {
return khttp.delete(url, getAuthTokenHeader(token))
protected fun delete(url: String, authToken: String = token): Response {
val request: Request = Request.Builder()
.url(url)
.header(AUTHORIZATION, "Bearer $authToken")
.delete()
.build()
return client.newCall(request).execute()
}
protected fun delete(url: String, data: String): Response {
return khttp.delete(url, getAuthTokenHeader(token), data = data)
protected fun delete(url: String, data: String, authToken: String = token): Response {
val json = "application/json; charset=utf-8".toMediaType()
val body = data.toRequestBody(json)
val request: Request = Request.Builder()
.url(url)
.header(AUTHORIZATION, "Bearer $authToken")
.delete(body)
.build()
return client.newCall(request).execute()
}
protected fun deleteWithWrongToken(url: String): Response {
return khttp.delete(url, getAuthTokenHeader("wrongToken"))
return delete(url, authToken = "wrongToken")
}
private fun getAuthTokenHeader(token: String) = mapOf(Pair(AUTHORIZATION, "Bearer $token"))
}

View File

@@ -1,26 +1,39 @@
package org.briarproject.briar.headless.contact
import okhttp3.Response
import org.briarproject.bramble.api.contact.HandshakeLinkConstants.BASE32_LINK_BYTES
import org.briarproject.briar.headless.IntegrationTest
import org.briarproject.briar.headless.url
import org.briarproject.briar.test.BriarTestUtils.getRealHandshakeLink
import org.json.JSONArray
import org.json.JSONObject
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
class ContactControllerIntegrationTest : IntegrationTest() {
/**
* Can only be called once.
*/
private val Response.jsonArray: JSONArray get() = JSONArray(body?.use { it.string() })
/**
* Can only be called once.
*/
private val Response.jsonObject: JSONObject get() = JSONObject(body?.use { it.string() })
@Test
fun `returning list of contacts needs authentication token`() {
val response = getWithWrongToken("$url/contacts")
assertEquals(401, response.statusCode)
assertEquals(401, response.code)
}
@Test
fun `returns list of contacts`() {
// retrieve empty list of contacts
var response = get("$url/contacts")
assertEquals(200, response.statusCode)
assertEquals(200, response.code)
assertEquals(0, response.jsonArray.length())
// add one test contact
@@ -29,9 +42,10 @@ class ContactControllerIntegrationTest : IntegrationTest() {
// retrieve list with one test contact
response = get("$url/contacts")
assertEquals(200, response.statusCode)
assertEquals(1, response.jsonArray.length())
val contact = response.jsonArray.getJSONObject(0)
assertEquals(200, response.code)
val jsonArray = response.jsonArray
assertEquals(1, jsonArray.length())
val contact = jsonArray.getJSONObject(0)
val author = contact.getJSONObject("author")
assertEquals(testContactName, author.getString("name"))
}
@@ -39,7 +53,7 @@ class ContactControllerIntegrationTest : IntegrationTest() {
@Test
fun `returns own handshake link`() {
val response = get("$url/contacts/add/link")
assertEquals(200, response.statusCode)
assertEquals(200, response.code)
val link = response.jsonObject.getString("link")
assertTrue(link.startsWith("briar://"))
assertEquals(BASE32_LINK_BYTES + 8, link.length)
@@ -48,14 +62,14 @@ class ContactControllerIntegrationTest : IntegrationTest() {
@Test
fun `returning own handshake link needs authentication token`() {
val response = getWithWrongToken("$url/contacts/add/link")
assertEquals(401, response.statusCode)
assertEquals(401, response.code)
}
@Test
fun `returns list of pending contacts`() {
// retrieve empty list of pending contacts
var response = get("$url/contacts/add/pending")
assertEquals(200, response.statusCode)
assertEquals(200, response.code)
assertEquals(0, response.jsonArray.length())
// add one pending contact
@@ -65,37 +79,38 @@ class ContactControllerIntegrationTest : IntegrationTest() {
"alias": "$alias"
}"""
response = post("$url/contacts/add/pending", json)
assertEquals(200, response.statusCode)
assertEquals(200, response.code)
// get added contact as only list item
response = get("$url/contacts/add/pending")
assertEquals(200, response.statusCode)
assertEquals(1, response.jsonArray.length())
val jsonObject = response.jsonArray.getJSONObject(0)
assertEquals(200, response.code)
val jsonArray = response.jsonArray
assertEquals(1, jsonArray.length())
val jsonObject = jsonArray.getJSONObject(0)
assertEquals(alias, jsonObject.getJSONObject("pendingContact").getString("alias"))
// remove pending contact again
val idString = jsonObject.getJSONObject("pendingContact").getString("pendingContactId")
val deleteJson = """{"pendingContactId": "$idString"}"""
response = delete("$url/contacts/add/pending", deleteJson)
assertEquals(200, response.statusCode)
response = delete("$url/contacts/add/pending", data = deleteJson)
assertEquals(200, response.code)
// list of pending contacts should be empty now
response = get("$url/contacts/add/pending")
assertEquals(200, response.statusCode)
assertEquals(200, response.code)
assertEquals(0, response.jsonArray.length())
}
@Test
fun `returning list of pending contacts needs authentication token`() {
val response = getWithWrongToken("$url/contacts/add/pending")
assertEquals(401, response.statusCode)
assertEquals(401, response.code)
}
@Test
fun `adding a pending contact needs authentication token`() {
val response = postWithWrongToken("$url/contacts/add/pending")
assertEquals(401, response.statusCode)
assertEquals(401, response.code)
}
@Test
@@ -106,7 +121,7 @@ class ContactControllerIntegrationTest : IntegrationTest() {
"alias": "$alias"
}"""
val response = post("$url/contacts/add/pending", json)
assertEquals(400, response.statusCode)
assertEquals(400, response.code)
assertEquals("INVALID_LINK", response.jsonObject.getString("error"))
}
@@ -118,7 +133,7 @@ class ContactControllerIntegrationTest : IntegrationTest() {
"alias": "$alias"
}"""
val response = post("$url/contacts/add/pending", json)
assertEquals(400, response.statusCode)
assertEquals(400, response.code)
assertEquals("INVALID_PUBLIC_KEY", response.jsonObject.getString("error"))
}
@@ -130,36 +145,37 @@ class ContactControllerIntegrationTest : IntegrationTest() {
"alias": "$alias"
}"""
var response = post("$url/contacts/add/pending", json)
assertEquals(200, response.statusCode)
assertEquals(200, response.code)
val pendingContactId = response.jsonObject.getString("pendingContactId")
response = post("$url/contacts/add/pending", json)
assertEquals(403, response.statusCode)
assertEquals("PENDING_EXISTS", response.jsonObject.getString("error"))
assertEquals(pendingContactId, response.jsonObject.getString("pendingContactId"))
assertEquals(alias, response.jsonObject.getString("pendingContactAlias"))
assertEquals(403, response.code)
val jsonObject = response.jsonObject
assertEquals("PENDING_EXISTS", jsonObject.getString("error"))
assertEquals(pendingContactId, jsonObject.getString("pendingContactId"))
assertEquals(alias, jsonObject.getString("pendingContactAlias"))
}
@Test
fun `removing a pending contact needs authentication token`() {
val response = deleteWithWrongToken("$url/contacts/add/pending")
assertEquals(401, response.statusCode)
assertEquals(401, response.code)
}
@Test
fun `deleting a contact needs authentication token`() {
val response = deleteWithWrongToken("$url/contacts/1")
assertEquals(401, response.statusCode)
assertEquals(401, response.code)
}
@Test
fun `deleting real and non-existing contact`() {
var response = delete("$url/contacts/1")
assertEquals(200, response.statusCode)
assertEquals(200, response.code)
response = delete("$url/contacts/1")
assertEquals(404, response.statusCode)
assertEquals(404, response.code)
}
}