예제 #1
0
        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);
        }
예제 #2
0
        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);
        }