public async Task GetQuestionCategoryAsync_DoesntExist_ReturnNull()
		{
			var database = new TestDatabaseBuilder()
				.AddClassroom("Class1")
				.Build();
			
			var questionCategoryService = new QuestionCategoryService(database.Context);
			var category = await questionCategoryService.GetQuestionCategoryAsync
			(
				"Class1",
				id: 1
			);

			Assert.Null(category);
		}
		public async Task GetQuestionCategoriesAsync_OnlyForClassroom()
		{
			var database = new TestDatabaseBuilder()
				.AddClassroom("Class1")
				.AddClassroom("Class2")
				.AddQuestionCategory("Class1", "Category1")
				.AddQuestionCategory("Class1", "Category2")
				.AddQuestionCategory("Class2", "Category1")
				.Build();

			var questionCategoryService = new QuestionCategoryService(database.Context);
			var categories = await questionCategoryService.GetQuestionCategoriesAsync("Class1");

			Assert.Equal(2, categories.Count);
			Assert.Equal("Class1", categories[0].Classroom.Name);
			Assert.Equal("Category1", categories[0].Name);
			Assert.Equal("Class1", categories[0].Classroom.Name);
			Assert.Equal("Category2", categories[1].Name);
		}
		public async Task GetQuestionCategoryAsync_Exists_ReturnCategory()
		{
			var database = new TestDatabaseBuilder()
				.AddClassroom("Class1")
				.AddQuestionCategory("Class1", "Category1")
				.Build();

			var questionCategoryId = database.Context.QuestionCategories.First().Id;

			database.Reload();

			var questionCategoryService = new QuestionCategoryService(database.Context);
			var category = await questionCategoryService.GetQuestionCategoryAsync
			(
				"Class1", 
				questionCategoryId
			);

			Assert.Equal("Class1", category.Classroom.Name);
			Assert.Equal("Category1", category.Name);
		}
		public async Task CreateQuestionCategoryAsync_CategoryCreated()
		{
			var database = new TestDatabaseBuilder()
				.AddClassroom("Class1")
				.Build();
			
			var questionCategoryService = new QuestionCategoryService(database.Context);
			await questionCategoryService.CreateQuestionCategoryAsync
			(
				"Class1",
				new QuestionCategory()
				{
					Name = "Category1"
				}
			);

			database.Reload();

			var questionCategory = database.Context.QuestionCategories
				.Include(qc => qc.Classroom)
				.Single();

			Assert.Equal("Class1", questionCategory.Classroom.Name);
			Assert.Equal("Category1", questionCategory.Name);
		}
		public async Task DeleteQuestionCategoryAsync_CategoryDeleted()
		{
			var database = new TestDatabaseBuilder()
				.AddClassroom("Class1")
				.AddQuestionCategory("Class1", "Category1")
				.Build();
			
			var questionCategoryId = database.Context.QuestionCategories.First().Id;

			database.Reload();

			var questionCategoryService = new QuestionCategoryService(database.Context);
			await questionCategoryService.DeleteQuestionCategoryAsync
			(
				"Class1",
				questionCategoryId
			);

			database.Reload();
			
			Assert.Equal(0, database.Context.QuestionCategories.Count());
		}
		public async Task UpdateQuestionCategoryAsync_CategoryUpdated()
		{
			var database = new TestDatabaseBuilder()
				.AddClassroom("Class1")
				.AddQuestionCategory("Class1", "Category1", privateCategory: true)
				.Build();
			
			var questionCategory = database.Context.QuestionCategories
				.Include(qc => qc.Classroom)
				.First();

			// Update the category
			database.Context.Entry(questionCategory).State = EntityState.Detached;
			questionCategory.IsPrivate = false;

			// Apply the update
			var questionCategoryService = new QuestionCategoryService(database.Context);
			await questionCategoryService.UpdateQuestionCategoryAsync
			(
				"Class1",
				questionCategory
			);

			database.Reload();

			questionCategory = database.Context.QuestionCategories
				.Include(qc => qc.Classroom)
				.Single();

			Assert.Equal("Class1", questionCategory.Classroom.Name);
			Assert.Equal("Category1", questionCategory.Name);
			Assert.Equal(false, questionCategory.IsPrivate);
		}