public async Task GetCardTemplatesWithSearchTextTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController     controller = CreateController(context);
            Dictionary <string, object> parameters = new Dictionary <string, object>()
            {
                { EntityControllerBase <CardTemplate, long> .SearchTextParameter, "test123" }
            };

            //No cards matching the search text
            ActionResult <List <CardTemplate> > result = await controller.GetAsync(parameters);

            Assert.AreEqual(0, result.Value.Count);

            //Search text is template id
            parameters[EntityControllerBase <Card, long> .SearchTextParameter] = "1";
            result = await controller.GetAsync(parameters);

            Assert.AreEqual(1, result.Value.Count);
            Assert.AreEqual(template1.CardTemplateId, result.Value[0].CardTemplateId);

            //title contains the search text
            parameters[EntityControllerBase <Card, long> .SearchTextParameter] = "fault";
            result = await controller.GetAsync(parameters);

            Assert.AreEqual(1, result.Value.Count);
            Assert.AreEqual(template1.CardTemplateId, result.Value[0].CardTemplateId);

            //One of the field names contains the search text
            parameters[EntityControllerBase <Card, long> .SearchTextParameter] = "Fro";
            result = await controller.GetAsync(parameters);

            Assert.AreEqual(1, result.Value.Count);
            Assert.AreEqual(template1.CardTemplateId, result.Value[0].CardTemplateId);
        }
        public async Task AddNewFieldDefinitionOnPutCardTemplateTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController controller = CreateController(context);

            //Save changed entity
            CardFieldDefinition fieldDefinition2 = new CardFieldDefinition()
            {
                CardTemplateId = 1,
                FieldName      = "Field2",
            };

            template1.FieldDefinitions.Add(fieldDefinition2);
            ActionResult <CardTemplate> result = await controller.PutAsync(template1);

            Assert.IsNotNull(result.Value);
            CardTemplate template3 = context.Set <CardTemplate>().FirstOrDefault(template => template.CardTemplateId == 1);

            Assert.AreEqual(2, template3.FieldDefinitions.Count);
            Assert.AreEqual(2, template3.FieldDefinitions[1].FieldId);
            Card card1 = context.Set <Card>().Include(card => card.Fields).FirstOrDefault(card => card.CardId == 1);

            Assert.AreEqual(2, card1.Fields.Count);
            Assert.AreEqual("Field2", card1.Fields.OrderBy(field => field.FieldId).ToList()[1].FieldName);
        }
        public async Task GetCardTemplatesTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController     controller = CreateController(context);
            Dictionary <string, object> parameters = new Dictionary <string, object>();

            //Get all templates of user
            ActionResult <List <CardTemplate> > result = await controller.GetAsync(parameters);

            Assert.AreEqual(2, result.Value.Count);
            Assert.AreEqual(1, result.Value[1].FieldDefinitions.Count);
        }
        public async Task RemoveFieldDefinitionOnPutCardTemplateTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController controller = CreateController(context);

            //Save changed entity
            template1.FieldDefinitions.Clear();
            ActionResult <CardTemplate> result = await controller.PutAsync(template1);

            Assert.IsNotNull(result.Value);
            CardTemplate template3 = context.Find <CardTemplate>((long)1);

            Assert.AreEqual(0, template3.FieldDefinitions.Count);
            Card card1 = context.Find <Card>((long)1);

            Assert.AreEqual(0, card1.Fields.Count);
        }
        public async Task PostCardTemplateTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController controller = CreateController(context);

            //null as parameter -> bad request
            ActionResult <CardTemplate> result = await controller.PostAsync(null);

            Assert.IsTrue(result.Result is BadRequestResult);

            //Create new valid entity
            CardTemplate cardTemplate1 = new CardTemplate()
            {
                CardTemplateId = 4,
                Title          = "test123"
            };
            CardFieldDefinition fieldDefinition = new CardFieldDefinition()
            {
                FieldName      = "test",
                CardTemplateId = 4
            };

            cardTemplate1.FieldDefinitions.Add(fieldDefinition);
            result = await controller.PostAsync(cardTemplate1);

            Assert.IsNotNull(result.Value);
            cardTemplate1 = context.Set <CardTemplate>()
                            .Include(template => template.FieldDefinitions)
                            .SingleOrDefault(field => field.CardTemplateId == 4);
            Assert.IsNotNull(cardTemplate1);
            Assert.AreEqual(User.UserId, cardTemplate1.UserId);
            Assert.AreEqual(1, cardTemplate1.FieldDefinitions[0].FieldId);

            //Invalid template is validated
            bool wasThrown = false;

            try
            {
                result = await controller.PostAsync(new CardTemplate());
            }
            catch (NotifyException)
            {
                wasThrown = true;
            }
            Assert.IsTrue(wasThrown);
        }
        public async Task PutCardTemplateTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController controller = CreateController(context);

            //null as parameter -> bad request
            ActionResult <CardTemplate> result = await controller.PutAsync(null);

            Assert.IsTrue(result.Result is BadRequestResult);

            //template does not exist in db -> not found
            CardTemplate newTemplate = new CardTemplate()
            {
                CardTemplateId = 5,
                Title          = "dfsdf"
            };

            result = await controller.PutAsync(newTemplate);

            Assert.IsTrue(result.Result is NotFoundResult);

            //Save changed entity
            template2.Title = "New Title";
            result          = await controller.PutAsync(template2);

            Assert.IsNotNull(result.Value);
            CardTemplate template3 = context.Find <CardTemplate>(template2.CardTemplateId);

            Assert.AreEqual("New Title", template3.Title);
            Assert.AreEqual(1, template3.FieldDefinitions.Count);

            //Invalid template is validated
            bool wasThrown = false;

            try
            {
                result = await controller.PostAsync(new CardTemplate());
            }
            catch (NotifyException)
            {
                wasThrown = true;
            }
            Assert.IsTrue(wasThrown);
        }
        public async Task UpdateFieldDefinitionOnPutCardTemplateTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController controller = CreateController(context);

            //Save changed entity
            template1.FieldDefinitions[0].FieldName            = "NewFieldName";
            template1.FieldDefinitions[0].ShowInputForPractice = true;
            ActionResult <CardTemplate> result = await controller.PutAsync(template1);

            Assert.IsNotNull(result.Value);
            CardFieldDefinition definition3 = context.Find <CardFieldDefinition>(template1.CardTemplateId, 1);

            Assert.IsTrue(definition3.ShowInputForPractice);
            Assert.AreEqual("NewFieldName", definition3.FieldName);
            Card card1 = context.Set <Card>().SingleOrDefault(card => card.CardId == 1);

            Assert.AreEqual(1, card1.Fields.Count);
            Assert.AreEqual("NewFieldName", card1.Fields[0].FieldName);
        }
        public async Task GetTemplateByIdTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController controller = CreateController(context);

            //get template successfully
            ActionResult <CardTemplate> result = await controller.GetAsync(3);

            Assert.IsNotNull(result.Value);
            Assert.AreEqual(1, result.Value.FieldDefinitions.Count);

            //template of other user -> unauthorized
            result = await controller.GetAsync(2);

            Assert.IsTrue(result.Result is UnauthorizedResult);

            //template does not exist -> not found
            result = await controller.GetAsync(4);

            Assert.IsTrue(result.Result is NotFoundResult);
        }
        public async Task DeleteCardTemplateTest()
        {
            using DbContext context = CreateContext();
            CardTemplatesController controller = CreateController(context);

            //null as parameter -> bad request
            IActionResult result = await controller.DeleteAsync(null);

            Assert.IsTrue(result is BadRequestResult);

            //template does not exist -> not found
            result = await controller.DeleteAsync(new CardTemplate());

            Assert.IsTrue(result is NotFoundResult);

            //delete existing entity
            result = await controller.DeleteAsync(template2);

            Assert.IsTrue(result is OkResult);
            CardTemplate template1 = context.Find <CardTemplate>((long)3);

            Assert.IsNull(template1);
        }