public async Task <ActionResult <TestDto> > GenerateTest(TestQueryDto testQueryDto, CancellationToken token) { var collection = await storage.FindCollection(testQueryDto.CollectionId, token); if (collection is null) { return(NotFound()); } if (!User.OwnsResource(collection)) { return(Forbid()); } var cards = await storage.GetCollectionCards(testQueryDto.CollectionId, token); if (testQueryDto.Filter != null) { var filter = filterGenerator.GetFilter(testQueryDto.Filter); cards = filter(cards).ToList(); } if (cards.Count == 0) { return(UnprocessableEntity("Not enough cards for test")); } var testBuilder = testBuilderFactory.GetBuilder(cards, new RandomCardsSelector()); foreach (var block in testQueryDto.Blocks) { if (generatorsByCaption.ContainsKey(block.Type)) { testBuilder = testBuilder.WithGenerator(generatorsByCaption[block.Type], block.Amount); } } var exercises = testBuilder.Build().ToList(); var test = new Test(exercises, User.Identity.Name); await testStorage.AddTest(test, token); return(Ok(new TestDto(test))); }
public TestsController_GeneratingTests() { generators = new IExerciseGenerator[] { new OpenQuestionExerciseGenerator(), new MatchingQuestionExerciseGenerator(), new ChoiceQuestionExerciseGenerator() }; exercises = new Exercise[0]; cards = new List <Card> { new Card("t1", "d1", "admin", id), new Card("t2", "d2", "admin", id) }; collection = new Collection("coll", "admin", id); testQuery = new TestQueryDto(id, new List <TestBlockDto> { new TestBlockDto(generators[0].GetTypeCaption(), 1), new TestBlockDto(generators[1].GetTypeCaption(), 2), new TestBlockDto(generators[2].GetTypeCaption(), 3) }, null); fakeStorage = A.Fake <IStorage>(); fakeTestStorage = A.Fake <ITestStorage>(); factory = A.Fake <ITestBuilderFactory>(); fakeBuilder = A.Fake <ITestBuilder>(); A.CallTo(() => fakeStorage.FindCollection(A <Guid> ._, A <CancellationToken> ._)).Returns(collection); A.CallTo(() => fakeStorage.GetCollectionCards(id, A <CancellationToken> ._)).Returns(cards); A.CallTo(() => fakeBuilder.Build()).Returns(exercises); A.CallTo(() => fakeBuilder.WithGenerator(A <IExerciseGenerator> ._, A <int> ._)).Returns(fakeBuilder); A.CallTo(() => factory.GetBuilder(cards, A <ICardsSelector> ._)).Returns(fakeBuilder); controller = new TestsController(fakeStorage, fakeTestStorage, factory, generators, null); ControllerTestsHelper.AttachUserToControllerContext(controller, "admin"); }