public async Task POST_DailyNutritionLogControllerActionReturnsForbiddenWithWrongUser() { var options = SqliteInMemory .CreateOptions <ApplicationDbContext>(); using (var context = new ApplicationDbContext(options)) { context.Database.EnsureCreated(); context.SeedTestDatabaseUsersWithDailyNutritionLogs(); } using (var context = new ApplicationDbContext(options)) { DailyNutritionLogController controller = new DailyNutritionLogController( context, TestUtilities.SetUpMockClaimsManager(1).Object, TestUtilities.GenericSetUpControllerStubLogger <DailyNutritionLogController>().Object) { ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = TestUtilities.setUpSampleHttpContextUser() } } }; var dnl = new DailyNutritionLog { UserId = 1, NutritionLogDate = new DateTime(2020, 1, 1), FoodEntries = new List <FoodEntry>() }; // test userId in claims manager does not match route var result = await controller.Post(2, dnl); Assert.IsType <ForbidResult>(result); var dnl2 = new DailyNutritionLog { UserId = 2, NutritionLogDate = new DateTime(2020, 1, 1), FoodEntries = new List <FoodEntry>() }; // test userId in claims manager does not match daily nutrition log var result_2 = await controller.Post(1, dnl2); Assert.IsType <ForbidResult>(result_2); // test both cases at the same time var result_3 = await controller.Post(2, dnl2); Assert.IsType <ForbidResult>(result_3); } }
public async Task POST_DailyNutritionLogControllerActionReturnsBadRequestWithInvalidModel() { var options = SqliteInMemory .CreateOptions <ApplicationDbContext>(); using (var context = new ApplicationDbContext(options)) { context.Database.EnsureCreated(); context.SeedTestDatabaseUsersWithDailyNutritionLogs(); } using (var context = new ApplicationDbContext(options)) { var controller = new DailyNutritionLogController( context, TestUtilities.SetUpMockClaimsManager(2).Object, TestUtilities.GenericSetUpControllerStubLogger <DailyNutritionLogController>().Object) { ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = TestUtilities.setUpSampleHttpContextUser() } } }; // model validation will not actually occur on this object during model binding, see the following comment for more info var invalidDailyNutritionLog = new DailyNutritionLog { UserId = 2, FoodEntries = new List <FoodEntry>() }; // model validation doesnt actually happen when we test the controller action so we have to add it manually, // therefore we are limited in testing the data annotations to the model binding controller.ModelState.AddModelError("unitTestError", "a model validation error occured"); var result = await controller.Post(2, invalidDailyNutritionLog); Assert.IsType <BadRequestObjectResult>(result); } }
public async Task POST_DailyNutritionLogControllerActionCreatesDailyNutritionLog(int userId, int numberOfFoodEntries) { int newEntryId = 0; var options = SqliteInMemory .CreateOptions <ApplicationDbContext>(); using (var context = new ApplicationDbContext(options)) { context.Database.EnsureCreated(); context.SeedTestDatabaseUsersWithDailyNutritionLogs(); } using (var context = new ApplicationDbContext(options)) { DailyNutritionLogController controller = new DailyNutritionLogController( context, TestUtilities.SetUpMockClaimsManager(userId).Object, TestUtilities.GenericSetUpControllerStubLogger <DailyNutritionLogController>().Object); controller.ControllerContext = new ControllerContext() { HttpContext = new DefaultHttpContext { User = TestUtilities.setUpSampleHttpContextUser() } }; var newDailyNutritionLog = new DailyNutritionLog { UserId = userId, NutritionLogDate = new DateTime(month: 9, day: 12, year: 2020), FoodEntries = new List <FoodEntry>() }; Random rand = new Random(); for (int i = 0; i < numberOfFoodEntries; i++) { newDailyNutritionLog.FoodEntries.Add(new FoodEntry { Calories = rand.Next(300, 800) }); } CreatedAtActionResult result = (CreatedAtActionResult)(await controller.Post(userId, newDailyNutritionLog)); Assert.IsType <CreatedAtActionResult>(result); var resultData = result.Value as DailyNutritionLog; newEntryId = resultData.DailyNutritionLogId; } using (var context = new ApplicationDbContext(options)) { var newEntry = await context .DailyNutritionLogs .Where(_ => _.DailyNutritionLogId == newEntryId) .Include(_ => _.FoodEntries) .FirstOrDefaultAsync(); Assert.NotNull(newEntry); Assert.Equal(numberOfFoodEntries, newEntry.FoodEntries.Count()); foreach (FoodEntry foodEntry in newEntry.FoodEntries) { Assert.Equal(newEntryId, foodEntry.DailyNutritionLogId); } } }