@@ -9,6 +9,7 @@ import com.coder.gateway.services.CoderSettingsState
9
9
import com.coder.gateway.settings.CoderSettings
10
10
import com.coder.gateway.util.sslContextFromPEMs
11
11
import com.google.gson.GsonBuilder
12
+ import com.sun.net.httpserver.HttpExchange
12
13
import com.sun.net.httpserver.HttpServer
13
14
import com.sun.net.httpserver.HttpsConfigurator
14
15
import com.sun.net.httpserver.HttpsServer
@@ -39,47 +40,58 @@ class BaseCoderRestClientTest {
39
40
* hardcode IDs everywhere since you cannot use variables in the where
40
41
* blocks).
41
42
*/
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 > {
43
44
val srv = HttpServer .create(InetSocketAddress (0 ), 0 )
44
- addServerContext(srv, workspaces)
45
+ addServerContext(srv, workspaces, spy )
45
46
srv.start()
46
47
return Pair (srv, " http://localhost:" + srv.address.port)
47
48
}
48
49
49
50
private val resourceEndpoint = " /api/v2/templateversions/([^/]+)/resources" .toRegex()
50
51
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) {
52
87
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
55
91
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
83
95
} catch (ex: Exception ) {
84
96
// This will be a developer error.
85
97
code = HttpURLConnection .HTTP_INTERNAL_ERROR
0 commit comments