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