Beispiel #1
0
        public void Updates_CanBeMade_ToExistingFeatureToggle()
        {
            //arrange
            var app = new Application {
                Id = 1, AppName = "TestApp"
            };
            var existingValue = new FeatureToggle {
                Id = 1, Application = app, ApplicationId = app.Id, ToggleName = "TestToggle", FeatureToggleStatuses = new List <FeatureToggleStatus>(), Notes = "FirstNote", IsPermanent = false
            };
            var updatedValue = new FeatureToggleUpdateModel {
                Id = 1, FeatureToggleName = "UpdatedFeatureToggleName", Notes = "Update", UserAccepted = true, Statuses = new List <FeatureToggleStatusUpdateModel>(), IsPermanent = true
            };

            _context.FeatureToggles.Add(existingValue);
            _context.SaveChanges();
            var controller = new FeatureTogglesController(_context);

            //act
            var result = controller.Update(updatedValue) as OkObjectResult;

            //assert
            _context.FeatureToggles.FirstOrDefault().ToggleName.Should().Be("UpdatedFeatureToggleName");
            _context.FeatureToggles.FirstOrDefault().Notes.Should().Be(updatedValue.Notes);
            _context.FeatureToggles.FirstOrDefault().UserAccepted.Should().BeTrue();
            _context.FeatureToggles.FirstOrDefault().IsPermanent.Should().BeTrue();
        }
Beispiel #2
0
        public async Task ChangingToggleName_ToExistingName_IsNotAllowed()
        {
            //arrange
            var app = Application.Create("test", "DEV", false);

            app.AddFeatureToggle("t1", "", "workItemId1");
            app.AddFeatureToggle("t2", "", "workItemId1");
            await _appRepository.AddAsync(app);

            var toggle       = app.FeatureToggles.FirstOrDefault(t => t.ToggleName == "t1");
            var updatedValue = new FeatureToggleUpdateModel
            {
                ApplicationId     = app.Id,
                Id                = toggle.Id,
                FeatureToggleName = "t2",
                ReasonToChange    = new ReasontoChangeUpdateModel
                {
                    Description  = "desc",
                    Environments = new List <string>
                    {
                        "DEV"
                    }
                }
            };

            //act
            var result = await _featureToggleController.Update(updatedValue);

            //assert
            result.Should().BeOfType <BadRequestObjectResult>().Which.Should().NotBeNull();
            var savedApp = await _appRepository.FindByIdAsync(app.Id);

            savedApp.FeatureToggles.FirstOrDefault(t => t.Id == toggle.Id).ToggleName.Should().Be("t1");
        }
Beispiel #3
0
        public async Task ExistingFeatureToggleBasicDataIsUpdated()
        {
            //arrange
            var app = Application.Create("test", "DEV", false);

            app.AddFeatureToggle("TestToggle", "FirstNote", "WorkItemId", false);
            await _appRepository.AddAsync(app);

            var toggle = app.FeatureToggles.Single();

            toggle.AddReasonToChange("user", "reason 1", new List <string>());
            var updatedValue = new FeatureToggleUpdateModel
            {
                ApplicationId      = app.Id,
                Id                 = toggle.Id,
                FeatureToggleName  = "UpdatedFeatureToggleName",
                Notes              = "Update",
                UserAccepted       = true,
                Statuses           = new List <FeatureToggleStatusUpdateModel>(),
                IsPermanent        = true,
                WorkItemIdentifier = "UpdateWorkItemId",
                ReasonToChange     = new ReasontoChangeUpdateModel
                {
                    Description  = "reason 2",
                    Environments = new List <string> {
                        "DEV"
                    }
                }
            };

            //act
            await _featureToggleController.Update(updatedValue);

            //assert
            var savedApp = await _appRepository.FindByIdAsync(app.Id);

            savedApp.FeatureToggles.FirstOrDefault().ToggleName.Should().Be("UpdatedFeatureToggleName");
            savedApp.FeatureToggles.FirstOrDefault().Notes.Should().Be("Update");
            savedApp.FeatureToggles.FirstOrDefault().UserAccepted.Should().BeTrue();
            savedApp.FeatureToggles.FirstOrDefault().IsPermanent.Should().BeTrue();
            savedApp.FeatureToggles.FirstOrDefault().WorkItemIdentifier.Should().Be("UpdateWorkItemId");
            savedApp.FeatureToggles.FirstOrDefault().ReasonsToChange.Count.Should().Be(2);
            var firstReason = savedApp.FeatureToggles.FirstOrDefault().ReasonsToChange.FirstOrDefault();

            firstReason.Description.Should().Be("reason 1");
            var secondReason = savedApp.FeatureToggles.FirstOrDefault().ReasonsToChange.LastOrDefault();

            secondReason.Description.Should().Be("reason 2");
            secondReason.Environments.Contains("DEV");
        }
Beispiel #4
0
        public async Task FeatureToggleUpdate_ByDifferentUser_UsernameChanged()
        {
            //arrange
            var app = Application.Create("test", "DEV", false);

            app.AddDeployEnvironment("QA", false, false, false);
            app.AddFeatureToggle("t1", "", "workItemId1");
            await _appRepository.AddAsync(app);

            var toggle       = app.FeatureToggles.Single();
            var updatedValue = new FeatureToggleUpdateModel
            {
                ApplicationId     = app.Id,
                Id                = toggle.Id,
                FeatureToggleName = "t1",
                Statuses          = new List <FeatureToggleStatusUpdateModel>
                {
                    new FeatureToggleStatusUpdateModel
                    {
                        Enabled     = true,
                        Environment = "DEV",
                    },
                    new FeatureToggleStatusUpdateModel
                    {
                        Enabled     = true,
                        Environment = "QA",
                    }
                },
                ReasonToChange = new ReasontoChangeUpdateModel
                {
                    Description  = "desc",
                    Environments = new List <string>
                    {
                        "DEV"
                    }
                }
            };

            //act
            await _featureToggleController.Update(updatedValue);

            //assert
            var savedApp = await _appRepository.FindByIdAsync(app.Id);

            var statuses  = savedApp.GetFeatureToggleStatuses(toggle.Id);
            var basicData = savedApp.GetFeatureToggleBasicData(toggle.Id);

            statuses.Count.Should().Be(2);
            statuses.All(s => s.UpdatedBy == "bla").Should().BeTrue();
        }
        public IActionResult Update([FromBody] FeatureToggleUpdateModel model)
        {
            var featureToggle = _db.FeatureToggles.Where(ft => ft.Id == model.Id)
                                .Include(ft => ft.FeatureToggleStatuses).ThenInclude(fts => fts.Environment).FirstOrDefault();

            if (featureToggle is null)
            {
                throw new InvalidOperationException("Feature toggle not found!");
            }

            featureToggle.ToggleName   = model.FeatureToggleName;
            featureToggle.UserAccepted = model.UserAccepted;
            featureToggle.Notes        = model.Notes;
            featureToggle.IsPermanent  = model.IsPermanent;
            foreach (var toggleStatus in model.Statuses)
            {
                var status = featureToggle.FeatureToggleStatuses.FirstOrDefault(s => s.Environment.EnvName == toggleStatus.Environment);
                if (status != null)
                {
                    UpdateTimestampOnChange(status, toggleStatus);
                    status.Enabled = toggleStatus.Enabled;
                }
            }

            _db.SaveChanges();

            return(Ok(model));

            void UpdateTimestampOnChange(FeatureToggleStatus status, FeatureToggleStatusUpdateModel toggleStatus)
            {
                if (status.Enabled != toggleStatus.Enabled)
                {
                    status.LastUpdated = DateTime.UtcNow;
                }
            }
        }
Beispiel #6
0
        public async Task <IActionResult> Update([FromBody] FeatureToggleUpdateModel model)
        {
            var app = await _applicationsRepository.FindByIdAsync(model.ApplicationId);

            var toggleData = app.GetFeatureToggleBasicData(model.Id);

            var updatedBy = _httpContextAccessor.HttpContext.User.Identity.Name;

            if (model.ReasonToChange != null)
            {
                app.UpdateFeatureToggleReasonsToChange(model.Id, updatedBy, model.ReasonToChange.Description, model.ReasonToChange.Environments);
            }


            if (model.IsPermanent != toggleData.IsPermanent)
            {
                app.UpdateFeatureTogglePermanentStatus(model.Id, model.IsPermanent);
            }

            if (model.Notes != toggleData.Notes)
            {
                app.UpdateFeatureToggleNotes(model.Id, model.Notes);
            }

            if (model.UserAccepted != toggleData.UserAccepted)
            {
                if (model.UserAccepted)
                {
                    app.FeatureAcceptedByUser(model.Id);
                }
                else
                {
                    app.FeatureRejectedByUser(model.Id);
                }
            }
            if (!string.IsNullOrEmpty(model.WorkItemIdentifier) && model.WorkItemIdentifier != toggleData.WorkItemIdentifier)
            {
                app.UpdateFeaturetoggleWorkItemIdentifier(model.Id, model.WorkItemIdentifier);
            }

            if (model.FeatureToggleName != toggleData.ToggleName)
            {
                try
                {
                    app.ChangeFeatureToggleName(model.Id, model.FeatureToggleName);
                }
                catch (BusinessRuleValidationException ex)
                {
                    return(BadRequest(ex.Message));
                }
            }
            foreach (var newStatus in model.Statuses)
            {
                app.SetToggle(model.Id, newStatus.Environment, newStatus.Enabled, updatedBy);
            }


            await _applicationsRepository.UpdateAsync(app);

            return(Ok(model));
        }