public static IAssetRepository GetPopulatedAssetRepository()
        {
            var table  = new NoSqlTableInMemory <AssetRepository.AssetEntity>();
            var assets = new List <AssetRepository.AssetEntity>
            {
                new AssetRepository.AssetEntity
                {
                    Id       = "EUR",
                    Name     = "EUR",
                    Accuracy = 8,
                },
                new AssetRepository.AssetEntity
                {
                    Id       = "BTC",
                    Name     = "BTC",
                    Accuracy = 8
                },
                new AssetRepository.AssetEntity
                {
                    Id       = "USD",
                    Name     = "USD",
                    Accuracy = 8
                }
            };

            table.InsertAsync(assets).GetAwaiter().GetResult();
            return(new AssetRepository(table, new ConvertService()));
        }
        public async Task AzureStorage_WithCache_Test()
        {
            var testEntity = GetTestEntity();

            var storage1 = new NoSqlTableInMemory <TestEntity>();

            Parallel.For(1, 10, i =>
            {
                storage1.CreateIfNotExistsAsync(testEntity).Wait();
            });

            var createdEntity = await storage1.GetDataAsync(testEntity.PartitionKey, testEntity.RowKey);

            Assert.IsNotNull(createdEntity);
        }
Beispiel #3
0
        public async Task cashout_test_old_txes(string messageId, double amountToTransferD, string address)
        {
            decimal amountToTransfer = (decimal)amountToTransferD;

            var message = new ToSendMessageFromQueue {
                Id = messageId, Address = address, Amount = amountToTransfer
            };

            var fakeRpcClient = Substitute.For <IJsonRpcClient>();

            fakeRpcClient.SendToAddress(address, amountToTransfer).Returns("sometxid");

            var fakeTxesStorage = new NoSqlTableInMemory <ExistingCashOutEntity>();

            fakeTxesStorage.Insert(new ExistingCashOutEntity {
                PartitionKey = "part", RowKey = "id1"
            });
            fakeTxesStorage.Insert(new ExistingCashOutEntity {
                PartitionKey = "part", RowKey = "id2"
            });
            fakeTxesStorage.Insert(new ExistingCashOutEntity {
                PartitionKey = "part", RowKey = "id3"
            });
            fakeTxesStorage.Insert(new ExistingCashOutEntity {
                PartitionKey = "part", RowKey = "id4"
            });
            fakeTxesStorage.Insert(new ExistingCashOutEntity {
                PartitionKey = "part", RowKey = "id5"
            });


            var fakeLogger = Substitute.For <ILog>();

            var fakeSlackNotifier = Substitute.For <ISlackNotifier>();

            var queueTrigger = new CashOutQueueTrigger("SolarCoinApi.Tests.CashOut", fakeRpcClient, fakeTxesStorage, fakeLogger, fakeSlackNotifier);


            //Act
            await queueTrigger.Process(message);


            //Assert
            await fakeRpcClient.Received(0).SendToAddress(Arg.Any <string>(), Arg.Any <decimal>());
        }
        public async Task Test_Filter_Works_For_Autogenerated_DateTime_RowKey()
        {
            const int daysToSelect = 10;
            var       testEntity   = GetTestEntity();
            var       storage1     = new NoSqlTableInMemory <TestEntity>();
            var       dt           = DateTime.UtcNow;

            for (int i = 0; i < 100; ++i)
            {
                await storage1.InsertAndGenerateRowKeyAsDateTimeAsync(testEntity, dt);

                dt = dt.AddDays(1);
            }

            var selectedRecordsCount = (await storage1.WhereAsync(testEntity.PartitionKey, dt.AddDays(-daysToSelect), dt, ToIntervalOption.IncludeTo)).Count();

            Assert.AreEqual(selectedRecordsCount, daysToSelect);
        }
        public async Task Verify_InsertAndGenerate_DateTime_RowKey_Increments()
        {
            var testEntity = GetTestEntity();

            var storage1 = new NoSqlTableInMemory <TestEntity>();

            for (int i = 0; i < 1000; ++i)
            {
                testEntity.Counter = i;
                await storage1.InsertAndGenerateRowKeyAsDateTimeAsync(testEntity, DateTime.UtcNow);
            }

            int ct          = 0;
            var allEntities = (await storage1.GetDataAsync()).OrderBy(x => x.RowKey);

            foreach (var entity in allEntities)
            {
                Assert.AreEqual <int>(ct, entity.Counter);
                ++ct;
            }
        }
        public static IAssetPairsRepository GetPopulatedAssetPairsRepository()
        {
            var table      = new NoSqlTableInMemory <AssetPairEntity>();
            var assetPairs = new List <AssetPairEntity>
            {
                new AssetPairEntity
                {
                    Id           = "EURUSD",
                    Name         = "EURUSD",
                    Accuracy     = 5,
                    BaseAssetId  = "EUR",
                    QuoteAssetId = "USD",
                },
                new AssetPairEntity
                {
                    Id           = "BTCEUR",
                    Name         = "BTCEUR",
                    Accuracy     = 3,
                    BaseAssetId  = "BTC",
                    QuoteAssetId = "EUR"
                },
                new AssetPairEntity
                {
                    Id           = "BTCUSD",
                    Name         = "BTCUSD",
                    Accuracy     = 3,
                    BaseAssetId  = "BTC",
                    QuoteAssetId = "USD"
                },
                new AssetPairEntity
                {
                    Id           = "BTCCHF",
                    Name         = "BTCCHF",
                    Accuracy     = 3,
                    BaseAssetId  = "BTC",
                    QuoteAssetId = "CHF"
                },
                new AssetPairEntity
                {
                    Id           = "CHFJPY",
                    Name         = "CHFJPY",
                    Accuracy     = 3,
                    BaseAssetId  = "CHF",
                    QuoteAssetId = "JPY"
                },
                new AssetPairEntity
                {
                    Id           = "USDCHF",
                    Name         = "USDCHF",
                    Accuracy     = 3,
                    BaseAssetId  = "USD",
                    QuoteAssetId = "CHF"
                },
                new AssetPairEntity
                {
                    Id           = "EURCHF",
                    Name         = "EURCHF",
                    Accuracy     = 5,
                    BaseAssetId  = "EUR",
                    QuoteAssetId = "CHF"
                },
                new AssetPairEntity
                {
                    Id           = "BTCJPY",
                    Name         = "BTCJPY",
                    Accuracy     = 5,
                    BaseAssetId  = "BTC",
                    QuoteAssetId = "JPY"
                },
                new AssetPairEntity
                {
                    Id           = "EURJPY",
                    Name         = "EURJPY",
                    Accuracy     = 3,
                    BaseAssetId  = "EUR",
                    QuoteAssetId = "JPY"
                },
                new AssetPairEntity
                {
                    Id           = "JPYUSD",
                    Name         = "JPYUSD",
                    Accuracy     = 3,
                    BaseAssetId  = "JPY",
                    QuoteAssetId = "USD"
                },
                new AssetPairEntity
                {
                    Id           = "EURGBP",
                    Name         = "EURGBP",
                    Accuracy     = 3,
                    BaseAssetId  = "EUR",
                    QuoteAssetId = "GBP"
                },
                new AssetPairEntity
                {
                    Id           = "GBPUSD",
                    Name         = "GBPUSD",
                    Accuracy     = 3,
                    BaseAssetId  = "GBP",
                    QuoteAssetId = "USD"
                },
            };

            foreach (var pair in assetPairs)
            {
                pair.LegalEntity            = "LYKKETEST";
                pair.MatchingEngineMode     = MatchingEngineMode.MarketMaker;
                pair.StpMultiplierMarkupAsk = 1;
                pair.StpMultiplierMarkupBid = 1;
            }

            table.InsertAsync(assetPairs).GetAwaiter().GetResult();
            return(new AssetPairsRepository(table, new ConvertService()));
        }
 public CachedAzureTableStorageDecorator(INoSQLTableStorage <T> table)
 {
     _table = table;
     _cache = new NoSqlTableInMemory <T>();
     Init();
 }
Beispiel #8
0
        public async Task cashin_handler_test()
        {
            long s = 100000000; // accedpted vout amounts are in satoshis, should conver to solar coins, 1 slr = 10^8 satoshis

            //Arrange

            var hotWalletAddress = Guid.NewGuid().ToString();
            var txFee            = 0.01m;
            var minTxAmount      = 0.1m;


            //Arranging generated wallets storage
            var generatedWallets = new NoSqlTableInMemory <WalletStorageEntity>();

            generatedWallets.Insert(new WalletStorageEntity {
                PartitionKey = "part", RowKey = Guid.NewGuid().ToString(), Address = "8first_generated_address", PrivateKey = "first_priv_key"
            });
            generatedWallets.Insert(new WalletStorageEntity {
                PartitionKey = "part", RowKey = Guid.NewGuid().ToString(), Address = "8second_generated_address", PrivateKey = "second_priv_key"
            });
            generatedWallets.Insert(new WalletStorageEntity {
                PartitionKey = "part", RowKey = Guid.NewGuid().ToString(), Address = "8third_generated_address", PrivateKey = "third_priv_key"
            });
            generatedWallets.Insert(new WalletStorageEntity {
                PartitionKey = "part", RowKey = Guid.NewGuid().ToString(), Address = "8fourth_generated_address", PrivateKey = "fourth_priv_key"
            });

            var fakeTxesQueue = Substitute.For <IQueueExt>();

            var fakeRpcClient = Substitute.For <IJsonRpcClient>();

            fakeRpcClient.CreateRawTransaction(Arg.Any <object[]>(), Arg.Any <Dictionary <string, decimal> >()).Returns("string");
            fakeRpcClient.SignRawTransaction(Arg.Any <string>(), Arg.Any <string>()).Returns(new SignRawTransactionResponseModel());
            fakeRpcClient.SendRawTransaction(Arg.Any <string>()).Returns("string");

            var fakeSlackNotifier = Substitute.For <ISlackNotifier>();

            var fakeLogger = Substitute.For <ILog>();


            var queueTrigger = new CashInHandlerQueueTrigger("SolarCoinApi.Test.CashInHandlerJobRunner", generatedWallets, fakeLogger, fakeTxesQueue, fakeRpcClient, fakeSlackNotifier, hotWalletAddress, txFee, minTxAmount);



            string txId    = Guid.NewGuid().ToString();
            var    message = new TransitQueueMessage
            {
                TxId  = txId,
                Vouts = new List <Vout>
                {
                    new Vout {
                        Address = "8third_generated_address", Amount = (long)(2.3652m * s)
                    },
                    new Vout {
                        Address = "some_unrelated_address_1", Amount = (long)(5m * s)
                    },                                                                       // should be ignored
                    new Vout {
                        Address = "some_unrelated_address_2", Amount = (long)(6.365m * s)
                    },                                                                           // should be ignored
                    new Vout {
                        Address = "8third_generated_address", Amount = (long)(2.146m * s)
                    },
                    new Vout {
                        Address = "some_unrelated_address_3", Amount = (long)(9.213m * s)
                    },                                                                           // should be ignored
                    new Vout {
                        Address = "8first_generated_address", Amount = (long)(0.09m * s)
                    },                                                                          // this shouldn't be put to queue because it's less than min tx amount
                    new Vout {
                        Address = "8fourth_generated_address", Amount = (long)(100.2568m * s)
                    }
                }
            };



            // Act
            await queueTrigger.ReceiveMessage(message);

            // Assert

            // Check if all relevant outputs where put in the queue correctly
            await fakeTxesQueue.Received(1).PutRawMessageAsync(Arg.Is <string>(x => JsonConvert.DeserializeObject <QueueModel>(x).Equals(new QueueModel {
                Address = "8third_generated_address", TxId = txId, Amount = 2.3652m + 2.146m
            })));

            await fakeTxesQueue.Received(1).PutRawMessageAsync(Arg.Is <string>(x => JsonConvert.DeserializeObject <QueueModel>(x).Equals(new QueueModel {
                Address = "8fourth_generated_address", TxId = txId, Amount = 100.2568m
            })));

            await fakeTxesQueue.Received(2).PutRawMessageAsync(Arg.Any <string>());

            // Check if all relevant outputs where transferred to the hot wallet
            await fakeRpcClient.Received(1).CreateRawTransaction(
                Arg.Is <object[]>(
                    x => x.Count() == 1 &&
                    x.All(y => (string)(y.GetType().GetProperty("txid").GetValue(y)) == txId) &&
                    x.Any(y => (int)(y.GetType().GetProperty("vout").GetValue(y)) == 6)),
                Arg.Is <Dictionary <string, decimal> >(x => x.Count == 1 && x[hotWalletAddress] == 100.2568m - txFee));

            await fakeRpcClient.Received(1).CreateRawTransaction(
                Arg.Is <object[]>(x => x.Count() == 2 &&
                                  x.All(y => (string)(y.GetType().GetProperty("txid").GetValue(y)) == txId) &&
                                  x.Any(y => (int)(y.GetType().GetProperty("vout").GetValue(y)) == 0) &&
                                  x.Any(y => (int)(y.GetType().GetProperty("vout").GetValue(y)) == 3)),
                Arg.Is <Dictionary <string, decimal> >(x => x.Count == 1 && x[hotWalletAddress] == 2.3652m + 2.146m - txFee));

            await fakeRpcClient.Received(2).CreateRawTransaction(Arg.Any <object[]>(), Arg.Any <Dictionary <string, decimal> >());

            await fakeRpcClient.Received(1).SignRawTransaction(Arg.Any <string>(), "third_priv_key");

            await fakeRpcClient.Received(1).SignRawTransaction(Arg.Any <string>(), "fourth_priv_key");

            await fakeRpcClient.Received(2).SignRawTransaction(Arg.Any <string>(), Arg.Any <string>());

            await fakeRpcClient.Received(2).SendRawTransaction(Arg.Any <string>());
        }
Beispiel #9
0
 public AzureTableStorageWithCache(string connstionString, string tableName, ILog log)
 {
     _cache = new NoSqlTableInMemory <T>();
     _table = new AzureTableStorage <T>(connstionString, tableName, log);
     Init();
 }