diff --git a/src/Umbraco.Core/Configuration/Models/RuntimeSettings.cs b/src/Umbraco.Core/Configuration/Models/RuntimeSettings.cs
index a1598fd377..2b01d4734a 100644
--- a/src/Umbraco.Core/Configuration/Models/RuntimeSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/RuntimeSettings.cs
@@ -19,7 +19,6 @@ public class RuntimeSettings
public RuntimeMode Mode { get; set; } = RuntimeMode.BackofficeDevelopment;
///
- [Obsolete("No longer used and will be removed in Umbraco 16.")]
/// Gets or sets a value for the maximum request length in kb.
///
public long? MaxRequestLength { get; set; }
diff --git a/src/Umbraco.Core/Extensions/ContentExtensions.cs b/src/Umbraco.Core/Extensions/ContentExtensions.cs
index dde4ffb397..35b9d945d8 100644
--- a/src/Umbraco.Core/Extensions/ContentExtensions.cs
+++ b/src/Umbraco.Core/Extensions/ContentExtensions.cs
@@ -245,13 +245,13 @@ public static class ContentExtensions
}
IEnumerable 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 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;
}
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs
index 0821232826..c5bfbc8c01 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs
index 3aba928bda..ec843c1c54 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/AccessRuleDto.cs
@@ -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; }
}
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs
index 38e63ffc20..c94a680a1f 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/AuditEntryDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs
index c6f9006b29..67db05a3cf 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ConsentDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs
index ad4c03ac53..8194448ce4 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentScheduleDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCleanupPolicyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCleanupPolicyDto.cs
index 4dd1a14fb5..cdc36ad077 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCleanupPolicyDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCleanupPolicyDto.cs
@@ -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; }
}
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs
index b7d675f9a8..d77872ae20 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionCultureVariationDto.cs
@@ -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'
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs
index 07fe6d9a84..e05bcf0d05 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ContentVersionDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/CreatedPackageSchemaDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/CreatedPackageSchemaDto.cs
index 060c9d5a23..07ac53d552 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/CreatedPackageSchemaDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/CreatedPackageSchemaDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs
index 2f0b2ed5f5..0087298645 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/DocumentPublishedReadOnlyDto.cs
@@ -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; }
}
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs
index 05c94ed3db..a34c1100a2 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginTokenDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginTokenDto.cs
index b9ae050960..9699a6ef13 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginTokenDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginTokenDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs
index 5c985a0174..6bab9b91be 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/KeyValueDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs
index 62f8232da5..36f637fef3 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs
index 77b500eef5..5a025c412e 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/MemberDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/NodeDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/NodeDto.cs
index c136f45fd4..e140b3ec5d 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/NodeDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/NodeDto.cs
@@ -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; }
}
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs
index 59484734dc..51c36126d5 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/RelationDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs
index 66a8c2bd07..a91bfc6bd5 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/ServerRegistrationDto.cs
@@ -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")]
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs
index fa8011be29..4972332566 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs
@@ -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;
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs
index 548d2ff57d..cf66725f36 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserGroupDto.cs
@@ -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; }
diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookLogDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookLogDto.cs
index 8e409cd0b3..d5de4bd008 100644
--- a/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookLogDto.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Dtos/WebhookLogDto.cs
@@ -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; }
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/index.ts
index 5df50e5c85..d27015417a 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/validation/context/index.ts
@@ -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';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-image-cropper/image-cropper-field.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-image-cropper/image-cropper-field.element.ts
index 579195ee7f..771b7d4860 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-image-cropper/image-cropper-field.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-image-cropper/image-cropper-field.element.ts
@@ -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 ?? '';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/property-editors/stylesheet-picker/property-editor-ui-stylesheet-picker.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/property-editors/stylesheet-picker/property-editor-ui-stylesheet-picker.stories.ts
index 70a4bdc7f9..fe1803a1ec 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/property-editors/stylesheet-picker/property-editor-ui-stylesheet-picker.stories.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/property-editors/stylesheet-picker/property-editor-ui-stylesheet-picker.stories.ts
@@ -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) =>
diff --git a/tests/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTestWithContent.cs b/tests/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTestWithContent.cs
index 77c65ab10b..70957f4c83 100644
--- a/tests/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTestWithContent.cs
+++ b/tests/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTestWithContent.cs
@@ -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
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/ContentServiceTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/ContentServiceTests.cs
index fa47ff3806..734008428a 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/ContentServiceTests.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/ContentServiceTests.cs
@@ -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();
@@ -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(), userId: Constants.Security.SuperUserId);
@@ -1540,7 +1540,7 @@ internal sealed class ContentServiceTests : UmbracoIntegrationTestWithContent
contentService.Publish(content, Array.Empty());
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" });
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/DocumentUrlServiceTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/DocumentUrlServiceTests.cs
index 382dca172f..9c8b266bc5 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/DocumentUrlServiceTests.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/DocumentUrlServiceTests.cs
@@ -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
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/DocumentUrlServiceTests_HideTopLevel_False.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/DocumentUrlServiceTests_HideTopLevel_False.cs
index e741e4125e..2620465e0c 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/DocumentUrlServiceTests_HideTopLevel_False.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/DocumentUrlServiceTests_HideTopLevel_False.cs
@@ -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
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishStatusServiceTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishStatusServiceTest.cs
index bca82448b2..2edd244e38 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishStatusServiceTest.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishStatusServiceTest.cs
@@ -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, ["*"]);
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProviderTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProviderTests.cs
index b359a0557d..f1cf6573cb 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProviderTests.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProviderTests.cs
@@ -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
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProvider_hidetoplevel_false.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProvider_hidetoplevel_false.cs
index 7caa63fda6..9503e4c80a 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProvider_hidetoplevel_false.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProvider_hidetoplevel_false.cs
@@ -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
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentPublishingServiceTests.Scheduling.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentPublishingServiceTests.Scheduling.cs
index 5fad7f9d17..61c26bc873 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentPublishingServiceTests.Scheduling.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentPublishingServiceTests.Scheduling.cs
@@ -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);
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs
index 3cf71467e4..8d33039141 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs
@@ -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
diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/ContentExtensionsTests.GetStatus.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/ContentExtensionsTests.GetStatus.cs
new file mode 100644
index 0000000000..1f2600299e
--- /dev/null
+++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/ContentExtensionsTests.GetStatus.cs
@@ -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();
+ 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();
+ contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Nothing);
+ var mock = new Mock();
+ 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();
+ contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Nothing);
+ var mock = new Mock();
+ 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();
+ contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Nothing);
+ var mock = new Mock();
+ 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();
+ contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Nothing);
+ var mock = new Mock();
+ 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();
+ contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Culture);
+ var mock = new Mock();
+ 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();
+ contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Culture);
+ var mock = new Mock();
+ 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();
+ contentTypeMock.SetupGet(c => c.Variations).Returns(ContentVariation.Culture);
+ var mock = new Mock();
+ 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);
+ }
+}
diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/ContentExtensionsTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/ContentExtensionsTests.cs
new file mode 100644
index 0000000000..3ffc906a05
--- /dev/null
+++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/ContentExtensionsTests.cs
@@ -0,0 +1,8 @@
+using NUnit.Framework;
+
+namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Extensions;
+
+[TestFixture]
+public partial class ContentExtensionsTests
+{
+}
diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj
index 0a1c88c5b8..bc6314297f 100644
--- a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj
+++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj
@@ -46,5 +46,8 @@
BackOfficeExternalLoginServiceTests.cs
+
+ ContentExtensionsTests.cs
+