public IActionResult AddElement([FromBody] ElementCreationData elementData)
        {
            var userId     = _userProvider.GetCurrentUserId();
            var collection = _dbContext.Collection
                             .Include(c => c.Elements)
                             .SingleOrDefault(c => c.Id == elementData.CollectionId);

            if (collection == null)
            {
                return(NotFound());
            }

            if (collection.Elements.Count >= _configurationProvider.MaxElementsInCollection)
            {
                return(BadRequest("Could not add the element: Maximum number of elements reached"));
            }

            var lastSequenceInCollection = collection.Elements.Max(e => e.Sequence);
            var element = new Element
            {
                Link         = elementData.Link,
                Name         = elementData.Name,
                CollectionId = elementData.CollectionId,
                OwnerId      = userId,
                Sequence     = lastSequenceInCollection + 1 ?? 1
            };

            _dbContext.Add(element);
            _dbContext.SaveChanges();
            return(Ok());
        }
        public void AddElement_FirstElementInCollection_SequenceEquals1(string elementName, string link)
        {
            //Arrange
            var userId = NewGuid;

            AddUser(userId);
            var collection  = AddCollection(userId, 0);
            var elementData = new ElementCreationData {
                CollectionId = collection.Id, Link = link, Name = elementName
            };

            //Act
            InTransaction(context =>
            {
                var controller = new ElementsController(context, GetUserProviderMock(userId), getCollectionConfigurationProviderMock());
                controller.AddElement(elementData);
            });

            //Assert
            InTransaction(context =>
            {
                var element = context.Element.Single(el => el.Name == elementName);
                element.Sequence.Should().Be(1);
            });
        }
        public void AddElement_100ElementsInserted_SequenceConserved()
        {
            //Arrange
            var userId = NewGuid;

            AddUser(userId);
            var collection = AddCollection(userId, 0);

            //Act
            InTransaction(context =>
            {
                var controller = new ElementsController(context, GetUserProviderMock(userId), getCollectionConfigurationProviderMock());
                for (var i = 0; i < 100; i++)
                {
                    var elementData = new ElementCreationData {
                        CollectionId = collection.Id, Link = NewGuid, Name = i.ToString()
                    };
                    controller.AddElement(elementData);
                }
            });

            //Assert
            InTransaction(context =>
            {
                var elements = context.Collection
                               .Include(c => c.Elements)
                               .Single(c => c.Id == collection.Id)
                               .Elements.OrderBy(el => int.Parse(el.Name))
                               .ToList();
                elements.Should().HaveCount(100);
                elements.Max(el => el.Sequence).Should().Be(100);
                elements.Select(el => el.Sequence).Should().BeInAscendingOrder();
            });
        }
        public void AddElement_NewElementData_AllPropertiesInserted(string elementName, string link)
        {
            //Arrange
            var userId = NewGuid;

            AddUser(userId);
            var collection  = AddCollection(userId, 0);
            var elementData = new ElementCreationData {
                CollectionId = collection.Id, Link = link, Name = elementName
            };

            //Act
            InTransaction(context =>
            {
                var controller = new ElementsController(context, GetUserProviderMock(userId), getCollectionConfigurationProviderMock());
                controller.AddElement(elementData);
            });

            //Assert
            InTransaction(context =>
            {
                var element = context.Element.SingleOrDefault(el => el.Name == elementName);
                element.Should().NotBeNull();
                element.Name.Should().Be(elementName);
                element.Link.Should().Be(link);
                element.CollectionId.Should().Be(collection.Id);
                element.OwnerId.Should().Be(userId);
            });
        }