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 +