public async Task<IHttpActionResult> PutUserPreference(UserPreferenceDTO userPrefDto) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (userPrefDto == null) { return BadRequest("Null object"); } if (userPrefDto.Categories == null) { return BadRequest(); // DataAnnotations is not supported in PLC :-( } var userId = User.Identity.GetUserId(); var categories = db.Categories .Where(x => userPrefDto.Categories.Contains(x.Name)) .ToList(); if (categories.Count != userPrefDto.Categories.Count) { // Client sent a bad category name return BadRequest("Invalid category name"); } UserPreference userPreference = new UserPreference { ApplicationUser_Id = userId, ConversationLimit = userPrefDto.ConversationLimit, SortOrder = userPrefDto.SortOrder, UserCategory = new List<UserCategory>() }; if (UserPreferenceExists(userId)) { db.UserPreferences.Attach(userPreference); db.Entry(userPreference).State = EntityState.Modified; db.Entry(userPreference).Collection(x => x.UserCategory).Load(); userPreference.UserCategory.Clear(); foreach (var c in categories) { userPreference.UserCategory.Add(new UserCategory { Category = c, ApplicationUser_Id = userId }); } } else { foreach (var c in categories) { userPreference.UserCategory.Add(new UserCategory { Category = c, ApplicationUser_Id = userId }); } db.UserPreferences.Add(userPreference); } await db.SaveChangesAsync(); return StatusCode(HttpStatusCode.NoContent); }
public async Task PutInvalidCategoryReturnsBadRequest() { var categories = new List<Category>() { new Category { Name = "CAT1" }, new Category { Name = "CAT2" }, }.AsQueryable(); // Mock DbSet with no existing user preferences var mockCategorySet = Helpers.CreateMockSet(categories); mockCtx.SetupGet(mc => mc.Categories).Returns(mockCategorySet.Object); var dto = new UserPreferenceDTO { Categories = new string[] { "CAT1", "CAT3" } // Includes bogus category }; var result = await controller.PutUserPreference(dto); Assert.IsInstanceOfType(result, typeof(BadRequestErrorMessageResult)); }
public async Task PutUpdatesDB() { var data = new List<UserPreference>().AsQueryable(); var categories = new List<Category>() { new Category { Name = "CAT1" }, new Category { Name = "CAT2" }, }.AsQueryable(); // Mock DbSet with no existing user preferences var mockSet = Helpers.CreateMockSet(data); mockCtx.SetupGet(mc => mc.UserPreferences).Returns(mockSet.Object); var mockCategorySet = Helpers.CreateMockSet(categories); mockCtx.SetupGet(mc => mc.Categories).Returns(mockCategorySet.Object); var dto = new UserPreferenceDTO { Categories = new string[] { "CAT1", "CAT2" } }; var result = await controller.PutUserPreference(dto); mockSet.Verify(m => m.Add(It.IsAny<UserPreference>()), Times.Once()); mockCtx.Verify(m => m.SaveChangesAsync(), Times.Once()); }
public async Task PutNullCategoryReturnsBadRequest() { var parent = new UserPreferenceDTO { Categories = null }; var result = await controller.PutUserPreference(parent); Assert.IsInstanceOfType(result, typeof(BadRequestResult)); }