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(); }
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"); }
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"); }
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; } } }
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)); }