Skip to content

Commit 92f998f

Browse files
committed
Refactor mock server
Should be easier to add new endpoints now.
1 parent 6b97667 commit 92f998f

File tree

1 file changed

+44
-32
lines changed

1 file changed

+44
-32
lines changed

src/test/kotlin/com/coder/gateway/sdk/BaseCoderRestClientTest.kt

+44-32
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.coder.gateway.services.CoderSettingsState
99
import com.coder.gateway.settings.CoderSettings
1010
import com.coder.gateway.util.sslContextFromPEMs
1111
import com.google.gson.GsonBuilder
12+
import com.sun.net.httpserver.HttpExchange
1213
import com.sun.net.httpserver.HttpServer
1314
import com.sun.net.httpserver.HttpsConfigurator
1415
import com.sun.net.httpserver.HttpsServer
@@ -39,47 +40,58 @@ class BaseCoderRestClientTest {
3940
* hardcode IDs everywhere since you cannot use variables in the where
4041
* blocks).
4142
*/
42-
private fun mockServer(workspaces: List<TestWorkspace>): Pair<HttpServer, String> {
43+
private fun mockServer(workspaces: List<TestWorkspace>, spy: ((exchange: HttpExchange) -> Unit)? = null): Pair<HttpServer, String> {
4344
val srv = HttpServer.create(InetSocketAddress(0), 0)
44-
addServerContext(srv, workspaces)
45+
addServerContext(srv, workspaces, spy)
4546
srv.start()
4647
return Pair(srv, "http://localhost:" + srv.address.port)
4748
}
4849

4950
private val resourceEndpoint = "/api/v2/templateversions/([^/]+)/resources".toRegex()
5051

51-
private fun addServerContext(srv: HttpServer, workspaces: List<TestWorkspace> = emptyList()) {
52+
private fun toJson(src: Any?): String {
53+
return GsonBuilder().registerTypeAdapter(Instant::class.java, InstantConverter()).create().toJson(src)
54+
}
55+
56+
private fun handleExchange(exchange: HttpExchange, workspaces: List<TestWorkspace>): Pair<Int, String> {
57+
val matches = resourceEndpoint.find(exchange.requestURI.path)
58+
if (matches != null) {
59+
val templateVersionId = UUID.fromString(matches.destructured.toList()[0])
60+
val ws = workspaces.first { it.workspace.latestBuild.templateVersionID == templateVersionId }
61+
return Pair(HttpURLConnection.HTTP_OK, toJson(ws.resources))
62+
}
63+
64+
when (exchange.requestURI.path) {
65+
"/api/v2/workspaces" -> {
66+
return Pair(HttpsURLConnection.HTTP_OK, toJson(WorkspacesResponse(workspaces.map{ it.workspace }, workspaces.size)))
67+
}
68+
"/api/v2/users/me" -> {
69+
val user = User(
70+
UUID.randomUUID(),
71+
"tester",
72+
"tester@example.com",
73+
Instant.now(),
74+
Instant.now(),
75+
UserStatus.ACTIVE,
76+
listOf(),
77+
listOf(),
78+
"",
79+
)
80+
return Pair(HttpsURLConnection.HTTP_OK, toJson(user))
81+
}
82+
}
83+
return Pair(HttpsURLConnection.HTTP_NOT_FOUND, "not found")
84+
}
85+
86+
private fun addServerContext(srv: HttpServer, workspaces: List<TestWorkspace> = emptyList(), spy: ((exchange: HttpExchange) -> Unit)? = null) {
5287
srv.createContext("/") { exchange ->
53-
var code = HttpURLConnection.HTTP_NOT_FOUND
54-
var response = "not found"
88+
spy?.invoke(exchange)
89+
var code: Int
90+
var response: String
5591
try {
56-
val matches = resourceEndpoint.find(exchange.requestURI.path)
57-
if (matches != null) {
58-
val templateVersionId = UUID.fromString(matches.destructured.toList()[0])
59-
val ws = workspaces.first { it.workspace.latestBuild.templateVersionID == templateVersionId }
60-
code = HttpURLConnection.HTTP_OK
61-
response = GsonBuilder().registerTypeAdapter(Instant::class.java, InstantConverter())
62-
.create().toJson(ws.resources)
63-
} else if (exchange.requestURI.path == "/api/v2/workspaces") {
64-
code = HttpsURLConnection.HTTP_OK
65-
response = GsonBuilder().registerTypeAdapter(Instant::class.java, InstantConverter())
66-
.create().toJson(WorkspacesResponse(workspaces.map{ it.workspace }, workspaces.size))
67-
} else if (exchange.requestURI.path == "/api/v2/users/me") {
68-
code = HttpsURLConnection.HTTP_OK
69-
val user = User(
70-
UUID.randomUUID(),
71-
"tester",
72-
"tester@example.com",
73-
Instant.now(),
74-
Instant.now(),
75-
UserStatus.ACTIVE,
76-
listOf(),
77-
listOf(),
78-
"",
79-
)
80-
response = GsonBuilder().registerTypeAdapter(Instant::class.java, InstantConverter())
81-
.create().toJson(user)
82-
}
92+
val p = handleExchange(exchange, workspaces)
93+
code = p.first
94+
response = p.second
8395
} catch (ex: Exception) {
8496
// This will be a developer error.
8597
code = HttpURLConnection.HTTP_INTERNAL_ERROR

0 commit comments

Comments
 (0)