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 +}