public async Task Given_AValidDateRangeEffectiveContractObject_When_PutIsInvoked_Then_TheDateRangeEffectiveContractObjectShouldBeReturned()
        {
            MockContractValidator.Setup(m => m.ValidateContract(It.IsAny <DateRangeEffectiveContractObject>())).ReturnsAsync(new string[0]);
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Update(It.IsAny <DateRangeEffectiveDtoObject>())).ReturnsAsync(new DateRangeEffectiveDtoObject
            {
                CreatedByUserId    = StaticTestValues.CreatedByUserId1,
                CreatedOn          = StaticTestValues.CreatedOnDateTimeOffset1,
                EffectiveEndDate   = StaticTestValues.EffectiveEndDateTimeOffset1,
                EffectiveStartDate = StaticTestValues.EffectiveStartDateTimeOffset1,
                Id = StaticTestValues.ValidId1,
                LastUpdatedByUserId = StaticTestValues.LastUpdatedByUserId1,
                LastUpdatedOn       = StaticTestValues.LastUpdatedOnDateTimeOffset1,
                Property            = StaticTestValues.ValidProperty1,
                VirtualProperty     = StaticTestValues.ValidVirtualProperty1
            });

            var response = await(await DateRangeEffectiveContractObjectsController.Put(new DateRangeEffectiveContractObject())).ExecuteAsync(CancellationToken.None);
            var dateRangeEffectiveContractObject = JsonConvert.DeserializeObject <DateRangeEffectiveContractObject>(await response.Content.ReadAsStringAsync());

            Assert.AreEqual(StaticTestValues.CreatedByUserId1, dateRangeEffectiveContractObject.CreatedByUserId);
            Assert.AreEqual(StaticTestValues.CreatedOnDateTimeOffset1, dateRangeEffectiveContractObject.CreatedOn);
            Assert.AreEqual(StaticTestValues.EffectiveEndDateTimeOffset1, dateRangeEffectiveContractObject.EffectiveEndDate);
            Assert.AreEqual(StaticTestValues.EffectiveStartDateTimeOffset1, dateRangeEffectiveContractObject.EffectiveStartDate);
            Assert.AreEqual(StaticTestValues.ValidId1, dateRangeEffectiveContractObject.Id);
            Assert.AreEqual(StaticTestValues.LastUpdatedByUserId1, dateRangeEffectiveContractObject.LastUpdatedByUserId);
            Assert.AreEqual(StaticTestValues.LastUpdatedOnDateTimeOffset1, dateRangeEffectiveContractObject.LastUpdatedOn);
            Assert.AreEqual(StaticTestValues.ValidProperty1, dateRangeEffectiveContractObject.Property);
            Assert.AreEqual(StaticTestValues.ValidVirtualProperty1, dateRangeEffectiveContractObject.VirtualProperty);
        }
        public async Task Given_AValidDateRangeEffectiveContractObjectId_When_GetIsInvoked_Then_TheDateRangeEffectiveContractObjectShouldBeReturned()
        {
            var dateRangeEffectiveDtoObject = new DateRangeEffectiveDtoObject
            {
                CreatedByUserId    = StaticTestValues.CreatedByUserId1,
                CreatedOn          = StaticTestValues.CreatedOnDateTimeOffset1,
                EffectiveEndDate   = StaticTestValues.EffectiveEndDateTimeOffset1,
                EffectiveStartDate = StaticTestValues.EffectiveStartDateTimeOffset1,
                Id = StaticTestValues.ValidId1,
                LastUpdatedByUserId = StaticTestValues.LastUpdatedByUserId1,
                LastUpdatedOn       = StaticTestValues.LastUpdatedOnDateTimeOffset1,
                Property            = StaticTestValues.ValidProperty1,
                VirtualProperty     = StaticTestValues.ValidVirtualProperty1
            };

            MockDateRangeEffectiveObjectsDal.Setup(m => m.Read(StaticTestValues.ValidId1)).ReturnsAsync(dateRangeEffectiveDtoObject);

            var response = await(await DateRangeEffectiveContractObjectsController.Get(1)).ExecuteAsync(CancellationToken.None);
            var country  = JsonConvert.DeserializeObject <DateRangeEffectiveContractObject>(await response.Content.ReadAsStringAsync());

            Assert.AreEqual(StaticTestValues.CreatedByUserId1, country.CreatedByUserId);
            Assert.AreEqual(StaticTestValues.CreatedOnDateTimeOffset1, country.CreatedOn);
            Assert.AreEqual(StaticTestValues.EffectiveEndDateTimeOffset1, country.EffectiveEndDate);
            Assert.AreEqual(StaticTestValues.EffectiveStartDateTimeOffset1, country.EffectiveStartDate);
            Assert.AreEqual(StaticTestValues.ValidId1, country.Id);
            Assert.AreEqual(StaticTestValues.LastUpdatedByUserId1, country.LastUpdatedByUserId);
            Assert.AreEqual(StaticTestValues.LastUpdatedOnDateTimeOffset1, country.LastUpdatedOn);
            Assert.AreEqual(StaticTestValues.ValidProperty1, country.Property);
            Assert.AreEqual(StaticTestValues.ValidVirtualProperty1, country.VirtualProperty);
        }
        public async Task Given_AnInvalidDateRangeEffectiveContractObject_When_PutIsInvoked_Then_DalUpdateMethodShouldNotBeInvoked()
        {
            MockContractValidator.Setup(m => m.ValidateContract(It.IsAny <DateRangeEffectiveContractObject>())).ReturnsAsync(new[] { StaticTestValues.ContractValidatorErrorMessage1 });

            await(await DateRangeEffectiveContractObjectsController.Put(new DateRangeEffectiveContractObject())).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Update(It.IsAny <DateRangeEffectiveDtoObject>()), Times.Never);
        }
        public async Task Given_AnyDateRangeEffectiveContractObjectId_When_GetIsInvoked_Then_DalReadMethodShouldOnlyBeInvokedOnce()
        {
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Read(0)).ThrowsAsync(new ObjectNotFoundException());

            await(await DateRangeEffectiveContractObjectsController.Get(0)).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Read(It.IsAny <int>()), Times.Once);
        }
        public async Task Given_AValidDateRangeEffectiveContractObjectId_When_GetIsInvoked_Then_OkStatusCodeShouldBeReturned()
        {
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Read(1)).ReturnsAsync(new DateRangeEffectiveDtoObject());

            var response = await(await DateRangeEffectiveContractObjectsController.Get(1)).ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }
        public async Task Given_AnInvalidDateRangeEffectiveContractObjectId_When_HardDeleteIsInvoked_Then_NotFoundStatusCodeShouldBeReturned()
        {
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Delete(StaticTestValues.InvalidId1)).Throws(new ObjectNotFoundException());

            var response = await(await DateRangeEffectiveContractObjectsController.HardDelete(StaticTestValues.InvalidId1)).ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);
        }
        public async Task Given_AnyDateRangeEffectiveContractObjectId_When_HardDeleteIsInvoked_Then_DalDeleteMethodShouldOnlyBeInvokedOnce()
        {
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Delete(It.IsAny <int>())).Throws(new ObjectNotFoundException());

            await(await DateRangeEffectiveContractObjectsController.HardDelete(StaticTestValues.InvalidId1)).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Delete(It.IsAny <int>()), Times.Once);
        }
        public async Task Given_AnInvalidDateRangeEffectiveContractObjectId_When_DeleteIsInvoked_Then_DalUpdateMethodShouldNotBeInvoked()
        {
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Read(0)).ThrowsAsync(new ObjectNotFoundException());

            await(await DateRangeEffectiveContractObjectsController.Delete(0)).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Update(It.IsAny <DateRangeEffectiveDtoObject>()), Times.Never);
        }
        public async Task Given_AValidDateRangeEffectiveContractObjectId_When_HardDeleteIsInvoked_Then_NoContentStatusCodeShouldBeReturned()
        {
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Delete(StaticTestValues.ValidId1)).Returns(Task.Factory.StartNew(() => { }));

            var response = await(await DateRangeEffectiveContractObjectsController.HardDelete(StaticTestValues.ValidId1)).ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(HttpStatusCode.NoContent, response.StatusCode);
        }
        public async Task Given_AValidDateRangeEffectiveContractObjectId_When_DeleteIsInvoked_Then_DalUpdateMethodShouldOnlyBeInvokedOnce()
        {
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Read(StaticTestValues.ValidId1)).ReturnsAsync(new DateRangeEffectiveDtoObject());

            await(await DateRangeEffectiveContractObjectsController.Delete(StaticTestValues.ValidId1)).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Update(It.IsAny <DateRangeEffectiveDtoObject>()), Times.Once);
        }
        public async Task Given_AValidDateRangeEffectiveContractObjectId_When_DeleteIsInvoked_Then_DalUpdateMethodShouldBeInvokedWithUpdatedAuditInformation()
        {
            MockUser.SetupGet(m => m.Id).Returns(StaticTestValues.LastUpdatedByUserId2.Value);
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Read(StaticTestValues.ValidId1)).ReturnsAsync(new DateRangeEffectiveDtoObject());

            await(await DateRangeEffectiveContractObjectsController.Delete(StaticTestValues.ValidId1)).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Update(It.Is <DateRangeEffectiveDtoObject>(c => c.LastUpdatedByUserId == StaticTestValues.LastUpdatedByUserId2 && c.LastUpdatedOn > DateTimeOffset.UtcNow.AddSeconds(-1) && c.LastUpdatedOn <DateTimeOffset.UtcNow.AddSeconds(1) && c.EffectiveEndDate> DateTimeOffset.UtcNow.AddSeconds(-1) && c.EffectiveEndDate < DateTimeOffset.UtcNow.AddSeconds(1))));
        }
        public async Task Given_AValidDateRangeEffectiveContractObject_When_PutIsInvoked_Then_DalUpdateMethodShouldOnlyBeInvokedOnce()
        {
            MockContractValidator.Setup(m => m.ValidateContract(It.IsAny <DateRangeEffectiveContractObject>())).ReturnsAsync(new string[0]);
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Update(It.IsAny <DateRangeEffectiveDtoObject>())).ReturnsAsync(new DateRangeEffectiveDtoObject());

            await(await DateRangeEffectiveContractObjectsController.Put(new DateRangeEffectiveContractObject())).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Update(It.IsAny <DateRangeEffectiveDtoObject>()), Times.Once);
        }
        public async Task Given_AValidDateRangeEffectiveContractObject_When_PutIsInvoked_Then_OkResponseShouldBeReturned()
        {
            MockContractValidator.Setup(m => m.ValidateContract(It.IsAny <DateRangeEffectiveContractObject>())).ReturnsAsync(new string[0]);
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Update(It.IsAny <DateRangeEffectiveDtoObject>())).ReturnsAsync(new DateRangeEffectiveDtoObject());

            var response = await(await DateRangeEffectiveContractObjectsController.Put(new DateRangeEffectiveContractObject())).ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }
        public async Task Given_AValidDateRangeEffectiveContractObject_When_PostIsInvoked_Then_DalCreateMethodShouldBeInvokedWithUpdatedAuditInformation()
        {
            MockUser.SetupGet(m => m.Id).Returns(StaticTestValues.CreatedByUserId2);
            MockContractValidator.Setup(m => m.ValidateContract(It.IsAny <DateRangeEffectiveContractObject>())).ReturnsAsync(new string[0]);
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Create(It.IsAny <DateRangeEffectiveDtoObject>())).ReturnsAsync(new DateRangeEffectiveDtoObject());

            await(await DateRangeEffectiveContractObjectsController.Post(new DateRangeEffectiveContractObject())).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Create(It.Is <DateRangeEffectiveDtoObject>(c => c.LastUpdatedByUserId == null && c.LastUpdatedOn == null && c.CreatedByUserId == StaticTestValues.CreatedByUserId2 && c.CreatedOn > DateTimeOffset.UtcNow.AddSeconds(-1) && c.CreatedOn < DateTimeOffset.UtcNow.AddSeconds(1))));
        }
        public async Task Given_ADateRangeEffectiveContractObjectWithAnInvalidEffectiveDateRange_When_PutIsInvoked_Then_DalUpdateMethodShouldNotBeInvoked()
        {
            MockContractValidator.Setup(m => m.ValidateContract(It.IsAny <DateRangeEffectiveContractObject>())).ReturnsAsync(new string[0]);

            await(await DateRangeEffectiveContractObjectsController.Put(new DateRangeEffectiveContractObject {
                EffectiveStartDate = DateTimeOffset.MaxValue, EffectiveEndDate = DateTimeOffset.MinValue
            })).ExecuteAsync(CancellationToken.None);

            MockDateRangeEffectiveObjectsDal.Verify(m => m.Update(It.IsAny <DateRangeEffectiveDtoObject>()), Times.Never);
        }
        public async Task Given_ADateRangeEffectiveContractObjectWithAnInvalidId_When_PutIsInvoked_Then_NotFoundStatusShouldBeReturned()
        {
            MockContractValidator.Setup(m => m.ValidateContract(It.IsAny <DateRangeEffectiveContractObject>())).ReturnsAsync(new string[0]);
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Update(It.Is <DateRangeEffectiveDtoObject>(c => c.Id == StaticTestValues.InvalidId1))).ThrowsAsync(new ObjectNotFoundException());

            var response = await(await DateRangeEffectiveContractObjectsController.Put(new DateRangeEffectiveContractObject {
                Id = StaticTestValues.InvalidId1
            })).ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);
        }
        public async Task Given_AValidDateRangeEffectiveContractObject_When_PostIsInvoked_Then_ResponseShouldContainTheUrlToGetTheCreatedContract()
        {
            MockContractValidator.Setup(m => m.ValidateContract(It.IsAny <DateRangeEffectiveContractObject>())).ReturnsAsync(new string[0]);
            MockDateRangeEffectiveObjectsDal.Setup(m => m.Create(It.IsAny <DateRangeEffectiveDtoObject>())).ReturnsAsync(new DateRangeEffectiveDtoObject {
                Id = StaticTestValues.ValidId1
            });

            var response = await(await DateRangeEffectiveContractObjectsController.Post(new DateRangeEffectiveContractObject())).ExecuteAsync(CancellationToken.None);

            Assert.AreEqual($"http://localhost/v1/{StaticTestValues.ControllerName}/{StaticTestValues.ValidId1}?controller={StaticTestValues.ControllerName}", response.Headers.Location.ToString());
        }