public async Task AccountRequestRateLimitTest(KeyPair clientKeyPair, int?requestLimit)
        {
            context.AppState.State = ApplicationState.Ready;

            var account = context.AccountStorage.GetAccount(clientKeyPair);

            if (requestLimit.HasValue)
            {
                account.Account.RequestRateLimits = new RequestRateLimits {
                    HourLimit = (uint)requestLimit.Value, MinuteLimit = (uint)requestLimit.Value
                }
            }
            ;

            var minuteLimit     = (account.Account.RequestRateLimits ?? context.Constellation.RequestRateLimits).MinuteLimit;
            var minuteIterCount = minuteLimit + 1;

            for (var i = 0; i < minuteIterCount; i++)
            {
                var envelope = new AccountDataRequest
                {
                    Account        = account.Account.Id,
                    RequestId      = i + 1,
                    AccountWrapper = account
                }.CreateEnvelope();
                envelope.Sign(clientKeyPair);
                if (!context.IsAlpha)
                {
                    var quantum = new RequestQuantum {
                        Apex = context.QuantumStorage.CurrentApex + 1, RequestEnvelope = envelope, Timestamp = DateTime.UtcNow.Ticks
                    };
                    envelope = quantum.CreateEnvelope();
                    envelope.Sign(TestEnvironment.AlphaKeyPair);
                }

                if (i + 1 > minuteLimit)
                {
                    await AssertQuantumHandling(envelope, typeof(TooManyRequestsException));
                }
                else
                {
                    await AssertQuantumHandling(envelope, null);
                }
            }
        }
        public async Task AccountRequestRateLimitTest(KeyPair clientKeyPair, int?requestLimit)
        {
            context.AppState.State = ApplicationState.Ready;

            var account = context.AccountStorage.GetAccount(clientKeyPair);

            if (requestLimit.HasValue)
            {
                //TODO: replace it with quantum
                var effect = new RequestRateLimitUpdateEffect
                {
                    Account           = account.Id,
                    AccountWrapper    = account,
                    RequestRateLimits = new RequestRateLimits
                    {
                        HourLimit   = (uint)requestLimit.Value,
                        MinuteLimit = (uint)requestLimit.Value
                    }
                };
                var effectProcessor = new RequestRateLimitUpdateEffectProcessor(effect, context.Constellation.RequestRateLimits);
                effectProcessor.CommitEffect();
            }
            var clientConnection = new AlphaWebSocketConnection(context, new FakeWebSocket(), "127.0.0.1")
            {
                ClientPubKey    = clientKeyPair,
                ConnectionState = ConnectionState.Ready,
                Account         = account
            };

            var minuteLimit     = (account.Account.RequestRateLimits ?? context.Constellation.RequestRateLimits).MinuteLimit;
            var minuteIterCount = minuteLimit + 1;

            for (var i = 0; i < minuteIterCount; i++)
            {
                var envelope = new AccountDataRequest
                {
                    Account   = account.Account.Id,
                    RequestId = i + 1
                }.CreateEnvelope();
                envelope.Sign(clientKeyPair);
                using var writer = new XdrBufferWriter();
                var inMessage = envelope.ToIncomingMessage(writer);
                if (i + 1 > minuteLimit)
                {
                    await AssertMessageHandling(clientConnection, inMessage, typeof(TooManyRequestsException));
                }
                else
                {
                    await AssertMessageHandling(clientConnection, inMessage);
                }
            }
        }
        public async Task AccountDataRequestTest(ConnectionState state, Type excpectedException)
        {
            Global.AppState.State = ApplicationState.Ready;

            var clientConnection = new AlphaWebSocketConnection(new FakeWebSocket(), "127.0.0.1")
            {
                ClientPubKey    = TestEnvironment.Client1KeyPair.PublicKey,
                ConnectionState = state
            };

            var account = Global.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair);

            var envelope = new AccountDataRequest
            {
                Account   = account.Account.Id,
                RequestId = 1
            }.CreateEnvelope();

            envelope.Sign(TestEnvironment.Client1KeyPair);

            await AssertMessageHandling(clientConnection, envelope, excpectedException);
        }
        public async Task AccountDataRequestTest(ConnectionState state, Type excpectedException)
        {
            context.AppState.State = ApplicationState.Ready;

            var clientConnection = new AlphaWebSocketConnection(context, new FakeWebSocket(), "127.0.0.1")
            {
                ClientPubKey    = TestEnvironment.Client1KeyPair.PublicKey,
                ConnectionState = state
            };

            var account = context.AccountStorage.GetAccount(TestEnvironment.Client1KeyPair);

            var envelope = new AccountDataRequest
            {
                Account   = account.Account.Id,
                RequestId = 1
            }.CreateEnvelope();

            envelope.Sign(TestEnvironment.Client1KeyPair);
            using var writer = new XdrBufferWriter();
            var inMessage = envelope.ToIncomingMessage(writer);

            await AssertMessageHandling(clientConnection, inMessage, excpectedException);
        }