Skip to content

Commit b1524f3

Browse files
committed
REST API test for consistency
1 parent e238965 commit b1524f3

File tree

3 files changed

+321
-31
lines changed

3 files changed

+321
-31
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ kotlin {
107107
implementation("io.ktor:ktor-client-cio:$ktorVersion")
108108
implementation("io.ktor:ktor-client-auth:$ktorVersion")
109109
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
110+
implementation("com.google.code.gson:gson:2.8.5")
110111

111112
}
112113
}

src/jvmMain/kotlin/models.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,7 @@ data class EventReprForDelete(
2424

2525
fun EventReprForDelete.str(): String =
2626
"(${this.reference.storage_name}, ${this.reference.file_path}, ${this.reference.event_number})"
27+
28+
data class EventListRepr(
29+
val events: Array<EventRepr>
30+
)

src/jvmTest/kotlin/TestREST.kt

Lines changed: 316 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,43 +15,79 @@ import io.ktor.http.*
1515
import io.ktor.serialization.kotlinx.json.*
1616
import kotlinx.coroutines.runBlocking
1717
import kotlinx.serialization.json.Json
18+
import com.google.gson.Gson
19+
import kotlin.test.assertFalse
1820

1921

2022
const val BASE_URL = "http://127.0.0.1:8080/event_api/v1"
2123
const val PERIOD = 7.toShort()
2224
const val RUN = 5050
2325

24-
val event1 = EventRepr(
25-
Reference("data2", "/tmp/file12", 1),
26-
"19.1",
27-
PERIOD,
28-
RUN,
29-
mapOf("track_number" to 11)
30-
)
31-
32-
val event1_mod = EventRepr(
33-
Reference("data2", "/tmp/file12", 1),
34-
"19.1",
35-
PERIOD,
36-
RUN,
37-
mapOf("track_number" to 1100)
38-
)
39-
40-
val event2 = EventRepr(
41-
Reference("data2", "/tmp/file12", 2),
42-
"19.1",
43-
PERIOD,
44-
RUN,
45-
mapOf("track_number" to 22)
46-
)
47-
48-
val event3 = EventRepr(
49-
Reference("data2", "/tmp/file12", 3),
50-
"19.1",
51-
PERIOD,
52-
RUN,
53-
mapOf("track_number" to 33)
54-
)
26+
val gson = Gson()
27+
28+
val event1 = gson.fromJson("""
29+
{
30+
"reference": {
31+
"storage_name": "data2",
32+
"file_path": "/tmp/file12",
33+
"event_number": 1
34+
},
35+
"software_version": "19.1",
36+
"period_number": $PERIOD,
37+
"run_number": $RUN,
38+
"parameters": {
39+
"track_number": 11
40+
}
41+
}
42+
""", EventRepr::class.java)
43+
44+
val event1_mod = gson.fromJson("""
45+
{
46+
"reference": {
47+
"storage_name": "data2",
48+
"file_path": "/tmp/file12",
49+
"event_number": 1
50+
},
51+
"software_version": "19.1",
52+
"period_number": $PERIOD,
53+
"run_number": $RUN,
54+
"parameters": {
55+
"track_number": 1100
56+
}
57+
}
58+
""", EventRepr::class.java)
59+
60+
val event2 = gson.fromJson("""
61+
{
62+
"reference": {
63+
"storage_name": "data2",
64+
"file_path": "/tmp/file12",
65+
"event_number": 2
66+
},
67+
"software_version": "19.1",
68+
"period_number": $PERIOD,
69+
"run_number": $RUN,
70+
"parameters": {
71+
"track_number": 22
72+
}
73+
}
74+
""", EventRepr::class.java)
75+
76+
val event3 = gson.fromJson("""
77+
{
78+
"reference": {
79+
"storage_name": "data2",
80+
"file_path": "/tmp/file12",
81+
"event_number": 3
82+
},
83+
"software_version": "19.1",
84+
"period_number": $PERIOD,
85+
"run_number": $RUN,
86+
"parameters": {
87+
"track_number": 33
88+
}
89+
}
90+
""", EventRepr::class.java)
5591

5692

5793
class RestApiTest {
@@ -134,6 +170,255 @@ class RestApiTest {
134170
}
135171
}
136172

173+
@Test
174+
fun `Long API consistency test`() {
175+
runBlocking {
176+
177+
var response: HttpResponse
178+
179+
println("************************************************************")
180+
println("Deleting events 1,2,3 (if present in database)")
181+
listOf(event1, event2, event3).forEach { event ->
182+
response = authenticatedClient().delete("$BASE_URL/event") {
183+
contentType(ContentType.Application.Json)
184+
setBody(gson.toJson(listOf(event)))
185+
}
186+
println(response.status)
187+
println(response.bodyAsText())
188+
}
189+
190+
println("************************************************************")
191+
println("Creating events 1, 2")
192+
response = authenticatedClient().post("$BASE_URL/event") {
193+
contentType(ContentType.Application.Json)
194+
setBody(gson.toJson(listOf(event2, event1)))
195+
}
196+
println(response.status)
197+
println(response.bodyAsText())
198+
199+
println("************************************************************")
200+
println("Checking that events 1,2 are in catalogue and event 3 is not")
201+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
202+
contentType(ContentType.Application.Json)
203+
}
204+
var eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
205+
assert(event1 in eventsArray.events)
206+
assert(event2 in eventsArray.events)
207+
assertFalse(event3 in eventsArray.events)
208+
209+
println("************************************************************")
210+
println("Creating event 3")
211+
response = authenticatedClient().post("$BASE_URL/event") {
212+
contentType(ContentType.Application.Json)
213+
setBody(gson.toJson(listOf(event3)))
214+
}
215+
assertEquals(response.status, HttpStatusCode.OK)
216+
println(response.status)
217+
println(response.bodyAsText())
218+
219+
println("************************************************************")
220+
println("Checking that event 3 is now in catalogue")
221+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
222+
contentType(ContentType.Application.Json)
223+
}
224+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
225+
assert(event3 in eventsArray.events)
226+
227+
println("************************************************************")
228+
println("Checking that event 3 can not be written again with POST")
229+
response = authenticatedClient().post("$BASE_URL/event") {
230+
contentType(ContentType.Application.Json)
231+
setBody(gson.toJson(listOf(event3)))
232+
}
233+
println(response.status)
234+
println(response.bodyAsText())
235+
assertEquals(response.status, HttpStatusCode.Conflict) // 409
236+
237+
println("************************************************************")
238+
println("Checking that event 3 can be written again with PUT")
239+
response = authenticatedClient().put("$BASE_URL/event") {
240+
contentType(ContentType.Application.Json)
241+
setBody(gson.toJson(listOf(event3)))
242+
}
243+
println(response.status)
244+
println(response.bodyAsText())
245+
assertEquals(response.status, HttpStatusCode.OK)
246+
247+
println("************************************************************")
248+
println("Checking that event 3 is still in the catalogue")
249+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
250+
contentType(ContentType.Application.Json)
251+
}
252+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
253+
assert(event3 in eventsArray.events)
254+
255+
println("************************************************************")
256+
println("Modifying event 1 parameter (with POST, should fail)")
257+
response = authenticatedClient().post("$BASE_URL/event") {
258+
contentType(ContentType.Application.Json)
259+
setBody(gson.toJson(listOf(event1_mod)))
260+
}
261+
println(response.status)
262+
println(response.bodyAsText())
263+
assertEquals(response.status, HttpStatusCode.Conflict) // 409
264+
265+
println("************************************************************")
266+
println("Modifying event 1 parameter (with PUT)")
267+
response = authenticatedClient().put("$BASE_URL/event") {
268+
contentType(ContentType.Application.Json)
269+
setBody(gson.toJson(listOf(event1_mod)))
270+
}
271+
println(response.status)
272+
println(response.bodyAsText())
273+
assertEquals(response.status, HttpStatusCode.OK)
274+
275+
println("************************************************************")
276+
println("Checking that original event 1 is not there, but modified is")
277+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
278+
contentType(ContentType.Application.Json)
279+
}
280+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
281+
assert(event1_mod in eventsArray.events)
282+
assertFalse(event1 in eventsArray.events)
283+
284+
println("************************************************************")
285+
println("Trying to delete event 1 both original and modified (should fail)")
286+
response = authenticatedClient().delete("$BASE_URL/event") {
287+
contentType(ContentType.Application.Json)
288+
setBody(gson.toJson(listOf(event1, event1_mod)))
289+
}
290+
println(response.status)
291+
println(response.bodyAsText())
292+
assertEquals(response.status, HttpStatusCode.NotFound)
293+
294+
println("************************************************************")
295+
println("Checking (again) that original event 1 is not there, but modified is")
296+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
297+
contentType(ContentType.Application.Json)
298+
}
299+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
300+
assert(event1_mod in eventsArray.events)
301+
assertFalse(event1 in eventsArray.events)
302+
303+
println("************************************************************")
304+
println("Delete modified event 1")
305+
response = authenticatedClient().delete("$BASE_URL/event") {
306+
contentType(ContentType.Application.Json)
307+
setBody(gson.toJson(listOf(event1_mod)))
308+
}
309+
println(response.status)
310+
println(response.bodyAsText())
311+
assertEquals(response.status, HttpStatusCode.OK)
312+
313+
println("************************************************************")
314+
println("Checking that event 1 was deleted")
315+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
316+
contentType(ContentType.Application.Json)
317+
}
318+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
319+
assertFalse(event1_mod in eventsArray.events)
320+
assertFalse(event1 in eventsArray.events)
321+
322+
println("************************************************************")
323+
println("Creating again events 1,2 with POST (should fail)")
324+
response = authenticatedClient().post("$BASE_URL/event") {
325+
contentType(ContentType.Application.Json)
326+
setBody(gson.toJson(listOf(event1, event2)))
327+
}
328+
println(response.status)
329+
println(response.bodyAsText())
330+
assertEquals(response.status, HttpStatusCode.Conflict) // 409
331+
332+
println("************************************************************")
333+
println("Creating again events 1,2 with PUT (should work)")
334+
response = authenticatedClient().put("$BASE_URL/event") {
335+
contentType(ContentType.Application.Json)
336+
setBody(gson.toJson(listOf(event1, event2)))
337+
}
338+
println(response.status)
339+
println(response.bodyAsText())
340+
assertEquals(response.status, HttpStatusCode.OK)
341+
342+
println("************************************************************")
343+
println("Checking that events 1,2 are there")
344+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
345+
contentType(ContentType.Application.Json)
346+
}
347+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
348+
assert(event1 in eventsArray.events)
349+
assert(event2 in eventsArray.events)
350+
351+
println("************************************************************")
352+
println("Modifying event number for event 1 (should be treated as different event)")
353+
var event1_mod_event_num = gson.fromJson("""
354+
{
355+
"reference": {
356+
"storage_name": "data2",
357+
"file_path": "/tmp/file12",
358+
"event_number": 1000
359+
},
360+
"software_version": "19.1",
361+
"period_number": $PERIOD,
362+
"run_number": $RUN,
363+
"parameters": {
364+
"track_number": 11
365+
}
366+
}
367+
""".trimIndent(), EventRepr::class.java)
368+
response = authenticatedClient().put("$BASE_URL/event") {
369+
contentType(ContentType.Application.Json)
370+
setBody(gson.toJson(listOf(event1_mod_event_num)))
371+
}
372+
println(response.status)
373+
println(response.bodyAsText())
374+
assertEquals(response.status, HttpStatusCode.OK)
375+
376+
println("************************************************************")
377+
println("Checking that event 1 both original and modified are there")
378+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
379+
contentType(ContentType.Application.Json)
380+
}
381+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
382+
assert(event1 in eventsArray.events)
383+
assert(event1_mod_event_num in eventsArray.events)
384+
385+
println("************************************************************")
386+
println("Doing filter based on track_number")
387+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN&track_number=11") {
388+
contentType(ContentType.Application.Json)
389+
}
390+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
391+
assert(event1 in eventsArray.events)
392+
assert(event1_mod_event_num in eventsArray.events)
393+
assertFalse(event2 in eventsArray.events)
394+
assertFalse(event3 in eventsArray.events)
395+
396+
println("************************************************************")
397+
println("Delete events")
398+
response = authenticatedClient().delete("$BASE_URL/event") {
399+
contentType(ContentType.Application.Json)
400+
setBody(gson.toJson(listOf(event1, event1_mod_event_num, event2, event3)))
401+
}
402+
println(response.status)
403+
println(response.bodyAsText())
404+
assertEquals(response.status, HttpStatusCode.OK)
405+
406+
println("************************************************************")
407+
println("Check that events were deleted")
408+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN") {
409+
contentType(ContentType.Application.Json)
410+
}
411+
println(response.status)
412+
println(response.bodyAsText())
413+
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
414+
assertFalse(event1 in eventsArray.events)
415+
assertFalse(event1_mod_event_num in eventsArray.events)
416+
assertFalse(event2 in eventsArray.events)
417+
assertFalse(event3 in eventsArray.events)
418+
419+
}
420+
}
421+
137422
}
138423

139424

0 commit comments

Comments
 (0)