public void ShouldUpdateExistingItemInDataStorage(SaveItemCommand sut, ID itemId, ID templateId, ID fieldId)
        {
            // arrange
            var originalItem = new DbItem("original item", itemId)
            {
                new DbField("Title", fieldId)
                {
                    Value = "original title"
                }
            };

            sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
            sut.DataStorage.GetFakeTemplate(null).ReturnsForAnyArgs(new DbTemplate("Sample", templateId));

            var fields = new FieldList {
                { fieldId, "updated title" }
            };
            var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId, ID.NewID, ID.Null, fields);

            sut.Initialize(updatedItem);

            // act
            ReflectionUtil.CallMethod(sut, "DoExecute");

            // assert
            originalItem.Name.Should().Be("updated item");
            originalItem.Fields[fieldId].Value.Should().Be("updated title");
        }
        public void ShouldThrowExceptionIfNoFieldFoundInOriginalItem(SaveItemCommand sut, ID itemId, ID templateId, ID fieldId)
        {
            // arrange
            var originalItem = new DbItem("original item", itemId)
            {
                new DbField("Title")
            };

            sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
            sut.DataStorage.GetFakeTemplate(null).ReturnsForAnyArgs(new DbTemplate("Sample", templateId));

            var fields = new FieldList {
                { fieldId, "updated title" }
            };
            var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId, ID.NewID, ID.Null, fields);

            sut.Initialize(updatedItem);

            // act
            Action action = () => ReflectionUtil.CallMethod(sut, "DoExecute");

            // assert
            action
            .ShouldThrow <TargetInvocationException>()
            .WithInnerException <InvalidOperationException>()
            .WithInnerMessage("Item field not found. Item: 'updated item', '{0}'; field: '{1}'.".FormatWith(itemId, fieldId));
        }
        public void ShouldAddMissingFieldToItemIfFieldExistsInTemplate(SaveItemCommand sut, ID itemId, ID templateId, ID fieldId)
        {
            // arrange
            var template = new DbTemplate("Sample", templateId)
            {
                fieldId
            };
            var originalItem = new DbItem("original item", itemId, templateId);

            sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
            sut.DataStorage.GetFakeTemplate(templateId).Returns(template);

            var fields = new FieldList {
                { fieldId, "updated title" }
            };
            var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId, ID.NewID, ID.Null, fields);

            sut.Initialize(updatedItem);

            // act
            ReflectionUtil.CallMethod(sut, "DoExecute");

            // assert
            originalItem.Name.Should().Be("updated item");
            originalItem.Fields[fieldId].Value.Should().Be("updated title");
        }
        public void ShouldUpdateBranchId(SaveItemCommand sut, DbItem item, ID branchId, FieldList fields, Language language)
        {
            // arrange
            sut.DataStorage.GetFakeItem(item.ID).Returns(item);
            var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", item.ID, ID.NewID, branchId, fields, language, Version.Parse(0));

            sut.Initialize(updatedItem);

            // act
            ReflectionUtil.CallMethod(sut, "DoExecute");

            // assert
            item.BranchId.Should().Be(branchId);
        }
        public void ShouldNotUpdateFieldsIfItemVersionIsZero(SaveItemCommand sut, DbItem item, FieldList fields, Language language)
        {
            // arrange
            sut.DataStorage.GetFakeItem(item.ID).Returns(item);
            var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", item.ID, ID.NewID, ID.Null, fields, language, Version.Parse(0));

            sut.Initialize(updatedItem);

            // act
            Action action = () => ReflectionUtil.CallMethod(sut, "DoExecute");

            // assert
            action.ShouldNotThrow();
        }
    public void ShouldUpdateItemPathAfterRename(string originalPath, string expectedPath, SaveItemCommand sut, ID itemId, ID templateId)
    {
      // arrange
      var originalItem = new DbItem("original item") { FullPath = originalPath };
      sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
      sut.DataStorage.GetFakeTemplate(null).ReturnsForAnyArgs(new DbTemplate("Sample", templateId));

      var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId);
      sut.Initialize(updatedItem);

      // act
      ReflectionUtil.CallMethod(sut, "DoExecute");

      // assertt
      originalItem.FullPath.Should().Be(expectedPath);
    }
    public void ShouldUpdateExistingItemInDataStorage(SaveItemCommand sut, ID itemId, ID templateId, ID fieldId)
    {
      // arrange
      var originalItem = new DbItem("original item", itemId) { new DbField("Title", fieldId) { Value = "original title" } };
      sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
      sut.DataStorage.GetFakeTemplate(null).ReturnsForAnyArgs(new DbTemplate("Sample", templateId));

      var fields = new FieldList { { fieldId, "updated title" } };
      var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId, ID.NewID, ID.Null, fields);

      sut.Initialize(updatedItem);

      // act
      ReflectionUtil.CallMethod(sut, "DoExecute");

      // assert
      originalItem.Name.Should().Be("updated item");
      originalItem.Fields[fieldId].Value.Should().Be("updated title");
    }
    public void ShouldThrowExceptionIfNoTemplateFound(SaveItemCommand sut, ID itemId, ID templateId)
    {
      // arrange
      var originalItem = new DbItem("original item", itemId, templateId);
      sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
      sut.DataStorage.GetFakeTemplate(templateId).Returns(x => null);

      var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId, templateId);

      sut.Initialize(updatedItem);

      // act
      Action action = () => ReflectionUtil.CallMethod(sut, "DoExecute");

      // assert
      action
        .ShouldThrow<TargetInvocationException>()
        .WithInnerException<InvalidOperationException>()
        .WithInnerMessage("Item template not found. Item: 'updated item', '{0}'; template: '{1}'.".FormatWith(itemId, templateId));
    }
    public void ShouldThrowExceptionIfNoFieldFoundInOriginalItem(SaveItemCommand sut, ID itemId, ID templateId, ID fieldId)
    {
      // arrange
      var originalItem = new DbItem("original item", itemId) { new DbField("Title") };
      sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
      sut.DataStorage.GetFakeTemplate(null).ReturnsForAnyArgs(new DbTemplate("Sample", templateId));

      var fields = new FieldList { { fieldId, "updated title" } };
      var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId, ID.NewID, ID.Null, fields);

      sut.Initialize(updatedItem);

      // act
      Action action = () => ReflectionUtil.CallMethod(sut, "DoExecute");

      // assert
      action
        .ShouldThrow<TargetInvocationException>()
        .WithInnerException<InvalidOperationException>()
        .WithInnerMessage("Item field not found. Item: 'updated item', '{0}'; field: '{1}'.".FormatWith(itemId, fieldId));
    }
        public void ShouldThrowExceptionIfNoTemplateFound(SaveItemCommand sut, ID itemId, ID templateId)
        {
            // arrange
            var originalItem = new DbItem("original item", itemId, templateId);

            sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
            sut.DataStorage.GetFakeTemplate(templateId).Returns(x => null);

            var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId, templateId);

            sut.Initialize(updatedItem);

            // act
            Action action = () => ReflectionUtil.CallMethod(sut, "DoExecute");

            // assert
            action
            .ShouldThrow <TargetInvocationException>()
            .WithInnerException <InvalidOperationException>()
            .WithInnerMessage("Item template not found. Item: 'updated item', '{0}'; template: '{1}'.".FormatWith(itemId, templateId));
        }
    public void ShouldUpdateBranchId(SaveItemCommand sut, DbItem item, ID branchId, FieldList fields, Language language)
    {
      // arrange
      sut.DataStorage.GetFakeItem(item.ID).Returns(item);
      var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", item.ID, ID.NewID, branchId, fields, language, new Version(0));

      sut.Initialize(updatedItem);

      // act
      ReflectionUtil.CallMethod(sut, "DoExecute");

      // assert
      item.BranchId.Should().Be(branchId);
    }
    public void ShouldNotUpdateFieldsIfItemVersionIsZero(SaveItemCommand sut, DbItem item, FieldList fields, Language language)
    {
      // arrange
      sut.DataStorage.GetFakeItem(item.ID).Returns(item);
      var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", item.ID, ID.NewID, ID.Null, fields, language, new Version(0));

      sut.Initialize(updatedItem);

      // act
      Action action = () => ReflectionUtil.CallMethod(sut, "DoExecute");

      // assert
      action.ShouldNotThrow();
    }
    public void ShouldAddMissingFieldToItemIfFieldExistsInTemplate(SaveItemCommand sut, ID itemId, ID templateId, ID fieldId)
    {
      // arrange
      var template = new DbTemplate("Sample", templateId) { fieldId };
      var originalItem = new DbItem("original item", itemId, templateId);

      sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
      sut.DataStorage.GetFakeTemplate(templateId).Returns(template);

      var fields = new FieldList { { fieldId, "updated title" } };
      var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId, ID.NewID, ID.Null, fields);

      sut.Initialize(updatedItem);

      // act
      ReflectionUtil.CallMethod(sut, "DoExecute");

      // assert
      originalItem.Name.Should().Be("updated item");
      originalItem.Fields[fieldId].Value.Should().Be("updated title");
    }
        public void ShouldUpdateItemPathAfterRename(string originalPath, string expectedPath, SaveItemCommand sut, ID itemId, ID templateId)
        {
            // arrange
            var originalItem = new DbItem("original item")
            {
                FullPath = originalPath
            };

            sut.DataStorage.GetFakeItem(itemId).Returns(originalItem);
            sut.DataStorage.GetFakeTemplate(null).ReturnsForAnyArgs(new DbTemplate("Sample", templateId));

            var updatedItem = ItemHelper.CreateInstance(sut.Database, "updated item", itemId);

            sut.Initialize(updatedItem);

            // act
            ReflectionUtil.CallMethod(sut, "DoExecute");

            // assertt
            originalItem.FullPath.Should().Be(expectedPath);
        }