mirror of
				https://github.com/JKorf/CryptoExchange.Net
				synced 2025-10-31 10:27:48 +00:00 
			
		
		
		
	commit 90f285d7f6bcd926ce9ca3d5832b1d70a5eae6ab
Author: JKorf <jankorf91@gmail.com>
Date:   Sun Jun 25 19:51:12 2023 +0200
    Docs
commit 72187035c703d1402b37bd2f4c3e066706f28d67
Author: JKorf <jankorf91@gmail.com>
Date:   Sat Jun 24 16:02:53 2023 +0200
    docs
commit 8411977292f1fb0b6e0705b1ad675b79a5311d90
Author: JKorf <jankorf91@gmail.com>
Date:   Fri Jun 23 18:25:15 2023 +0200
    wip
commit cb7d33aad5d2751104c8b8a6c6eadbf0d36b672c
Author: JKorf <jankorf91@gmail.com>
Date:   Fri Jun 2 19:26:26 2023 +0200
    wip
commit 4359a2d05ea1141cff516dab18f364a6ca854e18
Author: JKorf <jankorf91@gmail.com>
Date:   Wed May 31 20:51:36 2023 +0200
    wip
commit c6adb1b2f728d143f6bd667139c619581122a3c9
Author: JKorf <jankorf91@gmail.com>
Date:   Mon May 1 21:13:47 2023 +0200
    wip
commit 7fee733f82fa6ff574030452f0955c9e817647dd
Author: JKorf <jankorf91@gmail.com>
Date:   Thu Apr 27 13:02:56 2023 +0200
    wip
commit f8057313ffc9b0c31effcda71d35d105ea390971
Author: JKorf <jankorf91@gmail.com>
Date:   Mon Apr 17 21:37:51 2023 +0200
    wip
		
	
			
		
			
				
	
	
		
			215 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using CryptoExchange.Net.Interfaces;
 | |
| using CryptoExchange.Net.Objects;
 | |
| using Moq;
 | |
| using Newtonsoft.Json.Linq;
 | |
| using System;
 | |
| using System.IO;
 | |
| using System.Net;
 | |
| using System.Net.Http;
 | |
| using System.Reflection;
 | |
| using System.Text;
 | |
| using System.Threading;
 | |
| using System.Threading.Tasks;
 | |
| using CryptoExchange.Net.Authentication;
 | |
| using System.Collections.Generic;
 | |
| using CryptoExchange.Net.Objects.Options;
 | |
| using Microsoft.Extensions.Logging;
 | |
| 
 | |
| namespace CryptoExchange.Net.UnitTests.TestImplementations
 | |
| {
 | |
|     public class TestRestClient: BaseRestClient
 | |
|     {
 | |
|         public TestRestApi1Client Api1 { get; }
 | |
|         public TestRestApi2Client Api2 { get; }
 | |
| 
 | |
|         public TestRestClient(Action<TestClientOptions> optionsFunc) : this(optionsFunc, null)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public TestRestClient(ILoggerFactory loggerFactory = null, HttpClient httpClient = null) : this((x) => { }, httpClient, loggerFactory)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public TestRestClient(Action<TestClientOptions> optionsFunc, HttpClient httpClient = null, ILoggerFactory loggerFactory = null) : base(loggerFactory, "Test")
 | |
|         {
 | |
|             var options = TestClientOptions.Default.Copy();
 | |
|             optionsFunc(options);
 | |
|             Initialize(options);
 | |
| 
 | |
|             Api1 = new TestRestApi1Client(options);
 | |
|             Api2 = new TestRestApi2Client(options);
 | |
|         }
 | |
| 
 | |
|         public void SetResponse(string responseData, out IRequest requestObj)
 | |
|         {
 | |
|             var expectedBytes = Encoding.UTF8.GetBytes(responseData);
 | |
|             var responseStream = new MemoryStream();
 | |
|             responseStream.Write(expectedBytes, 0, expectedBytes.Length);
 | |
|             responseStream.Seek(0, SeekOrigin.Begin);
 | |
| 
 | |
|             var response = new Mock<IResponse>();
 | |
|             response.Setup(c => c.IsSuccessStatusCode).Returns(true);
 | |
|             response.Setup(c => c.GetResponseStreamAsync()).Returns(Task.FromResult((Stream)responseStream));
 | |
|             
 | |
|             var headers = new Dictionary<string, IEnumerable<string>>();
 | |
|             var request = new Mock<IRequest>();
 | |
|             request.Setup(c => c.Uri).Returns(new Uri("http://www.test.com"));
 | |
|             request.Setup(c => c.GetResponseAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult(response.Object));
 | |
|             request.Setup(c => c.SetContent(It.IsAny<string>(), It.IsAny<string>())).Callback(new Action<string, string>((content, type) => { request.Setup(r => r.Content).Returns(content); }));
 | |
|             request.Setup(c => c.AddHeader(It.IsAny<string>(), It.IsAny<string>())).Callback<string, string>((key, val) => headers.Add(key, new List<string> { val }));
 | |
|             request.Setup(c => c.GetHeaders()).Returns(() => headers);
 | |
| 
 | |
|             var factory = Mock.Get(Api1.RequestFactory);
 | |
|             factory.Setup(c => c.Create(It.IsAny<HttpMethod>(), It.IsAny<Uri>(), It.IsAny<int>()))
 | |
|                 .Callback<HttpMethod, Uri, int>((method, uri, id) => 
 | |
|                 { 
 | |
|                     request.Setup(a => a.Uri).Returns(uri);
 | |
|                     request.Setup(a => a.Method).Returns(method); 
 | |
|                 })
 | |
|                 .Returns(request.Object);
 | |
| 
 | |
|             factory = Mock.Get(Api2.RequestFactory);
 | |
|             factory.Setup(c => c.Create(It.IsAny<HttpMethod>(), It.IsAny<Uri>(), It.IsAny<int>()))
 | |
|                 .Callback<HttpMethod, Uri, int>((method, uri, id) =>
 | |
|                 {
 | |
|                     request.Setup(a => a.Uri).Returns(uri);
 | |
|                     request.Setup(a => a.Method).Returns(method);
 | |
|                 })
 | |
|                 .Returns(request.Object);
 | |
|             requestObj = request.Object;
 | |
|         }
 | |
| 
 | |
|         public void SetErrorWithoutResponse(HttpStatusCode code, string message)
 | |
|         {
 | |
|             var we = new HttpRequestException();
 | |
|             typeof(HttpRequestException).GetField("_message", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(we, message);
 | |
|            
 | |
|             var request = new Mock<IRequest>();
 | |
|             request.Setup(c => c.Uri).Returns(new Uri("http://www.test.com"));
 | |
|             request.Setup(c => c.GetHeaders()).Returns(new Dictionary<string, IEnumerable<string>>());
 | |
|             request.Setup(c => c.GetResponseAsync(It.IsAny<CancellationToken>())).Throws(we);
 | |
| 
 | |
|             var factory = Mock.Get(Api1.RequestFactory);
 | |
|             factory.Setup(c => c.Create(It.IsAny<HttpMethod>(), It.IsAny<Uri>(), It.IsAny<int>()))
 | |
|                 .Returns(request.Object);
 | |
| 
 | |
| 
 | |
|             factory = Mock.Get(Api2.RequestFactory);
 | |
|             factory.Setup(c => c.Create(It.IsAny<HttpMethod>(), It.IsAny<Uri>(), It.IsAny<int>()))
 | |
|                 .Returns(request.Object);
 | |
|         }
 | |
| 
 | |
|         public void SetErrorWithResponse(string responseData, HttpStatusCode code)
 | |
|         {
 | |
|             var expectedBytes = Encoding.UTF8.GetBytes(responseData);
 | |
|             var responseStream = new MemoryStream();
 | |
|             responseStream.Write(expectedBytes, 0, expectedBytes.Length);
 | |
|             responseStream.Seek(0, SeekOrigin.Begin);
 | |
| 
 | |
|             var response = new Mock<IResponse>();
 | |
|             response.Setup(c => c.IsSuccessStatusCode).Returns(false);
 | |
|             response.Setup(c => c.GetResponseStreamAsync()).Returns(Task.FromResult((Stream)responseStream));
 | |
| 
 | |
|             var headers = new Dictionary<string, IEnumerable<string>>();
 | |
|             var request = new Mock<IRequest>();
 | |
|             request.Setup(c => c.Uri).Returns(new Uri("http://www.test.com"));
 | |
|             request.Setup(c => c.GetResponseAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult(response.Object));
 | |
|             request.Setup(c => c.AddHeader(It.IsAny<string>(), It.IsAny<string>())).Callback<string, string>((key, val) => headers.Add(key, new List<string> { val }));
 | |
|             request.Setup(c => c.GetHeaders()).Returns(headers);
 | |
| 
 | |
|             var factory = Mock.Get(Api1.RequestFactory);
 | |
|             factory.Setup(c => c.Create(It.IsAny<HttpMethod>(), It.IsAny<Uri>(), It.IsAny<int>()))
 | |
|                 .Callback<HttpMethod, Uri, int>((method, uri, id) => request.Setup(a => a.Uri).Returns(uri))
 | |
|                 .Returns(request.Object);
 | |
| 
 | |
|             factory = Mock.Get(Api2.RequestFactory);
 | |
|             factory.Setup(c => c.Create(It.IsAny<HttpMethod>(), It.IsAny<Uri>(), It.IsAny<int>()))
 | |
|                 .Callback<HttpMethod, Uri, int>((method, uri, id) => request.Setup(a => a.Uri).Returns(uri))
 | |
|                 .Returns(request.Object);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public class TestRestApi1Client : RestApiClient
 | |
|     {
 | |
|         public TestRestApi1Client(TestClientOptions options) : base(new TraceLogger(), null, "https://localhost:123", options, options.Api1Options)
 | |
|         {
 | |
|             RequestFactory = new Mock<IRequestFactory>().Object;
 | |
|         }
 | |
| 
 | |
|         public async Task<CallResult<T>> Request<T>(CancellationToken ct = default) where T : class
 | |
|         {
 | |
|             return await SendRequestAsync<T>(new Uri("http://www.test.com"), HttpMethod.Get, ct);
 | |
|         }
 | |
| 
 | |
|         public async Task<CallResult<T>> RequestWithParams<T>(HttpMethod method, Dictionary<string, object> parameters, Dictionary<string, string> headers) where T : class
 | |
|         {
 | |
|             return await SendRequestAsync<T>(new Uri("http://www.test.com"), method, default, parameters, additionalHeaders: headers);
 | |
|         }
 | |
| 
 | |
|         public void SetParameterPosition(HttpMethod method, HttpMethodParameterPosition position)
 | |
|         {
 | |
|             ParameterPositions[method] = position;
 | |
|         }
 | |
| 
 | |
|         public override TimeSpan? GetTimeOffset()
 | |
|         {
 | |
|             throw new NotImplementedException();
 | |
|         }
 | |
| 
 | |
|         protected override AuthenticationProvider CreateAuthenticationProvider(ApiCredentials credentials)
 | |
|             => new TestAuthProvider(credentials);
 | |
| 
 | |
|         protected override Task<WebCallResult<DateTime>> GetServerTimestampAsync()
 | |
|         {
 | |
|             throw new NotImplementedException();
 | |
|         }
 | |
| 
 | |
|         public override TimeSyncInfo GetTimeSyncInfo()
 | |
|         {
 | |
|             throw new NotImplementedException();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public class TestRestApi2Client : RestApiClient
 | |
|     {
 | |
|         public TestRestApi2Client(TestClientOptions options) : base(new TraceLogger(), null, "https://localhost:123", options, options.Api2Options)
 | |
|         {
 | |
|             RequestFactory = new Mock<IRequestFactory>().Object;
 | |
|         }
 | |
| 
 | |
|         public async Task<CallResult<T>> Request<T>(CancellationToken ct = default) where T : class
 | |
|         {
 | |
|             return await SendRequestAsync<T>(new Uri("http://www.test.com"), HttpMethod.Get, ct);
 | |
|         }
 | |
| 
 | |
|         protected override Error ParseErrorResponse(JToken error)
 | |
|         {
 | |
|             return new ServerError((int)error["errorCode"], (string)error["errorMessage"]);
 | |
|         }
 | |
| 
 | |
|         public override TimeSpan? GetTimeOffset()
 | |
|         {
 | |
|             throw new NotImplementedException();
 | |
|         }
 | |
| 
 | |
|         protected override AuthenticationProvider CreateAuthenticationProvider(ApiCredentials credentials)
 | |
|             => new TestAuthProvider(credentials);
 | |
| 
 | |
|         protected override Task<WebCallResult<DateTime>> GetServerTimestampAsync()
 | |
|         {
 | |
|             throw new NotImplementedException();
 | |
|         }
 | |
| 
 | |
|         public override TimeSyncInfo GetTimeSyncInfo()
 | |
|         {
 | |
|             throw new NotImplementedException();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public class ParseErrorTestRestClient: TestRestClient
 | |
|     {
 | |
|         public ParseErrorTestRestClient() { }
 | |
| 
 | |
|     }
 | |
| }
 |