Skip to content

Commit f88cab6

Browse files
VectorTetraViktor Tochonovxperiandri
authored
Implemented tests for file upload within an input object (#540)
Co-authored-by: Viktor Tochonov <[email protected]> Co-authored-by: Andrii Chebukin <[email protected]>
1 parent 323f7b7 commit f88cab6

File tree

3 files changed

+94
-2
lines changed

3 files changed

+94
-2
lines changed

tests/FSharp.Data.GraphQL.IntegrationTests.Server/Schema.fs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ type Input =
2727
{ Single : InputField option
2828
List : InputField list option }
2929

30+
type InputFile =
31+
{ File : FileData }
32+
3033
type UploadedFile =
3134
{ Name : string
3235
ContentType : string
@@ -134,7 +137,7 @@ module Schema =
134137
args = [ Define.Input("input", Nullable InputType, description = "The input to be echoed as an output.") ],
135138
resolve = fun ctx _ -> ctx.TryArg("input")) ])
136139

137-
let InputFileObject = Define.InputObject<Input>(
140+
let InputFileObject = Define.InputObject<InputFile>(
138141
name = "InputFile",
139142
fields =
140143
[
@@ -146,7 +149,8 @@ module Schema =
146149
use reader = new System.IO.StreamReader(stream, Encoding.UTF8)
147150
reader.ReadToEnd()
148151
let getFileContent (ctx : ResolveFieldContext) argName =
149-
let stream = ctx.Arg<System.IO.Stream> argName
152+
let inputFile = ctx.Arg<InputFile> argName
153+
let stream = inputFile.File.Stream
150154
use reader = new System.IO.StreamReader(stream, Encoding.UTF8, true)
151155
reader.ReadToEnd()
152156
let mapUploadToOutput (file : FileData) =

tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderTests.fs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,3 +487,47 @@ let ``Should be able to upload files inside another input type``() : Task = task
487487
let! result = UploadRequestOperation.operation.AsyncRun(input)
488488
result |> UploadRequestOperation.validateResult request
489489
}
490+
491+
module UploadComplexOperation =
492+
let operation =
493+
Provider.Operation<"""mutation UploadComplex($input: InputFile!) {
494+
uploadComplex(input: $input)
495+
}""">()
496+
497+
type Operation = Provider.Operations.UploadComplex
498+
type InputFile = Provider.Types.InputFile
499+
500+
let validateResult (file : File) (result : Operation.OperationResult) =
501+
result |> checkRequestTypeHeader "Multipart"
502+
result.Data.IsSome |> equals true
503+
result.Data.Value.UploadComplex |> equals file.Content
504+
505+
[<Fact>]
506+
let ``Should be able to upload file using complex input object`` () =
507+
let file = { Name = "complex.txt"; ContentType = "text/plain"; Content = "Complex input object file content" }
508+
let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
509+
UploadComplexOperation.operation.Run(input)
510+
|> UploadComplexOperation.validateResult file
511+
512+
[<Fact>]
513+
let ``Should be able to upload file using complex input object with context`` () =
514+
let file = { Name = "complex_context.txt"; ContentType = "text/plain"; Content = "Complex input with context file content" }
515+
let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
516+
UploadComplexOperation.operation.Run(context, input)
517+
|> UploadComplexOperation.validateResult file
518+
519+
[<Fact>]
520+
let ``Should be able to upload file using complex input object asynchronously`` () : Task = task {
521+
let file = { Name = "complex_async.txt"; ContentType = "text/plain"; Content = "Complex input object async file content" }
522+
let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
523+
let! result = UploadComplexOperation.operation.AsyncRun(input)
524+
result |> UploadComplexOperation.validateResult file
525+
}
526+
527+
[<Fact>]
528+
let ``Should be able to upload file using complex input object with context asynchronously`` () : Task = task {
529+
let file = { Name = "complex_context_async.txt"; ContentType = "text/plain"; Content = "Complex input with context async file content" }
530+
let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
531+
let! result = UploadComplexOperation.operation.AsyncRun(context, input)
532+
result |> UploadComplexOperation.validateResult file
533+
}

tests/FSharp.Data.GraphQL.IntegrationTests/LocalProviderWithOptionalParametersOnlyTests.fs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,3 +484,47 @@ let ``Should be able to upload files inside another input type``() =
484484
nullableMultipleNullable = Some (Array.map (Option.map makeUpload) request.NullableMultipleNullable.Value))
485485
UploadRequestOperation.operation.Run(input)
486486
|> UploadRequestOperation.validateResult request
487+
488+
module UploadComplexOperation =
489+
let operation =
490+
Provider.Operation<"""mutation UploadComplex($input: InputFile!) {
491+
uploadComplex(input: $input)
492+
}""">()
493+
494+
type Operation = Provider.Operations.UploadComplex
495+
type InputFile = Provider.Types.InputFile
496+
497+
let validateResult (file : File) (result : Operation.OperationResult) =
498+
result |> checkRequestTypeHeader "Multipart"
499+
result.Data.IsSome |> equals true
500+
result.Data.Value.UploadComplex |> equals file.Content
501+
502+
[<Fact>]
503+
let ``Should be able to upload file using complex input object`` () =
504+
let file = { Name = "complex.txt"; ContentType = "text/plain"; Content = "Complex input object file content" }
505+
let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
506+
UploadComplexOperation.operation.Run(input)
507+
|> UploadComplexOperation.validateResult file
508+
509+
[<Fact>]
510+
let ``Should be able to upload file using complex input object with context`` () =
511+
let file = { Name = "complex_context.txt"; ContentType = "text/plain"; Content = "Complex input with context file content" }
512+
let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
513+
UploadComplexOperation.operation.Run(context, input)
514+
|> UploadComplexOperation.validateResult file
515+
516+
[<Fact>]
517+
let ``Should be able to upload file using complex input object asynchronously`` () : Task = task {
518+
let file = { Name = "complex_async.txt"; ContentType = "text/plain"; Content = "Complex input object async file content" }
519+
let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
520+
let! result = UploadComplexOperation.operation.AsyncRun(input)
521+
result |> UploadComplexOperation.validateResult file
522+
}
523+
524+
[<Fact>]
525+
let ``Should be able to upload file using complex input object with context asynchronously`` () : Task = task {
526+
let file = { Name = "complex_context_async.txt"; ContentType = "text/plain"; Content = "Complex input with context async file content" }
527+
let input = UploadComplexOperation.InputFile(file = file.MakeUpload())
528+
let! result = UploadComplexOperation.operation.AsyncRun(context, input)
529+
result |> UploadComplexOperation.validateResult file
530+
}

0 commit comments

Comments
 (0)