public async Task CanRequest_RuleBreaches_WithoutOrders()
        {
            // arrange
            this._dbContext.DbRuleBreaches.Add(new RuleBreach {
                Id = 5, RuleId = "abc"
            });
            this._dbContext.DbRuleBreaches.Add(new RuleBreach {
                Id = 6, RuleId = "xyz"
            });
            await this._dbContext.SaveChangesAsync();

            var query = new RuleBreachQuery();

            query.Filter.Node.FieldId().FieldRuleId();

            // act
            var ruleBreaches = await this._apiClient.QueryAsync(query, CancellationToken.None);

            // assert
            Assert.That(ruleBreaches, Has.Count.EqualTo(2));

            var ruleBreach0 = ruleBreaches.Find(x => x.Id == 5);

            Assert.That(ruleBreach0.RuleId, Is.EqualTo("abc"));
            Assert.That(ruleBreach0.Orders, Is.Null);

            var ruleBreach1 = ruleBreaches.Find(x => x.Id == 6);

            Assert.That(ruleBreach1.RuleId, Is.EqualTo("xyz"));
            Assert.That(ruleBreach1.Orders, Is.Null);
        }
        public async Task CanRequest_RuleBreach_AllFields()
        {
            // arrange
            this._dbContext.DbRuleBreaches.Add(
                new RuleBreach
            {
                Id = 5,
                StartOfPeriodUnderInvestigation = new DateTime(2020, 01, 01, 01, 01, 01, DateTimeKind.Utc),

                // end date in british summer time, to check that using GB formatting doesn't cause any timezone changes
                EndOfPeriodUnderInvestigation = new DateTime(2020, 06, 03, 05, 06, 07, DateTimeKind.Utc),
                ReddeerEnrichmentId           = "VOD LN",
                Title             = "Test Rule Breach",
                Description       = "This is a description",
                Venue             = "London",
                AssetCfi          = "Equity",
                CreatedOn         = new DateTime(2020, 03, 01, 12, 12, 12),
                RuleId            = "abc",
                CorrelationId     = "xyz123",
                IsBackTest        = true,
                SystemOperationId = 789
            });
            await this._dbContext.SaveChangesAsync();

            var query = new RuleBreachQuery();

            query.Filter.Node.FieldId().FieldStartOfPeriodUnderInvestigation().FieldEndOfPeriodUnderInvestigation()
            .FieldReddeerEnrichmentId().FieldTitle().FieldDescription().FieldVenue().FieldAssetCfi()
            .FieldCreatedOn().FieldRuleId().FieldCorrelationId().FieldIsBackTest().FieldSystemOperationId();

            // act
            var ruleBreaches = await this._apiClient.QueryAsync(query, CancellationToken.None);

            // assert
            Assert.That(ruleBreaches, Has.Count.EqualTo(1));

            var ruleBreach = ruleBreaches[0];

            Assert.That(ruleBreach.Id, Is.EqualTo(5));
            Assert.That(
                ruleBreach.StartOfPeriodUnderInvestigation,
                Is.EqualTo(new DateTime(2020, 01, 01, 01, 01, 01, DateTimeKind.Utc)));
            Assert.That(
                ruleBreach.EndOfPeriodUnderInvestigation,
                Is.EqualTo(new DateTime(2020, 06, 03, 05, 06, 07, DateTimeKind.Utc)));
            Assert.That(ruleBreach.ReddeerEnrichmentId, Is.EqualTo("VOD LN"));
            Assert.That(ruleBreach.Title, Is.EqualTo("Test Rule Breach"));
            Assert.That(ruleBreach.Description, Is.EqualTo("This is a description"));
            Assert.That(ruleBreach.Venue, Is.EqualTo("London"));
            Assert.That(ruleBreach.AssetCfi, Is.EqualTo("Equity"));
            Assert.That(ruleBreach.CreatedOn, Is.EqualTo(new DateTime(2020, 03, 01, 12, 12, 12)));
            Assert.That(ruleBreach.RuleId, Is.EqualTo("abc"));
            Assert.That(ruleBreach.CorrelationId, Is.EqualTo("xyz123"));
            Assert.That(ruleBreach.IsBackTest, Is.EqualTo(true));
            Assert.That(ruleBreach.SystemOperationId, Is.EqualTo(789));
            Assert.That(ruleBreach.Orders, Is.Null);
        }
        public async Task CanRequest_RuleBreachById_WithOrders()
        {
            // arrange
            this._dbContext.DbRuleBreaches.Add(new RuleBreach {
                Id = 5, RuleId = "abc"
            });
            this._dbContext.DbRuleBreaches.Add(
                new RuleBreach
            {
                // a rule breach which shouldn't be found
                Id = 6, RuleId = "xyz"
            });
            this._dbContext.DbOrders.Add(
                new Order
            {
                // an order which shouldn't be found
                Id = 7, LimitPrice = 1.78m
            });
            this._dbContext.DbOrders.Add(new Order {
                Id = 8, LimitPrice = 6.78m
            });
            this._dbContext.DbOrders.Add(new Order {
                Id = 9, LimitPrice = 3.45m
            });
            this._dbContext.DbRuleBreachOrders.Add(
                new RuleBreachOrder
            {
                // a rule breach order which shouldn't be found
                RuleBreachId = 4, OrderId = 7
            });
            this._dbContext.DbRuleBreachOrders.Add(new RuleBreachOrder {
                RuleBreachId = 5, OrderId = 8
            });
            this._dbContext.DbRuleBreachOrders.Add(new RuleBreachOrder {
                RuleBreachId = 5, OrderId = 9
            });
            await this._dbContext.SaveChangesAsync();

            var query = new RuleBreachQuery();

            query.Filter.ArgumentId(5).Node.FieldId().FieldRuleId().FieldOrders().FieldId().FieldLimitPrice();

            // act
            var ruleBreaches = await this._apiClient.QueryAsync(query, CancellationToken.None);

            // assert
            Assert.That(ruleBreaches, Has.Count.EqualTo(1));

            var ruleBreach = ruleBreaches[0];

            Assert.That(ruleBreach.Id, Is.EqualTo(5));
            Assert.That(ruleBreach.RuleId, Is.EqualTo("abc"));

            Assert.That(ruleBreach.Orders, Has.Count.EqualTo(2));
            var order0 = ruleBreach.Orders[0];

            Assert.That(order0.Id, Is.EqualTo(8));
            Assert.That(order0.LimitPrice, Is.EqualTo(6.78m));
            var order1 = ruleBreach.Orders[1];

            Assert.That(order1.Id, Is.EqualTo(9));
            Assert.That(order1.LimitPrice, Is.EqualTo(3.45m));
        }