Skip to content

Commit 34116ce

Browse files
All tests pass!
1 parent bfb0724 commit 34116ce

File tree

14 files changed

+1319
-798
lines changed

14 files changed

+1319
-798
lines changed

RestClient.Net.CsTest/HttpClientFactoryExtensionsTests.cs

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,4 +1686,216 @@ public async Task CreatePatch_CancellationToken_CancelsRequest()
16861686

16871687
Assert.IsInstanceOfType<TaskCanceledException>(exception);
16881688
}
1689+
1690+
[TestMethod]
1691+
public async Task CreateHead_ReturnsSuccessResult()
1692+
{
1693+
// Arrange
1694+
var expectedContent = "Head Success";
1695+
using var response = new HttpResponseMessage(HttpStatusCode.OK)
1696+
{
1697+
Content = new StringContent(expectedContent),
1698+
};
1699+
using var httpClient = CreateMockHttpClientFactory(response: response).CreateClient();
1700+
1701+
var head = CreateHead<string, MyErrorModel, int>(
1702+
url: "http://test.com".ToAbsoluteUrl(),
1703+
buildRequest: id => new HttpRequestParts(
1704+
RelativeUrl: new RelativeUrl($"/items/{id}"),
1705+
Body: null,
1706+
Headers: null
1707+
),
1708+
deserializeSuccess: TestDeserializer.Deserialize<string>,
1709+
deserializeError: TestDeserializer.Deserialize<MyErrorModel>
1710+
);
1711+
1712+
// Act
1713+
var result = await head(httpClient, 123).ConfigureAwait(false);
1714+
1715+
// Assert
1716+
var successValue = +result;
1717+
Assert.AreEqual(expectedContent, successValue);
1718+
}
1719+
1720+
[TestMethod]
1721+
public async Task CreateHead_ErrorResponse_ReturnsFailureResult()
1722+
{
1723+
// Arrange
1724+
var expectedErrorContent = "Head Failed";
1725+
using var errorResponse = new HttpResponseMessage(HttpStatusCode.BadRequest)
1726+
{
1727+
Content = new StringContent( /*lang=json,strict*/
1728+
"{\"message\":\"Head Failed\"}"
1729+
),
1730+
};
1731+
using var httpClient = CreateMockHttpClientFactory(response: errorResponse).CreateClient();
1732+
1733+
var head = CreateHead<string, MyErrorModel, int>(
1734+
url: "http://test.com".ToAbsoluteUrl(),
1735+
buildRequest: id => new HttpRequestParts(
1736+
RelativeUrl: new RelativeUrl($"/items/{id}"),
1737+
Body: null,
1738+
Headers: null
1739+
),
1740+
deserializeSuccess: TestDeserializer.Deserialize<string>,
1741+
deserializeError: TestDeserializer.Deserialize<MyErrorModel>
1742+
);
1743+
1744+
// Act
1745+
var result = await head(httpClient, 123).ConfigureAwait(false);
1746+
1747+
// Assert
1748+
var httpError = !result;
1749+
if (httpError is not ResponseError(var body, var statusCode, var headers))
1750+
{
1751+
throw new InvalidOperationException("Expected error response");
1752+
}
1753+
1754+
Assert.AreEqual(HttpStatusCode.BadRequest, statusCode);
1755+
Assert.AreEqual(expectedErrorContent, body.Message);
1756+
}
1757+
1758+
[TestMethod]
1759+
public async Task CreateHead_CancellationToken_CancelsRequest()
1760+
{
1761+
// Arrange
1762+
using var cts = new CancellationTokenSource();
1763+
using var httpClient = CreateMockHttpClientFactory(
1764+
exceptionToThrow: new TaskCanceledException()
1765+
)
1766+
.CreateClient();
1767+
1768+
var head = CreateHead<string, MyErrorModel, int>(
1769+
url: "http://test.com".ToAbsoluteUrl(),
1770+
buildRequest: id => new HttpRequestParts(
1771+
RelativeUrl: new RelativeUrl($"/items/{id}"),
1772+
Body: null,
1773+
Headers: null
1774+
),
1775+
deserializeSuccess: TestDeserializer.Deserialize<string>,
1776+
deserializeError: TestDeserializer.Deserialize<MyErrorModel>
1777+
);
1778+
1779+
await cts.CancelAsync().ConfigureAwait(false);
1780+
1781+
// Act
1782+
var result = await head(httpClient, 123, cts.Token).ConfigureAwait(false);
1783+
1784+
// Assert
1785+
var exception = !result switch
1786+
{
1787+
ExceptionError(var ex) => ex,
1788+
ResponseError(var b, var sc, var h) => throw new InvalidOperationException(
1789+
"Expected exception error"
1790+
),
1791+
};
1792+
1793+
Assert.IsInstanceOfType<TaskCanceledException>(exception);
1794+
}
1795+
1796+
[TestMethod]
1797+
public async Task CreateOptions_ReturnsSuccessResult()
1798+
{
1799+
// Arrange
1800+
var expectedContent = "Options Success";
1801+
using var response = new HttpResponseMessage(HttpStatusCode.OK)
1802+
{
1803+
Content = new StringContent(expectedContent),
1804+
};
1805+
using var httpClient = CreateMockHttpClientFactory(response: response).CreateClient();
1806+
1807+
var options = CreateOptions<string, MyErrorModel, int>(
1808+
url: "http://test.com".ToAbsoluteUrl(),
1809+
buildRequest: id => new HttpRequestParts(
1810+
RelativeUrl: new RelativeUrl($"/items/{id}"),
1811+
Body: null,
1812+
Headers: null
1813+
),
1814+
deserializeSuccess: TestDeserializer.Deserialize<string>,
1815+
deserializeError: TestDeserializer.Deserialize<MyErrorModel>
1816+
);
1817+
1818+
// Act
1819+
var result = await options(httpClient, 123).ConfigureAwait(false);
1820+
1821+
// Assert
1822+
var successValue = +result;
1823+
Assert.AreEqual(expectedContent, successValue);
1824+
}
1825+
1826+
[TestMethod]
1827+
public async Task CreateOptions_ErrorResponse_ReturnsFailureResult()
1828+
{
1829+
// Arrange
1830+
var expectedErrorContent = "Options Failed";
1831+
using var errorResponse = new HttpResponseMessage(HttpStatusCode.BadRequest)
1832+
{
1833+
Content = new StringContent( /*lang=json,strict*/
1834+
"{\"message\":\"Options Failed\"}"
1835+
),
1836+
};
1837+
using var httpClient = CreateMockHttpClientFactory(response: errorResponse).CreateClient();
1838+
1839+
var options = CreateOptions<string, MyErrorModel, int>(
1840+
url: "http://test.com".ToAbsoluteUrl(),
1841+
buildRequest: id => new HttpRequestParts(
1842+
RelativeUrl: new RelativeUrl($"/items/{id}"),
1843+
Body: null,
1844+
Headers: null
1845+
),
1846+
deserializeSuccess: TestDeserializer.Deserialize<string>,
1847+
deserializeError: TestDeserializer.Deserialize<MyErrorModel>
1848+
);
1849+
1850+
// Act
1851+
var result = await options(httpClient, 123).ConfigureAwait(false);
1852+
1853+
// Assert
1854+
var httpError = !result;
1855+
if (httpError is not ResponseError(var body, var statusCode, var headers))
1856+
{
1857+
throw new InvalidOperationException("Expected error response");
1858+
}
1859+
1860+
Assert.AreEqual(HttpStatusCode.BadRequest, statusCode);
1861+
Assert.AreEqual(expectedErrorContent, body.Message);
1862+
}
1863+
1864+
[TestMethod]
1865+
public async Task CreateOptions_CancellationToken_CancelsRequest()
1866+
{
1867+
// Arrange
1868+
using var cts = new CancellationTokenSource();
1869+
using var httpClient = CreateMockHttpClientFactory(
1870+
exceptionToThrow: new TaskCanceledException()
1871+
)
1872+
.CreateClient();
1873+
1874+
var options = CreateOptions<string, MyErrorModel, int>(
1875+
url: "http://test.com".ToAbsoluteUrl(),
1876+
buildRequest: id => new HttpRequestParts(
1877+
RelativeUrl: new RelativeUrl($"/items/{id}"),
1878+
Body: null,
1879+
Headers: null
1880+
),
1881+
deserializeSuccess: TestDeserializer.Deserialize<string>,
1882+
deserializeError: TestDeserializer.Deserialize<MyErrorModel>
1883+
);
1884+
1885+
await cts.CancelAsync().ConfigureAwait(false);
1886+
1887+
// Act
1888+
var result = await options(httpClient, 123, cts.Token).ConfigureAwait(false);
1889+
1890+
// Assert
1891+
var exception = !result switch
1892+
{
1893+
ExceptionError(var ex) => ex,
1894+
ResponseError(var b, var sc, var h) => throw new InvalidOperationException(
1895+
"Expected exception error"
1896+
),
1897+
};
1898+
1899+
Assert.IsInstanceOfType<TaskCanceledException>(exception);
1900+
}
16891901
}

RestClient.Net.OpenApiGenerator.Tests/OpenApiCodeGeneratorTests.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,14 @@ public void Generate_CreatesCorrectBaseUrl()
214214
)
215215
);
216216

217-
Assert.IsTrue(result.ExtensionMethodsCode.Contains("\"https://api.test.com\""));
218-
Assert.IsFalse(result.ExtensionMethodsCode.Contains("\"/v1\""));
217+
Assert.IsTrue(
218+
result.ExtensionMethodsCode.Contains("\"https://api.test.com\""),
219+
$"Missing base URL. Generated code:\n{result.ExtensionMethodsCode.Substring(0, Math.Min(1000, result.ExtensionMethodsCode.Length))}"
220+
);
221+
Assert.IsFalse(
222+
result.ExtensionMethodsCode.Contains("\"/v1\""),
223+
$"Found /v1 in generated code"
224+
);
219225
}
220226

221227
[TestMethod]
@@ -246,7 +252,7 @@ public void Generate_IncludesQueryParameters()
246252
)
247253
);
248254

249-
Assert.IsTrue(result.ExtensionMethodsCode.Contains("int limit"));
255+
Assert.IsTrue(result.ExtensionMethodsCode.Contains("int? limit"));
250256
Assert.IsTrue(result.ExtensionMethodsCode.Contains("?limit={param}"));
251257
}
252258

@@ -264,9 +270,13 @@ public void Generate_HandlesPathAndQueryParametersTogether()
264270

265271
Assert.IsTrue(
266272
result.ExtensionMethodsCode.Contains("string apiKey")
267-
&& result.ExtensionMethodsCode.Contains("long petId")
273+
&& result.ExtensionMethodsCode.Contains("long petId"),
274+
$"Missing parameters. Code:\n{result.ExtensionMethodsCode}"
275+
);
276+
Assert.IsTrue(
277+
result.ExtensionMethodsCode.Contains("?api_key={param.apiKey}"),
278+
$"Missing direct interpolation. Code:\n{result.ExtensionMethodsCode}"
268279
);
269-
Assert.IsTrue(result.ExtensionMethodsCode.Contains("?api_key={param.apiKey}"));
270280
}
271281

272282
[TestMethod]
@@ -506,7 +516,7 @@ public void Generate_CreatesPrivateStaticFuncFields()
506516
// Verify that public methods call the private delegates with HttpClient as first parameter
507517
Assert.IsTrue(
508518
result.ExtensionMethodsCode.Contains("(httpClient,")
509-
&& result.ExtensionMethodsCode.Contains(", ct)")
519+
&& result.ExtensionMethodsCode.Contains(", cancellationToken)")
510520
);
511521
}
512522
}

0 commit comments

Comments
 (0)