@@ -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}
0 commit comments