public void GivenTier3WithOneCostCentresCached_ThenItShouldOnlyFetchTheUncachedTier3()
        {
            var lines  = new BcrLine[] { A.BcrLine().With(A.Criteria.Tier3, "b").With(A.Criteria.CostCentre, "b") };
            var engine = new Mock <IUnit4Engine>();

            engine.Setup(x => x.RunReport(Resql.BcrTier3("b"))).Returns(lines.AsDataSet());

            var cachedLines = new BcrLine[]
            { A.BcrLine().With(A.Criteria.Tier3, "a").With(A.Criteria.CostCentre, "a") };
            var cache = CreateCache(cachedLines);

            var reader = CreateReader(
                new[] { new CostCentre()
                        {
                            Tier3 = "a", Code = "a"
                        }, new CostCentre()
                        {
                            Tier3 = "b", Code = "b"
                        } },
                cache,
                engine.Object);

            var actualLines = reader.Read().Lines;

            engine.Verify(x => x.RunReport(Resql.BcrTier3("b")), Times.Once);
            engine.Verify(x => x.RunReport(Resql.BcrTier3("a")), Times.Never);

            Assert.That(actualLines, Is.EquivalentTo(lines.Union(cachedLines)));
        }
        public void GivenCachedCostCentreInOneTier3AndUncachedCostCentreInSameTier3_ThenItShouldFetchTheTier3()
        {
            var lines = new BcrLine[]
            {
                A.BcrLine().With(A.Criteria.Tier3, "tier3").With(A.Criteria.CostCentre, "a").Actuals(100),
                A.BcrLine().With(A.Criteria.Tier3, "tier3").With(A.Criteria.CostCentre, "b")
            };
            var engine = new Mock <IUnit4Engine>();

            engine.Setup(x => x.RunReport(Resql.BcrTier3("tier3"))).Returns(lines.AsDataSet());

            var cache = CreateCache(
                A.BcrLine().With(A.Criteria.Tier3, "tier3").With(A.Criteria.CostCentre, "a").Actuals(50));

            var reader = CreateReader(
                new[]
            {
                new CostCentre()
                {
                    Tier3 = "tier3", Code = "a"
                }, new CostCentre()
                {
                    Tier3 = "tier3", Code = "b"
                }
            },
                cache,
                engine.Object);

            var actualLines = reader.Read().Lines;

            engine.Verify(x => x.RunReport(Resql.BcrTier3("tier3")), Times.Once);

            Assert.That(actualLines, Is.EquivalentTo(lines));
        }
        public void GivenTier3WithAllCostCentresCachedAndUpdateCacheOption_ThenItShouldFetchThatTier3()
        {
            var engine = new Mock <IUnit4Engine>();

            var cache = CreateCache(A.BcrLine().With(A.Criteria.Tier3, "tier3"));

            var reader = CreateReader(new[] { new CostCentre()
                                              {
                                                  Tier3 = "tier3"
                                              } }, cache, engine.Object);

            reader.Read();

            engine.Verify(x => x.RunReport(Resql.BcrTier3("tier3")), Times.Never);
        }
        public void GivenNoCache_ThenItShouldFetchAllTier3Hierarchies()
        {
            var lines  = new BcrLine[] { A.BcrLine().With(A.Criteria.Tier3, "tier3") };
            var engine = new Mock <IUnit4Engine>();

            engine.Setup(x => x.RunReport(Resql.BcrTier3("tier3"))).Returns(lines.AsDataSet());
            var reader = CreateReader(
                new[] { new CostCentre()
                        {
                            Tier3 = "tier3"
                        } },
                Mock.Of <IFile <Bcr> >(),
                engine.Object);

            reader.Read();

            engine.Verify(x => x.RunReport(Resql.BcrTier3("tier3")), Times.Once);
        }
        public void GivenOneTier3_ThenTheReportShouldBeRanForThatTier3()
        {
            var hierarchy = new List <CostCentre>()
            {
                new CostCentre {
                    Tier3 = "A"
                }
            }.GroupBy(x => x.Tier3, x => x);

            var engineFactory =
                new DummyEngineFactory(
                    new[] { Resql.Bcr(tier3: hierarchy.Single().Single().Tier3) }
                    );

            var bcrReport = new BcrReport(engineFactory, new NullLogging());

            bcrReport.RunBcr(hierarchy);

            engineFactory.Mock.Verify(x => x.RunReport(Resql.BcrTier3(hierarchy.Single().Key)), Times.Once);
        }
        public void GivenTheFinalBcr_ThenItShouldBeWrittenToTheCache()
        {
            var lines = new BcrLine[]
            {
                A.BcrLine().With(A.Criteria.Tier3, "tier3").With(A.Criteria.CostCentre, "a"),
                A.BcrLine().With(A.Criteria.Tier3, "tier3").With(A.Criteria.CostCentre, "b")
            };
            var engine = new Mock <IUnit4Engine>();

            engine.Setup(x => x.RunReport(Resql.BcrTier3("tier3"))).Returns(lines.AsDataSet());

            var cache = new Mock <IFile <Bcr> >();

            cache.Setup(x => x.Exists()).Returns(true);
            cache.Setup(x => x.IsDirty()).Returns(false);
            cache.Setup(x => x.Read()).Returns(
                new Bcr(
                    new BcrLine[] { A.BcrLine().With(A.Criteria.Tier3, "tier3").With(A.Criteria.CostCentre, "a") }));

            var reader = CreateReader(
                new[]
            {
                new CostCentre()
                {
                    Tier3 = "tier3", Code = "a"
                }, new CostCentre()
                {
                    Tier3 = "tier3", Code = "b"
                }
            },
                cache.Object,
                engine.Object);

            var bcr = reader.Read();

            cache.Verify(x => x.Write(bcr), Times.Once);
        }