Merge branch 'v15/dev' into v16/dev

This commit is contained in:
Jacob Overgaard
2025-04-15 14:47:51 +02:00
38 changed files with 215 additions and 62 deletions

View File

@@ -19,7 +19,6 @@ public class RuntimeSettings
public RuntimeMode Mode { get; set; } = RuntimeMode.BackofficeDevelopment;
/// <summary>
[Obsolete("No longer used and will be removed in Umbraco 16.")]
/// Gets or sets a value for the maximum request length in kb.
/// </summary>
public long? MaxRequestLength { get; set; }

View File

@@ -245,13 +245,13 @@ public static class ContentExtensions
}
IEnumerable<ContentSchedule> expires = contentSchedule.GetSchedule(culture, ContentScheduleAction.Expire);
if (expires != null && expires.Any(x => x.Date > DateTime.MinValue && DateTime.Now > x.Date))
if (expires != null && expires.Any(x => x.Date > DateTime.MinValue && DateTime.UtcNow > x.Date))
{
return ContentStatus.Expired;
}
IEnumerable<ContentSchedule> release = contentSchedule.GetSchedule(culture, ContentScheduleAction.Release);
if (release != null && release.Any(x => x.Date > DateTime.MinValue && x.Date > DateTime.Now))
if (release != null && release.Any(x => x.Date > DateTime.MinValue && x.Date > DateTime.UtcNow))
{
return ContentStatus.AwaitingRelease;
}

View File

@@ -27,11 +27,11 @@ internal class AccessDto
[ForeignKey(typeof(NodeDto), Name = "FK_umbracoAccess_umbracoNode_id2")]
public int NoAccessNodeId { get; set; }
[Column("createDate")]
[Column("createDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime CreateDate { get; set; }
[Column("updateDate")]
[Column("updateDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime UpdateDate { get; set; }

View File

@@ -25,11 +25,11 @@ internal class AccessRuleDto
[Column("ruleType")]
public string? RuleType { get; set; }
[Column("createDate")]
[Column("createDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime CreateDate { get; set; }
[Column("updateDate")]
[Column("updateDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime UpdateDate { get; set; }
}

View File

@@ -30,7 +30,7 @@ internal class AuditEntryDto
[Length(Constants.Audit.IpLength)]
public string? PerformingIp { get; set; }
[Column("eventDateUtc")]
[Column("eventDateUtc", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime EventDateUtc { get; set; }

View File

@@ -29,7 +29,7 @@ public class ConsentDto
[Length(512)]
public string? Action { get; set; }
[Column("createDate")]
[Column("createDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime CreateDate { get; set; }

View File

@@ -24,6 +24,7 @@ internal class ContentScheduleDto
[NullSetting(NullSetting = NullSettings.Null)] // can be invariant
public int? LanguageId { get; set; }
// NOTE: this date is explicitly stored and treated as UTC despite the lack of "Utc" postfix.
[Column("date")]
public DateTime Date { get; set; }

View File

@@ -27,6 +27,6 @@ internal class ContentVersionCleanupPolicyDto
[NullSetting(NullSetting = NullSettings.Null)]
public int? KeepLatestVersionPerDayForDays { get; set; }
[Column("updated")]
[Column("updated", ForceToUtc = false)]
public DateTime Updated { get; set; }
}

View File

@@ -33,7 +33,7 @@ internal class ContentVersionCultureVariationDto
[Column("name")]
public string? Name { get; set; }
[Column("date")] // TODO: db rename to 'updateDate'
[Column("date", ForceToUtc = false)] // TODO: db rename to 'updateDate'
public DateTime UpdateDate { get; set; }
[Column("availableUserId")] // TODO: db rename to 'updateDate'

View File

@@ -22,7 +22,7 @@ public class ContentVersionDto
[Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_NodeId", ForColumns = "nodeId,current", IncludeColumns = "id,versionDate,text,userId,preventCleanup")]
public int NodeId { get; set; }
[Column("versionDate")] // TODO: db rename to 'updateDate'
[Column("versionDate", ForceToUtc = false)] // TODO: db rename to 'updateDate'
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime VersionDate { get; set; }

View File

@@ -27,7 +27,7 @@ public class CreatedPackageSchemaDto
[NullSetting(NullSetting = NullSettings.NotNull)]
public string Value { get; set; } = null!;
[Column("updateDate")]
[Column("updateDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime UpdateDate { get; set; }

View File

@@ -20,6 +20,6 @@ internal class DocumentPublishedReadOnlyDto
[Column("newest")]
public bool Newest { get; set; }
[Column("updateDate")]
[Column("updateDate", ForceToUtc = false)]
public DateTime VersionDate { get; set; }
}

View File

@@ -42,7 +42,7 @@ internal class ExternalLoginDto
[Index(IndexTypes.NonClustered, ForColumns = "loginProvider,providerKey", Name = "IX_" + TableName + "_ProviderKey")]
public string ProviderKey { get; set; } = null!;
[Column("createDate")]
[Column("createDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime CreateDate { get; set; }

View File

@@ -31,7 +31,7 @@ internal class ExternalLoginTokenDto
[NullSetting(NullSetting = NullSettings.NotNull)]
public string Value { get; set; } = null!;
[Column("createDate")]
[Column("createDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime CreateDate { get; set; }

View File

@@ -23,7 +23,7 @@ internal class KeyValueDto
[NullSetting(NullSetting = NullSettings.Null)]
public string? Value { get; set; }
[Column("updated")]
[Column("updated", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime UpdateDate { get; set; }

View File

@@ -35,7 +35,7 @@ internal class LogDto
[NullSetting(NullSetting = NullSettings.Null)]
public string? EntityType { get; set; }
[Column("Datestamp")]
[Column("Datestamp", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
[Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_datestamp", ForColumns = "Datestamp,userId,NodeId")]
public DateTime Datestamp { get; set; }

View File

@@ -45,7 +45,7 @@ internal class MemberDto
[Length(255)]
public string? SecurityStampToken { get; set; }
[Column("emailConfirmedDate")]
[Column("emailConfirmedDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? EmailConfirmedDate { get; set; }
@@ -62,15 +62,15 @@ internal class MemberDto
[Constraint(Default = 1)]
public bool IsApproved { get; set; }
[Column("lastLoginDate")]
[Column("lastLoginDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? LastLoginDate { get; set; }
[Column("lastLockoutDate")]
[Column("lastLockoutDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? LastLockoutDate { get; set; }
[Column("lastPasswordChangeDate")]
[Column("lastPasswordChangeDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? LastPasswordChangeDate { get; set; }

View File

@@ -70,7 +70,7 @@ public class NodeDto
[Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_ObjectType", ForColumns = "nodeObjectType,trashed", IncludeColumns = "uniqueId,parentId,level,path,sortOrder,nodeUser,text,createDate")]
public Guid? NodeObjectType { get; set; }
[Column("createDate")]
[Column("createDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime CreateDate { get; set; }
}

View File

@@ -27,7 +27,7 @@ internal class RelationDto
[ForeignKey(typeof(RelationTypeDto))]
public int RelationType { get; set; }
[Column("datetime")]
[Column("datetime", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime Datetime { get; set; }

View File

@@ -23,11 +23,11 @@ internal class ServerRegistrationDto
[Index(IndexTypes.UniqueNonClustered, Name = "IX_computerName")] // server identity is unique
public string? ServerIdentity { get; set; }
[Column("registeredDate")]
[Column("registeredDate", ForceToUtc = false)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime DateRegistered { get; set; }
[Column("lastNotifiedDate")]
[Column("lastNotifiedDate", ForceToUtc = false)]
public DateTime DateAccessed { get; set; }
[Column("isActive")]

View File

@@ -73,32 +73,32 @@ public class UserDto
[NullSetting(NullSetting = NullSettings.Null)]
public int? FailedLoginAttempts { get; set; }
[Column("lastLockoutDate")]
[Column("lastLockoutDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? LastLockoutDate { get; set; }
[Column("lastPasswordChangeDate")]
[Column("lastPasswordChangeDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? LastPasswordChangeDate { get; set; }
[Column("lastLoginDate")]
[Column("lastLoginDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? LastLoginDate { get; set; }
[Column("emailConfirmedDate")]
[Column("emailConfirmedDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? EmailConfirmedDate { get; set; }
[Column("invitedDate")]
[Column("invitedDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.Null)]
public DateTime? InvitedDate { get; set; }
[Column("createDate")]
[Column("createDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.NotNull)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime CreateDate { get; set; } = DateTime.Now;
[Column("updateDate")]
[Column("updateDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.NotNull)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime UpdateDate { get; set; } = DateTime.Now;

View File

@@ -44,12 +44,12 @@ public class UserGroupDto
[Obsolete("Is not used anymore Use UserGroup2PermissionDtos instead. This will be removed in Umbraco 18.")]
public string? DefaultPermissions { get; set; }
[Column("createDate")]
[Column("createDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.NotNull)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime CreateDate { get; set; }
[Column("updateDate")]
[Column("updateDate", ForceToUtc = false)]
[NullSetting(NullSetting = NullSettings.NotNull)]
[Constraint(Default = SystemMethods.CurrentDateTime)]
public DateTime UpdateDate { get; set; }

View File

@@ -1,4 +1,4 @@
using NPoco;
using NPoco;
using Umbraco.Cms.Core;
using Umbraco.Cms.Infrastructure.Persistence.DatabaseAnnotations;
@@ -24,7 +24,7 @@ internal class WebhookLogDto
[NullSetting(NullSetting = NullSettings.NotNull)]
public string StatusCode { get; set; } = string.Empty;
[Column(Name = "date")]
[Column(Name = "date", ForceToUtc = false)]
[Index(IndexTypes.NonClustered, Name = "IX_" + Constants.DatabaseSchema.Tables.WebhookLog + "_date")]
[NullSetting(NullSetting = NullSettings.NotNull)]
public DateTime Date { get; set; }

View File

@@ -1,4 +1,5 @@
export * from './validation.context.js';
export * from './validation.context-token.js';
export * from './validation-messages.manager.js';
export * from './server-model-validator.context-token.js';
export * from './server-model-validator.context.js';

View File

@@ -74,7 +74,12 @@ export class UmbInputImageCropperFieldElement extends UmbLitElement {
get source(): string {
if (this.src) {
return `${this._serverUrl}${this.src}`;
// Test that URL is relative:
if (this.src.startsWith('/')) {
return `${this._serverUrl}${this.src}`;
} else {
return this.src;
}
}
return this.fileDataUrl ?? '';

View File

@@ -10,7 +10,7 @@ const dataTypeData = umbDataTypeMockDb.read('dt-richTextEditor') as unknown as U
export default {
title: 'Property Editor UIs/Stylesheet Picker',
component: 'umb-property-editor-ui-stylesheet-picker',
id: 'umb-property-editor-ui-sstylesheet-picker',
id: 'umb-property-editor-ui-stylesheet-picker',
} as Meta;
export const AAAOverview = ({ value }: any) =>

View File

@@ -57,7 +57,7 @@ public abstract class UmbracoIntegrationTestWithContent : UmbracoIntegrationTest
// Create and Save Content "Text Page 1" based on "umbTextpage" -> 1054
Subpage = ContentBuilder.CreateSimpleContent(ContentType, "Text Page 1", Textpage.Id);
Subpage.Key = new Guid(SubPageKey);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(Subpage, -1, contentSchedule);
// Create and Save Content "Text Page 1" based on "umbTextpage" -> 1055

View File

@@ -214,7 +214,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
ctVariant.Variations = ContentVariation.Culture;
ContentTypeService.Save(ctVariant);
var now = DateTime.Now;
var now = DateTime.UtcNow;
// 10x invariant content, half is scheduled to be published in 5 seconds, the other half is scheduled to be unpublished in 5 seconds
var invariant = new List<IContent>();
@@ -321,7 +321,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
// Act
var content = ContentService.CreateAndSave("Test", Constants.System.Root, "umbTextpage");
var contentSchedule = ContentScheduleCollection.CreateWithEntry(null, DateTime.Now.AddHours(2));
var contentSchedule = ContentScheduleCollection.CreateWithEntry(null, DateTime.UtcNow.AddHours(2));
ContentService.Save(content, Constants.Security.SuperUserId, contentSchedule);
Assert.AreEqual(1, contentSchedule.FullSchedule.Count);
@@ -676,7 +676,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
var root = ContentService.GetById(Textpage.Id);
ContentService.Publish(root!, root!.AvailableCultures.ToArray());
var content = ContentService.GetById(Subpage.Id);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(null, DateTime.Now.AddSeconds(1));
var contentSchedule = ContentScheduleCollection.CreateWithEntry(null, DateTime.UtcNow.AddSeconds(1));
ContentService.PersistContentSchedule(content!, contentSchedule);
ContentService.Publish(content, content.AvailableCultures.ToArray());
@@ -1386,7 +1386,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
{
// Arrange
var content = ContentService.GetById(Subpage.Id); // This Content expired 5min ago
var contentSchedule = ContentScheduleCollection.CreateWithEntry(null, DateTime.Now.AddMinutes(-5));
var contentSchedule = ContentScheduleCollection.CreateWithEntry(null, DateTime.UtcNow.AddMinutes(-5));
ContentService.Save(content, contentSchedule: contentSchedule);
var parent = ContentService.GetById(Textpage.Id);
@@ -1416,7 +1416,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
var content = ContentBuilder.CreateBasicContent(contentType);
content.SetCultureName("Hello", "en-US");
var contentSchedule = ContentScheduleCollection.CreateWithEntry("en-US", null, DateTime.Now.AddMinutes(-5));
var contentSchedule = ContentScheduleCollection.CreateWithEntry("en-US", null, DateTime.UtcNow.AddMinutes(-5));
ContentService.Save(content, contentSchedule: contentSchedule);
var published = ContentService.Publish(content, new[] { "en-US" });
@@ -1431,7 +1431,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
{
// Arrange
var content = ContentService.GetById(Subpage.Id);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddHours(2), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddHours(2), null);
ContentService.Save(content, Constants.Security.SuperUserId, contentSchedule);
var parent = ContentService.GetById(Textpage.Id);
@@ -1488,7 +1488,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
content.Properties[0].SetValue("Foo", string.Empty);
contentService.Save(content);
contentService.PersistContentSchedule(content,
ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddHours(2), null));
ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddHours(2), null));
// Act
var result = contentService.Publish(content, Array.Empty<string>(), userId: Constants.Security.SuperUserId);
@@ -1540,7 +1540,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
contentService.Publish(content, Array.Empty<string>());
contentService.PersistContentSchedule(content,
ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddHours(2), null));
ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddHours(2), null));
contentService.Save(content);
// Act
@@ -1568,7 +1568,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
var content = ContentBuilder.CreateBasicContent(contentType);
content.SetCultureName("Hello", "en-US");
var contentSchedule = ContentScheduleCollection.CreateWithEntry("en-US", DateTime.Now.AddHours(2), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry("en-US", DateTime.UtcNow.AddHours(2), null);
ContentService.Save(content, contentSchedule: contentSchedule);
var published = ContentService.Publish(content, new[] { "en-US" });

View File

@@ -230,7 +230,7 @@ internal sealed class DocumentUrlServiceTests : UmbracoIntegrationTestWithConten
// Create a subpage
var subsubpage = ContentBuilder.CreateSimpleContent(ContentType, documentName, Subpage.Id);
subsubpage.Key = Guid.Parse(documentKey);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(subsubpage, -1, contentSchedule);
if (loadDraft is false)
@@ -248,7 +248,7 @@ internal sealed class DocumentUrlServiceTests : UmbracoIntegrationTestWithConten
// Create a second root
var secondRoot = ContentBuilder.CreateSimpleContent(ContentType, "Second Root", null);
secondRoot.Key = new Guid("8E21BCD4-02CA-483D-84B0-1FC92702E198");
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(secondRoot, -1, contentSchedule);
if (loadDraft is false)
@@ -266,7 +266,7 @@ internal sealed class DocumentUrlServiceTests : UmbracoIntegrationTestWithConten
{
// Create a second root
var secondRoot = ContentBuilder.CreateSimpleContent(ContentType, "Second Root", null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(secondRoot, -1, contentSchedule);
// Create a child of second root

View File

@@ -62,7 +62,7 @@ internal sealed class DocumentUrlServiceTests_HideTopLevel_False : UmbracoIntegr
// Create a subpage
var subsubpage = ContentBuilder.CreateSimpleContent(ContentType, "Sub Page 1", Subpage.Id);
subsubpage.Key = new Guid("DF49F477-12F2-4E33-8563-91A7CC1DCDBB");
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(subsubpage, -1, contentSchedule);
if (loadDraft is false)
@@ -81,7 +81,7 @@ internal sealed class DocumentUrlServiceTests_HideTopLevel_False : UmbracoIntegr
// Create a second root
var secondRoot = ContentBuilder.CreateSimpleContent(ContentType, "Second Root", null);
secondRoot.Key = new Guid("8E21BCD4-02CA-483D-84B0-1FC92702E198");
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(secondRoot, -1, contentSchedule);
if (loadDraft is false)
@@ -100,7 +100,7 @@ internal sealed class DocumentUrlServiceTests_HideTopLevel_False : UmbracoIntegr
{
// Create a second root
var secondRoot = ContentBuilder.CreateSimpleContent(ContentType, "Second Root", null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(secondRoot, -1, contentSchedule);
// Create a child of second root

View File

@@ -154,7 +154,7 @@ internal sealed class PublishStatusServiceTest : UmbracoIntegrationTestWithConte
{
var grandchild = ContentBuilder.CreateSimpleContent(ContentType, "Grandchild", Subpage2.Id);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(grandchild, -1, contentSchedule);
var publishResults = ContentService.PublishBranch(Textpage, PublishBranchFilter.IncludeUnpublished, ["*"]);

View File

@@ -12,7 +12,7 @@ internal sealed class PublishedUrlInfoProviderTests : PublishedUrlInfoProviderTe
{
// Create a second root
var secondRoot = ContentBuilder.CreateSimpleContent(ContentType, "Second Root", null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(secondRoot, -1, contentSchedule);
// Create a child of second root

View File

@@ -19,7 +19,7 @@ internal sealed class PublishedUrlInfoProvider_hidetoplevel_false : PublishedUrl
{
// Create a second root
var secondRoot = ContentBuilder.CreateSimpleContent(ContentType, "Second Root", null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(secondRoot, -1, contentSchedule);
// Create a child of second root

View File

@@ -14,7 +14,7 @@ public partial class ContentPublishingServiceTests
var result = await ContentPublishingService.PublishAsync(
Textpage.Key,
MakeModel(ContentScheduleCollection.CreateWithEntry("*", DateTime.Now.AddDays(1), null)),
MakeModel(ContentScheduleCollection.CreateWithEntry("*", DateTime.UtcNow.AddDays(1), null)),
Constants.Security.SuperUserKey);
Assert.IsTrue(result.Success);
@@ -25,7 +25,7 @@ public partial class ContentPublishingServiceTests
[Test]
public async Task Publish_Single_Item_Does_Not_Publish_Children_In_The_Future()
{
await ContentPublishingService.PublishAsync(Textpage.Key, MakeModel(ContentScheduleCollection.CreateWithEntry("*", DateTime.Now.AddDays(1), null)), Constants.Security.SuperUserKey);
await ContentPublishingService.PublishAsync(Textpage.Key, MakeModel(ContentScheduleCollection.CreateWithEntry("*", DateTime.UtcNow.AddDays(1), null)), Constants.Security.SuperUserKey);
VerifyIsNotPublished(Textpage.Key);
VerifyIsNotPublished(Subpage.Key);
@@ -36,7 +36,7 @@ public partial class ContentPublishingServiceTests
{
await ContentPublishingService.PublishAsync(Textpage.Key, MakeModel(_allCultures), Constants.Security.SuperUserKey);
var result = await ContentPublishingService.PublishAsync(Subpage.Key, MakeModel(ContentScheduleCollection.CreateWithEntry("*", DateTime.Now.AddDays(1), null)), Constants.Security.SuperUserKey);
var result = await ContentPublishingService.PublishAsync(Subpage.Key, MakeModel(ContentScheduleCollection.CreateWithEntry("*", DateTime.UtcNow.AddDays(1), null)), Constants.Security.SuperUserKey);
Assert.IsTrue(result.Success);
Assert.AreEqual(ContentPublishingOperationStatus.Success, result.Status);

View File

@@ -968,7 +968,7 @@ internal sealed class EntityServiceTests : UmbracoIntegrationTest
// Create and Save Content "Text Page 1" based on "umbTextpage" -> 1054
_subpage = ContentBuilder.CreateSimpleContent(_contentType, "Text Page 1", _textpage.Id);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-5), null);
ContentService.Save(_subpage, -1, contentSchedule);
// Create and Save Content "Text Page 2" based on "umbTextpage" -> 1055

View File

@@ -0,0 +1,136 @@
using Moq;
using NUnit.Framework;
using Umbraco.Cms.Core.Models;
using Umbraco.Extensions;
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Extensions;
public partial class ContentExtensionsTests
{
[Test]
public void GetStatus_WhenTrashed_ReturnsTrashed()
{
var contentMock = new Mock<IContent>();
contentMock.SetupGet(c => c.Trashed).Returns(true);
var result = contentMock.Object.GetStatus(new ContentScheduleCollection());
Assert.AreEqual(ContentStatus.Trashed, result);
}
[TestCase(true, ContentStatus.Published)]
[TestCase(false, ContentStatus.Unpublished)]
public void GetStatus_WithEmptySchedule_ReturnsPublishState(bool published, ContentStatus expectedStatus)
{
var contentTypeMock = new Mock<ISimpleContentType>();
contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Nothing);
var mock = new Mock<IContent>();
mock.SetupGet(c => c.ContentType).Returns(contentTypeMock.Object);
mock.SetupGet(c => c.Published).Returns(published);
var result = mock.Object.GetStatus(new ContentScheduleCollection());
Assert.AreEqual(expectedStatus, result);
}
[TestCase(1)]
[TestCase(10)]
[TestCase(60)]
[TestCase(120)]
[TestCase(1000)]
public void GetStatus_WithPendingExpiry_ForInvariant_ReturnsExpired(int minutesFromExpiry)
{
var contentTypeMock = new Mock<ISimpleContentType>();
contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Nothing);
var mock = new Mock<IContent>();
mock.SetupGet(c => c.ContentType).Returns(contentTypeMock.Object);
var schedule = ContentScheduleCollection.CreateWithEntry(null, DateTime.UtcNow.AddMinutes(-1 * minutesFromExpiry));
var result = mock.Object.GetStatus(schedule);
Assert.AreEqual(ContentStatus.Expired, result);
}
[TestCase(1)]
[TestCase(10)]
[TestCase(60)]
[TestCase(120)]
[TestCase(1000)]
public void GetStatus_WithPendingRelease_ForInvariant_ReturnsAwaitingRelease(int minutesUntilRelease)
{
var contentTypeMock = new Mock<ISimpleContentType>();
contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Nothing);
var mock = new Mock<IContent>();
mock.SetupGet(c => c.ContentType).Returns(contentTypeMock.Object);
var schedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(minutesUntilRelease), null);
var result = mock.Object.GetStatus(schedule);
Assert.AreEqual(ContentStatus.AwaitingRelease, result);
}
[TestCase(1)]
[TestCase(10)]
[TestCase(60)]
[TestCase(120)]
[TestCase(1000)]
public void GetStatus_WithPastReleaseAndFutureExpiry_ForInvariant_ReturnsPublishedState(int minutes)
{
var contentTypeMock = new Mock<ISimpleContentType>();
contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Nothing);
var mock = new Mock<IContent>();
mock.SetupGet(c => c.ContentType).Returns(contentTypeMock.Object);
mock.SetupGet(c => c.Published).Returns(true);
var schedule = ContentScheduleCollection.CreateWithEntry(DateTime.UtcNow.AddMinutes(-1 * minutes), DateTime.UtcNow.AddMinutes(minutes));
var result = mock.Object.GetStatus(schedule);
Assert.AreEqual(ContentStatus.Published, result);
}
[TestCase(1)]
[TestCase(10)]
[TestCase(60)]
[TestCase(120)]
[TestCase(1000)]
public void GetStatus_WithPendingExpiry_ForVariant_ReturnsExpired(int minutesFromExpiry)
{
var contentTypeMock = new Mock<ISimpleContentType>();
contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Culture);
var mock = new Mock<IContent>();
mock.SetupGet(c => c.ContentType).Returns(contentTypeMock.Object);
var schedule = ContentScheduleCollection.CreateWithEntry("en-US", null, DateTime.UtcNow.AddMinutes(-1 * minutesFromExpiry));
var result = mock.Object.GetStatus(schedule, "en-US");
Assert.AreEqual(ContentStatus.Expired, result);
}
[TestCase(1)]
[TestCase(10)]
[TestCase(60)]
[TestCase(120)]
[TestCase(1000)]
public void GetStatus_WithPendingRelease_ForVariant_ReturnsAwaitingRelease(int minutesUntilRelease)
{
var contentTypeMock = new Mock<ISimpleContentType>();
contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Culture);
var mock = new Mock<IContent>();
mock.SetupGet(c => c.ContentType).Returns(contentTypeMock.Object);
var schedule = ContentScheduleCollection.CreateWithEntry("en-US", DateTime.UtcNow.AddMinutes(minutesUntilRelease), null);
var result = mock.Object.GetStatus(schedule, "en-US");
Assert.AreEqual(ContentStatus.AwaitingRelease, result);
}
[TestCase(1)]
[TestCase(10)]
[TestCase(60)]
[TestCase(120)]
[TestCase(1000)]
public void GetStatus_WithPastReleaseAndFutureExpiry_ForVariant_ReturnsPublishedState(int minutes)
{
var contentTypeMock = new Mock<ISimpleContentType>();
contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Culture);
var mock = new Mock<IContent>();
mock.SetupGet(c => c.ContentType).Returns(contentTypeMock.Object);
mock.SetupGet(c => c.Published).Returns(true);
var schedule = ContentScheduleCollection.CreateWithEntry("en-US", DateTime.UtcNow.AddMinutes(-1 * minutes), DateTime.UtcNow.AddMinutes(minutes));
var result = mock.Object.GetStatus(schedule, "en-US");
Assert.AreEqual(ContentStatus.Published, result);
}
}

View File

@@ -0,0 +1,8 @@
using NUnit.Framework;
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Extensions;
[TestFixture]
public partial class ContentExtensionsTests
{
}

View File

@@ -46,5 +46,8 @@
<Compile Update="Umbraco.Cms.Api.Management\Services\BackOfficeExternalLoginServiceTests.UnLinkLoginAsync.cs">
<DependentUpon>BackOfficeExternalLoginServiceTests.cs</DependentUpon>
</Compile>
<Compile Update="Umbraco.Core\Extensions\ContentExtensionsTests.GetStatus.cs">
<DependentUpon>ContentExtensionsTests.cs</DependentUpon>
</Compile>
</ItemGroup>
</Project>