Skip to content

Commit d47dd5b

Browse files
committed
Add missing end-to-end tests for Location and Content-Length HTTP headers
1 parent c653e11 commit d47dd5b

File tree

2 files changed

+364
-0
lines changed

2 files changed

+364
-0
lines changed
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
using FluentAssertions;
2+
using Microsoft.Kiota.Http.HttpClientLibrary;
3+
using Microsoft.Kiota.Http.HttpClientLibrary.Middleware.Options;
4+
using Microsoft.Net.Http.Headers;
5+
using OpenApiKiotaEndToEndTests.Headers.GeneratedCode;
6+
using OpenApiKiotaEndToEndTests.Headers.GeneratedCode.Models;
7+
using OpenApiTests;
8+
using OpenApiTests.Headers;
9+
using TestBuildingBlocks;
10+
using Xunit;
11+
using Xunit.Abstractions;
12+
13+
namespace OpenApiKiotaEndToEndTests.Headers;
14+
15+
public sealed class HeaderTests : IClassFixture<IntegrationTestContext<OpenApiStartup<HeaderDbContext>, HeaderDbContext>>
16+
{
17+
private readonly IntegrationTestContext<OpenApiStartup<HeaderDbContext>, HeaderDbContext> _testContext;
18+
private readonly TestableHttpClientRequestAdapterFactory _requestAdapterFactory;
19+
private readonly HeaderFakers _fakers = new();
20+
21+
public HeaderTests(IntegrationTestContext<OpenApiStartup<HeaderDbContext>, HeaderDbContext> testContext, ITestOutputHelper testOutputHelper)
22+
{
23+
_testContext = testContext;
24+
_requestAdapterFactory = new TestableHttpClientRequestAdapterFactory(testOutputHelper);
25+
26+
testContext.UseController<CountriesController>();
27+
}
28+
29+
[Fact]
30+
public async Task Returns_Location_for_post_resource_request()
31+
{
32+
// Arrange
33+
Country newCountry = _fakers.Country.Generate();
34+
35+
using HttpClientRequestAdapter requestAdapter = _requestAdapterFactory.CreateAdapter(_testContext.Factory);
36+
var apiClient = new HeadersClient(requestAdapter);
37+
38+
var headerInspector = new HeadersInspectionHandlerOption
39+
{
40+
InspectResponseHeaders = true
41+
};
42+
43+
var requestBody = new CountryPostRequestDocument
44+
{
45+
Data = new CountryDataInPostRequest
46+
{
47+
Type = CountryResourceType.Countries,
48+
Attributes = new CountryAttributesInPostRequest
49+
{
50+
Name = newCountry.Name,
51+
Population = newCountry.Population
52+
}
53+
}
54+
};
55+
56+
// Act
57+
CountryPrimaryResponseDocument? response =
58+
await apiClient.Countries.PostAsync(requestBody, configuration => configuration.Options.Add(headerInspector));
59+
60+
// Assert
61+
response.ShouldNotBeNull();
62+
response.Data.ShouldNotBeNull();
63+
64+
string[] locationHeaderValues = headerInspector.ResponseHeaders.Should().ContainKey(HeaderNames.Location).WhoseValue.ToArray();
65+
locationHeaderValues.ShouldHaveCount(1);
66+
locationHeaderValues[0].Should().Be($"/countries/{response.Data.Id}");
67+
}
68+
69+
[Fact]
70+
public async Task Returns_ContentLength_for_head_primary_resources_request()
71+
{
72+
// Arrange
73+
Country existingCountry = _fakers.Country.Generate();
74+
75+
await _testContext.RunOnDatabaseAsync(async dbContext =>
76+
{
77+
await dbContext.ClearTableAsync<Country>();
78+
dbContext.Countries.Add(existingCountry);
79+
await dbContext.SaveChangesAsync();
80+
});
81+
82+
using HttpClientRequestAdapter requestAdapter = _requestAdapterFactory.CreateAdapter(_testContext.Factory);
83+
var apiClient = new HeadersClient(requestAdapter);
84+
85+
var headerInspector = new HeadersInspectionHandlerOption
86+
{
87+
InspectResponseHeaders = true
88+
};
89+
90+
// Act
91+
Stream? response = await apiClient.Countries.HeadAsync(configuration => configuration.Options.Add(headerInspector));
92+
93+
// Assert
94+
response.Should().BeNull();
95+
96+
string[] contentLengthHeaderValues = headerInspector.ResponseHeaders.Should().ContainKey(HeaderNames.ContentLength).WhoseValue.ToArray();
97+
contentLengthHeaderValues.ShouldHaveCount(1);
98+
long.Parse(contentLengthHeaderValues[0]).Should().BeGreaterThan(0);
99+
}
100+
101+
[Fact]
102+
public async Task Returns_ContentLength_for_head_primary_resource_request()
103+
{
104+
// Arrange
105+
Country existingCountry = _fakers.Country.Generate();
106+
107+
await _testContext.RunOnDatabaseAsync(async dbContext =>
108+
{
109+
dbContext.Countries.Add(existingCountry);
110+
await dbContext.SaveChangesAsync();
111+
});
112+
113+
using HttpClientRequestAdapter requestAdapter = _requestAdapterFactory.CreateAdapter(_testContext.Factory);
114+
var apiClient = new HeadersClient(requestAdapter);
115+
116+
var headerInspector = new HeadersInspectionHandlerOption
117+
{
118+
InspectResponseHeaders = true
119+
};
120+
121+
// Act
122+
Stream? response = await apiClient.Countries[existingCountry.StringId].HeadAsync(configuration => configuration.Options.Add(headerInspector));
123+
124+
// Assert
125+
response.Should().BeNull();
126+
127+
string[] contentLengthHeaderValues = headerInspector.ResponseHeaders.Should().ContainKey(HeaderNames.ContentLength).WhoseValue.ToArray();
128+
contentLengthHeaderValues.ShouldHaveCount(1);
129+
long.Parse(contentLengthHeaderValues[0]).Should().BeGreaterThan(0);
130+
}
131+
132+
[Fact]
133+
public async Task Returns_ContentLength_for_head_secondary_resource_request()
134+
{
135+
// Arrange
136+
Country existingCountry = _fakers.Country.Generate();
137+
existingCountry.Languages = _fakers.Language.Generate(1).ToHashSet();
138+
139+
await _testContext.RunOnDatabaseAsync(async dbContext =>
140+
{
141+
dbContext.Countries.Add(existingCountry);
142+
await dbContext.SaveChangesAsync();
143+
});
144+
145+
using HttpClientRequestAdapter requestAdapter = _requestAdapterFactory.CreateAdapter(_testContext.Factory);
146+
var apiClient = new HeadersClient(requestAdapter);
147+
148+
var headerInspector = new HeadersInspectionHandlerOption
149+
{
150+
InspectResponseHeaders = true
151+
};
152+
153+
// Act
154+
Stream? response = await apiClient.Countries[existingCountry.StringId].Languages.HeadAsync(configuration => configuration.Options.Add(headerInspector));
155+
156+
// Assert
157+
response.Should().BeNull();
158+
159+
string[] contentLengthHeaderValues = headerInspector.ResponseHeaders.Should().ContainKey(HeaderNames.ContentLength).WhoseValue.ToArray();
160+
contentLengthHeaderValues.ShouldHaveCount(1);
161+
long.Parse(contentLengthHeaderValues[0]).Should().BeGreaterThan(0);
162+
}
163+
164+
[Fact]
165+
public async Task Returns_ContentLength_for_head_relationship_request()
166+
{
167+
// Arrange
168+
Country existingCountry = _fakers.Country.Generate();
169+
existingCountry.Languages = _fakers.Language.Generate(1).ToHashSet();
170+
171+
await _testContext.RunOnDatabaseAsync(async dbContext =>
172+
{
173+
dbContext.Countries.Add(existingCountry);
174+
await dbContext.SaveChangesAsync();
175+
});
176+
177+
using HttpClientRequestAdapter requestAdapter = _requestAdapterFactory.CreateAdapter(_testContext.Factory);
178+
var apiClient = new HeadersClient(requestAdapter);
179+
180+
var headerInspector = new HeadersInspectionHandlerOption
181+
{
182+
InspectResponseHeaders = true
183+
};
184+
185+
// Act
186+
Stream? response = await apiClient.Countries[existingCountry.StringId].Relationships.Languages
187+
.HeadAsync(configuration => configuration.Options.Add(headerInspector));
188+
189+
// Assert
190+
response.Should().BeNull();
191+
192+
string[] contentLengthHeaderValues = headerInspector.ResponseHeaders.Should().ContainKey(HeaderNames.ContentLength).WhoseValue.ToArray();
193+
contentLengthHeaderValues.ShouldHaveCount(1);
194+
long.Parse(contentLengthHeaderValues[0]).Should().BeGreaterThan(0);
195+
}
196+
}
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
using System.Net;
2+
using FluentAssertions;
3+
using JsonApiDotNetCore.OpenApi.Client.NSwag;
4+
using Microsoft.Net.Http.Headers;
5+
using OpenApiNSwagEndToEndTests.Headers.GeneratedCode;
6+
using OpenApiTests;
7+
using OpenApiTests.Headers;
8+
using TestBuildingBlocks;
9+
using Xunit;
10+
using Xunit.Abstractions;
11+
12+
namespace OpenApiNSwagEndToEndTests.Headers;
13+
14+
public sealed class HeaderTests : IClassFixture<IntegrationTestContext<OpenApiStartup<HeaderDbContext>, HeaderDbContext>>
15+
{
16+
private readonly IntegrationTestContext<OpenApiStartup<HeaderDbContext>, HeaderDbContext> _testContext;
17+
private readonly XUnitLogHttpMessageHandler _logHttpMessageHandler;
18+
private readonly HeaderFakers _fakers = new();
19+
20+
public HeaderTests(IntegrationTestContext<OpenApiStartup<HeaderDbContext>, HeaderDbContext> testContext, ITestOutputHelper testOutputHelper)
21+
{
22+
_testContext = testContext;
23+
_logHttpMessageHandler = new XUnitLogHttpMessageHandler(testOutputHelper);
24+
25+
testContext.UseController<CountriesController>();
26+
}
27+
28+
[Fact]
29+
public async Task Returns_Location_for_post_resource_request()
30+
{
31+
// Arrange
32+
Country newCountry = _fakers.Country.Generate();
33+
34+
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
35+
var apiClient = new HeadersClient(httpClient);
36+
37+
var requestBody = new CountryPostRequestDocument
38+
{
39+
Data = new CountryDataInPostRequest
40+
{
41+
Attributes = new CountryAttributesInPostRequest
42+
{
43+
Name = newCountry.Name,
44+
Population = newCountry.Population
45+
}
46+
}
47+
};
48+
49+
// Act
50+
ApiResponse<CountryPrimaryResponseDocument?> response = await ApiResponse.TranslateAsync(() => apiClient.PostCountryAsync(null, requestBody));
51+
52+
// Assert
53+
response.StatusCode.Should().Be((int)HttpStatusCode.Created);
54+
55+
response.Result.ShouldNotBeNull();
56+
57+
string[] locationHeaderValues = response.Headers.Should().ContainKey(HeaderNames.Location).WhoseValue.ToArray();
58+
locationHeaderValues.ShouldHaveCount(1);
59+
locationHeaderValues[0].Should().Be($"/countries/{response.Result.Data.Id}");
60+
}
61+
62+
[Fact]
63+
public async Task Returns_ContentLength_for_head_primary_resources_request()
64+
{
65+
// Arrange
66+
Country existingCountry = _fakers.Country.Generate();
67+
68+
await _testContext.RunOnDatabaseAsync(async dbContext =>
69+
{
70+
await dbContext.ClearTableAsync<Country>();
71+
dbContext.Countries.Add(existingCountry);
72+
await dbContext.SaveChangesAsync();
73+
});
74+
75+
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
76+
var apiClient = new HeadersClient(httpClient);
77+
78+
// Act
79+
ApiResponse response = await ApiResponse.TranslateAsync(() => apiClient.HeadCountryCollectionAsync(null, null));
80+
81+
// Assert
82+
response.StatusCode.Should().Be((int)HttpStatusCode.OK);
83+
84+
string[] contentLengthHeaderValues = response.Headers.Should().ContainKey(HeaderNames.ContentLength).WhoseValue.ToArray();
85+
contentLengthHeaderValues.ShouldHaveCount(1);
86+
long.Parse(contentLengthHeaderValues[0]).Should().BeGreaterThan(0);
87+
}
88+
89+
[Fact]
90+
public async Task Returns_ContentLength_for_head_primary_resource_request()
91+
{
92+
// Arrange
93+
Country existingCountry = _fakers.Country.Generate();
94+
95+
await _testContext.RunOnDatabaseAsync(async dbContext =>
96+
{
97+
dbContext.Countries.Add(existingCountry);
98+
await dbContext.SaveChangesAsync();
99+
});
100+
101+
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
102+
var apiClient = new HeadersClient(httpClient);
103+
104+
// Act
105+
ApiResponse response = await ApiResponse.TranslateAsync(() => apiClient.HeadCountryAsync(existingCountry.StringId!, null, null));
106+
107+
// Assert
108+
response.StatusCode.Should().Be((int)HttpStatusCode.OK);
109+
110+
string[] contentLengthHeaderValues = response.Headers.Should().ContainKey(HeaderNames.ContentLength).WhoseValue.ToArray();
111+
contentLengthHeaderValues.ShouldHaveCount(1);
112+
long.Parse(contentLengthHeaderValues[0]).Should().BeGreaterThan(0);
113+
}
114+
115+
[Fact]
116+
public async Task Returns_ContentLength_for_head_secondary_resource_request()
117+
{
118+
// Arrange
119+
Country existingCountry = _fakers.Country.Generate();
120+
existingCountry.Languages = _fakers.Language.Generate(1).ToHashSet();
121+
122+
await _testContext.RunOnDatabaseAsync(async dbContext =>
123+
{
124+
dbContext.Countries.Add(existingCountry);
125+
await dbContext.SaveChangesAsync();
126+
});
127+
128+
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
129+
var apiClient = new HeadersClient(httpClient);
130+
131+
// Act
132+
ApiResponse response = await ApiResponse.TranslateAsync(() => apiClient.HeadCountryLanguagesAsync(existingCountry.StringId!, null, null));
133+
134+
// Assert
135+
response.StatusCode.Should().Be((int)HttpStatusCode.OK);
136+
137+
string[] contentLengthHeaderValues = response.Headers.Should().ContainKey(HeaderNames.ContentLength).WhoseValue.ToArray();
138+
contentLengthHeaderValues.ShouldHaveCount(1);
139+
long.Parse(contentLengthHeaderValues[0]).Should().BeGreaterThan(0);
140+
}
141+
142+
[Fact]
143+
public async Task Returns_ContentLength_for_head_relationship_request()
144+
{
145+
// Arrange
146+
Country existingCountry = _fakers.Country.Generate();
147+
existingCountry.Languages = _fakers.Language.Generate(1).ToHashSet();
148+
149+
await _testContext.RunOnDatabaseAsync(async dbContext =>
150+
{
151+
dbContext.Countries.Add(existingCountry);
152+
await dbContext.SaveChangesAsync();
153+
});
154+
155+
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
156+
var apiClient = new HeadersClient(httpClient);
157+
158+
// Act
159+
ApiResponse response = await ApiResponse.TranslateAsync(() => apiClient.HeadCountryLanguagesRelationshipAsync(existingCountry.StringId!, null, null));
160+
161+
// Assert
162+
response.StatusCode.Should().Be((int)HttpStatusCode.OK);
163+
164+
string[] contentLengthHeaderValues = response.Headers.Should().ContainKey(HeaderNames.ContentLength).WhoseValue.ToArray();
165+
contentLengthHeaderValues.ShouldHaveCount(1);
166+
long.Parse(contentLengthHeaderValues[0]).Should().BeGreaterThan(0);
167+
}
168+
}

0 commit comments

Comments
 (0)