Skip to content

Commit daa54cc

Browse files
Copilotxperiandri
andcommitted
Improve test host disposal and introspection file update safety
Agent-Logs-Url: https://github.com/fsprojects/FSharp.Data.GraphQL/sessions/4998e0af-9a24-4088-a9a9-3318b08f3de9 Co-authored-by: xperiandri <2365592+xperiandri@users.noreply.github.com>
1 parent 278d6a6 commit daa54cc

2 files changed

Lines changed: 24 additions & 11 deletions

File tree

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ let readDestinationDocumentAsync ct (stream : FileStream) =
4242
let updateIntrospectionFileAsync ct sourceStream =
4343
task {
4444
use destinationStream =
45-
new FileStream (introspectionFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
45+
new FileStream (introspectionFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read)
4646

4747
let options = JsonWriterOptions(Indented = true)
4848
let! sourceDocument = parseAndNormalizeJsonAsync ct options sourceStream
@@ -67,8 +67,7 @@ let updateIntrospectionFileAsync ct sourceStream =
6767
[<Fact>]
6868
let ``Get GraphQL introspection response returns schema`` () =
6969
task {
70-
use factory = new TestHosts.IntegrationServerApplicationFactory ()
71-
use httpClient = factory.CreateClient ()
70+
use httpClient = TestHosts.createIntegrationHttpClient ()
7271
let! response = httpClient.GetFromJsonAsync<JsonElement>("/", CancellationToken.None)
7372
let schema = response.GetProperty("data").GetProperty("__schema")
7473
Assert.NotEqual(Unchecked.defaultof<JsonElement>, schema)
@@ -79,8 +78,7 @@ let ``Get GraphQL introspection response returns schema`` () =
7978
[<Fact>]
8079
let ``Update integration introspection file when schema changes`` () =
8180
task {
82-
use factory = new TestHosts.IntegrationServerApplicationFactory ()
83-
use httpClient = factory.CreateClient ()
81+
use httpClient = TestHosts.createIntegrationHttpClient ()
8482
let! sourceStream = httpClient.GetStreamAsync("/")
8583
let! _ = updateIntrospectionFileAsync CancellationToken.None sourceStream
8684
Assert.True(File.Exists introspectionFilePath)

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,40 @@ module FSharp.Data.GraphQL.IntegrationTests.TestHosts
33
open FSharp.Data.GraphQL
44
open Microsoft.AspNetCore.Mvc.Testing
55
open System.Net.Http
6+
open System
67

78
type IntegrationServerApplicationFactory () =
89
inherit WebApplicationFactory<FSharp.Data.GraphQL.IntegrationTests.Server.Startup> ()
910

1011
type StarWarsApplicationFactory () =
1112
inherit WebApplicationFactory<FSharp.Data.GraphQL.Samples.StarWarsApi.Startup> ()
1213

14+
let private integrationFactory = lazy (new IntegrationServerApplicationFactory ())
15+
let private starWarsFactory = lazy (new StarWarsApplicationFactory ())
16+
1317
let private integrationClient : Lazy<HttpClient> =
14-
lazy
15-
(let factory = new IntegrationServerApplicationFactory ()
16-
factory.CreateClient ())
18+
lazy (integrationFactory.Value.CreateClient ())
1719

1820
let private starWarsClient : Lazy<HttpClient> =
19-
lazy
20-
(let factory = new StarWarsApplicationFactory ()
21-
factory.CreateClient ())
21+
lazy (starWarsFactory.Value.CreateClient ())
22+
23+
do
24+
AppDomain.CurrentDomain.ProcessExit.Add(fun _ ->
25+
if integrationClient.IsValueCreated then
26+
integrationClient.Value.Dispose ()
27+
28+
if starWarsClient.IsValueCreated then
29+
starWarsClient.Value.Dispose ()
30+
31+
if integrationFactory.IsValueCreated then
32+
integrationFactory.Value.Dispose ()
33+
34+
if starWarsFactory.IsValueCreated then
35+
starWarsFactory.Value.Dispose ())
2236

2337
let integrationServerUrl = integrationClient.Value.BaseAddress.ToString().TrimEnd '/'
2438
let starWarsServerUrl = starWarsClient.Value.BaseAddress.ToString().TrimEnd '/'
2539

2640
let createIntegrationConnection () = new GraphQLClientConnection (integrationClient.Value)
2741
let createStarWarsConnection () = new GraphQLClientConnection (starWarsClient.Value)
42+
let createIntegrationHttpClient () = integrationFactory.Value.CreateClient ()

0 commit comments

Comments
 (0)