mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-16 17:46:45 +00:00
685 lines
29 KiB
TypeScript
685 lines
29 KiB
TypeScript
import {
|
|
createFolderFromCardActions,
|
|
createFolderFromListDropdown,
|
|
createFolderFromListHeaderButton,
|
|
createFolderFromProjectHeader,
|
|
createFolderInsideFolder,
|
|
createNewProject,
|
|
createWorkflowFromEmptyState,
|
|
createWorkflowFromListDropdown,
|
|
createWorkflowFromProjectHeader,
|
|
deleteAndTransferFolderContentsFromCardDropdown,
|
|
deleteAndTransferFolderContentsFromListDropdown,
|
|
deleteEmptyFolderFromCardDropdown,
|
|
deleteEmptyFolderFromListDropdown,
|
|
deleteFolderWithContentsFromCardDropdown,
|
|
deleteFolderWithContentsFromListDropdown,
|
|
dragAndDropToFolder,
|
|
dragAndDropToProjectRoot,
|
|
duplicateWorkflowFromCardActions,
|
|
duplicateWorkflowFromWorkflowPage,
|
|
getAddResourceDropdown,
|
|
getCanvasBreadcrumbs,
|
|
getCurrentBreadcrumbText,
|
|
getFolderCard,
|
|
getFolderCardActionItem,
|
|
getFolderCardActionToggle,
|
|
getFolderCards,
|
|
getFolderEmptyState,
|
|
getHomeProjectBreadcrumb,
|
|
getListBreadcrumbItem,
|
|
getListBreadcrumbs,
|
|
getMainBreadcrumbsEllipsis,
|
|
getMainBreadcrumbsEllipsisMenuItems,
|
|
getNewFolderModalErrorMessage,
|
|
getNewFolderNameInput,
|
|
getOverviewMenuItem,
|
|
getPersonalProjectMenuItem,
|
|
getProjectEmptyState,
|
|
getProjectMenuItem,
|
|
getProjectTab,
|
|
getVisibleListBreadcrumbs,
|
|
getWorkflowCard,
|
|
getWorkflowCardBreadcrumbs,
|
|
getWorkflowCardBreadcrumbsEllipsis,
|
|
getWorkflowCards,
|
|
goToPersonalProject,
|
|
moveFolderFromFolderCardActions,
|
|
moveFolderFromListActions,
|
|
moveWorkflowToFolder,
|
|
renameFolderFromCardActions,
|
|
renameFolderFromListActions,
|
|
} from '../composables/folders';
|
|
import { visitWorkflowsPage } from '../composables/workflowsPage';
|
|
import { successToast } from '../pages/notifications';
|
|
|
|
describe('Folders', () => {
|
|
before(() => {
|
|
cy.resetDatabase();
|
|
cy.enableFeature('sharing');
|
|
cy.enableFeature('folders');
|
|
cy.enableFeature('advancedPermissions');
|
|
cy.enableFeature('projectRole:admin');
|
|
cy.enableFeature('projectRole:editor');
|
|
cy.changeQuota('maxTeamProjects', -1);
|
|
});
|
|
|
|
beforeEach(() => {
|
|
visitWorkflowsPage();
|
|
});
|
|
|
|
describe('Create and navigate folders', () => {
|
|
it('should create folder from the project header', () => {
|
|
// 1. In project root
|
|
getPersonalProjectMenuItem().click();
|
|
createFolderFromProjectHeader('My Folder');
|
|
getFolderCards().should('have.length.greaterThan', 0);
|
|
// Clicking on the success toast should navigate to the folder
|
|
successToast().find('a').click();
|
|
getCurrentBreadcrumbText().should('equal', 'My Folder');
|
|
// 2. In a folder
|
|
createFolderFromListHeaderButton('My Folder 2');
|
|
getFolderCard('My Folder 2').should('exist');
|
|
});
|
|
|
|
it('should not allow illegal folder names', () => {
|
|
// Validation logic is thoroughly tested in unit tests
|
|
// Here we just make sure everything is working in the full UI
|
|
const ILLEGAL_CHARACTERS_NAME = 'hello[';
|
|
const ONLY_DOTS_NAME = '...';
|
|
const REGULAR_NAME = 'My Folder';
|
|
|
|
getPersonalProjectMenuItem().click();
|
|
getAddResourceDropdown().click();
|
|
cy.getByTestId('action-folder').click();
|
|
getNewFolderNameInput().type(ILLEGAL_CHARACTERS_NAME, { delay: 50 });
|
|
getNewFolderModalErrorMessage().should(
|
|
'contain.text',
|
|
'Folder name cannot contain the following characters',
|
|
);
|
|
getNewFolderNameInput().clear();
|
|
getNewFolderNameInput().type(ONLY_DOTS_NAME, { delay: 50 });
|
|
getNewFolderModalErrorMessage().should(
|
|
'contain.text',
|
|
'Folder name cannot contain only dots',
|
|
);
|
|
getNewFolderNameInput().clear();
|
|
getNewFolderModalErrorMessage().should('contain.text', 'Folder name cannot be empty');
|
|
getNewFolderNameInput().type(REGULAR_NAME, { delay: 50 });
|
|
getNewFolderModalErrorMessage().should('not.exist');
|
|
});
|
|
|
|
it('should create folder from the list header button', () => {
|
|
goToPersonalProject();
|
|
// First create a folder so list appears
|
|
createFolderFromProjectHeader('Test 2');
|
|
createFolderFromListHeaderButton('My Folder 2');
|
|
getFolderCards().should('have.length.greaterThan', 0);
|
|
// Clicking on the success toast should navigate to the folder
|
|
successToast().contains('My Folder 2').find('a').contains('Open folder').click();
|
|
getCurrentBreadcrumbText().should('equal', 'My Folder 2');
|
|
});
|
|
|
|
it('should create folder from the list header dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Created from list dropdown');
|
|
getFolderCard('Created from list dropdown').should('exist');
|
|
getFolderCard('Created from list dropdown').click();
|
|
createFolderFromListDropdown('Child Folder');
|
|
successToast().should('exist');
|
|
getFolderCard('Child Folder').should('exist');
|
|
});
|
|
|
|
it('should create folder from the card dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Created from card dropdown');
|
|
getFolderCard('Created from card dropdown').should('exist');
|
|
createFolderFromCardActions('Created from card dropdown', 'Child Folder');
|
|
successToast().should('exist');
|
|
// Should be automatically navigated to the new folder
|
|
getFolderCard('Child Folder').should('exist');
|
|
getCurrentBreadcrumbText().should('equal', 'Created from card dropdown');
|
|
});
|
|
|
|
it('should navigate folders using breadcrumbs and dropdown menu', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Navigate Test');
|
|
// Open folder using menu item
|
|
getFolderCardActionToggle('Navigate Test').click();
|
|
getFolderCardActionItem('Navigate Test', 'open').click();
|
|
getCurrentBreadcrumbText().should('equal', 'Navigate Test');
|
|
// Create new child folder and navigate to it
|
|
createFolderFromListHeaderButton('Child Folder');
|
|
getFolderCard('Child Folder').should('exist');
|
|
getFolderCard('Child Folder').click();
|
|
getCurrentBreadcrumbText().should('equal', 'Child Folder');
|
|
// Navigate back to parent folder using breadcrumbs
|
|
getVisibleListBreadcrumbs().contains('Navigate Test').click();
|
|
getCurrentBreadcrumbText().should('equal', 'Navigate Test');
|
|
// Go back to home project using breadcrumbs
|
|
getHomeProjectBreadcrumb().click();
|
|
getListBreadcrumbs().should('not.exist');
|
|
});
|
|
|
|
// Creates folders inside folders and also checks breadcrumbs
|
|
it('should create multiple levels of folders', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Multi-level Test');
|
|
createFolderInsideFolder('Child Folder', 'Multi-level Test');
|
|
// One level deep:
|
|
// - Breadcrumbs should only show home project and current folder
|
|
getHomeProjectBreadcrumb().should('exist');
|
|
getCurrentBreadcrumbText().should('equal', 'Multi-level Test');
|
|
getFolderCard('Child Folder').should('exist');
|
|
|
|
createFolderInsideFolder('Child Folder 2', 'Child Folder');
|
|
// Two levels deep:
|
|
// - Breadcrumbs should also show parent folder, without hidden ellipsis
|
|
getHomeProjectBreadcrumb().should('exist');
|
|
getCurrentBreadcrumbText().should('equal', 'Child Folder');
|
|
getVisibleListBreadcrumbs().should('have.length', 1);
|
|
getMainBreadcrumbsEllipsis().should('not.exist');
|
|
|
|
// Three levels deep:
|
|
// - Breadcrumbs should show parents up to the grandparent folder, with one hidden element
|
|
createFolderInsideFolder('Child Folder 3', 'Child Folder 2');
|
|
getVisibleListBreadcrumbs().should('have.length', 1);
|
|
getMainBreadcrumbsEllipsis().should('exist');
|
|
// Clicking on the ellipsis should show hidden element in main breadcrumbs
|
|
getMainBreadcrumbsEllipsis().click();
|
|
getMainBreadcrumbsEllipsisMenuItems().first().should('contain.text', 'Multi-level Test');
|
|
getMainBreadcrumbsEllipsis().click();
|
|
});
|
|
|
|
// Make sure breadcrumbs and folder card show correct info when landing straight on a folder page
|
|
it('should correctly render all elements when landing on a folder page', () => {
|
|
// Create a few levels of folders
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Landing Test');
|
|
createFolderInsideFolder('Child Folder', 'Landing Test');
|
|
createFolderInsideFolder('Child Folder 2', 'Child Folder');
|
|
createFolderInsideFolder('Child Folder 3', 'Child Folder 2');
|
|
// Reload page to simulate landing on a folder page
|
|
cy.reload();
|
|
// Main list breadcrumbs should show home project, parent, grandparent, with one hidden element
|
|
getHomeProjectBreadcrumb().should('exist');
|
|
getCurrentBreadcrumbText().should('equal', 'Child Folder 2');
|
|
getVisibleListBreadcrumbs().should('have.length', 1);
|
|
getVisibleListBreadcrumbs().first().should('contain.text', 'Child Folder');
|
|
getMainBreadcrumbsEllipsis().should('exist');
|
|
getMainBreadcrumbsEllipsis().click();
|
|
getMainBreadcrumbsEllipsisMenuItems().first().should('contain.text', 'Landing Test');
|
|
// Should load child folder card
|
|
getFolderCard('Child Folder 3').should('exist');
|
|
});
|
|
|
|
it('should show folders only in projects', () => {
|
|
// No folder cards should be shown in the overview page
|
|
getOverviewMenuItem().click();
|
|
getFolderCards().should('not.exist');
|
|
// Option to create folders should not be available in the dropdown
|
|
getAddResourceDropdown().click();
|
|
cy.getByTestId('action-folder').should('not.exist');
|
|
|
|
// In personal, we should see previously created folders
|
|
getPersonalProjectMenuItem().click();
|
|
getAddResourceDropdown().click();
|
|
cy.getByTestId('action-folder').should('exist');
|
|
createFolderFromProjectHeader('Personal Folder');
|
|
getFolderCards().should('exist');
|
|
// Create folder option should not be available on credentials tab
|
|
getProjectTab('ProjectsCredentials').click();
|
|
getAddResourceDropdown().click();
|
|
cy.getByTestId('action-folder').should('not.exist');
|
|
});
|
|
});
|
|
|
|
describe('Empty State', () => {
|
|
it('should show project empty state when no folders exist', () => {
|
|
createNewProject('Test empty project', { openAfterCreate: true });
|
|
getProjectEmptyState().should('exist');
|
|
});
|
|
|
|
it('should toggle folder empty state correctly', () => {
|
|
createNewProject('Test empty folder', { openAfterCreate: true });
|
|
createFolderFromProjectHeader('My Folder');
|
|
getProjectEmptyState().should('not.exist');
|
|
getFolderCard('My Folder').should('exist');
|
|
getFolderCard('My Folder').click();
|
|
getFolderEmptyState().should('exist');
|
|
// Create a new workflow from the empty state
|
|
createWorkflowFromEmptyState('My Workflow');
|
|
// Toast should inform that the workflow was created in the folder
|
|
successToast().should(
|
|
'contain.text',
|
|
'Workflow successfully created in "Test empty folder", within "My Folder"',
|
|
);
|
|
// Go back to the folder
|
|
getProjectMenuItem('Test empty folder').click();
|
|
getFolderCard('My Folder').should('exist');
|
|
getFolderCard('My Folder').click();
|
|
// Should not show empty state anymore
|
|
getFolderEmptyState().should('not.exist');
|
|
getWorkflowCards().should('have.length.greaterThan', 0);
|
|
// Also when filtering and there are no results, empty state CTA should not show
|
|
cy.getByTestId('resources-list-search').type('non-existing', { delay: 20 });
|
|
getWorkflowCards().should('not.exist');
|
|
getFolderEmptyState().should('not.exist');
|
|
// But there should be a message saying that no results were found
|
|
cy.getByTestId('resources-list-empty').should('exist');
|
|
});
|
|
});
|
|
|
|
describe('Create workflows inside folders', () => {
|
|
it('should create workflows in folders in all supported ways', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Workflows go here');
|
|
// 1. From empty state
|
|
getFolderCard('Workflows go here').should('exist').click();
|
|
createWorkflowFromEmptyState('Created from empty state');
|
|
goToPersonalProject();
|
|
getFolderCard('Workflows go here').click();
|
|
getWorkflowCard('Created from empty state').should('exist');
|
|
// 2. From the project header
|
|
createWorkflowFromProjectHeader('Workflows go here', 'Created from project header');
|
|
goToPersonalProject();
|
|
getFolderCard('Workflows go here').click();
|
|
getWorkflowCard('Created from project header').should('exist');
|
|
// 3. From list breadcrumbs
|
|
createWorkflowFromListDropdown('Created from list breadcrumbs');
|
|
goToPersonalProject();
|
|
getFolderCard('Workflows go here').click();
|
|
getWorkflowCard('Created from list breadcrumbs').should('exist');
|
|
});
|
|
|
|
it('should show new workflow breadcrumbs correctly', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Workflow breadcrumbs test');
|
|
getFolderCard('Workflow breadcrumbs test').should('exist').click();
|
|
getFolderEmptyState().find('button').contains('Create Workflow').click();
|
|
// Should show breadcrumbs before and after saving new workflow
|
|
getCanvasBreadcrumbs().should('exist');
|
|
getCanvasBreadcrumbs().findChildByTestId('home-project').should('contain.text', 'Personal');
|
|
getCanvasBreadcrumbs().find('li[data-test-id="breadcrumbs-item"]').should('have.length', 1);
|
|
// Save workflow and reload
|
|
cy.getByTestId('workflow-save-button').click();
|
|
cy.reload();
|
|
// Should still show the same breadcrumbs
|
|
getCanvasBreadcrumbs().should('exist');
|
|
getCanvasBreadcrumbs().findChildByTestId('home-project').should('contain.text', 'Personal');
|
|
getCanvasBreadcrumbs().find('li[data-test-id="breadcrumbs-item"]').should('have.length', 1);
|
|
});
|
|
});
|
|
|
|
describe('Rename and delete folders', () => {
|
|
it('should rename folder from main dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Rename Me');
|
|
getFolderCard('Rename Me').should('exist');
|
|
renameFolderFromListActions('Rename Me', 'Renamed');
|
|
getCurrentBreadcrumbText().should('equal', 'Renamed');
|
|
});
|
|
|
|
it('should rename folder from card dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Rename Me 2');
|
|
renameFolderFromCardActions('Rename Me 2', 'Renamed 2');
|
|
getFolderCard('Renamed 2').should('exist');
|
|
});
|
|
|
|
it('should delete empty folder from card dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Delete Me');
|
|
getFolderCard('Delete Me').should('exist');
|
|
deleteEmptyFolderFromCardDropdown('Delete Me');
|
|
});
|
|
|
|
it('should delete empty folder from main dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Delete Me 2');
|
|
getFolderCard('Delete Me 2').should('exist');
|
|
deleteEmptyFolderFromListDropdown('Delete Me 2');
|
|
// Since we deleted the current folder, we should be back in the home project
|
|
getListBreadcrumbs().should('not.exist');
|
|
getPersonalProjectMenuItem().find('li').should('have.class', 'is-active');
|
|
});
|
|
|
|
it('should warn before deleting non-empty folder from list dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('I have children');
|
|
createFolderInsideFolder('Child 1', 'I have children');
|
|
deleteFolderWithContentsFromListDropdown('I have children');
|
|
// Since we deleted the current folder, we should be back in the home project
|
|
getListBreadcrumbs().should('not.exist');
|
|
getPersonalProjectMenuItem().find('li').should('have.class', 'is-active');
|
|
});
|
|
|
|
it('should warn before deleting non-empty folder from card dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('I also have family');
|
|
createFolderInsideFolder('Child 1', 'I also have family');
|
|
// Back to home
|
|
getHomeProjectBreadcrumb().click();
|
|
getFolderCard('I also have family').should('exist');
|
|
deleteFolderWithContentsFromCardDropdown('I also have family');
|
|
});
|
|
|
|
it('should transfer contents when deleting non-empty folder - from card dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Move my contents');
|
|
createFolderFromProjectHeader('Destination');
|
|
createFolderInsideFolder('Child 1', 'Move my contents');
|
|
getHomeProjectBreadcrumb().click();
|
|
getFolderCard('Move my contents').should('exist');
|
|
deleteAndTransferFolderContentsFromCardDropdown('Move my contents', 'Destination');
|
|
getFolderCard('Destination').click();
|
|
// Should show the contents of the moved folder
|
|
getFolderCard('Child 1').should('exist');
|
|
});
|
|
|
|
it('should transfer contents when deleting non-empty folder - from list breadcrumbs', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Move me too');
|
|
createFolderFromProjectHeader('Destination 2');
|
|
createFolderInsideFolder('Child 1', 'Move me too');
|
|
deleteAndTransferFolderContentsFromListDropdown('Destination 2');
|
|
getFolderCard('Destination').click();
|
|
// Should show the contents of the moved folder
|
|
getFolderCard('Child 1').should('exist');
|
|
});
|
|
});
|
|
|
|
describe('Move folders and workflows', () => {
|
|
it('should move empty folder to another folder - from folder card action', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Move me - I am empty');
|
|
createFolderFromProjectHeader('Destination 3');
|
|
moveFolderFromFolderCardActions('Move me - I am empty', 'Destination 3');
|
|
getFolderCard('Destination 3').click();
|
|
getFolderCard('Move me - I am empty').should('exist');
|
|
getFolderCard('Move me - I am empty').click();
|
|
getFolderEmptyState().should('exist');
|
|
successToast().should('contain.text', 'Move me - I am empty has been moved to Destination 3');
|
|
// Breadcrumbs should show the destination folder
|
|
getListBreadcrumbItem('Destination 3').should('exist');
|
|
});
|
|
|
|
it('should move folder with contents to another folder - from folder card action', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Move me - I have family');
|
|
createFolderFromProjectHeader('Destination 4');
|
|
// Create a workflow and a folder inside the folder
|
|
createFolderInsideFolder('Child 1', 'Move me - I have family');
|
|
createWorkflowFromProjectHeader('Move me - I have family');
|
|
goToPersonalProject();
|
|
// Move the folder
|
|
moveFolderFromFolderCardActions('Move me - I have family', 'Destination 4');
|
|
successToast().should(
|
|
'contain.text',
|
|
'Move me - I have family has been moved to Destination 4',
|
|
);
|
|
// Go to destination folder and check if contents are there
|
|
getFolderCard('Destination 4').click();
|
|
// Moved folder should be there
|
|
getFolderCard('Move me - I have family').should('exist').click();
|
|
// Both the workflow and the folder should be there
|
|
getFolderCards().should('have.length', 1);
|
|
getWorkflowCards().should('have.length', 1);
|
|
// Breadcrumbs should show the destination folder
|
|
getListBreadcrumbItem('Destination 4').should('exist');
|
|
});
|
|
|
|
it('should move empty folder to another folder - from list breadcrumbs', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Move me too - I am empty');
|
|
createFolderFromProjectHeader('Destination 5');
|
|
moveFolderFromListActions('Move me too - I am empty', 'Destination 5');
|
|
// Since we moved the current folder, we should be in the destination folder
|
|
getCurrentBreadcrumbText().should('equal', 'Destination 5');
|
|
});
|
|
|
|
it('should move folder with contents to another folder - from list dropdown', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Move me - I have family 2');
|
|
createFolderFromProjectHeader('Destination 6');
|
|
// Create a workflow and a folder inside the folder
|
|
createFolderInsideFolder('Child 1', 'Move me - I have family 2');
|
|
createWorkflowFromProjectHeader('Move me - I have family 2');
|
|
// Navigate back to folder
|
|
goToPersonalProject();
|
|
getFolderCard('Move me - I have family 2').should('exist');
|
|
// Move the folder
|
|
moveFolderFromListActions('Move me - I have family 2', 'Destination 6');
|
|
// Since we moved the current folder, we should be in the destination folder
|
|
getCurrentBreadcrumbText().should('equal', 'Destination 6');
|
|
// Moved folder should be there
|
|
getFolderCard('Move me - I have family 2').should('exist').click();
|
|
// After navigating to the moved folder, both the workflow and the folder should be there
|
|
getFolderCards().should('have.length', 1);
|
|
getWorkflowCards().should('have.length', 1);
|
|
// Breadcrumbs should show the destination folder
|
|
getListBreadcrumbItem('Destination 6').should('exist');
|
|
});
|
|
|
|
it('should move folder to project root - from folder card action', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Test parent');
|
|
createFolderInsideFolder('Move me to root', 'Test parent');
|
|
moveFolderFromFolderCardActions('Move me to root', 'No folder (project root)');
|
|
// Parent folder should be empty
|
|
getFolderEmptyState().should('exist');
|
|
// Child folder should be in the root
|
|
goToPersonalProject();
|
|
getFolderCard('Move me to root').should('exist');
|
|
// Navigate to the moved folder and check breadcrumbs
|
|
getFolderCard('Move me to root').click();
|
|
getHomeProjectBreadcrumb().should('contain.text', 'Personal');
|
|
getListBreadcrumbs().findChildByTestId('breadcrumbs-item').should('not.exist');
|
|
getCurrentBreadcrumbText().should('equal', 'Move me to root');
|
|
});
|
|
|
|
it('should move workflow from project root to folder', () => {
|
|
goToPersonalProject();
|
|
createWorkflowFromProjectHeader(undefined, 'Move me');
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Workflow destination');
|
|
moveWorkflowToFolder('Move me', 'Workflow destination');
|
|
successToast().should('contain.text', 'Move me has been moved to Workflow destination');
|
|
// Navigate to the destination folder
|
|
getFolderCard('Workflow destination').click();
|
|
// Moved workflow should be there
|
|
getWorkflowCards().should('have.length', 1);
|
|
getWorkflowCard('Move me').should('exist');
|
|
});
|
|
|
|
it('should move workflow to another folder', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Moving workflow from here');
|
|
createFolderFromProjectHeader('Moving workflow to here');
|
|
getFolderCard('Moving workflow from here').click();
|
|
createWorkflowFromProjectHeader(undefined, 'Move me');
|
|
goToPersonalProject();
|
|
getFolderCard('Moving workflow from here').click();
|
|
getWorkflowCard('Move me').should('exist');
|
|
moveWorkflowToFolder('Move me', 'Moving workflow to here');
|
|
// Now folder should be empty
|
|
getFolderEmptyState().should('exist');
|
|
// Navigate to the destination folder
|
|
getHomeProjectBreadcrumb().click();
|
|
getFolderCard('Moving workflow to here').click();
|
|
// Moved workflow should be there
|
|
getWorkflowCards().should('have.length', 1);
|
|
getWorkflowCard('Move me').should('exist');
|
|
});
|
|
});
|
|
|
|
describe('Card breadcrumbs', () => {
|
|
it('should correctly show workflow card breadcrumbs in overview page', () => {
|
|
createNewProject('Test card breadcrumbs', { openAfterCreate: true });
|
|
createFolderFromProjectHeader('Parent Folder');
|
|
createFolderInsideFolder('Child Folder', 'Parent Folder');
|
|
getFolderCard('Child Folder').click();
|
|
createFolderFromListHeaderButton('Child Folder 2');
|
|
getFolderCard('Child Folder 2').click();
|
|
createWorkflowFromEmptyState('Breadcrumbs Test');
|
|
// Go to overview page
|
|
getOverviewMenuItem().click();
|
|
getWorkflowCard('Breadcrumbs Test').should('exist');
|
|
getWorkflowCardBreadcrumbs('Breadcrumbs Test').should('exist');
|
|
getWorkflowCardBreadcrumbsEllipsis('Breadcrumbs Test').should('exist');
|
|
getWorkflowCardBreadcrumbsEllipsis('Breadcrumbs Test').realHover({ position: 'topLeft' });
|
|
cy.get('[role=tooltip]').should('exist');
|
|
cy.get('[role=tooltip]').should(
|
|
'contain.text',
|
|
'Test card breadcrumbs / Parent Folder / Child Folder / Child Folder 2',
|
|
);
|
|
});
|
|
|
|
it('should correctly toggle folder and workflow card breadcrumbs in projects and folders', () => {
|
|
createNewProject('Test nested search', { openAfterCreate: true });
|
|
createFolderFromProjectHeader('Parent Folder');
|
|
getFolderCard('Parent Folder').click();
|
|
createWorkflowFromEmptyState('Child - Workflow');
|
|
getProjectMenuItem('Test nested search').click();
|
|
createFolderInsideFolder('Child Folder', 'Parent Folder');
|
|
// Should not show breadcrumbs in the folder if there is no search term
|
|
cy.getByTestId('card-badge').should('not.exist');
|
|
// Back to project root
|
|
getHomeProjectBreadcrumb().click();
|
|
// Should not show breadcrumbs in the project if there is no search term
|
|
cy.getByTestId('card-badge').should('not.exist');
|
|
// Search for something
|
|
cy.getByTestId('resources-list-search').type('child', { delay: 20 });
|
|
// Both folder and workflow from child folder should be in the results - nested search works
|
|
getFolderCards().should('have.length', 1);
|
|
getWorkflowCards().should('have.length', 1);
|
|
// Card badges with breadcrumbs should be shown
|
|
getFolderCard('Child Folder').findChildByTestId('card-badge').should('exist');
|
|
getWorkflowCard('Child - Workflow').findChildByTestId('card-badge').should('exist');
|
|
});
|
|
});
|
|
|
|
describe('Duplicate workflows', () => {
|
|
beforeEach(() => {
|
|
// Prevent the duplicated workflow from opening in a new tab
|
|
cy.window().then((win) => {
|
|
cy.stub(win, 'open').as('open');
|
|
});
|
|
});
|
|
|
|
it('should duplicate workflow within root folder from personal projects', () => {
|
|
goToPersonalProject();
|
|
createWorkflowFromProjectHeader(undefined, 'Duplicate Me From Root');
|
|
goToPersonalProject();
|
|
duplicateWorkflowFromCardActions('Duplicate Me From Root', 'Duplicate Me From Root (Copy)');
|
|
getWorkflowCard('Duplicate Me From Root (Copy)').should('exist');
|
|
});
|
|
|
|
it('should duplicate workflow within a folder from personal projects', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Parent folder for duplication');
|
|
getFolderCard('Parent folder for duplication').click();
|
|
createWorkflowFromProjectHeader(
|
|
'Parent folder for duplication',
|
|
'Duplicate Me From Personal',
|
|
);
|
|
goToPersonalProject();
|
|
getFolderCard('Parent folder for duplication').click();
|
|
duplicateWorkflowFromCardActions(
|
|
'Duplicate Me From Personal',
|
|
'Duplicate Me From Personal (Copy)',
|
|
);
|
|
getWorkflowCard('Duplicate Me From Personal (Copy)').should('exist');
|
|
});
|
|
|
|
it('should duplicate workflow within a folder from overview', () => {
|
|
goToPersonalProject();
|
|
getFolderCard('Parent folder for duplication').click();
|
|
createWorkflowFromProjectHeader(
|
|
'Parent folder for duplication',
|
|
'Duplicate Me From Overview',
|
|
);
|
|
getOverviewMenuItem().click();
|
|
duplicateWorkflowFromCardActions(
|
|
'Duplicate Me From Overview',
|
|
'Duplicate Me From Overview (Copy)',
|
|
);
|
|
getWorkflowCard('Duplicate Me From Overview (Copy)').should('exist');
|
|
goToPersonalProject();
|
|
getFolderCard('Parent folder for duplication').click();
|
|
getWorkflowCard('Duplicate Me From Overview (Copy)').should('exist');
|
|
});
|
|
|
|
it('should duplicate workflow within a folder from workflow', () => {
|
|
goToPersonalProject();
|
|
createFolderFromProjectHeader('Parent folder for duplication');
|
|
getFolderCard('Parent folder for duplication').click();
|
|
createWorkflowFromProjectHeader(
|
|
'Parent folder for duplication',
|
|
'Duplicate Me From Workflow',
|
|
);
|
|
duplicateWorkflowFromWorkflowPage('Duplicate Me From Workflow (Copy)');
|
|
goToPersonalProject();
|
|
getFolderCard('Parent folder for duplication').click();
|
|
getWorkflowCard('Duplicate Me From Workflow (Copy)').should('exist');
|
|
});
|
|
});
|
|
|
|
describe('Drag and drop', () => {
|
|
it('should drag and drop folders into folders', () => {
|
|
const PROJECT_NAME = 'Drag and Drop Test';
|
|
const TARGET_NAME = 'Drag me';
|
|
const DESTINATION_NAME = 'Folder Destination';
|
|
|
|
createNewProject(PROJECT_NAME, { openAfterCreate: true });
|
|
createFolderFromProjectHeader(TARGET_NAME);
|
|
createFolderFromProjectHeader(DESTINATION_NAME);
|
|
|
|
dragAndDropToFolder(TARGET_NAME, DESTINATION_NAME);
|
|
successToast().should('contain.text', `${TARGET_NAME} has been moved to ${DESTINATION_NAME}`);
|
|
// Only one folder card should remain
|
|
getFolderCards().should('have.length', 1);
|
|
// Check folder in the destination
|
|
getFolderCard(DESTINATION_NAME).click();
|
|
getFolderCard(TARGET_NAME).should('exist');
|
|
});
|
|
|
|
it('should drag and drop folders into project root breadcrumb', () => {
|
|
const PROJECT_NAME = 'Drag to root test';
|
|
const TARGET_NAME = 'To Project root';
|
|
const PARENT_NAME = 'Parent Folder';
|
|
|
|
createNewProject(PROJECT_NAME, { openAfterCreate: true });
|
|
createFolderFromProjectHeader(PARENT_NAME);
|
|
createFolderInsideFolder(TARGET_NAME, PARENT_NAME);
|
|
|
|
dragAndDropToProjectRoot(TARGET_NAME);
|
|
|
|
// No folder cards should be shown in the parent folder
|
|
getFolderCards().should('not.exist');
|
|
successToast().should('contain.text', `${TARGET_NAME} has been moved to ${PROJECT_NAME}`);
|
|
// Check folder in the project root
|
|
getProjectMenuItem(PROJECT_NAME).click();
|
|
getFolderCard(TARGET_NAME).should('exist');
|
|
});
|
|
|
|
it('should drag and drop workflows into folders', () => {
|
|
const PROJECT_NAME = 'Drag and Drop WF Test';
|
|
const TARGET_NAME = 'Drag me - WF';
|
|
const DESTINATION_NAME = 'Workflow Destination';
|
|
|
|
createNewProject(PROJECT_NAME, { openAfterCreate: true });
|
|
createFolderFromProjectHeader(DESTINATION_NAME);
|
|
createWorkflowFromProjectHeader(undefined, TARGET_NAME);
|
|
getProjectMenuItem(PROJECT_NAME).click();
|
|
dragAndDropToFolder(TARGET_NAME, DESTINATION_NAME);
|
|
// No workflow cards should be shown in the project root
|
|
getWorkflowCards().should('not.exist');
|
|
successToast().should('contain.text', `${TARGET_NAME} has been moved to ${DESTINATION_NAME}`);
|
|
// Check workflow in the destination
|
|
getFolderCard(DESTINATION_NAME).click();
|
|
getWorkflowCard(TARGET_NAME).should('exist');
|
|
});
|
|
});
|
|
});
|