public void Initialise()
        {
            _mockLogger = new Mock <ILogger <MyAccountsService> >();
            _mockMyAccountsStatusDeriverlogger = new Mock <ILogger <MyAccountsStatusDeriver> >();
            _mockGetProcess        = new Mock <IMyAccountsGetProcess>(MockBehavior.Strict);
            _mockGetDetailsProcess = new Mock <IMyAccountsDetailGetProcess>(MockBehavior.Strict);
            _mockMyAccountDetailGetTransactionsRecentProcess = new Mock <IMyAccountDetailGetTransactionsRecentProcess>();

            _mockStatusDeriverProcess = new Mock <IMyAccountsStatusDeriver>();

            // Default recent transactions to return empty list
            _mockMyAccountDetailGetTransactionsRecentProcess.Setup(
                x => x.GetTransactionsRecent(It.IsAny <String>(), It.IsAny <uint>()))
            .Returns(Task.FromResult(new RecievedTransactionsDto()));

            _service = new MyAccountsService(_mockLogger.Object, _mockGetProcess.Object, _mockGetDetailsProcess.Object, _mockMyAccountDetailGetTransactionsRecentProcess.Object, _mockStatusDeriverProcess.Object);
        }
        [DataRow(81, 100.0D, 100.0D, 55.99D, "15/06/2012", "15/06/2012 23:59", 0L, true, "Direct Debit", null, null)]     // on expiry date (end minute of day)

        public void GetMyAccountsDetail_WhenProvideLowellReference_AndSatisfiesDiscountOfferConditions_RetrievesAccount_OutputsDiscountOffer(
            int testNumber,
            double?testOutstandingBalance,
            double?testDiscountedBalance,
            double?testDiscountAmount,      // indicates offer
            string testDiscountExpiryString,
            string testCurrentDateTimeString,
            long?testCompany,
            bool testHasArrangement,
            string testPlanType,

            double?expectedDiscountOfferAmount,
            string expectedDiscountOfferExpiryString)
        {
            // Can't use DateTime in attribute, therefore need to convert from strings
            DateTime?testDiscountExpiry          = ConvertTestStringToNullableDateTime(testDiscountExpiryString, "d");
            DateTime testCurrentDateTime         = ConvertTestStringToDateTime(testCurrentDateTimeString, "g");
            DateTime?expectedDiscountOfferExpiry = ConvertTestStringToNullableDateTime(expectedDiscountOfferExpiryString, "d");

            // Test assumption - 'Local' date can be compared with 'Unspecified' date
            {
                DateTime dtNow = DateTime.Now;
                Assert.AreEqual(DateTimeKind.Local, dtNow.Kind);

                DateTime dtNowMinusHour = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, dtNow.Hour, dtNow.Minute, dtNow.Second).AddHours(-1);
                Assert.AreEqual(DateTimeKind.Unspecified, dtNowMinusHour.Kind);

                Assert.IsTrue(dtNowMinusHour < dtNow);
                Assert.IsTrue(dtNow > dtNowMinusHour);

                DateTime dtNowPlusHour = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, dtNow.Hour, dtNow.Minute, dtNow.Second).AddHours(1);
                Assert.AreEqual(DateTimeKind.Unspecified, dtNowMinusHour.Kind);

                Assert.IsTrue(dtNowPlusHour > dtNow);
                Assert.IsTrue(dtNow < dtNowPlusHour);
            }

            //
            // Arrange
            //
            const string userId          = "anyuser123";
            const string lowellReference = "wibble";

            CaseFlowMyAccountsDetailDto caseFlowDto = new CaseFlowMyAccountsDetailDto()
            {
                OutstandingBalance = (decimal?)testOutstandingBalance,  // doubles in params, because MSTest does not support decimal
                DiscountedBalance  = (decimal?)testDiscountedBalance,
                DiscountAmount     = (decimal?)testDiscountAmount,
                DiscountExpiry     = testDiscountExpiry,
                Company            = testCompany,
                HasArrangement     = testHasArrangement,
                PlanType           = testPlanType
            };

            _mockGetDetailsProcess.Setup(x => x.GetMyAccountsDetail(lowellReference)).Returns(Task.FromResult(caseFlowDto));

            // Must use concrete Status Deriver, so that Solicitor (company 2) logic is followed
            MyAccountsService service = new MyAccountsService(_mockLogger.Object,
                                                              _mockGetProcess.Object,
                                                              _mockGetDetailsProcess.Object,
                                                              _mockMyAccountDetailGetTransactionsRecentProcess.Object,
                                                              new MyAccountsStatusDeriver(_mockMyAccountsStatusDeriverlogger.Object)); // **** IMPORTANT BIT

            //
            // Act
            //

            // Using service created above, so as to utilise concrete Status Deriver
            MyAccountsDetailResultDto resultDto = service.GetMyAccountsDetail(userId, lowellReference, testCurrentDateTime).Result;

            //
            // Assert
            //
            Assert.AreEqual((decimal?)expectedDiscountOfferAmount, resultDto.DiscountOfferAmount);
            Assert.AreEqual(expectedDiscountOfferExpiry, resultDto.DiscountOfferExpiry);
        }