mirror of
https://github.com/Suwayomi/Tachidesk.git
synced 2025-12-10 06:42:07 +01:00
Fix File Upload (#694)
* Fix File Upload * Use operations instead of operation * Fix tests
This commit is contained in:
@@ -21,7 +21,7 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
|
||||
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE", "UNCHECKED_CAST")
|
||||
override suspend fun parseRequest(context: Context): GraphQLServerRequest? {
|
||||
return try {
|
||||
val formParam = context.formParam("operation")
|
||||
val formParam = context.formParam("operations")
|
||||
?: return context.bodyAsClass(GraphQLServerRequest::class.java)
|
||||
|
||||
val request = context.jsonMapper().fromJsonString(
|
||||
@@ -35,18 +35,12 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
|
||||
)
|
||||
}.orEmpty()
|
||||
|
||||
val filesMap = map.keys
|
||||
.sortedBy { it.toIntOrNull() }
|
||||
.map { context.uploadedFile(it) }
|
||||
|
||||
val mapItems = map.flatMap { (index, variables) ->
|
||||
val indexInt = index.toIntOrNull() ?: return@flatMap emptyList()
|
||||
val file = filesMap.getOrNull(indexInt)
|
||||
val mapItems = map.flatMap { (key, variables) ->
|
||||
val file = context.uploadedFile(key)
|
||||
variables.map { fullVariable ->
|
||||
val variable = fullVariable.removePrefix("variables.").substringBefore('.')
|
||||
val listIndex = fullVariable.substringAfterLast('.').toIntOrNull()
|
||||
MapItem(
|
||||
indexInt,
|
||||
variable,
|
||||
listIndex,
|
||||
file
|
||||
@@ -74,7 +68,6 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
|
||||
}
|
||||
|
||||
data class MapItem(
|
||||
val index: Int,
|
||||
val variable: String,
|
||||
val listIndex: Int?,
|
||||
val file: UploadedFile?
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
package suwayomi.tachidesk.graphql
|
||||
|
||||
import com.expediagroup.graphql.server.types.GraphQLRequest
|
||||
import io.javalin.http.Context
|
||||
import io.javalin.http.UploadedFile
|
||||
import io.javalin.plugin.json.JSON_MAPPER_KEY
|
||||
import io.javalin.plugin.json.JavalinJackson
|
||||
import io.javalin.plugin.json.JsonMapper
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.jupiter.api.Test
|
||||
import suwayomi.tachidesk.graphql.server.JavalinGraphQLRequestParser
|
||||
import java.io.ByteArrayInputStream
|
||||
import kotlin.test.assertIs
|
||||
import kotlin.test.assertNotNull
|
||||
|
||||
class RequestParserTest {
|
||||
private val ctx = mockk<Context>(relaxed = true)
|
||||
private val requestParser = JavalinGraphQLRequestParser()
|
||||
|
||||
@Test
|
||||
fun testZero() = runTest {
|
||||
every { ctx.appAttribute<JsonMapper>(JSON_MAPPER_KEY) } returns (JavalinJackson(JavalinJackson.defaultMapper()))
|
||||
every { ctx.formParam("operations") } returns """{ "query": "mutation (${'$'}file: Upload!) { singleUpload(file: ${'$'}file) { id } }", "variables": { "file": null } }"""
|
||||
every { ctx.formParam("map") } returns """{ "0": ["variables.file"] }"""
|
||||
every { ctx.uploadedFile("0") } returns UploadedFile(ByteArrayInputStream(byteArrayOf()), "", "", "", 0)
|
||||
val test = requestParser.parseRequest(ctx)
|
||||
assertIs<GraphQLRequest>(test)
|
||||
assertNotNull(test.variables?.get("file"))
|
||||
println("File: " + test.variables?.get("file"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testTest() = runTest {
|
||||
every { ctx.appAttribute<JsonMapper>(JSON_MAPPER_KEY) } returns (JavalinJackson(JavalinJackson.defaultMapper()))
|
||||
every { ctx.formParam("operations") } returns """{ "query": "mutation (${'$'}file: Upload!) { singleUpload(file: ${'$'}file) { id } }", "variables": { "file": null } }"""
|
||||
every { ctx.formParam("map") } returns """{ "test": ["variables.file"] }"""
|
||||
every { ctx.uploadedFile("test") } returns UploadedFile(ByteArrayInputStream(byteArrayOf()), "", "", "", 0)
|
||||
val test = requestParser.parseRequest(ctx)
|
||||
assertIs<GraphQLRequest>(test)
|
||||
assertNotNull(test.variables?.get("file"))
|
||||
println("File: " + test.variables?.get("file"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testList() = runTest {
|
||||
every { ctx.appAttribute<JsonMapper>(JSON_MAPPER_KEY) } returns (JavalinJackson(JavalinJackson.defaultMapper()))
|
||||
every { ctx.formParam("operations") } returns """{ "query": "mutation (${'$'}files: [Upload!]!) { singleUpload(files: ${'$'}files) { id } }", "variables": { "files": [null, null] } }"""
|
||||
every { ctx.formParam("map") } returns """{ "test": ["variables.files.0"], "test2": ["variables.files.1"] }"""
|
||||
every { ctx.uploadedFile("test") } returns UploadedFile(ByteArrayInputStream(byteArrayOf()), "", "", "", 0)
|
||||
every { ctx.uploadedFile("test2") } returns UploadedFile(ByteArrayInputStream(byteArrayOf()), "", "", "", 0)
|
||||
val test = requestParser.parseRequest(ctx)
|
||||
assertIs<GraphQLRequest>(test)
|
||||
val files = test.variables?.get("files")
|
||||
assertIs<List<*>>(files)
|
||||
assert(files.all { it is UploadedFile })
|
||||
println("Files: $files")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user