diff --git a/tests/FSharp.Data.GraphQL.IntegrationTests.Server/Schema.fs b/tests/FSharp.Data.GraphQL.IntegrationTests.Server/Schema.fs
index 970aa596..fec874b4 100644
--- a/tests/FSharp.Data.GraphQL.IntegrationTests.Server/Schema.fs
+++ b/tests/FSharp.Data.GraphQL.IntegrationTests.Server/Schema.fs
@@ -27,6 +27,9 @@ type Input =
{ Single : InputField option
List : InputField list option }
+type InputFile =
+ { File : FileData }
+
type UploadedFile =
{ Name : string
ContentType : string
@@ -134,7 +137,7 @@ module Schema =
args = [ Define.Input("input", Nullable InputType, description = "The input to be echoed as an output.") ],
resolve = fun ctx _ -> ctx.TryArg("input")) ])
- let InputFileObject = Define.InputObject(
+ let InputFileObject = Define.InputObject(
name = "InputFile",
fields =
[
@@ -146,7 +149,8 @@ module Schema =
use reader = new System.IO.StreamReader(stream, Encoding.UTF8)
reader.ReadToEnd()
let getFileContent (ctx : ResolveFieldContext) argName =
- let stream = ctx.Arg argName
+ let inputFile = ctx.Arg argName
+ let stream = inputFile.File.Stream
use reader = new System.IO.StreamReader(stream, Encoding.UTF8, true)
reader.ReadToEnd()
let mapUploadToOutput (file : FileData) =
diff --git a/tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderTests.fs b/tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderTests.fs
index b7f6b9ae..897364cb 100644
--- a/tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderTests.fs
+++ b/tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderTests.fs
@@ -487,3 +487,47 @@ let ``Should be able to upload files inside another input type``() : Task = task
let! result = UploadRequestOperation.operation.AsyncRun(input)
result |> UploadRequestOperation.validateResult request
}
+
+module UploadComplexOperation =
+ let operation =
+ Provider.Operation<"""mutation UploadComplex($input: InputFile!) {
+ uploadComplex(input: $input)
+ }""">()
+
+ type Operation = Provider.Operations.UploadComplex
+ type InputFile = Provider.Types.InputFile
+
+ let validateResult (file : File) (result : Operation.OperationResult) =
+ result |> checkRequestTypeHeader "Multipart"
+ result.Data.IsSome |> equals true
+ result.Data.Value.UploadComplex |> equals file.Content
+
+[]
+let ``Should be able to upload file using complex input object`` () =
+ let file = { Name = "complex.txt"; ContentType = "text/plain"; Content = "Complex input object file content" }
+ let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
+ UploadComplexOperation.operation.Run(input)
+ |> UploadComplexOperation.validateResult file
+
+[]
+let ``Should be able to upload file using complex input object with context`` () =
+ let file = { Name = "complex_context.txt"; ContentType = "text/plain"; Content = "Complex input with context file content" }
+ let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
+ UploadComplexOperation.operation.Run(context, input)
+ |> UploadComplexOperation.validateResult file
+
+[]
+let ``Should be able to upload file using complex input object asynchronously`` () : Task = task {
+ let file = { Name = "complex_async.txt"; ContentType = "text/plain"; Content = "Complex input object async file content" }
+ let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
+ let! result = UploadComplexOperation.operation.AsyncRun(input)
+ result |> UploadComplexOperation.validateResult file
+}
+
+[]
+let ``Should be able to upload file using complex input object with context asynchronously`` () : Task = task {
+ let file = { Name = "complex_context_async.txt"; ContentType = "text/plain"; Content = "Complex input with context async file content" }
+ let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
+ let! result = UploadComplexOperation.operation.AsyncRun(context, input)
+ result |> UploadComplexOperation.validateResult file
+}
diff --git a/tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderWithOptionalParametersOnlyTests.fs b/tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderWithOptionalParametersOnlyTests.fs
index 92fc1cae..74cc97a4 100644
--- a/tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderWithOptionalParametersOnlyTests.fs
+++ b/tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderWithOptionalParametersOnlyTests.fs
@@ -484,3 +484,47 @@ let ``Should be able to upload files inside another input type``() =
nullableMultipleNullable = Some (Array.map (Option.map makeUpload) request.NullableMultipleNullable.Value))
UploadRequestOperation.operation.Run(input)
|> UploadRequestOperation.validateResult request
+
+module UploadComplexOperation =
+ let operation =
+ Provider.Operation<"""mutation UploadComplex($input: InputFile!) {
+ uploadComplex(input: $input)
+ }""">()
+
+ type Operation = Provider.Operations.UploadComplex
+ type InputFile = Provider.Types.InputFile
+
+ let validateResult (file : File) (result : Operation.OperationResult) =
+ result |> checkRequestTypeHeader "Multipart"
+ result.Data.IsSome |> equals true
+ result.Data.Value.UploadComplex |> equals file.Content
+
+[]
+let ``Should be able to upload file using complex input object`` () =
+ let file = { Name = "complex.txt"; ContentType = "text/plain"; Content = "Complex input object file content" }
+ let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
+ UploadComplexOperation.operation.Run(input)
+ |> UploadComplexOperation.validateResult file
+
+[]
+let ``Should be able to upload file using complex input object with context`` () =
+ let file = { Name = "complex_context.txt"; ContentType = "text/plain"; Content = "Complex input with context file content" }
+ let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
+ UploadComplexOperation.operation.Run(context, input)
+ |> UploadComplexOperation.validateResult file
+
+[]
+let ``Should be able to upload file using complex input object asynchronously`` () : Task = task {
+ let file = { Name = "complex_async.txt"; ContentType = "text/plain"; Content = "Complex input object async file content" }
+ let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
+ let! result = UploadComplexOperation.operation.AsyncRun(input)
+ result |> UploadComplexOperation.validateResult file
+}
+
+[]
+let ``Should be able to upload file using complex input object with context asynchronously`` () : Task = task {
+ let file = { Name = "complex_context_async.txt"; ContentType = "text/plain"; Content = "Complex input with context async file content" }
+ let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
+ let! result = UploadComplexOperation.operation.AsyncRun(context, input)
+ result |> UploadComplexOperation.validateResult file
+}