Files
Umbraco-CMS/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs

2108 lines
97 KiB
C#
Raw Normal View History

// Copyright (c) Umbraco.
// See LICENSE for more details.
#pragma warning disable SA1124 // Do not use regions (justification: regions are currently adding some useful organisation to this file)
using Microsoft.Extensions.Logging;
2016-05-27 11:34:03 +02:00
using NUnit.Framework;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Cache;
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Notifications;
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Cms.Core.Sync;
using Umbraco.Cms.Core.Web;
using Umbraco.Cms.Infrastructure.Serialization;
using Umbraco.Cms.Infrastructure.Sync;
using Umbraco.Cms.Tests.Common.Attributes;
using Umbraco.Cms.Tests.Common.Builders;
using Umbraco.Cms.Tests.Common.Testing;
using Umbraco.Cms.Tests.Integration.Testing;
2016-05-27 11:34:03 +02:00
namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services
2016-05-27 11:34:03 +02:00
{
2017-12-02 16:14:21 +01:00
[TestFixture]
2016-11-05 19:23:55 +01:00
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
public class ContentEventsTests : UmbracoIntegrationTestWithContent
2016-05-27 11:34:03 +02:00
{
private CacheRefresherCollection CacheRefresherCollection => GetRequiredService<CacheRefresherCollection>();
private IUmbracoContextFactory UmbracoContextFactory => GetRequiredService<IUmbracoContextFactory>();
2016-05-27 11:34:03 +02:00
private ILogger<ContentEventsTests> Logger => GetRequiredService<ILogger<ContentEventsTests>>();
#region Setup
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
private class TestNotificationHandler :
INotificationHandler<ContentCacheRefresherNotification>,
INotificationHandler<ContentDeletedNotification>,
INotificationHandler<ContentDeletingVersionsNotification>,
INotificationHandler<ContentRefreshNotification>
{
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
private readonly IDocumentRepository _documentRepository;
public TestNotificationHandler(IDocumentRepository documentRepository)
{
_documentRepository = documentRepository;
}
public void Handle(ContentCacheRefresherNotification args)
{
// reports the event as: "ContentCache/<action>,<action>.../X
// where
// <action> is(are) the action(s)
// X is the event content ID
if (args.MessageType != MessageType.RefreshByPayload)
{
throw new NotSupportedException();
}
// We're in between tests, don't do anything.
if (_events is null)
{
return;
}
foreach (ContentCacheRefresher.JsonPayload payload in (ContentCacheRefresher.JsonPayload[])args.MessageObject)
{
var e = new EventInstance
{
Message = _msgCount,
Sender = "ContentCacheRefresher",
EventArgs = payload,
Name = payload.ChangeTypes.ToString().Replace(" ", string.Empty),
Args = payload.Id.ToInvariantString()
};
_events.Add(e);
}
_msgCount++;
}
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
public void Handle(ContentDeletedNotification notification)
{
// reports the event as : "ContentRepository/Remove/X"
// where
// X is the event content ID
var e = new EventInstance
{
Message = _msgCount++,
Sender = "ContentRepository",
EventArgs = null, // Notification has no event args
Name = "Remove",
Args = string.Join(",", notification.DeletedEntities.Select(x => x.Id))
};
_events.Add(e);
}
public void Handle(ContentDeletingVersionsNotification notification)
{
// reports the event as : "ContentRepository/Remove/X:Y"
// where
// X is the event content ID
// Y is the event content version GUID
var e = new EventInstance
{
Message = _msgCount++,
Sender = "ContentRepository",
EventArgs = null, // Notification has no args
Name = "RemoveVersion",
Args = $"{notification.Id}:{notification.SpecificVersion}"
};
_events.Add(e);
}
public void Handle(ContentRefreshNotification notification)
{
// reports the event as : "ContentRepository/Refresh/XY-Z"
// where
// X can be u (unpublished) or p (published) and is the state of the event content
// Y can be u (unchanged), x (unpublishing), p (published) or m (masked) and is the state of the published version
// Z is the event content ID
// reports the event as "ContentRepository/Refresh/id.xyz
// where
// id is the event content identifier
// x is u|p and is the (un)published state of the event content
// y is +|-|= and is the action (publish, unpublish, no change)
// z is u|p|m and is the (un)published state after the event
if (_events is null)
{
return;
}
IContent[] entities = new[] { notification.Entity }; // args.Entities
var e = new EventInstance
{
Message = _msgCount++,
Sender = "ContentRepository",
Name = "Refresh",
Args = string.Join(",", entities.Select(x =>
{
PublishedState publishedState = ((Content)x).PublishedState;
string xstate = x.Published ? "p" : "u";
if (publishedState == PublishedState.Publishing)
{
xstate += "+" + (x.ParentId == -1 || _documentRepository.IsPathPublished(_documentRepository.Get(x.ParentId)) ? "p" : "m");
}
else if (publishedState == PublishedState.Unpublishing)
{
xstate += "-u";
}
else
{
xstate += "=" + (x.Published ? _documentRepository.IsPathPublished(x) ? "p" : "m" : "u");
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
}
return $"{x.Id}.{xstate}";
}))
};
_events.Add(e);
}
}
protected override void CustomTestSetup(IUmbracoBuilder builder)
{
V15: Remove Nucache (#17166) * Remove nucache reference from Web.Common * Get tests building-ish * Move ReservedFieldNamesService to the right project * Remove IPublishedSnapshotStatus * Added functionality to the INavigationQueryService to get root keys * Fixed issue with navigation * Remove IPublishedSnapshot from UmbracoContext * Begin removing usage of IPublishedSnapshot from PublishedContentExtensions * Fix PublishedContentExtensions.cs * Don't use snapshots in delivery media api * Use IPublishedMediaCache in QueryMediaApiController * Remove more usages of IPublishedSnapshotAccessor * Comment out tests * Remove more usages of PublishedSnapshotAccessor * Remove PublishedSnapshot from property * Fixed test build * Fix errors * Fix some tests * Delete NuCache 🎉 * Implement DatabaseCacheRebuilder * Remove usage of IPublishedSnapshotService * Remove IPublishedSnapshotService * Remove TestPublishedSnapshotAccessor and make tests build * Don't test Snapshot cachelevel It's no longer supported * Fix BlockEditorConverter Element != Element document type * Remember to set cachemanager * Fix RichTextParserTests * Implement TryGetLevel on INavigationQueryService * Fake level and obsolete it in PublishedContent * Remove ChildrenForAllCultures * Hack Path property on PublishedContent * Remove usages of IPublishedSnapshot in tests * More ConvertersTests * Add hybrid cache to integration tests We can actually do this now because we no longer save files on disk * Rename IPublishedSnapshotRebuilder to ICacheRebuilder * Comment out tests * V15: Replacing the usages of Parent (navigation data) from IPublishedContent (#17125) * Fix .Parent references in PublishedContentExtensions * Add missing methods to FriendlyPublishedContentExtensions (ones that you were able to call on the content directly as they now require extra params) * Fix references from the extension methods * Fix dependencies in tests * Replace IPublishedSnapshotAccessor with the content cache in tests * Resolving more .Parent references * Fix unit tests * Obsolete and use extension methods * Remove private method and use extension instead * Moving code around * Fix tests * Fix more references * Cleanup * Fix more usages * Resolve merge conflict * Fix tests * Cleanup * Fix more tests * Fixed unit tests * Cleanup * Replace last usages --------- Co-authored-by: Bjarke Berg <mail@bergmania.dk> * Remove usage of IPublishedSnapshotAccessor from IRequestItemProvider * Post merge fixup * Remo IPublishedSnapshot * Add HasAny to IDocumentUrlService * Fix TextBuilder * Fix modelsbuilder tests * Use explicit types * Implement GetByContentType * Support element types in PublishedContentTypeCache * Run enlistments before publishing notifications * Fix elements cache refreshing * Implement GetByUdi * Implement GetAtRoot * Implement GetByRoute * Reimplement GetRouteById * Fix blocks unit tests * Initialize domain cache on boot * Only return routes with domains on non default lanauges * V15: Replacing the usages of `Children` (navigation data) from `IPublishedContent` (#17159) * Update params in PublishedContentExtensions to the general interfaces for the published cache and navigation service, so that we can use the extension methods on both documents and media * Introduce GetParent() which uses the right services * Fix obsolete message on .Parent * Obsolete .Children * Fix usages of Children for ApiMediaQueryService * Fix usage in internal * Fix usages in views * Fix indentation * Fix issue with delete language * Update nuget pacakges * Clear elements cache when content is deleted instead of trying to update it * Reset publishedModelFactory * Fixed publishing --------- Co-authored-by: Bjarke Berg <mail@bergmania.dk> Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Co-authored-by: kjac <kja@umbraco.dk>
2024-10-01 15:03:02 +02:00
builder.AddUmbracoHybridCache();
builder.Services.AddUnique<IServerMessenger, LocalServerMessenger>();
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
builder.Services.AddUnique<IServerMessenger, LocalServerMessenger>();
builder
.AddNotificationHandler<ContentCacheRefresherNotification, TestNotificationHandler>()
.AddNotificationHandler<ContentDeletedNotification, TestNotificationHandler>()
.AddNotificationHandler<ContentDeletingVersionsNotification, TestNotificationHandler>()
.AddNotificationHandler<ContentRefreshNotification, TestNotificationHandler>()
;
builder.AddNotificationHandler<ContentTreeChangeNotification, ContentTreeChangeDistributedCacheNotificationHandler>();
}
[SetUp]
public void SetUp()
2016-05-27 11:34:03 +02:00
{
_events = new List<EventInstance>();
// prepare content type
Template template = TemplateBuilder.CreateTextPageTemplate();
FileService.SaveTemplate(template);
2016-08-23 11:17:08 +02:00
_contentType = ContentTypeBuilder.CreateSimpleContentType("whatever", "Whatever", defaultTemplateId: template.Id);
_contentType.Key = Guid.NewGuid();
FileService.SaveTemplate(_contentType.DefaultTemplate);
ContentTypeService.Save(_contentType);
2016-05-27 11:34:03 +02:00
}
private static IList<EventInstance> _events;
private static int _msgCount;
2016-05-27 11:34:03 +02:00
private IContentType _contentType;
private void ResetEvents()
{
_events = new List<EventInstance>();
_msgCount = 0;
Logger.LogDebug("RESET EVENTS");
2016-05-27 11:34:03 +02:00
}
private IContent CreateContent(int parentId = -1)
{
Content content1 = ContentBuilder.CreateSimpleContent(_contentType, "Content1", parentId);
ContentService.Save(content1);
2016-05-27 11:34:03 +02:00
return content1;
}
private IContent CreateBranch()
{
Content content1 = ContentBuilder.CreateSimpleContent(_contentType, "Content1");
ContentService.Save(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
// 2 (published)
// .1 (published)
// .2 (not published)
Content content2 = ContentBuilder.CreateSimpleContent(_contentType, "Content2", content1);
ContentService.Save(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
Content content21 = ContentBuilder.CreateSimpleContent(_contentType, "Content21", content2);
ContentService.Save(content21);
ContentService.Publish(content21, content21.AvailableCultures.ToArray());
Content content22 = ContentBuilder.CreateSimpleContent(_contentType, "Content22", content2);
ContentService.Save(content22);
2016-05-27 11:34:03 +02:00
// 3 (not published)
// .1 (not published)
// .2 (not published)
Content content3 = ContentBuilder.CreateSimpleContent(_contentType, "Content3", content1);
ContentService.Save(content3);
Content content31 = ContentBuilder.CreateSimpleContent(_contentType, "Content31", content3);
ContentService.Save(content31);
Content content32 = ContentBuilder.CreateSimpleContent(_contentType, "Content32", content3);
ContentService.Save(content32);
2016-05-27 11:34:03 +02:00
// 4 (published + saved)
// .1 (published)
// .2 (not published)
Content content4 = ContentBuilder.CreateSimpleContent(_contentType, "Content4", content1);
ContentService.Save(content4);
ContentService.Publish(content4, content4.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
content4.Name = "Content4X";
ContentService.Save(content4);
Content content41 = ContentBuilder.CreateSimpleContent(_contentType, "Content41", content4);
ContentService.Save(content41);
ContentService.Publish(content41, content41.AvailableCultures.ToArray());
Content content42 = ContentBuilder.CreateSimpleContent(_contentType, "Content42", content4);
ContentService.Save(content42);
2016-05-27 11:34:03 +02:00
// 5 (not published)
// .1 (published)
// .2 (not published)
Content content5 = ContentBuilder.CreateSimpleContent(_contentType, "Content5", content1);
ContentService.Save(content5);
ContentService.Publish(content5, content5.AvailableCultures.ToArray());
Content content51 = ContentBuilder.CreateSimpleContent(_contentType, "Content51", content5);
ContentService.Save(content51);
ContentService.Publish(content51, content51.AvailableCultures.ToArray());
Content content52 = ContentBuilder.CreateSimpleContent(_contentType, "Content52", content5);
ContentService.Save(content52);
ContentService.Unpublish(content5);
2016-05-27 11:34:03 +02:00
return content1;
}
#endregion
#region Validate Setup
2018-06-22 21:03:47 +02:00
[Test]
[LongRunning]
2018-06-22 21:03:47 +02:00
public void CreatedBranchIsOk()
{
IContent content1 = CreateBranch();
2018-06-22 21:03:47 +02:00
IContent[] children1 = Children(content1).ToArray();
2018-06-22 21:03:47 +02:00
IContent content2 = children1[0];
IContent[] children2 = Children(content2).ToArray();
IContent content21 = children2[0];
IContent content22 = children2[1];
2018-06-22 21:03:47 +02:00
IContent content3 = children1[1];
IContent[] children3 = Children(content3).ToArray();
IContent content31 = children3[0];
IContent content32 = children3[1];
2018-06-22 21:03:47 +02:00
IContent content4 = children1[2];
IContent[] children4 = Children(content4).ToArray();
IContent content41 = children4[0];
IContent content42 = children4[1];
2018-06-22 21:03:47 +02:00
IContent content5 = children1[3];
IContent[] children5 = Children(content5).ToArray();
IContent content51 = children5[0];
IContent content52 = children5[1];
2018-06-22 21:03:47 +02:00
Assert.IsTrue(content1.Published);
Assert.IsFalse(content1.Edited);
Assert.IsTrue(content2.Published);
Assert.IsFalse(content2.Edited);
Assert.IsTrue(content21.Published);
Assert.IsFalse(content21.Edited);
Assert.IsFalse(content22.Published);
Assert.IsTrue(content22.Edited);
Assert.IsFalse(content3.Published);
Assert.IsTrue(content3.Edited);
Assert.IsFalse(content31.Published);
Assert.IsTrue(content31.Edited);
Assert.IsFalse(content32.Published);
Assert.IsTrue(content32.Edited);
Assert.IsTrue(content4.Published);
Assert.IsTrue(content4.Edited);
Assert.IsTrue(content41.Published);
Assert.IsFalse(content41.Edited);
Assert.IsFalse(content42.Published);
Assert.IsTrue(content42.Edited);
Assert.IsFalse(content5.Published);
Assert.IsTrue(content5.Edited);
Assert.IsTrue(content51.Published);
Assert.IsFalse(content51.Edited);
Assert.IsFalse(content52.Published);
Assert.IsTrue(content52.Edited);
}
#endregion
#region Events tracer
2016-05-27 11:34:03 +02:00
private class EventInstance
{
2017-12-02 16:14:21 +01:00
public int Message { get; set; }
2016-05-27 11:34:03 +02:00
public string Sender { get; set; }
2016-05-27 11:34:03 +02:00
public string Name { get; set; }
2016-05-27 11:34:03 +02:00
public string Args { get; set; }
2016-05-27 11:34:03 +02:00
public object EventArgs { get; set; }
public override string ToString() => $"{Message:000}: {Sender.Replace(" ", string.Empty)}/{Name}/{Args}";
2016-05-27 11:34:03 +02:00
}
private static readonly string[] _propertiesImpactingAllVersions = { "SortOrder", "ParentId", "Level", "Path", "Trashed" };
2016-05-27 11:34:03 +02:00
private static bool HasChangesImpactingAllVersions(IContent icontent)
{
var content = (Content)icontent;
// UpdateDate will be dirty
// Published may be dirty if saving a Published entity
// so cannot do this (would always be true):
////return content.IsEntityDirty();
2016-05-27 11:34:03 +02:00
// have to be more precise & specify properties
return _propertiesImpactingAllVersions.Any(content.IsPropertyDirty);
2016-05-27 11:34:03 +02:00
}
2017-07-18 19:24:27 +02:00
private void WriteEvents()
{
Console.WriteLine("EVENTS");
foreach (EventInstance e in _events)
{
2017-07-18 19:24:27 +02:00
Console.WriteLine(e);
}
2017-07-18 19:24:27 +02:00
}
#endregion
#region Utils
2017-12-02 16:14:21 +01:00
private IEnumerable<IContent> Children(IContent content)
=> ContentService.GetPagedChildren(content.Id, 0, int.MaxValue, out _);
2016-05-27 11:34:03 +02:00
#endregion
#region Save, Publish & Unpublish single content
2016-05-27 11:34:03 +02:00
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void SaveUnpublishedContent()
{
// rule: when a content is saved,
2017-12-02 16:14:21 +01:00
// - repository : refresh u=u
// - content cache : refresh newest
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ResetEvents();
content.Name = "changed";
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void SavePublishedContent_ContentProperty1()
{
// rule: when a content is saved,
// - repository : refresh (u)
// - content cache :: refresh newest
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
content.Name = "changed";
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
ResetEvents();
content.Name = "again";
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
i = 0;
m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void SavePublishedContent_ContentProperty2()
{
// rule: when a content is saved,
// - repository : refresh (u)
// - content cache :: refresh newest
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
content.SortOrder = 666;
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
ResetEvents();
content.SortOrder = 667;
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
i = 0;
m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void SavePublishedContent_UserProperty()
{
// rule: when a content is saved,
// - repository : refresh (u)
// - content cache :: refresh newest
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
content.Properties.First().SetValue("changed");
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
ResetEvents();
content.Properties.First().SetValue("again");
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
i = 0;
m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void SaveAndPublishUnpublishedContent()
{
// rule: when a content is saved&published,
// - repository : refresh (p)
// - content cache :: refresh published, newest
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ResetEvents();
content.Name = "changed";
ContentService.Save(content);
ContentService.Publish(content, Array.Empty<string>());
2016-05-27 11:34:03 +02:00
Assert.AreEqual(4, _msgCount);
Assert.AreEqual(4, _events.Count);
int i = 0;
int m = 0;
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content.Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content.Id}.u+p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void SaveAndPublishPublishedContent()
{
// rule: when a content is saved&published,
// - repository : refresh (p)
// - content cache :: refresh published, newest
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
content.Name = "changed";
ContentService.Save(content);
ContentService.Publish(content, Array.Empty<string>());
2016-05-27 11:34:03 +02:00
Assert.AreEqual(4, _msgCount);
Assert.AreEqual(4, _events.Count);
int i = 0;
int m = 0;
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content.Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content.Id}.p+p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void PublishUnpublishedContent()
{
// rule: when a content is published,
// - repository : refresh (p)
// - published page cache :: refresh
// note: whenever the published cache is refreshed, subscribers must
// assume that the unpublished cache is also refreshed, with the same
// values, and deal with it.
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
content.Name = "changed";
ContentService.Save(content);
ResetEvents();
ContentService.Publish(content, Array.Empty<string>());
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.u+p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void UnpublishContent()
{
// rule: when a content is unpublished,
// - repository : refresh (u)
// - content cache :: refresh newest, remove published
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Unpublish(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p-u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void UnpublishContentWithChanges()
{
// rule: when a content is unpublished,
// - repository : refresh (u)
// - content cache :: refresh newest, remove published
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
content.Name = "changed";
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Unpublish(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p-u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
////Assert.AreEqual(string.Format("{0:000}: ContentCacheRefresher/Refresh/{1}", m, content.Id), _events[i++].ToString());
////Assert.AreEqual("changed", ContentService.GetById(((ContentCacheRefresher.JsonPayload)_events[i - 1].EventArgs).Id).Name);
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i].ToString());
}
2016-05-27 11:34:03 +02:00
#endregion
#region Publish & Unpublish branch
2016-05-27 11:34:03 +02:00
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void UnpublishContentBranch()
{
// rule: when a content branch is unpublished,
// - repository :: refresh root (u)
// - unpublished page cache :: refresh root
// - published page cache :: remove root
// note: subscribers must take care of the hierarchy and unpublish
// the whole branch by themselves. Examine does it in UmbracoContentIndexer,
// content caches have to do it too... wondering whether we should instead
// trigger RemovePublished for all of the removed content?
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Unpublish(content1);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.p-u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
////Assert.AreEqual(string.Format("{0:000}: ContentCacheRefresher/Refresh/{1}", m, content1.Id), _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void PublishContentBranch()
{
// rule: when a content branch is published,
// - repository :: refresh root (p)
// - published page cache :: refresh root & descendants, database (level, sortOrder) order
IContent content1 = CreateBranch();
ContentService.Unpublish(content1);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.u+p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString()); // repub content1
2016-05-27 11:34:03 +02:00
/*
var content1C = content1.Children().ToArray();
Assert.AreEqual(string.Format("{0:000}: ContentCacheRefresher/RefreshPublished/{1}", m, content1C[0].Id), _events[i++].ToString()); // repub content1.content2
Assert.AreEqual(string.Format("{0:000}: ContentCacheRefresher/RefreshPublished/{1}", m, content1C[2].Id), _events[i++].ToString()); // repub content1.content4
var c = ContentService.GetPublishedVersion(((ContentCacheRefresher.JsonPayload)_events[i - 1].EventArgs).Id);
2016-05-27 11:34:03 +02:00
Assert.IsTrue(c.Published); // get the published one
Assert.AreEqual("Content4", c.Name); // published has old name
var content2C = content1C[0].Children().ToArray();
Assert.AreEqual(string.Format("{0:000}: ContentCacheRefresher/RefreshPublished/{1}", m, content2C[0].Id), _events[i++].ToString()); // repub content1.content2.content21
var content4C = content1C[2].Children().ToArray();
Assert.AreEqual(string.Format("{0:000}: ContentCacheRefresher/RefreshPublished/{1}", m, content4C[0].Id), _events[i].ToString()); // repub content1.content4.content41
*/
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void PublishContentBranchWithPublishedChildren()
{
// rule?
IContent content1 = CreateBranch();
ContentService.Unpublish(content1);
2016-05-27 11:34:03 +02:00
2018-06-22 21:03:47 +02:00
// branch is:
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.PublishBranch(content1, force: false, cultures: content1.AvailableCultures.ToArray()); // force = false, don't publish unpublished items
2018-06-22 21:03:47 +02:00
foreach (EventInstance e in _events)
{
2018-06-22 21:03:47 +02:00
Console.WriteLine(e);
}
2016-05-27 11:34:03 +02:00
2018-06-22 21:03:47 +02:00
Assert.AreEqual(3, _msgCount);
Assert.AreEqual(3, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
2018-06-22 21:03:47 +02:00
// force:false => only republish the root node + nodes that are edited
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2018-06-22 21:03:47 +02:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.u+p", _events[i++].ToString()); // content1 was unpublished, now published
// change: only content4 shows here, because it has changes - others don't need to be published
////Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p+p", _events[i++].ToString()); // content1/content2
2018-06-22 21:03:47 +02:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p+p", _events[i++].ToString()); // content1/content4
////Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p+p", _events[i++].ToString()); // content1/content2/content21
////Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p+p", _events[i++].ToString()); // content1/content4/content41
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString()); // repub content1
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void PublishContentBranchWithAllChildren()
{
// rule?
IContent content1 = CreateBranch();
ContentService.Unpublish(content1);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.PublishBranch(content1, force: true, cultures: content1.AvailableCultures.ToArray()); // force = true, also publish unpublished items
2016-05-27 11:34:03 +02:00
foreach (EventInstance e in _events)
{
2018-06-22 21:03:47 +02:00
Console.WriteLine(e);
}
2018-06-22 21:03:47 +02:00
Assert.AreEqual(10, _msgCount);
Assert.AreEqual(10, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2018-06-22 21:03:47 +02:00
// force:true => all nodes are republished, refreshing all nodes - but only with changes - published w/out changes are not repub
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.u+p", _events[i++].ToString());
////Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p+p", _events[i++].ToString());
////Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p+p", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[1].Id}.u+p", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u+p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[0].Id}.u+p", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[1].Id}.u+p", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p+p", _events[i++].ToString());
////Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p+p", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[1].Id}.u+p", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u+p", _events[i++].ToString());
////Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[0].Id}.p+p", _events[i++].ToString());
2018-06-22 21:03:47 +02:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[1].Id}.u+p", _events[i++].ToString());
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString()); // repub content1
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
#endregion
#region Sort
2016-05-27 11:34:03 +02:00
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void SortAll()
{
// rule: ?
IContent content1 = CreateBranch();
IContent[] content1C = Children(content1).ToArray();
2016-05-27 11:34:03 +02:00
Assert.AreEqual(4, content1C.Length);
IContent[] content1Csorted = new[] { content1C[3], content1C[0], content1C[1], content1C[2] };
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Sort(content1Csorted);
2016-05-27 11:34:03 +02:00
IContent[] content1Cagain = Children(content1).ToArray();
2016-05-27 11:34:03 +02:00
Assert.AreEqual(4, content1Cagain.Length);
Assert.AreEqual(content1C[0].Id, content1Cagain[1].Id);
Assert.AreEqual(content1C[1].Id, content1Cagain[2].Id);
Assert.AreEqual(content1C[2].Id, content1Cagain[3].Id);
Assert.AreEqual(content1C[3].Id, content1Cagain[0].Id);
Assert.AreEqual(5, _msgCount);
Assert.AreEqual(8, _events.Count);
int i = 0;
int m = 0;
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString()); // content5 is not published
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p=p", _events[i++].ToString()); // content2 is published
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u=u", _events[i++].ToString()); // content3 is not published
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1C[2].Id}.p=p", _events[i++].ToString()); // content4 is published + changes
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content1C[3].Id}", _events[i++].ToString()); // content5 is not published
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content1C[0].Id}", _events[i++].ToString()); // content2 is published
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content1C[1].Id}", _events[i++].ToString()); // content3 is not published
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content1C[2].Id}", _events[i].ToString()); // content4 is published
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void SortSome()
{
// rule: ?
IContent content1 = CreateBranch();
IContent[] content1C = Children(content1).ToArray();
2016-05-27 11:34:03 +02:00
Assert.AreEqual(4, content1C.Length);
IContent[] content1Csorted = new[] { content1C[0], content1C[1], content1C[3], content1C[2] };
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Sort(content1Csorted);
2016-05-27 11:34:03 +02:00
IContent[] content1Cagain = Children(content1).ToArray();
2016-05-27 11:34:03 +02:00
Assert.AreEqual(4, content1Cagain.Length);
Assert.AreEqual(content1C[0].Id, content1Cagain[0].Id);
Assert.AreEqual(content1C[1].Id, content1Cagain[1].Id);
Assert.AreEqual(content1C[2].Id, content1Cagain[3].Id);
Assert.AreEqual(content1C[3].Id, content1Cagain[2].Id);
Assert.AreEqual(3, _msgCount);
Assert.AreEqual(4, _events.Count);
int i = 0;
int m = 0;
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString()); // content5 is not published
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1C[2].Id}.p=p", _events[i++].ToString()); // content4 is published + changes
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content1C[3].Id}", _events[i++].ToString()); // content5 is not published
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content1C[2].Id}", _events[i].ToString()); // content4 is published
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
#endregion
#region Trash
2016-05-27 11:34:03 +02:00
// incl. trashing a published, unpublished content, w/changes
// incl. trashing a branch, untrashing a single masked content
// including emptying the recycle bin
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void TrashUnpublishedContent()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ResetEvents();
ContentService.MoveToRecycleBin(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void UntrashUnpublishedContent()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.MoveToRecycleBin(content);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content, -1);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void TrashPublishedContent()
{
// does 1) unpublish and 2) trash
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.MoveToRecycleBin(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
////Assert.AreEqual(string.Format("{0:000}: ContentCacheRefresher/RemovePublished,Refresh/{1}", m, content.Id), _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void UntrashPublishedContent()
{
// same as unpublished as it's been unpublished
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
ContentService.MoveToRecycleBin(content);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content, -1);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2016-05-27 11:34:03 +02:00
// trashing did /pm- (published, masked)
// un-trashing cannot re-publish so /u?- (not-published, unchanged)
// but because we *have* to change state to unpublished, it's /ux- and not /uu-
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p-u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void TrashPublishedContentWithChanges()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
content.Properties.First().SetValue("changed");
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.MoveToRecycleBin(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
////Assert.AreEqual(string.Format("{0:000}: ContentCacheRefresher/RemovePublished,Refresh/{1}", m, content.Id), _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void TrashContentBranch()
{
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.MoveToRecycleBin(content1);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[0].Id}.u=u", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p=m", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[0].Id}.p=m", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content5C[1].Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void EmptyRecycleBinContent()
{
ContentService.EmptyRecycleBin();
2016-05-27 11:34:03 +02:00
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.MoveToRecycleBin(content);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.EmptyRecycleBin();
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
var i = 0;
var m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Remove/{content.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void EmptyRecycleBinContents()
{
ContentService.EmptyRecycleBin(Constants.Security.SuperUserId);
2016-05-27 11:34:03 +02:00
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.MoveToRecycleBin(content1);
2016-05-27 11:34:03 +02:00
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.MoveToRecycleBin(content2);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.EmptyRecycleBin(Constants.Security.SuperUserId);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(3, _msgCount);
Assert.AreEqual(4, _events.Count);
var i = 0;
var m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1.Id}", _events[i++].ToString());
Assert.AreEqual($"{m:000}: ContentRepository/Remove/{content2.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content1.Id}", _events[i++].ToString());
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content2.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void EmptyRecycleBinBranch()
{
ContentService.EmptyRecycleBin(Constants.Security.SuperUserId);
2016-05-27 11:34:03 +02:00
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.MoveToRecycleBin(content1);
2016-05-27 11:34:03 +02:00
ResetEvents();
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
2016-05-27 11:34:03 +02:00
ContentService.EmptyRecycleBin(Constants.Security.SuperUserId);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
var i = 0;
var m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content5C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content5C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1C[3].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content4C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content4C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1C[2].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content3C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content3C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content2C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content2C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m:000}: ContentRepository/Remove/{content1.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
#endregion
#region Delete
2016-05-27 11:34:03 +02:00
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void DeleteUnpublishedContent()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ResetEvents();
ContentService.Delete(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Remove/{content.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void DeletePublishedContent()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Delete(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Remove/{content.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void DeletePublishedContentWithChanges()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
content.Properties.First().SetValue("changed");
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Delete(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Remove/{content.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void DeleteMaskedPublishedContent()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent(content1.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
ContentService.Unpublish(content1);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Delete(content2);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Remove/{content2.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content2.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void DeleteBranch()
{
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
// get them before they are deleted!
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Delete(content1);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content5C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content5C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1C[3].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content4C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content4C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1C[2].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content3C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content3C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content2C[1].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content2C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Remove/{content1C[0].Id}", _events[i++].ToString());
Assert.AreEqual($"{m:000}: ContentRepository/Remove/{content1.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/Remove/{content1.Id}", _events[i].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
#endregion
#region Move
2016-05-27 11:34:03 +02:00
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveUnpublishedContentUnderUnpublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ResetEvents();
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
public void MovePublishedContentUnderUnpublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ResetEvents();
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MovePublishedContentWithChangesUnderUnpublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
content1.Properties.First().SetValue("changed");
ContentService.Save(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ResetEvents();
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveUnpublishedContentUnderPublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveUnpublishedContentUnderMasked()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
IContent content3 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
ContentService.Unpublish(content2);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, content3.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
public void MovePublishedContentUnderPublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
public void MovePublishedContentUnderMasked()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
IContent content3 = CreateContent(content2.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
ContentService.Unpublish(content2);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, content3.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MovePublishedContentWithChangesUnderPublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
content1.Properties.First().SetValue("changed");
ContentService.Save(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
public void MovePublishedContentWithChangesUnderMasked()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
content1.Properties.First().SetValue("changed");
ContentService.Save(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
IContent content3 = CreateContent(content2.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
ContentService.Unpublish(content2);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, content3.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content1.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveMaskedPublishedContentUnderPublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent(content1.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
ContentService.Unpublish(content1);
IContent content3 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content2, content3.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content2.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content2.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveMaskedPublishedContentUnderMasked()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent(content1.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
ContentService.Unpublish(content1);
IContent content3 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
IContent content4 = CreateContent(content3.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content4);
ContentService.Publish(content4, content4.AvailableCultures.ToArray());
ContentService.Unpublish(content3);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content2, content4.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content2.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content2.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
public void MoveMaskedPublishedContentWithChangesUnderPublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent(content1.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
content2.Properties.First().SetValue("changed");
ContentService.Save(content2);
ContentService.Unpublish(content1);
IContent content3 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content2, content3.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content2.Id}.p=p", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content2.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveMaskedPublishedContentWithChangesUnderMasked()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent(content1.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
content2.Properties.First().SetValue("changed");
ContentService.Save(content2);
ContentService.Unpublish(content1);
IContent content3 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
IContent content4 = CreateContent(content3.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content4);
ContentService.Publish(content4, content4.AvailableCultures.ToArray());
ContentService.Unpublish(content3);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content2, content4.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content2.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content2.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveMaskedPublishedContentUnderUnpublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent(content1.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
ContentService.Unpublish(content1);
IContent content3 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ResetEvents();
ContentService.Move(content2, content3.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content2.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content2.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
public void MoveMaskedPublishedContentWithChangesUnderUnpublished()
{
IContent content1 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
ContentService.Publish(content1, content1.AvailableCultures.ToArray());
IContent content2 = CreateContent(content1.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
content2.Properties.First().SetValue("changed");
ContentService.Save(content2);
ContentService.Unpublish(content1);
IContent content3 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ResetEvents();
ContentService.Move(content2, content3.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content2.Id}.p=m", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content2.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveContentBranchUnderUnpublished()
{
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ResetEvents();
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[0].Id}.u=u", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p=m", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[0].Id}.p=m", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content5C[1].Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveContentBranchUnderPublished()
{
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[0].Id}.u=u", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p=p", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[0].Id}.p=m", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content5C[1].Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveContentBranchUnderMasked()
{
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
IContent content3 = CreateContent(content2.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
ContentService.Unpublish(content2);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, content3.Id);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[0].Id}.u=u", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p=m", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p=m", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[0].Id}.p=m", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content5C[1].Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveContentBranchBackFromPublished()
{
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, -1);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[0].Id}.u=u", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p=p", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[0].Id}.p=m", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content5C[1].Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveContentBranchBackFromUnpublished()
{
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Move(content1, content2.Id);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, -1);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[0].Id}.u=u", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p=p", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[0].Id}.p=m", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content5C[1].Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void MoveContentBranchBackFromMasked()
{
IContent content1 = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content1);
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Publish(content2, content2.AvailableCultures.ToArray());
IContent content3 = CreateContent(content2.Id);
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content3);
ContentService.Publish(content3, content3.AvailableCultures.ToArray());
ContentService.Unpublish(content2);
2016-05-27 11:34:03 +02:00
ContentService.Move(content1, content3.Id);
2016-05-27 11:34:03 +02:00
ResetEvents();
ContentService.Move(content1, -1);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
IContent[] content1C = Children(content1).ToArray();
IContent[] content2C = Children(content1C[0]).ToArray();
IContent[] content3C = Children(content1C[1]).ToArray();
IContent[] content4C = Children(content1C[2]).ToArray();
IContent[] content5C = Children(content1C[3]).ToArray();
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1.Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[0].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[0].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content2C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[1].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[0].Id}.u=u", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content3C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[2].Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[0].Id}.p=p", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content4C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content1C[3].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content5C[0].Id}.p=m", _events[i++].ToString());
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{content5C[1].Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{content1.Id}", _events[i++].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
#endregion
#region Copy
2016-05-27 11:34:03 +02:00
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void CopyUnpublishedContent()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ResetEvents();
IContent copy = ContentService.Copy(content, Constants.System.Root, false);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{copy.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{copy.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void CopyPublishedContent()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
IContent copy = ContentService.Copy(content, Constants.System.Root, false);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{copy.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{copy.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void CopyMaskedContent()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
IContent content2 = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content2);
ContentService.Move(content, content2.Id);
2016-05-27 11:34:03 +02:00
ResetEvents();
IContent copy = ContentService.Copy(content, Constants.System.Root, false);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{copy.Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{copy.Id}", _events[i].ToString());
2016-05-27 11:34:03 +02:00
}
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void CopyBranch()
{
IContent content = CreateBranch();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, content.AvailableCultures.ToArray());
2016-05-27 11:34:03 +02:00
ResetEvents();
IContent copy = ContentService.Copy(content, Constants.System.Root, false);
2016-05-27 11:34:03 +02:00
IContent[] copyC = Children(copy).ToArray();
IContent[] copy2C = Children(copyC[0]).ToArray();
IContent[] copy3C = Children(copyC[1]).ToArray();
IContent[] copy4C = Children(copyC[2]).ToArray();
IContent[] copy5C = Children(copyC[3]).ToArray();
2016-05-27 11:34:03 +02:00
Assert.AreEqual(14, _msgCount);
Assert.AreEqual(14, _events.Count);
int i = 0;
int m = 0;
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copy.Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copyC[0].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copy2C[0].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copy2C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copyC[1].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copy3C[0].Id}.u=u", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copy3C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copyC[2].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copy4C[0].Id}.u=u", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copy4C[1].Id}.u=u", _events[i++].ToString());
2018-10-31 22:38:58 +11:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copyC[3].Id}.u=u", _events[i++].ToString());
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{copy5C[0].Id}.u=u", _events[i++].ToString());
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentRepository/Refresh/{copy5C[1].Id}.u=u", _events[i++].ToString());
2016-05-27 11:34:03 +02:00
m++;
2017-12-02 16:14:21 +01:00
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshBranch/{copy.Id}", _events[i].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
#endregion
#region Rollback
2016-05-27 11:34:03 +02:00
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void Rollback()
{
IContent content = CreateContent();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Publish(content, Array.Empty<string>());
int v1 = content.VersionId;
2016-05-27 11:34:03 +02:00
content.Properties.First().SetValue("changed");
ContentService.Save(content);
ContentService.Publish(content, Array.Empty<string>());
int v2 = content.VersionId;
2016-05-27 11:34:03 +02:00
content.Properties.First().SetValue("again");
ContentService.Save(content);
ContentService.Publish(content, Array.Empty<string>());
int v3 = content.VersionId;
2016-05-27 11:34:03 +02:00
Console.WriteLine(v1);
Console.WriteLine(v2);
Console.WriteLine(v3);
ResetEvents();
content.CopyFrom(ContentService.GetVersion(v2));
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.AreEqual(2, _msgCount);
Assert.AreEqual(2, _events.Count);
int i = 0;
int m = 0;
#pragma warning disable SA1003 // Symbols should be spaced correctly (justification: suppression necessary here as it's used in an interpolated string format.
2017-12-06 09:58:50 +01:00
Assert.AreEqual($"{m++:000}: ContentRepository/Refresh/{content.Id}.p=p", _events[i++].ToString());
Assert.AreEqual($"{m:000}: ContentCacheRefresher/RefreshNode/{content.Id}", _events[i].ToString());
#pragma warning restore SA1003 // Symbols should be spaced correctly
2016-05-27 11:34:03 +02:00
}
#endregion
#region Misc
2016-05-27 11:34:03 +02:00
[Test]
[LongRunning]
2016-05-27 11:34:03 +02:00
public void ContentRemembers()
{
IContent content = ContentService.GetRootContent().FirstOrDefault();
2016-05-27 11:34:03 +02:00
Assert.IsNotNull(content);
ContentService.Save(content);
2016-05-27 11:34:03 +02:00
Assert.IsFalse(content.IsPropertyDirty("Published"));
Assert.IsFalse(content.WasPropertyDirty("Published"));
ContentService.Publish(content, Array.Empty<string>());
2016-05-27 11:34:03 +02:00
Assert.IsFalse(content.IsPropertyDirty("Published"));
Assert.IsTrue(content.WasPropertyDirty("Published")); // has just been published
ContentService.Publish(content, Array.Empty<string>());
2016-05-27 11:34:03 +02:00
Assert.IsFalse(content.IsPropertyDirty("Published"));
Assert.IsFalse(content.WasPropertyDirty("Published")); // was published already
}
2017-12-02 16:14:21 +01:00
[Test]
2021-01-20 16:45:19 +01:00
public void HasInitialContent() => Assert.AreEqual(5, ContentService.Count());
#endregion
#region TODO
// all content type events
#endregion
public class LocalServerMessenger : ServerMessengerBase
{
public LocalServerMessenger()
: base(false, new SystemTextJsonSerializer())
{
}
public override void SendMessages() { }
public override void Sync() { }
protected override void DeliverRemote(ICacheRefresher refresher, MessageType messageType, IEnumerable<object> ids = null, string json = null)
{
}
}
2016-05-27 11:34:03 +02:00
}
}
#pragma warning restore SA1124 // Do not use regions