public void WebSocketSubscribe_ShouldReturnTrue() { //Arrange List <Product> products = new List <Product> { new Product { ID = "BTC-EUR", BaseCurrency = "BTC", QuoteCurrency = "EUR", BaseMinSize = "0.001", BaseMaxSize = "10000.00", QuoteIncrement = "0.01" }, new Product { ID = "ETH-EUR", BaseCurrency = "ETH", QuoteCurrency = "EUR", BaseMinSize = "0.001", BaseMaxSize = "10000.00", QuoteIncrement = "0.01" } }; HttpClient httpClient = new HttpClient(); ClientWebSocket clientWebSocket = new ClientWebSocket(); Mock <ConnectionAdapter> connectionFactoryMock = new Mock <ConnectionAdapter>(MockBehavior.Strict, httpClient); connectionFactoryMock.Setup(x => x.WebSocketSendAsync(products.ToSubscribeString())) .ReturnsAsync( @"{""type"":""subscriptions"",""channels"":[{""name"":""ticker"",""product_ids"":[""BTC-EUR"",""ETH-EUR""]}]}"); connectionFactoryMock.Setup(x => x.IsWebSocketConnected()).Returns(true); connectionFactoryMock.Setup(x => x.WebSocketReceiveAsync()) .Returns(Task.FromResult( @"{""type"":""subscriptions"",""channels"":[{""name"":""ticker"",""product_ids"":[""BTC-EUR"",""ETH-EUR""]}]}")); Coinbase subjectUnderTest = new Coinbase { ClientWebSocket = clientWebSocket, ConnectionAdapter = connectionFactoryMock.Object }; //Act subjectUnderTest.ChangeFeed(products); Assert.IsTrue(true); }
public void WebSocketProcessFeed_ShouldReturnFeed() { //Arrange HttpClient httpClient = new HttpClient(); ClientWebSocket clientWebSocket = new ClientWebSocket(); List <Product> products = new List <Product> { new Product { ID = "BTC-EUR", BaseCurrency = "BTC", QuoteCurrency = "EUR" } }; Mock <ConnectionAdapter> connectionFactoryMock = new Mock <ConnectionAdapter>(MockBehavior.Strict, httpClient); connectionFactoryMock.Object.Authentication = new Authentication("api_key", "passphrase", "NiWaGaqmhB3lgI/tQmm/gQ==", "https://api.pro.coinbase.com", "wss://ws-feed.gdax.com"); connectionFactoryMock.Setup(x => x.WebSocketSendAsync(products.ToSubscribeString())) .ReturnsAsync( @"{""type"":""subscriptions"",""channels"":[{""name"":""ticker"",""product_ids"":[""BTC-EUR"",""ETH-EUR""]}]}"); connectionFactoryMock .Setup(x => x.ConnectAsync(connectionFactoryMock.Object.Authentication.WebSocketUri.ToString())) .Returns(Task.CompletedTask); connectionFactoryMock .Setup(x => x.WebSocketCloseAsync()) .Returns(Task.FromResult(true)); connectionFactoryMock.Setup(x => x.IsWebSocketConnected()).Returns(true); connectionFactoryMock.SetupSequence(f => f.WebSocketReceiveAsync()) .Returns(Task.FromResult(@"{ ""type"":""ticker"", ""sequence"":7000000000, ""product_id"":""BTC-EUR"", ""price"":""6693.2"", ""open_24h"":""6785.59000000"", ""volume_24h"":""1778.78223836"", ""low_24h"":""6566.00000000"", ""high_24h"":""6813.00000000"", ""volume_30d"":""152160.22176000"", ""best_bid"":""6693.20"", ""best_ask"":""6698.12"", ""side"":""sell"", ""time"":""2020-04-09T23:09:28.709968Z"", ""trade_id"":25684401, ""last_size"":""0.0027496"" }")) // will be returned on 1st invocation .Returns(Task.FromResult(@"{ ""type"":""ticker"", ""sequence"":7000000001, ""product_id"":""BTC-EUR"", ""price"":""6700.34"", ""open_24h"":""6785.59000000"", ""volume_24h"":""1778.79785469"", ""low_24h"":""6566.00000000"", ""high_24h"":""6813.00000000"", ""volume_30d"":""152160.22176000"", ""best_bid"":""6695.20"", ""best_ask"":""6700.12"", ""side"":""buy"", ""time"":""2020-04-09T23:09:57.499045Z"", ""trade_id"":25684402, ""last_size"":""0.01428046"" }")) // will be returned on 2nd invocation .Returns(Task.FromResult(@"{ ""type"":""ticker"", ""sequence"":7000000002, ""product_id"":""BTC-EUR"", ""price"":""6695.64"", ""open_24h"":""6785.59000000"", ""volume_24h"":""1778.79785469"", ""low_24h"":""6566.00000000"", ""high_24h"":""6813.00000000"", ""volume_30d"":""152160.22176000"", ""best_bid"":""6695.64"", ""best_ask"":""6699.80"", ""side"":""sell"", ""time"":""2020-04-09T23:10:01.022034Z"", ""trade_id"":25684403, ""last_size"":""0.00133587"" }")); // will be returned on 3rd invocation Coinbase subjectUnderTest = new Coinbase { ConnectionAdapter = connectionFactoryMock.Object }; bool eventRaised = false; int eventRaisedCount = 0; AutoResetEvent autoEvent = new AutoResetEvent(false); subjectUnderTest.ClientWebSocket = clientWebSocket; subjectUnderTest.Products = products; subjectUnderTest.NotifyCurrentPrices += delegate(string applicationName, Dictionary <string, decimal> subscribedPrices) { eventRaised = true; TaskCompletionSource <bool> taskCompletionSource = new TaskCompletionSource <bool>(); taskCompletionSource.SetResult(false); eventRaisedCount++; if (eventRaisedCount < 3) { return(taskCompletionSource.Task); } subjectUnderTest.SubscribeProducts = new List <Product>(); autoEvent.Set(); taskCompletionSource.SetResult(true); return(taskCompletionSource.Task); }; //Act subjectUnderTest.ChangeFeed(products); autoEvent.WaitOne(); Assert.IsTrue(eventRaised); }