From bff321e6f5999e162210a8d36cf077ce54998966 Mon Sep 17 00:00:00 2001 From: kasparboelkjeldsen <137318845+kasparboelkjeldsen@users.noreply.github.com> Date: Tue, 19 Nov 2024 08:48:20 +0100 Subject: [PATCH 1/3] Support for SMTP OAuth authentication through easier IEmailSenderClient implementation (#17484) * Implement IEmailSenderClient interface and implementation In an effort to support oauth 2 and other schemes, we extract a emailsenderclient interface, allowing to replace default smtp client with one that fits the usecase, without having to implement all of Umbracos logic that builds the mimemessage * fix test * Documentation * EmailMessageExtensions public, use EmailMessage in interface and impl. * move mimemessage into implementation * revert EmailMessageExtensions back to internal * use StaticServiceProvider to avoid breaking change * Fix test after changing constructor * revert constructor change and add new constructor an obsoletes * Moved a paranthesis so it will build in release-mode --- .../UmbracoBuilder.CoreServices.cs | 5 ++ .../Mail/BasicSmtpEmailSenderClient.cs | 50 +++++++++++++++++ .../Mail/EmailSender.cs | 55 +++++++++---------- .../Mail/Interfaces/IEmailSenderClient.cs | 17 ++++++ .../TestHelpers/TestHelper.cs | 3 +- 5 files changed, 101 insertions(+), 29 deletions(-) create mode 100644 src/Umbraco.Infrastructure/Mail/BasicSmtpEmailSenderClient.cs create mode 100644 src/Umbraco.Infrastructure/Mail/Interfaces/IEmailSenderClient.cs diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs index 1f8647c410..e467c0a8a3 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs @@ -46,6 +46,7 @@ using Umbraco.Cms.Infrastructure.HealthChecks; using Umbraco.Cms.Infrastructure.HostedServices; using Umbraco.Cms.Infrastructure.Install; using Umbraco.Cms.Infrastructure.Mail; +using Umbraco.Cms.Infrastructure.Mail.Interfaces; using Umbraco.Cms.Infrastructure.Manifest; using Umbraco.Cms.Infrastructure.Migrations; using Umbraco.Cms.Infrastructure.Migrations.Install; @@ -172,14 +173,18 @@ public static partial class UmbracoBuilderExtensions builder.Services.AddSingleton(); + builder.Services.AddTransient(); + // replace builder.Services.AddSingleton( services => new EmailSender( services.GetRequiredService>(), services.GetRequiredService>(), services.GetRequiredService(), + services.GetRequiredService(), services.GetService>(), services.GetService>())); + builder.Services.AddTransient(); builder.Services.AddTransient(); diff --git a/src/Umbraco.Infrastructure/Mail/BasicSmtpEmailSenderClient.cs b/src/Umbraco.Infrastructure/Mail/BasicSmtpEmailSenderClient.cs new file mode 100644 index 0000000000..15ae1d0f49 --- /dev/null +++ b/src/Umbraco.Infrastructure/Mail/BasicSmtpEmailSenderClient.cs @@ -0,0 +1,50 @@ +using System.Net.Mail; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Models.Email; +using Umbraco.Cms.Infrastructure.Extensions; +using Umbraco.Cms.Infrastructure.Mail.Interfaces; +using SecureSocketOptions = MailKit.Security.SecureSocketOptions; +using SmtpClient = MailKit.Net.Smtp.SmtpClient; + +namespace Umbraco.Cms.Infrastructure.Mail +{ + /// + /// A basic SMTP email sender client using MailKits SMTP client. + /// + public class BasicSmtpEmailSenderClient : IEmailSenderClient + { + private readonly GlobalSettings _globalSettings; + public BasicSmtpEmailSenderClient(IOptionsMonitor globalSettings) + { + _globalSettings = globalSettings.CurrentValue; + } + + public async Task SendAsync(EmailMessage message) + { + using var client = new SmtpClient(); + + await client.ConnectAsync( + _globalSettings.Smtp!.Host, + _globalSettings.Smtp.Port, + (SecureSocketOptions)(int)_globalSettings.Smtp.SecureSocketOptions); + + if (!string.IsNullOrWhiteSpace(_globalSettings.Smtp.Username) && + !string.IsNullOrWhiteSpace(_globalSettings.Smtp.Password)) + { + await client.AuthenticateAsync(_globalSettings.Smtp.Username, _globalSettings.Smtp.Password); + } + + var mimeMessage = message.ToMimeMessage(_globalSettings.Smtp!.From); + + if (_globalSettings.Smtp.DeliveryMethod == SmtpDeliveryMethod.Network) + { + await client.SendAsync(mimeMessage); + } + else + { + client.Send(mimeMessage); + } + } + } +} diff --git a/src/Umbraco.Infrastructure/Mail/EmailSender.cs b/src/Umbraco.Infrastructure/Mail/EmailSender.cs index 03b46dbedc..feb00735f2 100644 --- a/src/Umbraco.Infrastructure/Mail/EmailSender.cs +++ b/src/Umbraco.Infrastructure/Mail/EmailSender.cs @@ -1,20 +1,20 @@ // Copyright (c) Umbraco. // See LICENSE for more details. -using System.Net.Mail; using MailKit.Net.Smtp; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MimeKit; using MimeKit.IO; using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Mail; using Umbraco.Cms.Core.Models.Email; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Infrastructure.Extensions; -using SecureSocketOptions = MailKit.Security.SecureSocketOptions; -using SmtpClient = MailKit.Net.Smtp.SmtpClient; +using Umbraco.Cms.Infrastructure.Mail.Interfaces; namespace Umbraco.Cms.Infrastructure.Mail; @@ -28,15 +28,18 @@ public class EmailSender : IEmailSender private readonly ILogger _logger; private readonly bool _notificationHandlerRegistered; private GlobalSettings _globalSettings; + private readonly IEmailSenderClient _emailSenderClient; + [Obsolete("Please use the non-obsolete constructor. Will be removed in V17.")] public EmailSender( ILogger logger, IOptionsMonitor globalSettings, IEventAggregator eventAggregator) - : this(logger, globalSettings, eventAggregator, null, null) + : this(logger, globalSettings, eventAggregator,null, null) { } + [Obsolete("Please use the non-obsolete constructor. Will be removed in V17.")] public EmailSender( ILogger logger, IOptionsMonitor globalSettings, @@ -48,6 +51,24 @@ public class EmailSender : IEmailSender _eventAggregator = eventAggregator; _globalSettings = globalSettings.CurrentValue; _notificationHandlerRegistered = handler1 is not null || handler2 is not null; + _emailSenderClient = StaticServiceProvider.Instance.GetRequiredService(); + globalSettings.OnChange(x => _globalSettings = x); + } + + [ActivatorUtilitiesConstructor] + public EmailSender( + ILogger logger, + IOptionsMonitor globalSettings, + IEventAggregator eventAggregator, + IEmailSenderClient emailSenderClient, + INotificationHandler? handler1, + INotificationAsyncHandler? handler2) + { + _logger = logger; + _eventAggregator = eventAggregator; + _globalSettings = globalSettings.CurrentValue; + _notificationHandlerRegistered = handler1 is not null || handler2 is not null; + _emailSenderClient = emailSenderClient; globalSettings.OnChange(x => _globalSettings = x); } @@ -152,29 +173,7 @@ public class EmailSender : IEmailSender while (true); } - using var client = new SmtpClient(); - - await client.ConnectAsync( - _globalSettings.Smtp!.Host, - _globalSettings.Smtp.Port, - (SecureSocketOptions)(int)_globalSettings.Smtp.SecureSocketOptions); - - if (!string.IsNullOrWhiteSpace(_globalSettings.Smtp.Username) && - !string.IsNullOrWhiteSpace(_globalSettings.Smtp.Password)) - { - await client.AuthenticateAsync(_globalSettings.Smtp.Username, _globalSettings.Smtp.Password); - } - - var mailMessage = message.ToMimeMessage(_globalSettings.Smtp.From); - if (_globalSettings.Smtp.DeliveryMethod == SmtpDeliveryMethod.Network) - { - await client.SendAsync(mailMessage); - } - else - { - client.Send(mailMessage); - } - - await client.DisconnectAsync(true); + await _emailSenderClient.SendAsync(message); } + } diff --git a/src/Umbraco.Infrastructure/Mail/Interfaces/IEmailSenderClient.cs b/src/Umbraco.Infrastructure/Mail/Interfaces/IEmailSenderClient.cs new file mode 100644 index 0000000000..10dd5284c4 --- /dev/null +++ b/src/Umbraco.Infrastructure/Mail/Interfaces/IEmailSenderClient.cs @@ -0,0 +1,17 @@ +using Umbraco.Cms.Core.Models.Email; + +namespace Umbraco.Cms.Infrastructure.Mail.Interfaces +{ + /// + /// Client for sending an email from a MimeMessage + /// + public interface IEmailSenderClient + { + /// + /// Sends the email message + /// + /// + /// + public Task SendAsync(EmailMessage message); + } +} diff --git a/tests/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs b/tests/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs index 4468587866..485b7776e2 100644 --- a/tests/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs +++ b/tests/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs @@ -35,6 +35,7 @@ using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Mail; +using Umbraco.Cms.Infrastructure.Mail.Interfaces; using Umbraco.Cms.Infrastructure.Persistence; using Umbraco.Cms.Infrastructure.Persistence.Mappers; using Umbraco.Cms.Persistence.SqlServer.Services; @@ -80,7 +81,7 @@ public static class TestHelper public static UriUtility UriUtility => s_testHelperInternal.UriUtility; - public static IEmailSender EmailSender { get; } = new EmailSender(new NullLogger(), new TestOptionsMonitor(new GlobalSettings()), Mock.Of()); + public static IEmailSender EmailSender { get; } = new EmailSender(new NullLogger(), new TestOptionsMonitor(new GlobalSettings()), Mock.Of(), Mock.Of(), null,null); public static ITypeFinder GetTypeFinder() => s_testHelperInternal.GetTypeFinder(); From 85f1f8139030909898556a3f6296e3654a896ce4 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Nov 2024 15:46:49 +0100 Subject: [PATCH 2/3] Change icons of media types (#16290) * Change icons of media types * feat: install icons `audio-lines` and `origami` from lucide * feat: update the default icon for audio to `icon-audio-lines` and the default icon for vector graphics to `icon-origami` * chore: add more mocked media types * chore: add missing endpoint for media-type ancestors --------- Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> --- src/Umbraco.Core/Constants-Icons.cs | 4 +- .../mocks/data/media-type/media-type.data.ts | 202 +++++++++++++++++- .../handlers/media-type/tree.handlers.ts | 7 + .../core/icon-registry/icon-dictionary.json | 10 +- .../src/packages/core/icon-registry/icons.ts | 8 + .../icon-registry/icons/icon-audio-lines.ts | 19 ++ .../core/icon-registry/icons/icon-origami.ts | 16 ++ 7 files changed, 262 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-audio-lines.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-origami.ts diff --git a/src/Umbraco.Core/Constants-Icons.cs b/src/Umbraco.Core/Constants-Icons.cs index 53501a012c..cf2c263d83 100644 --- a/src/Umbraco.Core/Constants-Icons.cs +++ b/src/Umbraco.Core/Constants-Icons.cs @@ -67,7 +67,7 @@ public static partial class Constants /// /// System media audio icon. /// - public const string MediaAudio = "icon-sound-waves"; + public const string MediaAudio = "icon-audio-lines"; /// /// System media article icon @@ -77,7 +77,7 @@ public static partial class Constants /// /// System media vector icon. /// - public const string MediaVectorGraphics = "icon-picture"; + public const string MediaVectorGraphics = "icon-origami"; /// /// System media folder icon. diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.data.ts index 9378249bf4..389ec141ba 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media-type/media-type.data.ts @@ -15,7 +15,7 @@ export const data: Array = [ parent: null, description: 'Media type 1 description', alias: 'mediaType1', - icon: 'icon-bug', + icon: 'icon-picture', properties: [ { id: '19', @@ -99,4 +99,204 @@ export const data: Array = [ isDeletable: false, aliasCanBeChanged: false, }, + { + name: 'Media Type 2', + id: 'media-type-2-id', + parent: null, + description: 'Media type 2 description', + alias: 'mediaType2', + icon: 'icon-audio-lines', + properties: [ + { + id: '19', + container: { id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75' }, + alias: 'umbracoFile', + name: 'File', + description: '', + dataType: { id: 'dt-uploadField' }, + variesByCulture: false, + variesBySegment: false, + sortOrder: 0, + validation: { + mandatory: true, + mandatoryMessage: null, + regEx: null, + regExMessage: null, + }, + appearance: { + labelOnTop: false, + }, + }, + ], + containers: [ + { + id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', + parent: null, + name: 'Content', + type: 'Group', + sortOrder: 0, + }, + ], + allowedAsRoot: true, + variesByCulture: false, + variesBySegment: false, + isElement: false, + allowedMediaTypes: [{ mediaType: { id: 'media-type-2-id' }, sortOrder: 0 }], + compositions: [], + isFolder: false, + hasChildren: false, + collection: { id: 'dt-collectionView' }, + isDeletable: false, + aliasCanBeChanged: false, + }, + { + name: 'Media Type 3', + id: 'media-type-3-id', + parent: null, + description: 'Media type 3 description', + alias: 'mediaType3', + icon: 'icon-origami', + properties: [ + { + id: '19', + container: { id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75' }, + alias: 'umbracoFile', + name: 'File', + description: '', + dataType: { id: 'dt-uploadField' }, + variesByCulture: false, + variesBySegment: false, + sortOrder: 0, + validation: { + mandatory: true, + mandatoryMessage: null, + regEx: null, + regExMessage: null, + }, + appearance: { + labelOnTop: false, + }, + }, + ], + containers: [ + { + id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', + parent: null, + name: 'Content', + type: 'Group', + sortOrder: 0, + }, + ], + allowedAsRoot: true, + variesByCulture: false, + variesBySegment: false, + isElement: false, + allowedMediaTypes: [{ mediaType: { id: 'media-type-3-id' }, sortOrder: 0 }], + compositions: [], + isFolder: false, + hasChildren: false, + collection: { id: 'dt-collectionView' }, + isDeletable: false, + aliasCanBeChanged: false, + }, + { + name: 'Media Type 4', + id: 'media-type-4-id', + parent: null, + description: 'Media type 4 description', + alias: 'mediaType4', + icon: 'icon-video', + properties: [ + { + id: '19', + container: { id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75' }, + alias: 'umbracoFile', + name: 'File', + description: '', + dataType: { id: 'dt-uploadField' }, + variesByCulture: false, + variesBySegment: false, + sortOrder: 0, + validation: { + mandatory: true, + mandatoryMessage: null, + regEx: null, + regExMessage: null, + }, + appearance: { + labelOnTop: false, + }, + }, + ], + containers: [ + { + id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', + parent: null, + name: 'Content', + type: 'Group', + sortOrder: 0, + }, + ], + allowedAsRoot: true, + variesByCulture: false, + variesBySegment: false, + isElement: false, + allowedMediaTypes: [{ mediaType: { id: 'media-type-4-id' }, sortOrder: 0 }], + compositions: [], + isFolder: false, + hasChildren: false, + collection: { id: 'dt-collectionView' }, + isDeletable: false, + aliasCanBeChanged: false, + }, + { + name: 'Media Type 5', + id: 'media-type-5-id', + parent: null, + description: 'Media type 5 description', + alias: 'mediaType5', + icon: 'icon-document', + properties: [ + { + id: '19', + container: { id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75' }, + alias: 'umbracoFile', + name: 'File', + description: '', + dataType: { id: 'dt-uploadField' }, + variesByCulture: false, + variesBySegment: false, + sortOrder: 0, + validation: { + mandatory: true, + mandatoryMessage: null, + regEx: null, + regExMessage: null, + }, + appearance: { + labelOnTop: false, + }, + }, + ], + containers: [ + { + id: 'c3cd2f12-b7c4-4206-8d8b-27c061589f75', + parent: null, + name: 'Content', + type: 'Group', + sortOrder: 0, + }, + ], + allowedAsRoot: true, + variesByCulture: false, + variesBySegment: false, + isElement: false, + allowedMediaTypes: [{ mediaType: { id: 'media-type-5-id' }, sortOrder: 0 }], + compositions: [], + isFolder: false, + hasChildren: false, + collection: { id: 'dt-collectionView' }, + isDeletable: false, + aliasCanBeChanged: false, + }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts index 2d113dee35..75683e8e54 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts @@ -19,4 +19,11 @@ export const treeHandlers = [ const response = umbMediaTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); return res(ctx.status(200), ctx.json(response)); }), + + rest.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), (req, res, ctx) => { + const id = req.url.searchParams.get('descendantId'); + if (!id) return; + const response = umbMediaTypeMockDb.tree.getAncestorsOf({ descendantId: id }); + return res(ctx.status(200), ctx.json(response)); + }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json index d358487927..2cd9c3caee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json @@ -72,6 +72,10 @@ "name": "icon-attachment", "file": "paperclip.svg" }, + { + "name": "icon-audio-lines", + "file": "audio-lines.svg" + }, { "name": "icon-autofill", "file": "text-cursor-input.svg" @@ -1374,6 +1378,10 @@ "name": "icon-ordered-list", "file": "list-ordered.svg" }, + { + "name": "icon-origami", + "file": "origami.svg" + }, { "name": "icon-out", "file": "external-link.svg" @@ -2712,4 +2720,4 @@ "file": "icon-umbraco.svg" } ] -} +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons.ts index 8855310df5..f02b1643b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons.ts @@ -71,6 +71,10 @@ name: "icon-attachment", path: () => import("./icons/icon-attachment.js"), },{ +name: "icon-audio-lines", + +path: () => import("./icons/icon-audio-lines.js"), +},{ name: "icon-autofill", path: () => import("./icons/icon-autofill.js"), @@ -1299,6 +1303,10 @@ name: "icon-ordered-list", path: () => import("./icons/icon-ordered-list.js"), },{ +name: "icon-origami", + +path: () => import("./icons/icon-origami.js"), +},{ name: "icon-out", path: () => import("./icons/icon-out.js"), diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-audio-lines.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-audio-lines.ts new file mode 100644 index 0000000000..d2aa21c154 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-audio-lines.ts @@ -0,0 +1,19 @@ +export default ` + + + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-origami.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-origami.ts new file mode 100644 index 0000000000..bf9f34a255 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-origami.ts @@ -0,0 +1,16 @@ +export default ` + + + + + +`; \ No newline at end of file From 3d3b5d53d686d387682f8dc503e3d5d14c65a566 Mon Sep 17 00:00:00 2001 From: Allen Smith Date: Thu, 21 Nov 2024 10:30:59 -0500 Subject: [PATCH 3/3] Update terminology in ListView acceptance tests. (#17265) Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> --- .../tests/DefaultConfig/DataType/ListView.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/ListView.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/ListView.spec.ts index ef96da64f5..e624d462a5 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/ListView.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/ListView.spec.ts @@ -222,7 +222,7 @@ for (const listViewType of listViewTypes) { expect(dataTypeData.values).toContainEqual(expectedDataTypeValues); }); - test('can update content app icon', async ({umbracoApi, umbracoUi}) => { + test('can update workspace view icon', async ({umbracoApi, umbracoUi}) => { // Arrange const iconValue = 'icon-activity'; const expectedDataTypeValues = { @@ -241,9 +241,9 @@ for (const listViewType of listViewTypes) { expect(dataTypeData.values).toContainEqual(expectedDataTypeValues); }); - test('can update content app name', async ({umbracoApi, umbracoUi}) => { + test('can update workspace view name', async ({umbracoApi, umbracoUi}) => { // Arrange - const contentAppName = 'Test Content App Name'; + const contentAppName = 'Test Workspace View Name'; const expectedDataTypeValues = { "alias": "tabName", "value": contentAppName @@ -259,7 +259,7 @@ for (const listViewType of listViewTypes) { expect(dataTypeData.values).toContainEqual(expectedDataTypeValues); }); - test('can enable show content app first', async ({umbracoApi, umbracoUi}) => { + test('can enable show Content Workspace View first', async ({umbracoApi, umbracoUi}) => { // Arrange const expectedDataTypeValues = { "alias": "showContentFirst",