mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-11-03 03:59:12 +00:00
fix aut activity feed for 1.5.5 (#17943)
* fix aut activity feed for 1.5.5 * fix failure test * fix: custom property spec * refactor: Update clickOutside function usage in customProperty.ts --------- Co-authored-by: Sachin Chaurasiya <sachinchaurasiyachotey87@gmail.com> (cherry picked from commit 9ed21cec4a175a6e8ae1e616b55ea31536033312)
This commit is contained in:
parent
5ce631a84d
commit
13a0bc4ed1
@ -360,7 +360,9 @@ test.describe('Activity feed', () => {
|
|||||||
|
|
||||||
await checkDescriptionInEditModal(page, secondTaskValue);
|
await checkDescriptionInEditModal(page, secondTaskValue);
|
||||||
|
|
||||||
|
const resolveTask = page.waitForResponse('/api/v1/feed/tasks/*/resolve');
|
||||||
await page.getByText('OK').click();
|
await page.getByText('OK').click();
|
||||||
|
await resolveTask;
|
||||||
|
|
||||||
await toastNotification(page, /Task resolved successfully/);
|
await toastNotification(page, /Task resolved successfully/);
|
||||||
|
|
||||||
@ -394,17 +396,15 @@ test.describe('Activity feed', () => {
|
|||||||
expect(descriptionTask).toContain('Request to update description');
|
expect(descriptionTask).toContain('Request to update description');
|
||||||
|
|
||||||
// Check the editor send button is not visible and comment button is disabled when no text is added
|
// Check the editor send button is not visible and comment button is disabled when no text is added
|
||||||
expect(page.locator('[data-testid="send-button"]')).not.toBeVisible();
|
await expect(page.locator('[data-testid="send-button"]')).not.toBeVisible();
|
||||||
expect(
|
await expect(page.locator('[data-testid="comment-button"]')).toBeDisabled();
|
||||||
await page.locator('[data-testid="comment-button"]').isDisabled()
|
|
||||||
).toBeTruthy();
|
|
||||||
|
|
||||||
await page.fill(
|
await page.fill(
|
||||||
'[data-testid="editor-wrapper"] .ql-editor',
|
'[data-testid="editor-wrapper"] .ql-editor',
|
||||||
'Test comment added'
|
'Test comment added'
|
||||||
);
|
);
|
||||||
const addComment = page.waitForResponse('/api/v1/feed/*/posts');
|
const addComment = page.waitForResponse('/api/v1/feed/*/posts');
|
||||||
await page.getByTestId('comment-button').click({ force: true });
|
await page.getByTestId('comment-button').click();
|
||||||
await addComment;
|
await addComment;
|
||||||
|
|
||||||
// Close the task from the Button.Group, should throw error when no comment is added.
|
// Close the task from the Button.Group, should throw error when no comment is added.
|
||||||
@ -451,10 +451,12 @@ test.describe('Activity feed', () => {
|
|||||||
await page.getByTestId('request-description').click();
|
await page.getByTestId('request-description').click();
|
||||||
|
|
||||||
// create description task
|
// create description task
|
||||||
|
const waitForCountFetch1 = page.waitForResponse('/api/v1/feed/count?**');
|
||||||
const openTaskAfterDescriptionResponse =
|
const openTaskAfterDescriptionResponse =
|
||||||
page.waitForResponse(TASK_OPEN_FETCH_LINK);
|
page.waitForResponse(TASK_OPEN_FETCH_LINK);
|
||||||
await createDescriptionTask(page, value);
|
await createDescriptionTask(page, value);
|
||||||
await openTaskAfterDescriptionResponse;
|
await openTaskAfterDescriptionResponse;
|
||||||
|
await waitForCountFetch1;
|
||||||
|
|
||||||
// open task count after description
|
// open task count after description
|
||||||
const openTask1 = await page.getByTestId('open-task').textContent();
|
const openTask1 = await page.getByTestId('open-task').textContent();
|
||||||
@ -466,11 +468,11 @@ test.describe('Activity feed', () => {
|
|||||||
await page.getByTestId('request-entity-tags').click();
|
await page.getByTestId('request-entity-tags').click();
|
||||||
|
|
||||||
// create tag task
|
// create tag task
|
||||||
const waitForCountFetch = page.waitForResponse('/api/v1/feed/count?**');
|
const waitForCountFetch2 = page.waitForResponse('/api/v1/feed/count?**');
|
||||||
const openTaskAfterTagResponse = page.waitForResponse(TASK_OPEN_FETCH_LINK);
|
const openTaskAfterTagResponse = page.waitForResponse(TASK_OPEN_FETCH_LINK);
|
||||||
await createTagTask(page, { ...value, tag: 'PII.None' });
|
await createTagTask(page, { ...value, tag: 'PII.None' });
|
||||||
await openTaskAfterTagResponse;
|
await openTaskAfterTagResponse;
|
||||||
await waitForCountFetch;
|
await waitForCountFetch2;
|
||||||
|
|
||||||
// open task count after description
|
// open task count after description
|
||||||
await checkTaskCount(page, 2, 0);
|
await checkTaskCount(page, 2, 0);
|
||||||
@ -490,9 +492,9 @@ test.describe('Activity feed', () => {
|
|||||||
await page.getByRole('menuitem', { name: 'close' }).click();
|
await page.getByRole('menuitem', { name: 'close' }).click();
|
||||||
await commentWithCloseTask;
|
await commentWithCloseTask;
|
||||||
|
|
||||||
const waitForCountFetch2 = page.waitForResponse('/api/v1/feed/count?**');
|
const waitForCountFetch3 = page.waitForResponse('/api/v1/feed/count?**');
|
||||||
await toastNotification(page, 'Task closed successfully.');
|
await toastNotification(page, 'Task closed successfully.');
|
||||||
await waitForCountFetch2;
|
await waitForCountFetch3;
|
||||||
|
|
||||||
// open task count after closing one task
|
// open task count after closing one task
|
||||||
await checkTaskCount(page, 1, 1);
|
await checkTaskCount(page, 1, 1);
|
||||||
@ -601,10 +603,6 @@ base.describe('Activity feed with Data Consumer User', () => {
|
|||||||
resources: ['All'],
|
resources: ['All'],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
const viewAllUser = new UserClass();
|
|
||||||
const viewAllPolicy = new PolicyClass();
|
|
||||||
const viewAllRoles = new RolesClass();
|
|
||||||
let viewAllTeam: TeamClass;
|
|
||||||
|
|
||||||
base.beforeAll('Setup pre-requests', async ({ browser }) => {
|
base.beforeAll('Setup pre-requests', async ({ browser }) => {
|
||||||
const { afterAction, apiContext } = await performAdminLogin(browser);
|
const { afterAction, apiContext } = await performAdminLogin(browser);
|
||||||
@ -614,20 +612,6 @@ base.describe('Activity feed with Data Consumer User', () => {
|
|||||||
await entity3.create(apiContext);
|
await entity3.create(apiContext);
|
||||||
await user1.create(apiContext);
|
await user1.create(apiContext);
|
||||||
await user2.create(apiContext);
|
await user2.create(apiContext);
|
||||||
await viewAllUser.create(apiContext);
|
|
||||||
await viewAllPolicy.create(apiContext, rules);
|
|
||||||
await viewAllRoles.create(apiContext, [viewAllPolicy.responseData.name]);
|
|
||||||
viewAllTeam = new TeamClass({
|
|
||||||
name: `PW%team-${id}`,
|
|
||||||
displayName: `PW Team ${id}`,
|
|
||||||
description: 'playwright team description',
|
|
||||||
teamType: 'Group',
|
|
||||||
users: [viewAllUser.responseData.id],
|
|
||||||
defaultRoles: viewAllRoles.responseData.id
|
|
||||||
? [viewAllRoles.responseData.id]
|
|
||||||
: [],
|
|
||||||
});
|
|
||||||
await viewAllTeam.create(apiContext);
|
|
||||||
|
|
||||||
await afterAction();
|
await afterAction();
|
||||||
});
|
});
|
||||||
@ -639,10 +623,6 @@ base.describe('Activity feed with Data Consumer User', () => {
|
|||||||
await entity3.delete(apiContext);
|
await entity3.delete(apiContext);
|
||||||
await user1.delete(apiContext);
|
await user1.delete(apiContext);
|
||||||
await user2.delete(apiContext);
|
await user2.delete(apiContext);
|
||||||
await viewAllUser.delete(apiContext);
|
|
||||||
await viewAllPolicy.delete(apiContext);
|
|
||||||
await viewAllRoles.delete(apiContext);
|
|
||||||
await viewAllTeam.delete(apiContext);
|
|
||||||
|
|
||||||
await afterAction();
|
await afterAction();
|
||||||
});
|
});
|
||||||
@ -937,7 +917,29 @@ base.describe('Activity feed with Data Consumer User', () => {
|
|||||||
|
|
||||||
base(
|
base(
|
||||||
'Accepting task should throw error for not having edit permission',
|
'Accepting task should throw error for not having edit permission',
|
||||||
|
|
||||||
async ({ browser }) => {
|
async ({ browser }) => {
|
||||||
|
const { afterAction, apiContext } = await performAdminLogin(browser);
|
||||||
|
|
||||||
|
const viewAllUser = new UserClass();
|
||||||
|
const viewAllPolicy = new PolicyClass();
|
||||||
|
const viewAllRoles = new RolesClass();
|
||||||
|
|
||||||
|
await viewAllUser.create(apiContext);
|
||||||
|
await viewAllPolicy.create(apiContext, rules);
|
||||||
|
await viewAllRoles.create(apiContext, [viewAllPolicy.responseData.name]);
|
||||||
|
const viewAllTeam = new TeamClass({
|
||||||
|
name: `PW%team-${id}`,
|
||||||
|
displayName: `PW Team ${id}`,
|
||||||
|
description: 'playwright team description',
|
||||||
|
teamType: 'Group',
|
||||||
|
users: [viewAllUser.responseData.id],
|
||||||
|
defaultRoles: viewAllRoles.responseData.id
|
||||||
|
? [viewAllRoles.responseData.id]
|
||||||
|
: [],
|
||||||
|
});
|
||||||
|
await viewAllTeam.create(apiContext);
|
||||||
|
|
||||||
const { page: page1, afterAction: afterActionUser1 } =
|
const { page: page1, afterAction: afterActionUser1 } =
|
||||||
await performUserLogin(browser, user1);
|
await performUserLogin(browser, user1);
|
||||||
const { page: page2, afterAction: afterActionUser2 } =
|
const { page: page2, afterAction: afterActionUser2 } =
|
||||||
@ -948,39 +950,52 @@ base.describe('Activity feed with Data Consumer User', () => {
|
|||||||
assignee: viewAllUser.responseData.name,
|
assignee: viewAllUser.responseData.name,
|
||||||
};
|
};
|
||||||
|
|
||||||
await base.step('Create and Assign Task to user 3', async () => {
|
try {
|
||||||
await redirectToHomePage(page1);
|
await base.step('Create and Assign Task to user 3', async () => {
|
||||||
await entity3.visitEntityPage(page1);
|
await redirectToHomePage(page1);
|
||||||
|
await entity3.visitEntityPage(page1);
|
||||||
|
|
||||||
await page1.getByTestId('request-description').click();
|
await page1.getByTestId('request-description').click();
|
||||||
|
|
||||||
await createDescriptionTask(page1, value);
|
await createDescriptionTask(page1, value);
|
||||||
|
|
||||||
await afterActionUser1();
|
await afterActionUser1();
|
||||||
});
|
});
|
||||||
|
|
||||||
await base.step(
|
await base.step(
|
||||||
'Accept Task By user 2 should throw error for since it has only viewAll permission',
|
'Accept Task By user 2 should throw error for since it has only viewAll permission',
|
||||||
async () => {
|
async () => {
|
||||||
await redirectToHomePage(page2);
|
await redirectToHomePage(page2);
|
||||||
|
|
||||||
await entity3.visitEntityPage(page2);
|
await entity3.visitEntityPage(page2);
|
||||||
|
|
||||||
await page2.getByTestId('activity_feed').click();
|
await page2.getByTestId('activity_feed').click();
|
||||||
|
|
||||||
await page2.getByRole('menuitem', { name: 'Tasks' }).click();
|
const taskResponse = page2.waitForResponse(
|
||||||
|
'/api/v1/feed?entityLink=**type=Task&taskStatus=Open'
|
||||||
|
);
|
||||||
|
await page2.getByRole('menuitem', { name: 'Tasks' }).click();
|
||||||
|
await taskResponse;
|
||||||
|
|
||||||
await page2.getByText('Accept Suggestion').click();
|
await page2.getByText('Accept Suggestion').click();
|
||||||
|
|
||||||
await toastNotification(
|
await toastNotification(
|
||||||
page2,
|
page2,
|
||||||
// eslint-disable-next-line max-len
|
// eslint-disable-next-line max-len
|
||||||
`Principal: CatalogPrincipal{name='${viewAllUser.responseData.name}'} operation EditDescription denied by role ${viewAllRoles.responseData.name}, policy ${viewAllPolicy.responseData.name}, rule editNotAllowed`
|
`Principal: CatalogPrincipal{name='${viewAllUser.responseData.name}'} operation EditDescription denied by role ${viewAllRoles.responseData.name}, policy ${viewAllPolicy.responseData.name}, rule editNotAllowed`
|
||||||
);
|
);
|
||||||
|
|
||||||
await afterActionUser2();
|
await afterActionUser2();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
} finally {
|
||||||
|
await viewAllUser.delete(apiContext);
|
||||||
|
await viewAllPolicy.delete(apiContext);
|
||||||
|
await viewAllRoles.delete(apiContext);
|
||||||
|
await viewAllTeam.delete(apiContext);
|
||||||
|
|
||||||
|
await afterAction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -63,7 +63,12 @@ export const checkDescriptionInEditModal = async (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const deleteFeedComments = async (page: Page, feed: Locator) => {
|
export const deleteFeedComments = async (page: Page, feed: Locator) => {
|
||||||
await feed.click();
|
await feed.locator('.feed-reply-card-v2').click();
|
||||||
|
|
||||||
|
await page.waitForSelector('[data-testid="feed-actions"]', {
|
||||||
|
state: 'visible',
|
||||||
|
});
|
||||||
|
|
||||||
await page.locator('[data-testid="delete-message"]').click();
|
await page.locator('[data-testid="delete-message"]').click();
|
||||||
|
|
||||||
await page.waitForSelector('[role="dialog"].ant-modal');
|
await page.waitForSelector('[role="dialog"].ant-modal');
|
||||||
@ -88,14 +93,21 @@ export const reactOnFeed = async (page: Page) => {
|
|||||||
await page
|
await page
|
||||||
.locator('.ant-popover-feed-reactions .ant-popover-inner-content')
|
.locator('.ant-popover-feed-reactions .ant-popover-inner-content')
|
||||||
.waitFor({ state: 'visible' });
|
.waitFor({ state: 'visible' });
|
||||||
|
|
||||||
|
const waitForReactionResponse = page.waitForResponse('/api/v1/feed/*');
|
||||||
await page
|
await page
|
||||||
.locator(`[data-testid="reaction-button"][title="${reaction}"]`)
|
.locator(`[data-testid="reaction-button"][title="${reaction}"]`)
|
||||||
.click();
|
.click();
|
||||||
|
await waitForReactionResponse;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const addMentionCommentInFeed = async (page: Page, user: string) => {
|
export const addMentionCommentInFeed = async (page: Page, user: string) => {
|
||||||
|
const fetchFeedResponse = page.waitForResponse(
|
||||||
|
'/api/v1/feed?type=Conversation*'
|
||||||
|
);
|
||||||
await removeLandingBanner(page);
|
await removeLandingBanner(page);
|
||||||
|
await fetchFeedResponse;
|
||||||
|
|
||||||
// Click on add reply
|
// Click on add reply
|
||||||
const feedResponse = page.waitForResponse('/api/v1/feed/*');
|
const feedResponse = page.waitForResponse('/api/v1/feed/*');
|
||||||
|
|||||||
@ -21,7 +21,7 @@ import {
|
|||||||
ENTITY_PATH,
|
ENTITY_PATH,
|
||||||
} from '../support/entity/Entity.interface';
|
} from '../support/entity/Entity.interface';
|
||||||
import { UserClass } from '../support/user/UserClass';
|
import { UserClass } from '../support/user/UserClass';
|
||||||
import { descriptionBox, uuid } from './common';
|
import { clickOutside, descriptionBox, uuid } from './common';
|
||||||
|
|
||||||
export enum CustomPropertyType {
|
export enum CustomPropertyType {
|
||||||
STRING = 'String',
|
STRING = 'String',
|
||||||
@ -111,7 +111,7 @@ export const setValueForProperty = async (data: {
|
|||||||
await page.click('#enumValues');
|
await page.click('#enumValues');
|
||||||
await page.fill('#enumValues', value);
|
await page.fill('#enumValues', value);
|
||||||
await page.press('#enumValues', 'Enter');
|
await page.press('#enumValues', 'Enter');
|
||||||
await page.mouse.click(0, 0);
|
await clickOutside(page);
|
||||||
await page.click('[data-testid="inline-save-btn"]');
|
await page.click('[data-testid="inline-save-btn"]');
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -543,8 +543,8 @@ export const addCustomPropertiesForEntity = async ({
|
|||||||
await page.click('#root\\/enumConfig');
|
await page.click('#root\\/enumConfig');
|
||||||
await page.fill('#root\\/enumConfig', val);
|
await page.fill('#root\\/enumConfig', val);
|
||||||
await page.press('#root\\/enumConfig', 'Enter');
|
await page.press('#root\\/enumConfig', 'Enter');
|
||||||
await page.mouse.click(0, 0);
|
|
||||||
}
|
}
|
||||||
|
await clickOutside(page);
|
||||||
|
|
||||||
if (enumConfig.multiSelect) {
|
if (enumConfig.multiSelect) {
|
||||||
await page.click('#root\\/multiSelect');
|
await page.click('#root\\/multiSelect');
|
||||||
@ -621,14 +621,14 @@ export const editCreatedProperty = async (
|
|||||||
await page.click('#root\\/customPropertyConfig');
|
await page.click('#root\\/customPropertyConfig');
|
||||||
await page.fill('#root\\/customPropertyConfig', 'updatedValue');
|
await page.fill('#root\\/customPropertyConfig', 'updatedValue');
|
||||||
await page.press('#root\\/customPropertyConfig', 'Enter');
|
await page.press('#root\\/customPropertyConfig', 'Enter');
|
||||||
await page.mouse.click(0, 0);
|
await clickOutside(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ENTITY_REFERENCE_PROPERTIES.includes(type ?? '')) {
|
if (ENTITY_REFERENCE_PROPERTIES.includes(type ?? '')) {
|
||||||
await page.click('#root\\/customPropertyConfig');
|
await page.click('#root\\/customPropertyConfig');
|
||||||
await page.fill('#root\\/customPropertyConfig', 'Table');
|
await page.fill('#root\\/customPropertyConfig', 'Table');
|
||||||
await page.press('#root\\/customPropertyConfig', 'Enter');
|
await page.press('#root\\/customPropertyConfig', 'Enter');
|
||||||
await page.mouse.click(0, 0);
|
await clickOutside(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
const patchRequest = page.waitForResponse('/api/v1/metadata/types/*');
|
const patchRequest = page.waitForResponse('/api/v1/metadata/types/*');
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import { expect, Page } from '@playwright/test';
|
import { expect, Page } from '@playwright/test';
|
||||||
import { lowerCase } from 'lodash';
|
import { isEmpty, lowerCase } from 'lodash';
|
||||||
import {
|
import {
|
||||||
customFormatDateTime,
|
customFormatDateTime,
|
||||||
getCurrentMillis,
|
getCurrentMillis,
|
||||||
@ -325,9 +325,13 @@ export const updateDescription = async (page: Page, description: string) => {
|
|||||||
await page.locator('.ProseMirror').first().fill(description);
|
await page.locator('.ProseMirror').first().fill(description);
|
||||||
await page.getByTestId('save').click();
|
await page.getByTestId('save').click();
|
||||||
|
|
||||||
await expect(
|
isEmpty(description)
|
||||||
page.getByTestId('asset-description-container').getByRole('paragraph')
|
? await expect(
|
||||||
).toContainText(description);
|
page.getByTestId('asset-description-container')
|
||||||
|
).toContainText('No description')
|
||||||
|
: await expect(
|
||||||
|
page.getByTestId('asset-description-container').getByRole('paragraph')
|
||||||
|
).toContainText(description);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const assignTag = async (
|
export const assignTag = async (
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user