V16 QA Implement new release tag for E2E tests (#19697)

* Removed this as these tests are covered in other files

* Added release tags

* Make all tests with @smoke and @release tags run in the pipeline

* Updated npx command

* Updated npx command

* Updated npx command

* Fixed failed tests related to document type folder

* Cleaned up

* Used grep in yaml file instead of package.json file

* Updated yml file

* Updated testCommand

* Fixed command

* Added releaseTest command

* Added another job to run regression test in the release build

* Fixed comments

* Updated name of test job

* Make all release tests run in the pipeline

* Updated warning message

* Reverted npm command
This commit is contained in:
Nhu Dinh
2025-08-06 15:22:55 +07:00
committed by GitHub
parent 9414201c2e
commit 89a8bd3721
75 changed files with 325 additions and 146 deletions

View File

@@ -513,9 +513,9 @@ stages:
UMBRACO__CMS__WEBROUTING__UMBRACOAPPLICATIONURL: https://localhost:44331/
ASPNETCORE_URLS: https://localhost:44331
jobs:
# E2E Tests
# E2E Smoke Tests
- job:
displayName: E2E Tests (SQLite)
displayName: E2E Smoke Tests (SQLite)
# currently disabled due to DB locks randomly occuring.
condition: eq(${{parameters.sqliteAcceptanceTests}}, True)
variables:
@@ -678,7 +678,7 @@ stages:
testRunTitle: "$(Agent.JobName)"
- job:
displayName: E2E Tests (SQL Server)
displayName: E2E Smoke Tests (SQL Server)
variables:
# Connection string
CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True
@@ -862,6 +862,176 @@ stages:
searchFolder: "tests/Umbraco.Tests.AcceptanceTest/results"
testRunTitle: "$(Agent.JobName)"
- job:
displayName: E2E Release Tests (SQL Server)
variables:
# Connection string
CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True
CONNECTIONSTRINGS__UMBRACODBDSN_PROVIDERNAME: Microsoft.Data.SqlClient
condition: eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True')
strategy:
matrix:
WindowsPart1Of3:
vmImage: "windows-latest"
testCommand: "npm run releaseTest -- --shard=1/3"
WindowsPart2Of3:
vmImage: "windows-latest"
testCommand: "npm run releaseTest -- --shard=2/3"
WindowsPart3Of3:
vmImage: "windows-latest"
testCommand: "npm run releaseTest -- --shard=3/3"
pool:
vmImage: $(vmImage)
steps:
# Setup test environment
- task: DownloadPipelineArtifact@2
displayName: Download NuGet artifacts
inputs:
artifact: nupkg
path: $(Agent.BuildDirectory)/app/nupkg
- task: NodeTool@0
displayName: Use Node.js $(nodeVersion)
inputs:
versionSpec: $(nodeVersion)
- task: UseDotNet@2
displayName: Use .NET SDK from global.json
inputs:
useGlobalJson: true
- pwsh: |
"UMBRACO_USER_LOGIN=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL)
UMBRACO_USER_PASSWORD=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
URL=$(ASPNETCORE_URLS)
STORAGE_STAGE_PATH=$(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/playwright/.auth/user.json
CONSOLE_ERRORS_PATH=$(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/console-errors.json" | Out-File .env
displayName: Generate .env
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
# Cache and restore NPM packages
- task: Cache@2
displayName: Cache NPM packages
inputs:
key: 'npm_e2e | "$(Agent.OS)" | $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/package-lock.json'
restoreKeys: |
npm_e2e | "$(Agent.OS)"
npm_e2e
path: $(npm_config_cache)
- script: npm ci --no-fund --no-audit --prefer-offline
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
displayName: Restore NPM packages
# Build application
- pwsh: |
$cmsVersion = "$(Build.BuildNumber)" -replace "\+",".g"
dotnet new nugetconfig
dotnet nuget add source ./nupkg --name Local
dotnet new install Umbraco.Templates::$cmsVersion
dotnet new umbraco --name UmbracoProject --version $cmsVersion --exclude-gitignore --no-restore --no-update-check
dotnet restore UmbracoProject
cp $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/*.cs UmbracoProject
dotnet build UmbracoProject --configuration $(buildConfiguration) --no-restore
dotnet dev-certs https
displayName: Build application
workingDirectory: $(Agent.BuildDirectory)/app
# Start SQL Server
- powershell: docker run --name mssql -d -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=$(SA_PASSWORD)" mcr.microsoft.com/mssql/server:2022-latest
displayName: Start SQL Server Docker image (Linux)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
- pwsh: SqlLocalDB start MSSQLLocalDB
displayName: Start SQL Server LocalDB (Windows)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
# Run application
- bash: |
nohup dotnet run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile > $(Build.ArtifactStagingDirectory)/playwright.log 2>&1 &
echo "##vso[task.setvariable variable=AcceptanceTestProcessId]$!"
displayName: Run application (Linux)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
workingDirectory: $(Agent.BuildDirectory)/app
- pwsh: |
$process = Start-Process dotnet "run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile 2>&1" -PassThru -NoNewWindow -RedirectStandardOutput $(Build.ArtifactStagingDirectory)/playwright.log
Write-Host "##vso[task.setvariable variable=AcceptanceTestProcessId]$($process.Id)"
displayName: Run application (Windows)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
workingDirectory: $(Agent.BuildDirectory)/app
# Wait for application to start responding to requests
- pwsh: npx wait-on -v --interval 1000 --timeout 120000 $(ASPNETCORE_URLS)
displayName: Wait for application
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
# Install Playwright and dependencies
- pwsh: npx playwright install chromium
displayName: Install Playwright only with Chromium browser
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
# Test
- pwsh: $(testCommand)
displayName: Run Playwright tests
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
env:
CI: true
CommitId: $(Build.SourceVersion)
AgentOs: $(Agent.OS)
# Stop application
- bash: kill -15 $(AcceptanceTestProcessId)
displayName: Stop application (Linux)
condition: and(ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Linux'))
- pwsh: Stop-Process -Id $(AcceptanceTestProcessId)
displayName: Stop application (Windows)
condition: and(ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Windows_NT'))
# Stop SQL Server
- pwsh: docker stop mssql
displayName: Stop SQL Server Docker image (Linux)
condition: eq(variables['Agent.OS'], 'Linux')
- pwsh: SqlLocalDB stop MSSQLLocalDB
displayName: Stop SQL Server LocalDB (Windows)
condition: eq(variables['Agent.OS'], 'Windows_NT')
# Copy artifacts
- pwsh: |
if (Test-Path tests/Umbraco.Tests.AcceptanceTest/results/*) {
Copy-Item tests/Umbraco.Tests.AcceptanceTest/results/* $(Build.ArtifactStagingDirectory) -Recurse
}
displayName: Copy Playwright results
condition: succeededOrFailed()
# Copy console error log
- pwsh: |
if (Test-Path tests/Umbraco.Tests.AcceptanceTest/console-errors.json) {
Copy-Item tests/Umbraco.Tests.AcceptanceTest/console-errors.json $(Build.ArtifactStagingDirectory)
}
displayName: Copy console error log
condition: succeededOrFailed()
# Publish test artifacts
- task: PublishPipelineArtifact@1
displayName: Publish test artifacts
condition: succeededOrFailed()
inputs:
targetPath: $(Build.ArtifactStagingDirectory)
artifact: "Acceptance Test Results - $(Agent.JobName) - Attempt #$(System.JobAttempt)"
# Publish test results
- task: PublishTestResults@2
displayName: "Publish test results"
condition: succeededOrFailed()
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: '*.xml'
searchFolder: "tests/Umbraco.Tests.AcceptanceTest/results"
testRunTitle: "$(Agent.JobName)"
###############################################
## Release
###############################################

View File

@@ -10,7 +10,8 @@
"all": "npx playwright test",
"createTest": "node createTest.js",
"smokeTest": "npx playwright test DefaultConfig --grep \"@smoke\"",
"smokeTestSqlite": "npx playwright test DefaultConfig --grep \"@smoke\" --grep-invert \"Users\""
"smokeTestSqlite": "npx playwright test DefaultConfig --grep \"@smoke\" --grep-invert \"Users\"",
"releaseTest": "npx playwright test DefaultConfig --grep \"@release\""
},
"devDependencies": {
"@playwright/test": "^1.50",

View File

@@ -58,7 +58,7 @@ test('can publish content with the approved color data type', async ({umbracoApi
expect(contentData.values).toEqual([]);
});
test('can create content with the custom approved color data type', async ({umbracoApi, umbracoUi}) => {
test('can create content with the custom approved color data type', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const customDataTypeName = 'CustomApprovedColor';
const colorValue = 'd73737';

View File

@@ -80,7 +80,7 @@ test('can create content with the custom checkbox list data type', async ({umbra
expect(contentData.values[0].value).toEqual([optionValues[0]]);
});
test('can not publish a mandatory checkbox list with an empty value', async ({umbracoApi, umbracoUi}) => {
test('can not publish a mandatory checkbox list with an empty value', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const optionValues = ['testOption1', 'testOption2'];
const customDataTypeId = await umbracoApi.dataType.createCheckboxListDataType(customDataTypeName, optionValues);

View File

@@ -265,7 +265,7 @@ test('can create content with the custom data type with slider property editor',
expect(contentData.values).toEqual([]);
});
test('can change slider value in the content section', async ({umbracoApi, umbracoUi}) => {
test('can change slider value in the content section', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
customDataTypeName = 'Slider';
const sliderValue = 10;

View File

@@ -83,7 +83,7 @@ for (const dataTypeName of dataTypeNames) {
});
}
test('can not publish a mandatory dropdown with an empty value', async ({umbracoApi, umbracoUi}) => {
test('can not publish a mandatory dropdown with an empty value', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const optionValues = ['testOption1', 'testOption2', 'testOption3'];
const customDataTypeId = await umbracoApi.dataType.createDropdownDataType(customDataTypeName, false, optionValues);

View File

@@ -18,7 +18,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.documentType.ensureNameNotExists(documentTypeName);
});
test('can save content with a image media picker', async ({umbracoApi, umbracoUi}) => {
test('can create content with a image media picker', async ({umbracoApi, umbracoUi}) => {
// Arrange
const expectedState = 'Draft';
const dataType = await umbracoApi.dataType.getByName(dataTypeName);
@@ -60,7 +60,7 @@ test('can publish content with a image media picker', async ({umbracoApi, umbrac
expect(contentData.variants[0].state).toBe(expectedState);
});
test('can add an image to the image media picker', async ({umbracoApi, umbracoUi}) => {
test('can add an image to the image media picker', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataType = await umbracoApi.dataType.getByName(dataTypeName);
await umbracoApi.media.ensureNameNotExists(mediaName);

View File

@@ -170,7 +170,7 @@ test('can create content with the media link', async ({umbracoApi, umbracoUi}) =
await umbracoApi.media.ensureNameNotExists(mediaFileName);
});
test('can add multiple links in the content', async ({umbracoApi, umbracoUi}) => {
test('can add multiple links in the content', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);
@@ -190,6 +190,7 @@ test('can add multiple links in the content', async ({umbracoApi, umbracoUi}) =>
await umbracoUi.content.selectMediaWithName(mediaFileName);
await umbracoUi.content.clickChooseModalButton();
await umbracoUi.content.clickAddButton();
await umbracoUi.waitForTimeout(500); // Wait for the media link to be added
// Add external link
await umbracoUi.content.clickAddMultiURLPickerButton();
await umbracoUi.content.clickManualLinkButton();
@@ -267,7 +268,7 @@ test('can edit the URL picker in the content', async ({umbracoApi, umbracoUi}) =
expect(contentData.values[0].value[0].url).toEqual(link);
});
test('cannot submit an empty link', async ({umbracoApi, umbracoUi}) => {
test('cannot submit an empty link', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);
@@ -288,7 +289,7 @@ test('cannot submit an empty link', async ({umbracoApi, umbracoUi}) => {
await umbracoUi.content.isTextWithMessageVisible(ConstantHelper.validationMessages.emptyLinkPicker);
});
test('cannot update the URL picker with an empty link', async ({umbracoApi, umbracoUi}) => {
test('cannot update the URL picker with an empty link', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);

View File

@@ -69,7 +69,7 @@ test('can publish content with multiple image media picker data type', async ({u
expect(contentData.values).toEqual([]);
});
test('can add multiple images to the multiple image media picker', async ({umbracoApi, umbracoUi}) => {
test('can add multiple images to the multiple image media picker', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);

View File

@@ -97,7 +97,7 @@ test('can add multiple media files to the multiple media picker', async ({umbrac
expect(contentData.values[0].value[1].mediaTypeAlias).toEqual(secondMediaTypeName);
});
test('can remove a media picker in the content', async ({umbracoApi, umbracoUi}) => {
test('can remove a media picker in the content', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);

View File

@@ -17,7 +17,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.documentType.ensureNameNotExists(documentTypeName);
});
test('can create content with the numeric data type', async ({umbracoApi, umbracoUi}) => {
test('can create content with the numeric data type', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const expectedState = 'Draft';
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);

View File

@@ -84,7 +84,7 @@ test('can create content with the custom radiobox data type', async ({umbracoApi
expect(contentData.values[0].value).toEqual(optionValues[0]);
});
test('can not publish mandatory radiobox with an empty value', async ({umbracoApi, umbracoUi}) => {
test('can not publish mandatory radiobox with an empty value', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const customDataTypeId = await umbracoApi.dataType.createRadioboxDataType(customDataTypeName, optionValues);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId, 'Test Group', false, false, true);

View File

@@ -41,7 +41,7 @@ test('can create content with one tag', async ({umbracoApi, umbracoUi}) => {
expect(contentData.values[0].value).toEqual([tagsName[0]]);
});
test('can publish content with multiple tags', async ({umbracoApi, umbracoUi}) => {
test('can publish content with multiple tags', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const expectedState = 'Published';
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);

View File

@@ -80,7 +80,7 @@ test('can input text into the textarea', async ({umbracoApi, umbracoUi}) => {
expect(contentData.values[0].value).toEqual(text);
});
test('cannot input the text that exceeds the allowed amount of characters', async ({umbracoApi, umbracoUi}) => {
test('cannot input the text that exceeds the allowed amount of characters', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const maxChars = 100;
const textExceedMaxChars = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam mattis porttitor orci id cursus. Nulla';

View File

@@ -61,7 +61,7 @@ test('can publish content with the true/false data type', async ({umbracoApi, um
expect(contentData.values).toEqual([]);
});
test('can toggle the true/false value in the content ', async ({umbracoApi, umbracoUi}) => {
test('can toggle the true/false value in the content', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);

View File

@@ -66,7 +66,7 @@ const uploadFiles = [
{fileExtension: 'doc', fileName: 'ArticleDOC.doc'}
];
for (const uploadFile of uploadFiles) {
test(`can upload an article with the ${uploadFile.fileExtension} extension in the content`, async ({umbracoApi, umbracoUi}) => {
test(`can upload an article with the ${uploadFile.fileExtension} extension in the content`, {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);

View File

@@ -67,7 +67,7 @@ const uploadFiles = [
{fileExtension: 'opus', fileName: 'AudioOPUS.opus'}
];
for (const uploadFile of uploadFiles) {
test(`can upload an audio with the ${uploadFile.fileExtension} extension in the content`, async ({umbracoApi, umbracoUi}) => {
test(`can upload an audio with the ${uploadFile.fileExtension} extension in the content`, {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);

View File

@@ -65,7 +65,7 @@ const uploadFiles = [
{fileExtension: 'png', fileName: 'Umbraco.png'}
];
for (const uploadFile of uploadFiles) {
test(`can upload a file with the ${uploadFile.fileExtension} extension in the content`, async ({umbracoApi, umbracoUi}) => {
test(`can upload a file with the ${uploadFile.fileExtension} extension in the content`, {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);

View File

@@ -60,7 +60,7 @@ test('can publish content with the upload vector graphics data type', async ({um
expect(contentData.values).toEqual([]);
});
test(`can upload a file with the svg extension in the content`, async ({umbracoApi, umbracoUi}) => {
test(`can upload a file with the svg extension in the content`, {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const vectorGraphicsName = 'VectorGraphics.svg';
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);

View File

@@ -66,7 +66,7 @@ const uploadVideos = [
{fileExtension: 'ogv', fileName: 'Ogv.ogv'}
];
for (const uploadVideo of uploadVideos) {
test(`can upload a video with the ${uploadVideo.fileExtension} extension in the content`, async ({umbracoApi, umbracoUi}) => {
test(`can upload a video with the ${uploadVideo.fileExtension} extension in the content`, {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id);

View File

@@ -105,7 +105,7 @@ test('can delete culture and hostname', async ({umbracoApi, umbracoUi}) => {
expect(domainsData.domains.length).toBe(0);
});
test('can add culture and hostname for multiple languages', async ({umbracoApi, umbracoUi}) => {
test('can add culture and hostname for multiple languages', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const secondDomainName = 'testdomain2';
const secondLanguageName = 'Vietnamese';

View File

@@ -31,7 +31,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.documentType.ensureNameNotExists(documentTypeName);
});
test('can publish invariant content with descendants without unpublished content items', async ({umbracoApi, umbracoUi}) => {
test('can publish invariant content with descendants without unpublished content items', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId);
documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndDataType(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId);
@@ -144,7 +144,7 @@ test('can publish variant content with descendants without unpublished content i
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', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
childDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(childDocumentTypeName, dataTypeName, dataTypeId);
documentTypeId = await umbracoApi.documentType.createVariantDocumentTypeWithAllowedChildNodeAndInvariantPropertyEditor(documentTypeName, childDocumentTypeId, dataTypeName, dataTypeId);

View File

@@ -80,7 +80,7 @@ test('can update overlay size in a block', async ({umbracoApi, umbracoUi}) => {
expect(await umbracoApi.dataType.doesBlockEditorBlockContainOverlaySize(blockGridEditorName, contentElementTypeId, overlaySize)).toBeTruthy();
});
test('can enable inline editing mode in a block', async ({umbracoApi, umbracoUi}) => {
test('can enable inline editing mode in a block', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const textStringData = await umbracoApi.dataType.getByName(dataTypeName);
const contentElementTypeId = await umbracoApi.documentType.createDefaultElementType(elementTypeName, groupName, dataTypeName, textStringData.id);
@@ -119,7 +119,7 @@ test('can disable inline editing mode in a block', async ({umbracoApi, umbracoUi
expect(await umbracoApi.dataType.doesBlockEditorBlockContainInlineEditing(blockGridEditorName, contentElementTypeId, false)).toBeTruthy();
});
test('can enable hide content editor in a block', async ({umbracoApi, umbracoUi}) => {
test('can enable hide content editor in a block', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const textStringData = await umbracoApi.dataType.getByName(dataTypeName);
const contentElementTypeId = await umbracoApi.documentType.createDefaultElementType(elementTypeName, groupName, dataTypeName, textStringData.id);

View File

@@ -93,7 +93,7 @@ test('can add a block to a block grid editor', {tag: '@smoke'}, async ({umbracoA
await umbracoApi.documentType.ensureNameNotExists(elementTypeName);
});
test('can add multiple blocks to a block grid editor', async ({umbracoApi, umbracoUi}) => {
test('can add multiple blocks to a block grid editor', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const textStringData = await umbracoApi.dataType.getByName(dataTypeName);
const secondElementName = 'SecondBlockGridElement';
@@ -138,7 +138,7 @@ test('can remove a block from a block grid editor', {tag: '@smoke'}, async ({umb
await umbracoApi.documentType.ensureNameNotExists(elementTypeName);
});
test('can add a block to a group in a block grid editor', async ({umbracoApi, umbracoUi}) => {
test('can add a block to a group in a block grid editor', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const textStringData = await umbracoApi.dataType.getByName(dataTypeName);
const elementTypeId = await umbracoApi.documentType.createDefaultElementType(elementTypeName, groupName, dataTypeName, textStringData.id);
@@ -242,7 +242,7 @@ test.skip('can delete a group in a block grid editor', async ({umbracoApi, umbra
await umbracoUi.dataType.goToDataType(blockGridEditorName);
});
test('can add a min and max amount to a block grid editor', async ({umbracoApi, umbracoUi}) => {
test('can add a min and max amount to a block grid editor', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const minAmount = 1;
const maxAmount = 2;
@@ -282,7 +282,7 @@ test('max can not be less than min in a block grid editor', async ({umbracoApi,
expect(dataTypeData.values[0].value.max).toBe(oldMaxAmount);
});
test('can enable live editing mode in a block grid editor', async ({umbracoApi, umbracoUi}) => {
test('can enable live editing mode in a block grid editor', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.dataType.createEmptyBlockGrid(blockGridEditorName);
@@ -310,7 +310,7 @@ test('can disable live editing mode in a block grid editor', async ({umbracoApi,
expect(await umbracoApi.dataType.isLiveEditingModeEnabledForBlockEditor(blockGridEditorName, false)).toBeTruthy();
});
test('can add editor width in a block grid editor', async ({umbracoApi, umbracoUi}) => {
test('can add editor width in a block grid editor', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const propertyEditorWidth = '100%';
await umbracoApi.dataType.createEmptyBlockGrid(blockGridEditorName);
@@ -341,7 +341,7 @@ test('can remove editor width in a block grid editor', async ({umbracoApi, umbra
expect(await umbracoApi.dataType.doesMaxPropertyContainWidthForBlockEditor(blockGridEditorName, '')).toBeTruthy();
});
test('can add a create button label in a block grid editor', async ({umbracoApi, umbracoUi}) => {
test('can add a create button label in a block grid editor', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const createButtonLabel = 'Create Block';
await umbracoApi.dataType.createEmptyBlockGrid(blockGridEditorName);

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'Checkbox list';

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'Content Picker';

View File

@@ -1,4 +1,4 @@
import {NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'TestDataType';

View File

@@ -1,4 +1,4 @@
import {NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'TestDataType';

View File

@@ -17,7 +17,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.dataType.ensureNameNotExists(dataTypeFolderName);
});
test('can create a data type folder', async ({umbracoApi, umbracoUi}) => {
test('can create a data type folder', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Act
await umbracoUi.dataType.clickActionsMenuAtRoot();
await umbracoUi.dataType.createDataTypeFolder(dataTypeFolderName);
@@ -126,7 +126,7 @@ test('can create a folder in a folder in a folder', async ({umbracoApi, umbracoU
expect(childrenFolderData[0].isFolder).toBeTruthy();
});
test('cannot delete a non-empty data type folder', async ({umbracoApi, umbracoUi}) => {
test('cannot delete a non-empty data type folder', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
let dataTypeFolderId = await umbracoApi.dataType.createFolder(dataTypeFolderName);
expect(await umbracoApi.dataType.doesNameExist(dataTypeFolderName)).toBeTruthy();
@@ -151,7 +151,7 @@ test('cannot delete a non-empty data type folder', async ({umbracoApi, umbracoUi
await umbracoApi.dataType.ensureNameNotExists(dataTypeName);
});
test('can move a data type to a data type folder', async ({umbracoApi, umbracoUi}) => {
test('can move a data type to a data type folder', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.dataType.ensureNameNotExists(dataTypeName);
const dataTypeId = await umbracoApi.dataType.create(dataTypeName, editorAlias, editorUiAlias,[]);
@@ -174,7 +174,7 @@ test('can move a data type to a data type folder', async ({umbracoApi, umbracoUi
await umbracoApi.dataType.ensureNameNotExists(dataTypeName);
});
test('can duplicate a data type to a data type folder', async ({umbracoApi, umbracoUi}) => {
test('can duplicate a data type to a data type folder', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.dataType.ensureNameNotExists(dataTypeName);
await umbracoApi.dataType.create(dataTypeName, editorAlias, editorUiAlias, []);

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const customDataTypeName = 'Custom Dropdown';

View File

@@ -1,4 +1,4 @@
import { ConstantHelper, NotificationConstantHelper, test } from "@umbraco/playwright-testhelpers";
import { ConstantHelper, test } from "@umbraco/playwright-testhelpers";
import { expect } from "@playwright/test";
const labelTypes = [

View File

@@ -1,4 +1,4 @@
import { ConstantHelper, NotificationConstantHelper, test } from "@umbraco/playwright-testhelpers";
import { ConstantHelper, test } from "@umbraco/playwright-testhelpers";
import { expect } from "@playwright/test";
const listViewTypes = [

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'Multi URL Picker';

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'Numeric';

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'Radiobox';

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'Tags';

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'Textarea';

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'Textstring';

View File

@@ -1,4 +1,4 @@
import {NotificationConstantHelper, test} from "@umbraco/playwright-testhelpers";
import {test} from "@umbraco/playwright-testhelpers";
import {expect} from "@playwright/test";
const tipTapName = 'TestTiptap';

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const dataTypeName = 'True/false';

View File

@@ -1,4 +1,4 @@
import { ConstantHelper, NotificationConstantHelper, test } from "@umbraco/playwright-testhelpers";
import { ConstantHelper, test } from "@umbraco/playwright-testhelpers";
import { expect } from "@playwright/test";
const uploadTypes = [

View File

@@ -1,5 +1,5 @@
import {expect} from '@playwright/test';
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
const dataTypeName = 'List View - Media';
let dataTypeDefaultData = null;
@@ -96,7 +96,7 @@ test('can disable one view in the media section', async ({umbracoApi, umbracoUi}
await umbracoUi.media.isMediaGridViewVisible(false);
});
test('can allow bulk trash in the media section', async ({umbracoApi, umbracoUi}) => {
test('can allow bulk trash in the media section', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Act
await umbracoUi.media.goToSection(ConstantHelper.sections.media);
await umbracoUi.media.selectMediaWithName(firstMediaFileName);

View File

@@ -14,7 +14,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.media.ensureNameNotExists(mediaFileName);
});
test('can not create a empty media file', async ({umbracoApi, umbracoUi}) => {
test('can not create a empty media file', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoUi.media.goToSection(ConstantHelper.sections.media);
@@ -58,7 +58,7 @@ const mediaFileTypes = [
];
for (const mediaFileType of mediaFileTypes) {
test(`can create a media file with the ${mediaFileType.fileName} type`, async ({umbracoApi, umbracoUi}) => {
test(`can create a media file with the ${mediaFileType.fileName} type`, {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.media.ensureNameNotExists(mediaFileType.fileName);
await umbracoUi.media.goToSection(ConstantHelper.sections.media);
@@ -230,7 +230,7 @@ test('can delete a media item from the recycle bin', async ({umbracoApi, umbraco
expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeFalsy();
});
test('can empty the recycle bin', async ({umbracoApi, umbracoUi}) => {
test('can empty the recycle bin', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.media.emptyRecycleBin();
await umbracoApi.media.createDefaultMediaFile(mediaFileName);
@@ -249,7 +249,7 @@ test('can empty the recycle bin', async ({umbracoApi, umbracoUi}) => {
expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeFalsy();
});
test('can trash a media node with a relation', async ({umbracoApi, umbracoUi}) => {
test('can trash a media node with a relation', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const documentPickerName = ['TestPicker', 'DocumentTypeForPicker'];
await umbracoApi.media.emptyRecycleBin();

View File

@@ -26,7 +26,7 @@ test('can create a member group', {tag: '@smoke'}, async ({umbracoApi, umbracoUi
expect(await umbracoApi.memberGroup.doesNameExist(memberGroupName)).toBeTruthy();
});
test('cannot create member group with empty name', async ({umbracoApi, umbracoUi}) => {
test('cannot create member group with empty name', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Act
await umbracoUi.memberGroup.clickMemberGroupCreateButton();
await umbracoUi.memberGroup.clickSaveButton();
@@ -36,7 +36,7 @@ test('cannot create member group with empty name', async ({umbracoApi, umbracoUi
expect(await umbracoApi.memberGroup.doesNameExist(memberGroupName)).toBeFalsy();
});
test('cannot create member group with duplicate name', async ({umbracoApi, umbracoUi}) => {
test('cannot create member group with duplicate name', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.memberGroup.create(memberGroupName);
expect(await umbracoApi.memberGroup.doesNameExist(memberGroupName)).toBeTruthy();

View File

@@ -223,7 +223,7 @@ test('can delete member', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => {
expect(await umbracoApi.member.doesNameExist(memberName)).toBeFalsy();
});
test('cannot create member with invalid email', async ({umbracoApi, umbracoUi}) => {
test('cannot create member with invalid email', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const invalidEmail = 'invalidemail';
await umbracoUi.member.goToMembers();

View File

@@ -5,7 +5,7 @@ test.beforeEach(async ({umbracoUi}) => {
await umbracoUi.welcomeDashboard.goToSection(ConstantHelper.sections.settings);
});
test('can click on buttons', async ({umbracoUi}) => {
test('can click on buttons', {tag: '@release'}, async ({umbracoUi}) => {
// Arrange
const getTheHelpYouNeedDocumentationUrl = 'https://docs.umbraco.com/umbraco-cms';
const goToTheForumUrl = 'https://forum.umbraco.com/';

View File

@@ -76,7 +76,7 @@ test('can delete a document blueprint', async ({umbracoApi, umbracoUi}) => {
await umbracoUi.documentBlueprint.isDocumentBlueprintRootTreeItemVisible(documentBlueprintName, false, false);
});
test('can create a document blueprint from the content menu', async ({umbracoApi, umbracoUi}) => {
test('can create a document blueprint from the content menu', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName);
await umbracoApi.document.createDefaultDocument(documentBlueprintName, documentTypeId);

View File

@@ -34,7 +34,7 @@ test('can create a document type using create options', async ({umbracoApi, umbr
await umbracoUi.documentType.doesCollectionTreeItemTableRowHaveIcon(documentTypeName, 'icon-document');
});
test('can create a document type with a template using create options', async ({umbracoApi, umbracoUi}) => {
test('can create a document type with a template using create options', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.template.ensureNameNotExists(documentTypeName);
await umbracoUi.documentType.clickDocumentTypesMenu();
@@ -61,7 +61,7 @@ test('can create a document type with a template using create options', async ({
await umbracoApi.template.ensureNameNotExists(documentTypeName);
});
test('can create a element type using create options', async ({umbracoApi, umbracoUi}) => {
test('can create a element type using create options', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoUi.documentType.clickDocumentTypesMenu();
@@ -82,7 +82,7 @@ test('can create a element type using create options', async ({umbracoApi, umbra
await umbracoUi.documentType.doesCollectionTreeItemTableRowHaveIcon(documentTypeName, 'icon-plugin');
});
test('can create a document type folder using create options', async ({umbracoApi, umbracoUi}) => {
test('can create a document type folder using create options', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoUi.documentType.clickDocumentTypesMenu();

View File

@@ -153,7 +153,7 @@ test('can create a document type with a property in a tab', {tag: '@smoke'}, asy
expect(await umbracoApi.documentType.doesTabContainCorrectPropertyEditorInGroup(documentTypeName, dataTypeName, documentTypeData.properties[0].dataType.id, tabName, groupName)).toBeTruthy();
});
test('can create a document type with multiple groups', async ({umbracoApi, umbracoUi}) => {
test('can create a document type with multiple groups', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const secondDataTypeName = 'Image Media Picker';
@@ -176,7 +176,7 @@ test('can create a document type with multiple groups', async ({umbracoApi, umbr
expect(await umbracoApi.documentType.doesGroupContainCorrectPropertyEditor(documentTypeName, secondDataTypeName, secondDataType.id, secondGroupName)).toBeTruthy();
});
test('can create a document type with multiple tabs', async ({umbracoApi, umbracoUi}) => {
test('can create a document type with multiple tabs', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const secondDataTypeName = 'Image Media Picker';
@@ -373,7 +373,7 @@ test('can set is mandatory for a property in a document type', {tag: '@smoke'},
expect(documentTypeData.properties[0].validation.mandatory).toBeTruthy();
});
test('can enable validation for a property in a document type', async ({umbracoApi, umbracoUi}) => {
test('can enable validation for a property in a document type', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const regex = '^[a-zA-Z0-9]*$';

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from '@playwright/test';
const documentFolderName = 'TestFolder';

View File

@@ -72,7 +72,7 @@ test('can remove an allowed child node from a document type', async ({umbracoApi
await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName);
});
test('can configure a collection for a document type', async ({umbracoApi, umbracoUi}) => {
test('can configure a collection for a document type', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const collectionDataTypeName = 'TestCollection';
await umbracoApi.dataType.ensureNameNotExists(collectionDataTypeName);

View File

@@ -122,7 +122,7 @@ test('can add fallback language', async ({umbracoApi, umbracoUi}) => {
expect(languageData.fallbackIsoCode).toBe(defaultLanguageIsoCode);
});
test('cannot add a language with duplicate ISO code', async ({umbracoApi, umbracoUi}) => {
test('cannot add a language with duplicate ISO code', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.language.create(languageName, false, false, isoCode);
expect(await umbracoApi.language.doesExist(isoCode)).toBeTruthy();

View File

@@ -1,5 +1,5 @@
import {expect} from "@playwright/test";
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
const mediaTypeName = 'TestMediaType';
const mediaTypeFolderName = 'TestMediaTypeFolder';
@@ -16,7 +16,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.mediaType.ensureNameNotExists(mediaTypeFolderName);
});
test('can create a media type using create options', async ({umbracoApi, umbracoUi}) => {
test('can create a media type using create options', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoUi.mediaType.clickMediaTypesMenu();
@@ -35,7 +35,7 @@ test('can create a media type using create options', async ({umbracoApi, umbraco
await umbracoUi.mediaType.isMediaTypeTreeItemVisible(mediaTypeName);
});
test('can create a media type folder using create options', async ({umbracoApi, umbracoUi}) => {
test('can create a media type folder using create options', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoUi.mediaType.clickMediaTypesMenu();
@@ -53,7 +53,7 @@ test('can create a media type folder using create options', async ({umbracoApi,
await umbracoUi.mediaType.doesCollectionTreeItemTableRowHaveIcon(mediaTypeFolderName, 'icon-folder');
});
test('can create a media type in a folder using create options', async ({umbracoApi, umbracoUi}) => {
test('can create a media type in a folder using create options', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.mediaType.createFolder(mediaTypeFolderName);
await umbracoUi.mediaType.goToMediaType(mediaTypeFolderName);

View File

@@ -127,7 +127,7 @@ test('can set a property as mandatory in a media type', {tag: '@smoke'}, async (
expect(mediaTypeData.properties[0].validation.mandatory).toBeTruthy();
});
test('can set up validation for a property in a media type', async ({umbracoApi, umbracoUi}) => {
test('can set up validation for a property in a media type', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const regex = '^[a-zA-Z0-9]*$';
@@ -226,7 +226,7 @@ test('can create a media type with multiple groups', {tag: '@smoke'}, async ({um
expect(await umbracoApi.mediaType.doesGroupContainCorrectPropertyEditor(mediaTypeName, secondDataTypeName, secondDataType.id, secondGroupName)).toBeTruthy();
});
test('can create a media type with multiple tabs', async ({umbracoApi, umbracoUi}) => {
test('can create a media type with multiple tabs', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
const secondDataTypeName = 'Image Media Picker';
@@ -251,7 +251,7 @@ test('can create a media type with multiple tabs', async ({umbracoApi, umbracoUi
expect(await umbracoApi.mediaType.doesTabContainCorrectPropertyEditorInGroup(mediaTypeName, secondDataTypeName, secondDataType.id, secondTabName, secondGroupName)).toBeTruthy();
});
test('can delete a tab from a media type', async ({umbracoApi, umbracoUi}) => {
test('can delete a tab from a media type', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName);
await umbracoApi.mediaType.createMediaTypeWithPropertyEditorInTab(mediaTypeName, dataTypeName, dataTypeData.id, tabName, groupName);

View File

@@ -280,7 +280,7 @@ test('can show returned items in query builder ', async ({umbracoApi, umbracoUi}
await umbracoApi.document.ensureNameNotExists(childContentName);
});
test('cannot create a partial view with an empty name', async ({umbracoApi, umbracoUi}) => {
test('cannot create a partial view with an empty name', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Act
await umbracoUi.partialView.clickActionsMenuAtRoot();
await umbracoUi.partialView.clickCreateOptionsActionMenuOption();

View File

@@ -145,7 +145,7 @@ test('can create a folder in a folder in a folder', {tag: '@smoke'}, async ({umb
await umbracoUi.partialView.isPartialViewRootTreeItemVisible(childOfChildFolderName, true, false);
});
test('cannot delete non-empty folder', async ({umbracoApi, umbracoUi}) => {
test('cannot delete non-empty folder', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const childFolderName = 'ChildFolderName';
await umbracoApi.partialView.createFolder(folderName);

View File

@@ -101,7 +101,7 @@ test('can rename a script', async ({umbracoApi, umbracoUi}) => {
expect(await umbracoApi.script.doesNameExist(wrongScriptName)).toBeFalsy();
});
test('cannot create a script with an empty name', async ({umbracoApi, umbracoUi}) => {
test('cannot create a script with an empty name', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoUi.script.goToSection(ConstantHelper.sections.settings);

View File

@@ -137,7 +137,7 @@ test('can create a script in a folder in a folder', async ({umbracoApi, umbracoU
await umbracoUi.script.isScriptRootTreeItemVisible(scriptName, true, false);
});
test('cannot delete non-empty folder', async ({umbracoApi, umbracoUi}) => {
test('cannot delete non-empty folder', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const childFolderName = 'ChildFolderName';
await umbracoApi.script.createFolder(scriptFolderName);

View File

@@ -102,7 +102,7 @@ test('can rename a stylesheet', {tag: '@smoke'}, async ({umbracoApi, umbracoUi})
expect(await umbracoApi.stylesheet.doesNameExist(wrongStylesheetName)).toBeFalsy();
});
test('cannot create a stylesheet with an empty name', async ({umbracoApi, umbracoUi}) => {
test('cannot create a stylesheet with an empty name', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoUi.stylesheet.goToSection(ConstantHelper.sections.settings);

View File

@@ -141,7 +141,7 @@ test('can create a stylesheet in a folder in a folder', async ({umbracoApi, umbr
await umbracoUi.stylesheet.isStylesheetRootTreeItemVisible(stylesheetName, true, false);
});
test('cannot delete non-empty folder', async ({umbracoApi, umbracoUi}) => {
test('cannot delete non-empty folder', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const childFolderName = 'ChildFolderName';
await umbracoApi.stylesheet.createFolder(stylesheetFolderName);

View File

@@ -85,7 +85,7 @@ test('can delete a template', async ({umbracoApi, umbracoUi}) => {
await umbracoUi.template.isTemplateRootTreeItemVisible(templateName, false, false);
});
test('can set a template as master template', async ({umbracoApi, umbracoUi}) => {
test('can set a template as master template', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const childTemplateName = 'ChildTemplate';
await umbracoApi.template.ensureNameNotExists(childTemplateName);

View File

@@ -29,7 +29,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.documentType.ensureNameNotExists(documentTypeName);
});
test('can create content with a rich text editor that has a stylesheet', async ({umbracoApi, umbracoUi}) => {
test('can create content with a rich text editor that has a stylesheet', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password);

View File

@@ -1,26 +1,33 @@
import {ConstantHelper, NotificationConstantHelper, test} from "@umbraco/playwright-testhelpers";
import {expect} from "@playwright/test";
// Document Type
const rootDocumentTypeName = 'RootDocumentType';
const childDocumentTypeOneName = 'ChildDocumentTypeOne';
const childDocumentTypeTwoName = 'ChildDocumentTypeTwo';
let childDocumentTypeId = null;
let rootDocumentTypeId = null;
// Document
const rootDocumentName = 'RootDocument';
const childDocumentOneName = 'ChildDocumentOne';
const childDocumentTwoName = 'SecondChildDocument';
let rootDocumentId = null;
// Data Type
const dataTypeName = 'Textstring';
let dataTypeId = null;
const documentText = 'This is test document text';
// Document Blueprint
const testDocumentName = 'TestDocument';
const documentBlueprintName = 'TestBlueprintName';
// User
const testUser = ConstantHelper.testUserCredentials;
let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""};
// User Group
const userGroupName = 'TestUserGroup';
let userGroupId = null;
@@ -49,7 +56,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.documentBlueprint.ensureNameNotExists(documentBlueprintName);
});
test('can browse content node with permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can read content node with permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithReadPermission(userGroupName);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -64,7 +71,7 @@ test('can browse content node with permission enabled', async ({umbracoApi, umbr
await umbracoUi.content.doesDocumentHaveName(rootDocumentName);
});
test('can not browse content node with permission disabled', async ({umbracoApi, umbracoUi}) => {
test('can not read content node with permission disabled', async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithReadPermission(userGroupName, false);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -79,7 +86,7 @@ test('can not browse content node with permission disabled', async ({umbracoApi,
await umbracoUi.content.doesDocumentWorkspaceHaveText('Not found');
});
test('can create document blueprint with permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can create document blueprint with permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithCreateDocumentBlueprintPermission(userGroupName);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -111,7 +118,7 @@ test('can not create document blueprint with permission disabled', async ({umbra
await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false);
});
test('can delete content with delete permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can delete content with delete permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithDeleteDocumentPermission(userGroupName);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -143,7 +150,7 @@ test('can not delete content with delete permission disabled', async ({umbracoAp
await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false);
});
test('can empty recycle bin with delete permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can empty recycle bin with delete permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.document.moveToRecycleBin(rootDocumentId);
userGroupId = await umbracoApi.userGroup.createUserGroupWithDeleteDocumentPermission(userGroupName);
@@ -177,7 +184,7 @@ test('can not empty recycle bin with delete permission disabled', async ({umbrac
await umbracoUi.content.isActionsMenuForRecycleBinVisible(false);
});
test('can create content with create permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can create content with create permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithCreateDocumentPermission(userGroupName);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -238,7 +245,7 @@ test('can not create notifications with notification permission disabled', async
await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false);
});
test('can publish content with publish permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can publish content with publish permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithPublishPermission(userGroupName);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -302,7 +309,7 @@ test('can not set permissions with set permissions permission disabled', async (
await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false);
});
test('can unpublish content with unpublish permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can unpublish content with unpublish permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.document.publish(rootDocumentId);
expect(await umbracoApi.document.isDocumentPublished(rootDocumentId)).toBeTruthy();
@@ -338,7 +345,7 @@ test('can not unpublish content with unpublish permission disabled', async ({umb
await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false);
});
test('can update content with update permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can update content with update permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithUpdatePermission(userGroupName);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -375,7 +382,7 @@ test('can not update content with update permission disabled', async ({umbracoAp
});
// Needs create permission to be enabled to duplicate content
test.fixme('can duplicate content with duplicate permission enabled', async ({umbracoApi, umbracoUi}) => {
test.fixme('can duplicate content with duplicate permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const duplicatedContentName = rootDocumentName + ' (1)';
userGroupId = await umbracoApi.userGroup.createUserGroupWithDuplicatePermission(userGroupName);
@@ -417,7 +424,7 @@ test('can not duplicate content with duplicate permission disabled', async ({umb
});
// Needs create permission to be enabled to move content
test.fixme('can move content with move to permission enabled', async ({umbracoApi, umbracoUi}) => {
test.fixme('can move content with move to permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const moveToDocumentName = 'SecondRootDocument';
const moveToDocumentId = await umbracoApi.document.createDocumentWithTextContent(moveToDocumentName, rootDocumentTypeId, documentText, dataTypeName);
@@ -461,7 +468,7 @@ test('can not move content with move to permission disabled', async ({umbracoApi
});
// Needs a better way to assert
test.fixme('can sort children with sort children permission enabled', async ({umbracoApi, umbracoUi}) => {
test.fixme('can sort children with sort children permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.document.createDefaultDocumentWithParent(childDocumentTwoName, childDocumentTypeId, rootDocumentId);
userGroupId = await umbracoApi.userGroup.createUserGroupWithSortChildrenPermission(userGroupName);
@@ -502,7 +509,7 @@ test('can not sort children with sort children permission disabled', async ({umb
await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false);
});
test('can set culture and hostnames with culture and hostnames permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can set culture and hostnames with culture and hostnames permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const domainName = '/domain';
userGroupId = await umbracoApi.userGroup.createUserGroupWithCultureAndHostnamesPermission(userGroupName);
@@ -574,7 +581,7 @@ test('can not set public access with public access permission disabled', async (
await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false);
});
test('can rollback content with rollback permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can rollback content with rollback permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithRollbackPermission(userGroupName);
await umbracoApi.document.publish(rootDocumentId);
@@ -616,7 +623,7 @@ test('can not rollback content with rollback permission disabled', async ({umbra
await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false);
});
test('can not see delete button in content for userGroup with delete permission disabled and create permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can not see delete button in content for userGroup with delete permission disabled and create permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithDeletePermissionAndCreatePermission(userGroupName, false, true);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);

View File

@@ -35,7 +35,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.userGroup.ensureNameNotExists(userGroupName);
});
test('can only see property values for specific document with read UI enabled', async ({umbracoApi, umbracoUi}) => {
test('can only see property values for specific document with read UI enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithPermissionsForSpecificDocumentAndTwoPropertyValues(userGroupName, firstDocumentId, documentTypeId, firstPropertyName[0], true, false, secondPropertyName[0], true, false);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -50,7 +50,7 @@ test('can only see property values for specific document with read UI enabled',
await umbracoUi.content.isPropertyEditorUiWithNameReadOnly(firstPropertyName[1]);
await umbracoUi.content.isPropertyEditorUiWithNameReadOnly(secondPropertyName[1]);
await umbracoUi.content.goToContentWithName(secondDocumentName);
await umbracoUi.content.doesDocumentWorkspaceHaveText('Access denied');
await umbracoUi.content.doesDocumentWorkspaceHaveText('Not found');
});
test('cannot see specific property value without UI read permission enabled', async ({umbracoApi, umbracoUi}) => {
@@ -69,7 +69,7 @@ test('cannot see specific property value without UI read permission enabled', as
await umbracoUi.content.isPropertyEditorUiWithNameVisible(secondPropertyName[1], false);
});
test('can see specific property values with UI read permission enabled', async ({umbracoApi, umbracoUi}) => {
test('can see specific property values with UI read permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithPermissionsForSpecificDocumentAndTwoPropertyValues(userGroupName, firstDocumentId, documentTypeId, firstPropertyName[0], true, false, secondPropertyName[0], true, false);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -85,7 +85,7 @@ test('can see specific property values with UI read permission enabled', async (
await umbracoUi.content.isPropertyEditorUiWithNameReadOnly(secondPropertyName[1]);
});
test('can see property with UI read enabled but not another property with UI read disabled in the same document', async ({umbracoApi, umbracoUi}) => {
test('can see property with UI read enabled but not another property with UI read disabled in the same document', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithPermissionsForSpecificDocumentAndTwoPropertyValues(userGroupName, firstDocumentId, documentTypeId, firstPropertyName[0], true, false, secondPropertyName[0], false, false);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -103,7 +103,7 @@ test('can see property with UI read enabled but not another property with UI rea
// Remove .skip when the front-end is ready.
// Issue link: https://github.com/umbraco/Umbraco-CMS/issues/19395
test.skip('can edit specific property values with UI read and write permission enabled', async ({umbracoApi, umbracoUi}) => {
test.skip('can edit specific property values with UI read and write permission enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const inputText = 'This is test text';
userGroupId = await umbracoApi.userGroup.createUserGroupWithPermissionsForSpecificDocumentAndTwoPropertyValues(userGroupName, firstDocumentId, documentTypeId, firstPropertyName[0], true, true, secondPropertyName[0], true, true);
@@ -126,7 +126,7 @@ test.skip('can edit specific property values with UI read and write permission e
expect(firstDocumentData.values[1].value).toEqual(true);
});
test('cannot see specific property values with UI write permission enabled and UI read permission disabled', async ({umbracoApi, umbracoUi}) => {
test('cannot see specific property values with UI write permission enabled and UI read permission disabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithPermissionsForSpecificDocumentAndTwoPropertyValues(userGroupName, firstDocumentId, documentTypeId, firstPropertyName[0], false, true, secondPropertyName[0], false, true);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);

View File

@@ -1,5 +1,5 @@
import {expect} from '@playwright/test';
import {AliasHelper, ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {AliasHelper, ConstantHelper, test} from '@umbraco/playwright-testhelpers';
const testUser = ConstantHelper.testUserCredentials;
let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""};
@@ -43,7 +43,7 @@ test('cannot see property values without UI read permission', async ({umbracoApi
await umbracoUi.content.isPropertyEditorUiWithNameVisible('text-box', false);
});
test('can see property values with UI read but not UI write permission', async ({umbracoApi, umbracoUi}) => {
test('can see property values with UI read but not UI write permission', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithReadPermissionAndReadPropertyValuePermission(userGroupName, true, true);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -58,7 +58,7 @@ test('can see property values with UI read but not UI write permission', async (
await umbracoUi.content.isPropertyEditorUiWithNameReadOnly('text-box');
});
test('cannot open content without document read permission even with UI read permission', async ({umbracoApi, umbracoUi}) => {
test('cannot open content without document read permission even with UI read permission', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithReadPermissionAndReadPropertyValuePermission(userGroupName, false, true);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);
@@ -70,7 +70,7 @@ test('cannot open content without document read permission even with UI read per
await umbracoUi.content.goToContentWithName(documentName);
// Assert
await umbracoUi.content.doesDocumentWorkspaceHaveText('Access denied');
await umbracoUi.content.doesDocumentWorkspaceHaveText('Not found');
});
test('cannot edit property values without UI write permission', async ({umbracoApi, umbracoUi}) => {

View File

@@ -31,7 +31,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.dataType.ensureNameNotExists(customDataTypeName);
});
test('can see property values in block list with UI read but not UI write permission', async ({umbracoApi, umbracoUi}) => {
test('can see property values in block list with UI read but not UI write permission', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.document.createDefaultDocumentWithABlockListEditor(documentName, elementTypeId, documentTypeName, customDataTypeName);
userGroupId = await umbracoApi.userGroup.createUserGroupWithReadPermissionAndReadPropertyValuePermission(userGroupName, true, true);
@@ -51,7 +51,7 @@ test('can see property values in block list with UI read but not UI write permis
// Remove .skip when the front-end is ready.
// Issue link: https://github.com/umbraco/Umbraco-CMS/issues/19395
test.skip('can edit property values in block list with UI write permission', async ({umbracoApi, umbracoUi}) => {
test.skip('can edit property values in block list with UI write permission', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const updatedText = 'Updated test text';
await umbracoApi.document.createDefaultDocumentWithABlockListEditor(documentName, elementTypeId, documentTypeName, customDataTypeName);
@@ -90,7 +90,7 @@ test('cannot see property values in block list with only UI write but no UI read
await umbracoUi.content.isPropertyEditorUiWithNameVisible('block-list', false);
});
test('can see property values in block grid with UI read but not UI write permission', async ({umbracoApi, umbracoUi}) => {
test('can see property values in block grid with UI read but not UI write permission', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.document.createDefaultDocumentWithABlockGridEditor(documentName, elementTypeId, documentTypeName, customDataTypeName);
userGroupId = await umbracoApi.userGroup.createUserGroupWithReadPermissionAndReadPropertyValuePermission(userGroupName, true, true);
@@ -110,7 +110,7 @@ test('can see property values in block grid with UI read but not UI write permis
// Remove .skip when the front-end is ready.
// Issue link: https://github.com/umbraco/Umbraco-CMS/issues/19395
test.skip('can edit property values in block grid with UI write permission', async ({umbracoApi, umbracoUi}) => {
test.skip('can edit property values in block grid with UI write permission', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const updatedText = 'Updated test text';
await umbracoApi.document.createDefaultDocumentWithABlockGridEditor(documentName, elementTypeId, documentTypeName, customDataTypeName);
@@ -133,7 +133,7 @@ test.skip('can edit property values in block grid with UI write permission', asy
expect(documentData.values[0].value.contentData[0].values[0].value).toEqual(updatedText);
});
test('cannot see property values in block grid with only UI write but no UI read permission', async ({umbracoApi, umbracoUi}) => {
test('cannot see property values in block grid with only UI write but no UI read permission', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.document.createDefaultDocumentWithABlockGridEditor(documentName, elementTypeId, documentTypeName, customDataTypeName);
userGroupId = await umbracoApi.userGroup.createUserGroupWithUpdatePermissionAndWritePropertyValuePermission(userGroupName, true, true, false);

View File

@@ -1,4 +1,4 @@
import {AliasHelper, ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {AliasHelper, ConstantHelper, test} from '@umbraco/playwright-testhelpers';
const testUser = ConstantHelper.testUserCredentials;
let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""};
@@ -102,7 +102,7 @@ test('can not rename content with language not set in userGroup', async ({umbrac
await umbracoUi.content.isDocumentNameInputEditable(false);
});
test('can update content property with language set in userGroup', async ({umbracoApi, umbracoUi}) => {
test('can update content property with language set in userGroup', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithLanguageAndContentSection(userGroupName, englishIsoCode);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);

View File

@@ -33,7 +33,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.media.ensureNameNotExists(childFolderTwoName);
});
test('can see root media start node and children', async ({umbracoApi, umbracoUi}) => {
test('can see root media start node and children', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithMediaStartNode(userGroupName, rootFolderId);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);

View File

@@ -31,7 +31,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.userGroup.ensureNameNotExists(userGroupName);
});
test('can access members section with section enabled', async ({umbracoApi, umbracoUi}) => {
test('can access members section with section enabled', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createUserGroupWithMemberSection(userGroupName);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], true, [], false, 'en-us');

View File

@@ -31,7 +31,7 @@ test('can go to section defined in userGroup', async ({umbracoApi, umbracoUi}) =
await umbracoUi.content.goToSection(ConstantHelper.sections.content, false);
});
test('can not see section that is not defined in userGroup', async ({umbracoApi, umbracoUi}) => {
test('can not see section that is not defined in userGroup', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
userGroupId = await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName);
await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId);

View File

@@ -111,7 +111,7 @@ test('can remove a user group from a user', {tag: '@smoke'}, async ({umbracoApi,
expect(userData.userGroupIds).toEqual([]);
});
test('can update culture for a user', async ({umbracoApi, umbracoUi}) => {
test('can update culture for a user', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const danishIsoCode = 'da';
const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName);

View File

@@ -1,4 +1,4 @@
import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {ConstantHelper, test} from '@umbraco/playwright-testhelpers';
import {expect} from "@playwright/test";
const allPermissions = {
@@ -51,7 +51,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.userGroup.ensureNameNotExists(userGroupName);
});
test('can create an empty user group', async ({umbracoApi, umbracoUi}) => {
test('can create an empty user group', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Act
await umbracoUi.userGroup.clickUserGroupsButton();
await umbracoUi.userGroup.clickCreateLink();
@@ -87,7 +87,7 @@ test('can rename a user group', async ({umbracoApi, umbracoUi}) => {
await umbracoUi.userGroup.isUserGroupWithNameVisible(oldUserGroupName, false);
});
test('can update a user group', async ({umbracoApi, umbracoUi}) => {
test('can update a user group', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.userGroup.createEmptyUserGroup(userGroupName);
await umbracoUi.userGroup.clickUserGroupsButton();
@@ -105,7 +105,7 @@ test('can update a user group', async ({umbracoApi, umbracoUi}) => {
expect(userGroupData.fallbackPermissions).toContain(allPermissions.verbPermission[0]);
});
test('can delete a user group', async ({umbracoApi, umbracoUi}) => {
test('can delete a user group', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName);
await umbracoUi.userGroup.clickUserGroupsButton();
@@ -395,7 +395,7 @@ test('can enable all permissions for a user group', async ({umbracoApi, umbracoU
expect(userGroupData.fallbackPermissions).toEqual(allPermissions.verbPermission);
});
test('can add granular permission to a specific document for a user group', async ({umbracoApi, umbracoUi}) => {
test('can add granular permission to a specific document for a user group', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const documentTypeName = 'TestDocumentType';
const documentName = 'TestDocument';
@@ -421,7 +421,7 @@ test('can add granular permission to a specific document for a user group', asyn
await umbracoApi.document.ensureNameNotExists(documentTypeName);
});
test('can add all granular permissions to a specific document for a user group', async ({umbracoApi, umbracoUi}) => {
test('can add all granular permissions to a specific document for a user group', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const documentTypeName = 'TestDocumentType';
const documentName = 'TestDocument';

View File

@@ -7,7 +7,7 @@ test.beforeEach(async ({umbracoUi}) => {
await umbracoUi.userGroup.clickUserGroupsButton();
});
test('the default configuration of Administrators is correct', async ({umbracoApi, umbracoUi}) => {
test('the default configuration of Administrators is correct', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const userGroupName = 'Administrators';
const sections = [
@@ -67,7 +67,7 @@ test('the default configuration of Administrators is correct', async ({umbracoAp
expect(userGroupData.permissions).toEqual(granularPermissions);
});
test('the default configuration of Editors is correct', async ({umbracoApi, umbracoUi}) => {
test('the default configuration of Editors is correct', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const userGroupName = 'Editors';
const sections = [
@@ -120,7 +120,7 @@ test('the default configuration of Editors is correct', async ({umbracoApi, umbr
expect(userGroupData.permissions).toEqual(granularPermissions);
});
test('the default configuration of Sensitive data is correct', async ({umbracoApi, umbracoUi}) => {
test('the default configuration of Sensitive data is correct', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const userGroupName = 'Sensitive data';
const sections = [];
@@ -154,7 +154,7 @@ test('the default configuration of Sensitive data is correct', async ({umbracoAp
expect(userGroupData.permissions).toEqual(granularPermissions);
});
test('the default configuration of Translators data is correct', async ({umbracoApi, umbracoUi}) => {
test('the default configuration of Translators data is correct', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const userGroupName = 'Translators';
const sections = ["Umb.Section.Translation"];
@@ -191,7 +191,7 @@ test('the default configuration of Translators data is correct', async ({umbraco
expect(userGroupData.permissions).toEqual(granularPermissions);
});
test('the default configuration of Writers data is correct', async ({umbracoApi, umbracoUi}) => {
test('the default configuration of Writers data is correct', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const userGroupName = 'Writers';
const sections = ["Umb.Section.Content"];

View File

@@ -14,7 +14,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.webhook.ensureNameNotExists(webhookName);
});
test('can create a webhook', async ({umbracoApi, umbracoUi}) => {
test('can create a webhook', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const event = 'Content Deleted';
const webhookSiteUrl = umbracoApi.webhook.webhookSiteUrl + webhookSiteToken;
@@ -122,7 +122,7 @@ test('can disable a webhook', async ({umbracoApi, umbracoUi}) => {
await umbracoApi.webhook.isWebhookEnabled(webhookName, false);
});
test('cannot remove all events from a webhook', async ({umbracoApi, umbracoUi}) => {
test('cannot remove all events from a webhook', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const event = 'Content Deleted';
await umbracoApi.webhook.createDefaultWebhook(webhookName, webhookSiteToken, event);
@@ -173,7 +173,7 @@ test('can remove a header from a webhook', async ({umbracoApi, umbracoUi}) => {
expect(await umbracoApi.webhook.doesWebhookHaveHeader(webhookName, headerName, headerValue)).toBeFalsy();
});
test('cannot add both content event and media event for a webhook', async ({umbracoApi, umbracoUi}) => {
test('cannot add both content event and media event for a webhook', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
// Arrange
const event = 'Content Published';
await umbracoApi.webhook.createDefaultWebhook(webhookName, webhookSiteToken, event);

View File

@@ -27,7 +27,7 @@ test.afterEach(async ({umbracoApi}) => {
await umbracoApi.media.ensureNameNotExists(mediaName);
});
test('can trigger when content is published', async ({umbracoApi, umbracoUi}) => {
test('can trigger when content is published', {tag: '@release'}, async ({umbracoApi, umbracoUi}) => {
test.slow();
// Arrange