Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v9: Cherry picked fix from v8 and updated test for v9 #11358

Merged
merged 2 commits into from
Oct 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,7 @@ protected override void PersistNewItem(IContent entity)
protected override void PersistUpdatedItem(IContent entity)
{
var isEntityDirty = entity.IsDirty();
var editedSnapshot = entity.Edited;

// check if we need to make any database changes at all
if ((entity.PublishedState == PublishedState.Published || entity.PublishedState == PublishedState.Unpublished)
Expand Down Expand Up @@ -659,6 +660,19 @@ protected override void PersistUpdatedItem(IContent entity)
edited = true;
}

// To establish the new value of "edited" we compare all properties publishedValue to editedValue and look
// for differences.
//
// If we SaveAndPublish but the publish fails (e.g. already scheduled for release)
// we have lost the publishedValue on IContent (in memory vs database) so we cannot correctly make that comparison.
//
// This is a slight change to behaviour, historically a publish, followed by change & save, followed by undo change & save
// would change edited back to false.
if (!publishing && editedSnapshot)
{
edited = true;
}

if (entity.ContentType.VariesByCulture())
{
// names also impact 'edited'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1348,6 +1348,107 @@ public void Cannot_Publish_Content_Awaiting_Release()
Assert.AreEqual(PublishResultType.FailedPublishAwaitingRelease, published.Result);
}

[Test]
public void Failed_Publish_Should_Not_Update_Edited_State_When_Edited_True()
{
// Arrange
IContentService contentService = GetRequiredService<IContentService>();
IContentTypeService contentTypeService = GetRequiredService<IContentTypeService>();

IContentType contentType = new ContentTypeBuilder()
.WithId(0)
.AddPropertyType()
.WithAlias("header")
.WithValueStorageType(ValueStorageType.Integer)
.WithPropertyEditorAlias(Constants.PropertyEditors.Aliases.TextBox)
.WithName("header")
.Done()
.WithContentVariation(ContentVariation.Nothing)
.Build();

contentTypeService.Save(contentType);

Content content = new ContentBuilder()
.WithId(0)
.WithName("Home")
.WithContentType(contentType)
.AddPropertyData()
.WithKeyValue("header", "Cool header")
.Done()
.Build();

contentService.SaveAndPublish(content);

content.Properties[0].SetValue("Foo", culture: string.Empty);
content.ContentSchedule.Add(DateTime.Now.AddHours(2), null);
contentService.Save(content);

// Act
var result = contentService.SaveAndPublish(content, userId: Constants.Security.SuperUserId);

// Assert
Assert.Multiple(() =>
{
Assert.IsFalse(result.Success);
Assert.IsTrue(result.Content.Published);
Assert.AreEqual(PublishResultType.FailedPublishAwaitingRelease, result.Result);

// We changed property data
Assert.IsTrue(result.Content.Edited, "result.Content.Edited");
});
}

// V9 - Tests.Integration
[Test]
public void Failed_Publish_Should_Not_Update_Edited_State_When_Edited_False()
{
// Arrange
IContentService contentService = GetRequiredService<IContentService>();
IContentTypeService contentTypeService = GetRequiredService<IContentTypeService>();

IContentType contentType = new ContentTypeBuilder()
.WithId(0)
.AddPropertyType()
.WithAlias("header")
.WithValueStorageType(ValueStorageType.Integer)
.WithPropertyEditorAlias(Constants.PropertyEditors.Aliases.TextBox)
.WithName("header")
.Done()
.WithContentVariation(ContentVariation.Nothing)
.Build();

contentTypeService.Save(contentType);

Content content = new ContentBuilder()
.WithId(0)
.WithName("Home")
.WithContentType(contentType)
.AddPropertyData()
.WithKeyValue("header", "Cool header")
.Done()
.Build();

contentService.SaveAndPublish(content);

content.ContentSchedule.Add(DateTime.Now.AddHours(2), null);
contentService.Save(content);

// Act
var result = contentService.SaveAndPublish(content, userId: Constants.Security.SuperUserId);

// Assert
Assert.Multiple(() =>
{
Assert.IsFalse(result.Success);
Assert.IsTrue(result.Content.Published);
Assert.AreEqual(PublishResultType.FailedPublishAwaitingRelease, result.Result);

// We didn't change any property data
Assert.IsFalse(result.Content.Edited, "result.Content.Edited");
});
}


[Test]
public void Cannot_Publish_Culture_Awaiting_Release()
{
Expand Down Expand Up @@ -2151,7 +2252,7 @@ public void Can_Rollback_Version_On_Content()
ContentService.Save(rollback2);

Assert.IsTrue(rollback2.Published);
Assert.IsFalse(rollback2.Edited); // all changes cleared!
Assert.IsTrue(rollback2.Edited); // Still edited, change of behaviour

Assert.AreEqual("Jane Doe", rollback2.GetValue<string>("author"));
Assert.AreEqual("Text Page 2 ReReUpdated", rollback2.Name);
Expand All @@ -2170,7 +2271,7 @@ public void Can_Rollback_Version_On_Content()
content.CopyFrom(rollto);
content.Name = rollto.PublishName; // must do it explicitely AND must pick the publish one!
ContentService.Save(content);
Assert.IsFalse(content.Edited);
Assert.IsTrue(content.Edited); //Still edited, change of behaviour
Assert.AreEqual("Text Page 2 ReReUpdated", content.Name);
Assert.AreEqual("Jane Doe", content.GetValue("author"));
}
Expand Down