public void Add_ChildInCache_SetChildParentId()
        {
            // Arrange
            var treeContext          = new CachedTreeContext();
            var dbTreeRepository     = Substitute.For <IDbTreeRepository>();
            var cachedTreeRepository = new CachedTreeRepository(treeContext, dbTreeRepository);
            var parentId             = Guid.NewGuid();
            var childNode            = new TreeNode
            {
                Id               = Guid.NewGuid(),
                ParentId         = null,
                OriginalParentId = parentId
            };

            treeContext.Tree.Add(childNode.Id, childNode);
            var parentNode = new TreeNode
            {
                Id = parentId
            };

            // Act
            cachedTreeRepository.Add(parentNode);

            // Assert
            Assert.That(childNode.ParentId, Is.EqualTo(parentId));
        }
        public void Add_ChildToDeletedParent_DeleteChildAndGrandChild()
        {
            // Arrange
            var treeContext          = new CachedTreeContext();
            var dbTreeRepository     = Substitute.For <IDbTreeRepository>();
            var cachedTreeRepository = new CachedTreeRepository(treeContext, dbTreeRepository);
            var parentNode           = new TreeNode {
                Id = Guid.NewGuid(), ParentId = null, IsDeleted = true, State = NodeState.Deleted
            };
            var childNode = new TreeNode {
                Id = Guid.NewGuid(), ParentId = parentNode.Id
            };
            var grandchildNode = new TreeNode {
                Id = Guid.NewGuid(), ParentId = null, OriginalParentId = childNode.Id
            };

            treeContext.Tree.Add(parentNode.Id, parentNode);
            treeContext.Tree.Add(grandchildNode.Id, grandchildNode);

            // Act
            cachedTreeRepository.Add(childNode);

            // Assert
            Assert.That(treeContext.Tree[childNode.Id], Is.EqualTo(childNode));
            Assert.That(childNode.IsDeleted, Is.True);
            Assert.That(grandchildNode.ParentId, Is.EqualTo(childNode.Id));
            Assert.That(grandchildNode.IsDeleted, Is.True);
        }
        public void Add_NodeWithoutId_AddsNodeWithNewIdAndAddedState()
        {
            // Arrange
            var treeContext          = new CachedTreeContext();
            var dbTreeRepository     = Substitute.For <IDbTreeRepository>();
            var cachedTreeRepository = new CachedTreeRepository(treeContext, dbTreeRepository);
            var node = new TreeNode();

            // Act
            cachedTreeRepository.Add(node);

            // Assert
            Assert.That(node.Id, Is.Not.EqualTo(Guid.Empty));
            Assert.That(node.State, Is.EqualTo(NodeState.Added));
            Assert.That(treeContext.Tree[node.Id], Is.EqualTo(node));
        }
        public void Add_NodeIdIsNotEmpty_AddsNodeWithoutChangingIdAndState()
        {
            // Arrange
            var treeContext          = new CachedTreeContext();
            var dbTreeRepository     = Substitute.For <IDbTreeRepository>();
            var cachedTreeRepository = new CachedTreeRepository(treeContext, dbTreeRepository);
            var id   = Guid.NewGuid();
            var node = new TreeNode
            {
                Id = id
            };

            // Act
            cachedTreeRepository.Add(node);

            // Assert
            Assert.That(node.Id, Is.EqualTo(id));
            Assert.That(node.State, Is.EqualTo(NodeState.Unchanged));
            Assert.That(treeContext.Tree[node.Id], Is.EqualTo(node));
        }
        public void Add_ChildWithoutParent_AddsChildNodeToRootAndStoreOriginalParentId()
        {
            // Arrange
            var treeContext          = new CachedTreeContext();
            var dbTreeRepository     = Substitute.For <IDbTreeRepository>();
            var cachedTreeRepository = new CachedTreeRepository(treeContext, dbTreeRepository);
            var parentId             = Guid.NewGuid();
            var childNode            = new TreeNode
            {
                Id       = Guid.NewGuid(),
                ParentId = parentId
            };

            // Act
            cachedTreeRepository.Add(childNode);

            // Assert
            Assert.That(childNode.ParentId, Is.Null);
            Assert.That(childNode.OriginalParentId, Is.EqualTo(parentId));
            Assert.That(treeContext.Tree[childNode.Id], Is.EqualTo(childNode));
        }