public async Task Should_raise_error_when_toggling_an_nonexisting_feature_as_active()
        {
            var application = new Application("App01", "0.1");
            var feature     = new Feature("isBlueButtonActive", false);
            var dto         = new ApplicationFeatureDTO(feature, application, true);

            await _applicationFeatureDomainService.TogleApplicationFeature(dto);

            await _mediator.Received(1).Publish(Arg.Is <ErrorNotification>(d => d.Error.Equals(DomainMessageError.NonExistentFeature)));
        }
        public async Task Should_toggle_feature_as_active()
        {
            var application        = new Application("App01", "0.1");
            var feature            = new Feature("isBlueButtonActive", false);
            var dto                = new ApplicationFeatureDTO(feature, application, true);
            var applicationFeature = new ApplicationFeature(feature, application, false);

            _applicationFeatureRepository.GetAsync(application.Id, feature.Id).Returns(applicationFeature);

            await _applicationFeatureDomainService.TogleApplicationFeature(dto);

            applicationFeature.IsActive.Should().BeTrue();
        }
        public async Task Should_should_raise_error_if_feature_is_null_on_adding_application_feature()
        {
            var application = new Application("App01", "0.1");
            var dto         = new ApplicationFeatureDTO(null, application, false);

            var appFeature = await _applicationFeatureDomainService.Add(dto);

            using (new AssertionScope())
            {
                appFeature.Should().BeNull();
                _applicationFeatureRepository.Received(0).Add(appFeature);
                dto.ValidationResult.Errors.Should().NotBeEmpty();
                dto.ValidationResult.Errors.Any(d => d.ErrorMessage == DomainMessageError.FeatureCannotBeNull);
                await _mediator.Received(1).Publish(Arg.Is <ErrorNotification>(d => d.Error.Equals(DomainMessageError.FeatureCannotBeNull)));
            }
        }
        public async Task TogleApplicationFeature(ApplicationFeatureDTO applicationFeatureDTO)
        {
            if (!applicationFeatureDTO.IsValid())
            {
                return;
            }

            var existingFeature = await _applicationFeatureRepository.GetAsync(applicationFeatureDTO.Application.Id, applicationFeatureDTO.Feature.Id);

            if (existingFeature != null)
            {
                UpdateApplicationFeature(existingFeature, applicationFeatureDTO);
            }
            else
            {
                await NotifyError(DomainMessageError.NonExistentFeature);
            }
        }
        public async Task Should_should_raise_error_if_both_application_and_feature_are_null_on_adding_application_feature()
        {
            var dto = new ApplicationFeatureDTO(null, null, false);

            var appFeature = await _applicationFeatureDomainService.Add(dto);

            using (new AssertionScope())
            {
                var errorMessages = new string[] { DomainMessageError.ApplicationCannotBeNull, DomainMessageError.FeatureCannotBeNull };
                appFeature.Should().BeNull();
                _applicationFeatureRepository.Received(0).Add(appFeature);
                dto.ValidationResult.Errors.Should().HaveCount(2);
                dto.ValidationResult.Errors.Any(d => errorMessages.Contains(d.ErrorMessage));
                await _mediator.Received(1).Publish(Arg.Is <ErrorNotification>(d => d.Error.Equals(DomainMessageError.ApplicationCannotBeNull)));

                await _mediator.Received(1).Publish(Arg.Is <ErrorNotification>(d => d.Error.Equals(DomainMessageError.FeatureCannotBeNull)));
            }
        }
        public async Task Should_add_application_feature()
        {
            var application = new Application("App01", "0.1");
            var feature     = new Feature("isBlueButtonActive", true);
            var dto         = new ApplicationFeatureDTO(feature, application, false);

            var appFeature = await _applicationFeatureDomainService.Add(dto);

            using (new AssertionScope())
            {
                _applicationFeatureRepository.Received(1).Add(appFeature);
                appFeature.Application.Name.Should().Be("App01");
                appFeature.Application.Version.Should().Be("0.1");
                appFeature.Feature.Name.Should().Be("isBlueButtonActive");
                appFeature.Feature.IsActive.Should().Be(true);
                appFeature.IsActive.Should().Be(false);
            }
        }
        public async Task Should_update_feature_if_there_is_an_existing_feature_for_the_provided_application()
        {
            var application        = new Application("App01", "0.1");
            var feature            = new Feature("isBlueButtonActive", true);
            var dto                = new ApplicationFeatureDTO(feature, application, false);
            var applicationFeature = new ApplicationFeature(feature, application, true);

            _applicationFeatureRepository.GetAsync(application.Id, feature.Id).Returns(applicationFeature);

            var appFeature = await _applicationFeatureDomainService.Add(dto);

            using (new AssertionScope())
            {
                _applicationFeatureRepository.Received(0).Add(appFeature);
                appFeature.Application.Name.Should().Be("App01");
                appFeature.Application.Version.Should().Be("0.1");
                appFeature.Feature.Name.Should().Be("isBlueButtonActive");
                appFeature.Feature.IsActive.Should().Be(true);
                appFeature.IsActive.Should().Be(false);
            }
        }
        public async Task <ApplicationFeature> Add(ApplicationFeatureDTO applicationFeatureDTO)
        {
            if (!applicationFeatureDTO.IsValid())
            {
                await NotifyValidationErrors(applicationFeatureDTO);

                return(null);
            }

            var existingFeature = await _applicationFeatureRepository.GetAsync(applicationFeatureDTO.Application.Id, applicationFeatureDTO.Feature.Id);

            if (existingFeature != null)
            {
                return(UpdateApplicationFeature(existingFeature, applicationFeatureDTO));
            }

            var applicationFeature = new ApplicationFeature(applicationFeatureDTO.Feature, applicationFeatureDTO.Application, applicationFeatureDTO.IsActive);

            _applicationFeatureRepository.Add(applicationFeature);

            return(applicationFeature);
        }
 private static ApplicationFeature UpdateApplicationFeature(ApplicationFeature existingFeature, ApplicationFeatureDTO applicationFeatureDTO)
 {
     if (applicationFeatureDTO.IsActive == existingFeature.IsActive)
     {
         return(existingFeature);
     }
     if (applicationFeatureDTO.IsActive)
     {
         existingFeature.Enable();
     }
     else
     {
         existingFeature.Disable();
     }
     return(existingFeature);
 }