From 58a965f73301df439a325295de6d2c05f0b12de1 Mon Sep 17 00:00:00 2001 From: Nhu Dinh Date: Wed, 7 May 2025 12:36:56 +0700 Subject: [PATCH 1/4] Added tests for publishing with descendants --- .../Content/PublishWithDescendants.spec.ts | 203 ++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts new file mode 100644 index 000000000000..12020b776be6 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts @@ -0,0 +1,203 @@ +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +let documentTypeId = ''; +let childDocumentTypeId = ''; +let contentId = ''; +let dataTypeId = ''; +const contentName = 'TestContent'; +const childContentName = 'ChildContent'; +const documentTypeName = 'DocumentTypeForContent'; +const childDocumentTypeName = 'ChildDocumentType'; +const dataTypeName = 'Textstring'; +const contentText = 'This is test content text'; +const defaultLanguage = 'English (United States)'; +const danishLanguage = 'Danish'; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + dataTypeId = dataTypeData.id; + await umbracoApi.language.ensureIsoCodeNotExists('da'); + await umbracoApi.language.createDanishLanguage(); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.language.ensureIsoCodeNotExists('da'); + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can publish invariant content with descendants', async ({umbracoApi, umbracoUi}) => { + // Arrange + childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); + documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndDataType(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); + contentId = await umbracoApi.document.createDocumentWithTextContent(contentName, documentTypeId, contentText, dataTypeName); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, contentId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickViewMoreOptionsButton(); + await umbracoUi.content.clickPublishWithDescendantsButton(); + // verify variant language + await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(1); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); + await umbracoUi.content.clickPublishWithDescendantsModalButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.publishWithDescendants); + await umbracoUi.content.isErrorNotificationVisible(false); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe('Published'); + expect(contentData.values[0].value).toBe(contentText); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe('Draft'); +}); + +test('can publish invariant content with descendants and include unpublished content items.', async ({umbracoApi, umbracoUi}) => { + // Arrange + childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); + documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndDataType(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); + contentId = await umbracoApi.document.createDocumentWithTextContent(contentName, documentTypeId, contentText, dataTypeName); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, contentId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickViewMoreOptionsButton(); + await umbracoUi.content.clickPublishWithDescendantsButton(); + // verify variant language + await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(1); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); + await umbracoUi.content.clickIncludeUnpublishedDescendantsToggle(); + await umbracoUi.content.clickPublishWithDescendantsModalButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.publishWithDescendants); + await umbracoUi.content.isErrorNotificationVisible(false); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe('Published'); + expect(contentData.values[0].value).toBe(contentText); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe('Published'); +}); + +test('can cancel to publish invariant content with descendants', async ({umbracoApi, umbracoUi}) => { + // Arrange + childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); + documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndDataType(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); + contentId = await umbracoApi.document.createDocumentWithTextContent(contentName, documentTypeId, contentText, dataTypeName); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, contentId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickViewMoreOptionsButton(); + await umbracoUi.content.clickPublishWithDescendantsButton(); + // verify variant language + await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(1); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); + await umbracoUi.content.clickCloseButton(); + + // Assert + await umbracoUi.content.isErrorNotificationVisible(false); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe('Draft'); + expect(contentData.values[0].value).toBe(contentText); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe('Draft'); +}); + +test('can publish variant content with descendants', async ({umbracoApi, umbracoUi}) => { + // Arrange + childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); + documentTypeId = await umbracoApi.documentType.createVariantDocumentTypeWithAllowedChildNodeAndInvariantPropertyEditor(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); + contentId = await umbracoApi.document.createDocumentWithEnglishCultureAndTextContent(contentName, documentTypeId, contentText, dataTypeName); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, contentId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickViewMoreOptionsButton(); + await umbracoUi.content.clickPublishWithDescendantsButton(); + // verify variant language + await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(2); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(danishLanguage); + await umbracoUi.content.clickPublishWithDescendantsModalButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.publishWithDescendants); + await umbracoUi.content.isErrorNotificationVisible(false); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe('Published'); + expect(contentData.values[0].value).toBe(contentText); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe('Draft'); +}); + +test('can publish variant content with descendants and include unpublished content items.', async ({umbracoApi, umbracoUi}) => { + // Arrange + childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); + documentTypeId = await umbracoApi.documentType.createVariantDocumentTypeWithAllowedChildNodeAndInvariantPropertyEditor(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); + contentId = await umbracoApi.document.createDocumentWithEnglishCultureAndTextContent(contentName, documentTypeId, contentText, dataTypeName); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, contentId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickViewMoreOptionsButton(); + await umbracoUi.content.clickPublishWithDescendantsButton(); + // verify variant language + await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(2); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(danishLanguage); + await umbracoUi.content.clickIncludeUnpublishedDescendantsToggle(); + await umbracoUi.content.clickPublishWithDescendantsModalButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.publishWithDescendants); + await umbracoUi.content.isErrorNotificationVisible(false); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe('Published'); + expect(contentData.values[0].value).toBe(contentText); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe('Published'); +}); + +test('can cancel to publish variant content with descendants', async ({umbracoApi, umbracoUi}) => { + // Arrange + childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); + documentTypeId = await umbracoApi.documentType.createVariantDocumentTypeWithAllowedChildNodeAndInvariantPropertyEditor(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); + contentId = await umbracoApi.document.createDocumentWithEnglishCultureAndTextContent(contentName, documentTypeId, contentText, dataTypeName); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, contentId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickViewMoreOptionsButton(); + await umbracoUi.content.clickPublishWithDescendantsButton(); + // verify variant language + await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(2); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); + await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(danishLanguage); + await umbracoUi.content.clickCloseButton(); + + // Assert + await umbracoUi.content.isErrorNotificationVisible(false); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe('Draft'); + expect(contentData.values[0].value).toBe(contentText); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe('Draft'); +}); \ No newline at end of file From ceea9e47c40e0f970457627b95c0bc8c80af2700 Mon Sep 17 00:00:00 2001 From: Nhu Dinh Date: Wed, 7 May 2025 15:34:57 +0700 Subject: [PATCH 2/4] Bumped version --- tests/Umbraco.Tests.AcceptanceTest/package-lock.json | 8 ++++---- tests/Umbraco.Tests.AcceptanceTest/package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 05e729b5ca41..2515279b4e72 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -8,7 +8,7 @@ "hasInstallScript": true, "dependencies": { "@umbraco/json-models-builders": "^2.0.33", - "@umbraco/playwright-testhelpers": "^16.0.9", + "@umbraco/playwright-testhelpers": "^16.0.10", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -66,9 +66,9 @@ } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-16.0.9.tgz", - "integrity": "sha512-nfoRZNYrD2PP6k/GljiINCEA8VM6uvOAlqmkhYOdiTzrgLmVRqZExsNskm1BhlcxDhE6+XZlpjTcFIotFBKLFQ==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-16.0.10.tgz", + "integrity": "sha512-VvG67ZBFRWOSVnCejOIfYzLCPt/LFLDUnmbVzhvoiMiYjrBbWErULDgzDQyldY0b8ew2i9dG5FIUcHh4VEWdXQ==", "dependencies": { "@umbraco/json-models-builders": "2.0.33", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 585fe0258840..eb1629e53d15 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -9,7 +9,7 @@ "testSqlite": "npx playwright test DefaultConfig --grep-invert \"Users\"", "all": "npx playwright test", "createTest": "node createTest.js", - "smokeTest": "npx playwright test DefaultConfig --grep \"@smoke\"", + "smokeTest": "npx playwright test DefaultConfig/Content/PublishWithDescendants", "smokeTestSqlite": "npx playwright test DefaultConfig --grep \"@smoke\" --grep-invert \"Users\"" }, "devDependencies": { @@ -21,7 +21,7 @@ }, "dependencies": { "@umbraco/json-models-builders": "^2.0.33", - "@umbraco/playwright-testhelpers": "^16.0.9", + "@umbraco/playwright-testhelpers": "^16.0.10", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" From 81544d96a66eb4d206007a371be3357248e119fc Mon Sep 17 00:00:00 2001 From: Nhu Dinh Date: Fri, 9 May 2025 12:05:14 +0700 Subject: [PATCH 3/4] Fixed comments --- .../Content/PublishWithDescendants.spec.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts index 12020b776be6..da73d10269f3 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/PublishWithDescendants.spec.ts @@ -31,7 +31,7 @@ test.afterEach(async ({umbracoApi}) => { await umbracoApi.documentType.ensureNameNotExists(documentTypeName); }); -test('can publish invariant content with descendants', async ({umbracoApi, umbracoUi}) => { +test('can publish invariant content with descendants without unpublished content items', async ({umbracoApi, umbracoUi}) => { // Arrange childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndDataType(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); @@ -44,7 +44,7 @@ test('can publish invariant content with descendants', async ({umbracoApi, umbra await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.clickViewMoreOptionsButton(); await umbracoUi.content.clickPublishWithDescendantsButton(); - // verify variant language + // Verify variant language await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(1); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); await umbracoUi.content.clickPublishWithDescendantsModalButton(); @@ -59,7 +59,7 @@ test('can publish invariant content with descendants', async ({umbracoApi, umbra expect(childContentData.variants[0].state).toBe('Draft'); }); -test('can publish invariant content with descendants and include unpublished content items.', async ({umbracoApi, umbracoUi}) => { +test('can publish invariant content with descendants and include unpublished content items', async ({umbracoApi, umbracoUi}) => { // Arrange childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndDataType(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); @@ -72,7 +72,7 @@ test('can publish invariant content with descendants and include unpublished con await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.clickViewMoreOptionsButton(); await umbracoUi.content.clickPublishWithDescendantsButton(); - // verify variant language + // Verify variant language await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(1); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); await umbracoUi.content.clickIncludeUnpublishedDescendantsToggle(); @@ -101,7 +101,7 @@ test('can cancel to publish invariant content with descendants', async ({umbraco await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.clickViewMoreOptionsButton(); await umbracoUi.content.clickPublishWithDescendantsButton(); - // verify variant language + // Verify variant language await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(1); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); await umbracoUi.content.clickCloseButton(); @@ -115,7 +115,7 @@ test('can cancel to publish invariant content with descendants', async ({umbraco expect(childContentData.variants[0].state).toBe('Draft'); }); -test('can publish variant content with descendants', async ({umbracoApi, umbracoUi}) => { +test('can publish variant content with descendants without unpublished content items', async ({umbracoApi, umbracoUi}) => { // Arrange childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); documentTypeId = await umbracoApi.documentType.createVariantDocumentTypeWithAllowedChildNodeAndInvariantPropertyEditor(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); @@ -128,7 +128,7 @@ test('can publish variant content with descendants', async ({umbracoApi, umbraco await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.clickViewMoreOptionsButton(); await umbracoUi.content.clickPublishWithDescendantsButton(); - // verify variant language + // Verify variant language await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(2); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(danishLanguage); @@ -144,7 +144,7 @@ test('can publish variant content with descendants', async ({umbracoApi, umbraco expect(childContentData.variants[0].state).toBe('Draft'); }); -test('can publish variant content with descendants and include unpublished content items.', async ({umbracoApi, umbracoUi}) => { +test('can publish variant content with descendants and include unpublished content items', async ({umbracoApi, umbracoUi}) => { // Arrange childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId); documentTypeId = await umbracoApi.documentType.createVariantDocumentTypeWithAllowedChildNodeAndInvariantPropertyEditor(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); @@ -157,7 +157,7 @@ test('can publish variant content with descendants and include unpublished conte await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.clickViewMoreOptionsButton(); await umbracoUi.content.clickPublishWithDescendantsButton(); - // verify variant language + // Verify variant language await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(2); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(danishLanguage); @@ -187,7 +187,7 @@ test('can cancel to publish variant content with descendants', async ({umbracoAp await umbracoUi.content.goToContentWithName(contentName); await umbracoUi.content.clickViewMoreOptionsButton(); await umbracoUi.content.clickPublishWithDescendantsButton(); - // verify variant language + // Verify variant language await umbracoUi.content.doesDocumentVariantLanguageItemHaveCount(2); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(defaultLanguage); await umbracoUi.content.doesDocumentVariantLanguageItemHaveName(danishLanguage); From 58e2f4d66d25de1bc21852edf20d5e601f2f6394 Mon Sep 17 00:00:00 2001 From: Nhu Dinh Date: Fri, 9 May 2025 13:56:46 +0700 Subject: [PATCH 4/4] Reverted npm command --- tests/Umbraco.Tests.AcceptanceTest/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index bc529d2cf99c..460c45b9b7cb 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -9,7 +9,7 @@ "testSqlite": "npx playwright test DefaultConfig --grep-invert \"Users\"", "all": "npx playwright test", "createTest": "node createTest.js", - "smokeTest": "npx playwright test DefaultConfig/Content/PublishWithDescendants", + "smokeTest": "npx playwright test DefaultConfig --grep \"@smoke\"", "smokeTestSqlite": "npx playwright test DefaultConfig --grep \"@smoke\" --grep-invert \"Users\"" }, "devDependencies": {