Beispiel #1
0
        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");
        }