Merge branch '1.5.5' of github.com:open-metadata/OpenMetadata into 1.5.5

This commit is contained in:
Pere Miquel Brull 2024-09-20 16:07:16 +02:00
commit c75378f8e8
15 changed files with 263 additions and 165 deletions

View File

@ -45,7 +45,7 @@ VERSIONS = {
"sqlalchemy-databricks": "sqlalchemy-databricks~=0.1", "sqlalchemy-databricks": "sqlalchemy-databricks~=0.1",
"databricks-sdk": "databricks-sdk>=0.18.0,<0.20.0", "databricks-sdk": "databricks-sdk>=0.18.0,<0.20.0",
"trino": "trino[sqlalchemy]", "trino": "trino[sqlalchemy]",
"spacy": "spacy~=3.7", "spacy": "spacy<3.8",
"looker-sdk": "looker-sdk>=22.20.0", "looker-sdk": "looker-sdk>=22.20.0",
"lkml": "lkml~=1.3", "lkml": "lkml~=1.3",
"tableau": "tableau-api-lib~=0.1", "tableau": "tableau-api-lib~=0.1",

View File

@ -7,6 +7,7 @@ source:
username: username username: username
password: password password: password
securityToken: securityToken securityToken: securityToken
organizationId: organizationId
sobjectName: sobjectName sobjectName: sobjectName
# sslConfig: # sslConfig:
# caCertificate: | # caCertificate: |

View File

@ -15,7 +15,6 @@ Source connection handler
from typing import Optional from typing import Optional
from simple_salesforce.api import Salesforce from simple_salesforce.api import Salesforce
from sqlalchemy.engine import Engine
from metadata.generated.schema.entity.automations.workflow import ( from metadata.generated.schema.entity.automations.workflow import (
Workflow as AutomationWorkflow, Workflow as AutomationWorkflow,
@ -27,14 +26,17 @@ from metadata.ingestion.connections.test_connections import test_connection_step
from metadata.ingestion.ometa.ometa_api import OpenMetadata from metadata.ingestion.ometa.ometa_api import OpenMetadata
def get_connection(connection: SalesforceConnection) -> Engine: def get_connection(connection: SalesforceConnection) -> Salesforce:
""" """
Create connection Create connection
""" """
return Salesforce( return Salesforce(
username=connection.username, username=connection.username,
password=connection.password.get_secret_value(), password=connection.password.get_secret_value(),
security_token=connection.securityToken.get_secret_value(), security_token=connection.securityToken.get_secret_value()
if connection.securityToken
else "",
organizationId=connection.organizationId if connection.organizationId else "",
domain=connection.salesforceDomain, domain=connection.salesforceDomain,
version=connection.salesforceApiVersion, version=connection.salesforceApiVersion,
**connection.connectionArguments.root if connection.connectionArguments else {}, **connection.connectionArguments.root if connection.connectionArguments else {},

View File

@ -49,6 +49,13 @@ These are the permissions you will require to fetch the metadata from Salesforce
- **Username**: Username to connect to the Salesforce. This user should have the access as defined in requirements. - **Username**: Username to connect to the Salesforce. This user should have the access as defined in requirements.
- **Password**: Password to connect to Salesforce. - **Password**: Password to connect to Salesforce.
- **Security Token**: Salesforce Security Token is required to access the metadata through APIs. You can checkout [this doc](https://help.salesforce.com/s/articleView?id=sf.user_security_token.htm&type=5) on how to get the security token. - **Security Token**: Salesforce Security Token is required to access the metadata through APIs. You can checkout [this doc](https://help.salesforce.com/s/articleView?id=sf.user_security_token.htm&type=5) on how to get the security token.
- **Organization ID**: Salesforce Organization ID is the unique identifier for your Salesforce identity. You can check out [this doc](https://help.salesforce.com/s/articleView?id=000385215&type=1) on how to get the your Salesforce Organization ID.
{% note %}
**Note**: You need to provide `15` digit organization id in this section. for e.g. `00DIB000004nDEq`, which you can find by following the steps mentioned in above doc (`Salesforce dashboard->Setup->Company Profile->Company Information->Salesforce.com Organization Id`).
{% /note %}
{% note %}
**Note**: If you want to access salesforce metadata without token(only by using organization id), you will need to setup your ip in trusted ip ranges. You can go (`Salesforce dashboard->Setup->Security->Network Access->Trusted IP Ranges`) to configure this. You can check [here](https://help.salesforce.com/s/articleView?id=sf.security_networkaccess.htm&type=5) to configure your ip in trusted ip ranges.
{% /note %}
- **Salesforce Object Name**: Specify the Salesforce Object Name in case you want to ingest a specific object. If left blank, we will ingest all the Objects. - **Salesforce Object Name**: Specify the Salesforce Object Name in case you want to ingest a specific object. If left blank, we will ingest all the Objects.
- **Salesforce API Version**: Follow the steps mentioned [here](https://help.salesforce.com/s/articleView?id=000386929&type=1) to get the API version. Enter the numerical value in the field, For example `42.0`. - **Salesforce API Version**: Follow the steps mentioned [here](https://help.salesforce.com/s/articleView?id=000386929&type=1) to get the API version. Enter the numerical value in the field, For example `42.0`.
- **Salesforce Domain**: When connecting to Salesforce, you can specify the domain to use for accessing the platform. The common domains include `login` and `test`, and you can also utilize Salesforce My Domain. - **Salesforce Domain**: When connecting to Salesforce, you can specify the domain to use for accessing the platform. The common domains include `login` and `test`, and you can also utilize Salesforce My Domain.

View File

@ -83,18 +83,30 @@ This is a sample config for Salesforce:
{% codeInfo srNumber=5 %} {% codeInfo srNumber=5 %}
**sobjectName**: Specify the Salesforce Object Name in case you want to ingest a specific object. If left blank, we will ingest all the Objects. **Organization ID**: Salesforce Organization ID is the unique identifier for your Salesforce identity. You can check out [this doc](https://help.salesforce.com/s/articleView?id=000385215&type=1) on how to get the your Salesforce Organization ID.
{% note %}
**Note**: You need to provide `15` digit organization id in this section. for e.g. `00DIB000004nDEq`, which you can find by following the steps mentioned in above doc (`Salesforce dashboard->Setup->Company Profile->Company Information->Salesforce.com Organization Id`).
{% /note %}
{% note %}
**Note**: If you want to access salesforce metadata without token(only by using organization id), you will need to setup your ip in trusted ip ranges. You can go (`Salesforce dashboard->Setup->Security->Network Access->Trusted IP Ranges`) to configure this. You can check [here](https://help.salesforce.com/s/articleView?id=sf.security_networkaccess.htm&type=5) to configure your ip in trusted ip ranges.
{% /note %}
{% /codeInfo %} {% /codeInfo %}
{% codeInfo srNumber=6 %} {% codeInfo srNumber=6 %}
**salesforceApiVersion**: Follow the steps mentioned [here](https://help.salesforce.com/s/articleView?id=000386929&type=1) to get the API version. Enter the numerical value in the field, For example `42.0`. **sobjectName**: Specify the Salesforce Object Name in case you want to ingest a specific object. If left blank, we will ingest all the Objects.
{% /codeInfo %} {% /codeInfo %}
{% codeInfo srNumber=7 %} {% codeInfo srNumber=7 %}
**salesforceApiVersion**: Follow the steps mentioned [here](https://help.salesforce.com/s/articleView?id=000386929&type=1) to get the API version. Enter the numerical value in the field, For example `42.0`.
{% /codeInfo %}
{% codeInfo srNumber=8 %}
**salesforceDomain**: When connecting to Salesforce, you can specify the domain to use for accessing the platform. The common domains include `login` and `test`, and you can also utilize Salesforce My Domain. **salesforceDomain**: When connecting to Salesforce, you can specify the domain to use for accessing the platform. The common domains include `login` and `test`, and you can also utilize Salesforce My Domain.
By default, the domain `login` is used for accessing Salesforce. By default, the domain `login` is used for accessing Salesforce.
@ -108,13 +120,13 @@ By default, the domain `login` is used for accessing Salesforce.
#### Advanced Configuration #### Advanced Configuration
{% codeInfo srNumber=8 %} {% codeInfo srNumber=9 %}
**Connection Options (Optional)**: Enter the details for any additional connection options that can be sent to database during the connection. These details must be added as Key-Value pairs. **Connection Options (Optional)**: Enter the details for any additional connection options that can be sent to database during the connection. These details must be added as Key-Value pairs.
{% /codeInfo %} {% /codeInfo %}
{% codeInfo srNumber=9 %} {% codeInfo srNumber=10 %}
**Connection Arguments (Optional)**: Enter the details for any additional connection arguments such as security or protocol configs that can be sent to database during the connection. These details must be added as Key-Value pairs. **Connection Arguments (Optional)**: Enter the details for any additional connection arguments such as security or protocol configs that can be sent to database during the connection. These details must be added as Key-Value pairs.
@ -144,19 +156,22 @@ source:
securityToken: securityToken securityToken: securityToken
``` ```
```yaml {% srNumber=5 %} ```yaml {% srNumber=5 %}
sobjectName: sobjectName organizationId: organizationId
``` ```
```yaml {% srNumber=6 %} ```yaml {% srNumber=6 %}
salesforceApiVersion: 42.0 sobjectName: sobjectName
``` ```
```yaml {% srNumber=7 %} ```yaml {% srNumber=7 %}
salesforceDomain: login salesforceApiVersion: 42.0
``` ```
```yaml {% srNumber=8 %} ```yaml {% srNumber=8 %}
salesforceDomain: login
```
```yaml {% srNumber=9 %}
# connectionOptions: # connectionOptions:
# key: value # key: value
``` ```
```yaml {% srNumber=9 %} ```yaml {% srNumber=10 %}
# connectionArguments: # connectionArguments:
# key: value # key: value
``` ```

View File

@ -13,6 +13,7 @@ slug: /main-concepts/metadata-standard/schemas/entity/services/connections/datab
- **`username`** *(string)*: Username to connect to the Salesforce. This user should have privileges to read all the metadata in Redshift. - **`username`** *(string)*: Username to connect to the Salesforce. This user should have privileges to read all the metadata in Redshift.
- **`password`** *(string)*: Password to connect to the Salesforce. - **`password`** *(string)*: Password to connect to the Salesforce.
- **`securityToken`** *(string)*: Salesforce Security Token. - **`securityToken`** *(string)*: Salesforce Security Token.
- **`organizationId`** *(string)*: Salesforce Organization ID.
- **`sobjectName`** *(string)*: Salesforce Object Name. - **`sobjectName`** *(string)*: Salesforce Object Name.
- **`databaseName`** *(string)*: Optional name to give to the database in OpenMetadata. If left blank, we will use default as the database name. - **`databaseName`** *(string)*: Optional name to give to the database in OpenMetadata. If left blank, we will use default as the database name.
- **`salesforceApiVersion`** *(string)*: API version of the Salesforce instance. Default: `42.0`. - **`salesforceApiVersion`** *(string)*: API version of the Salesforce instance. Default: `42.0`.

View File

@ -49,6 +49,13 @@ These are the permissions you will require to fetch the metadata from Salesforce
- **Username**: Username to connect to the Salesforce. This user should have the access as defined in requirements. - **Username**: Username to connect to the Salesforce. This user should have the access as defined in requirements.
- **Password**: Password to connect to Salesforce. - **Password**: Password to connect to Salesforce.
- **Security Token**: Salesforce Security Token is required to access the metadata through APIs. You can checkout [this doc](https://help.salesforce.com/s/articleView?id=sf.user_security_token.htm&type=5) on how to get the security token. - **Security Token**: Salesforce Security Token is required to access the metadata through APIs. You can checkout [this doc](https://help.salesforce.com/s/articleView?id=sf.user_security_token.htm&type=5) on how to get the security token.
- **Organization ID**: Salesforce Organization ID is the unique identifier for your Salesforce identity. You can check out [this doc](https://help.salesforce.com/s/articleView?id=000385215&type=1) on how to get the your Salesforce Organization ID.
{% note %}
**Note**: You need to provide `15` digit organization id in this section. for e.g. `00DIB000004nDEq`, which you can find by following the steps mentioned in above doc (`Salesforce dashboard->Setup->Company Profile->Company Information->Salesforce.com Organization Id`).
{% /note %}
{% note %}
**Note**: If you want to access salesforce metadata without token(only by using organization id), you will need to setup your ip in trusted ip ranges. You can go (`Salesforce dashboard->Setup->Security->Network Access->Trusted IP Ranges`) to configure this. You can check [here](https://help.salesforce.com/s/articleView?id=sf.security_networkaccess.htm&type=5) to configure your ip in trusted ip ranges.
{% /note %}
- **Salesforce Object Name**: Specify the Salesforce Object Name in case you want to ingest a specific object. If left blank, we will ingest all the Objects. - **Salesforce Object Name**: Specify the Salesforce Object Name in case you want to ingest a specific object. If left blank, we will ingest all the Objects.
- **Salesforce API Version**: Follow the steps mentioned [here](https://help.salesforce.com/s/articleView?id=000386929&type=1) to get the API version. Enter the numerical value in the field, For example `42.0`. - **Salesforce API Version**: Follow the steps mentioned [here](https://help.salesforce.com/s/articleView?id=000386929&type=1) to get the API version. Enter the numerical value in the field, For example `42.0`.
- **Salesforce Domain**: When connecting to Salesforce, you can specify the domain to use for accessing the platform. The common domains include `login` and `test`, and you can also utilize Salesforce My Domain. - **Salesforce Domain**: When connecting to Salesforce, you can specify the domain to use for accessing the platform. The common domains include `login` and `test`, and you can also utilize Salesforce My Domain.

View File

@ -83,17 +83,28 @@ This is a sample config for Salesforce:
{% codeInfo srNumber=5 %} {% codeInfo srNumber=5 %}
**Organization ID**: Salesforce Organization ID is the unique identifier for your Salesforce identity. You can check out [this doc](https://help.salesforce.com/s/articleView?id=000385215&type=1) on how to get the your Salesforce Organization ID.
{% note %}
**Note**: You need to provide `15` digit organization id in this section. for e.g. `00DIB000004nDEq`, which you can find by following the steps mentioned in above doc (`Salesforce dashboard->Setup->Company Profile->Company Information->Salesforce.com Organization Id`).
{% /note %}
{% note %}
**Note**: If you want to access salesforce metadata without token(only by using organization id), you will need to setup your ip in trusted ip ranges. You can go (`Salesforce dashboard->Setup->Security->Network Access->Trusted IP Ranges`) to configure this. You can check [here](https://help.salesforce.com/s/articleView?id=sf.security_networkaccess.htm&type=5) to configure your ip in trusted ip ranges.
{% /note %}
{% /codeInfo %}
{% codeInfo srNumber=6 %}
**sobjectName**: Specify the Salesforce Object Name in case you want to ingest a specific object. If left blank, we will ingest all the Objects. **sobjectName**: Specify the Salesforce Object Name in case you want to ingest a specific object. If left blank, we will ingest all the Objects.
{% /codeInfo %} {% /codeInfo %}
{% codeInfo srNumber=6 %} {% codeInfo srNumber=7 %}
**salesforceApiVersion**: Follow the steps mentioned [here](https://help.salesforce.com/s/articleView?id=000386929&type=1) to get the API version. Enter the numerical value in the field, For example `42.0`. **salesforceApiVersion**: Follow the steps mentioned [here](https://help.salesforce.com/s/articleView?id=000386929&type=1) to get the API version. Enter the numerical value in the field, For example `42.0`.
{% /codeInfo %} {% /codeInfo %}
{% codeInfo srNumber=7 %} {% codeInfo srNumber=8 %}
**salesforceDomain**: When connecting to Salesforce, you can specify the domain to use for accessing the platform. The common domains include `login` and `test`, and you can also utilize Salesforce My Domain. **salesforceDomain**: When connecting to Salesforce, you can specify the domain to use for accessing the platform. The common domains include `login` and `test`, and you can also utilize Salesforce My Domain.
By default, the domain `login` is used for accessing Salesforce. By default, the domain `login` is used for accessing Salesforce.
@ -108,13 +119,13 @@ By default, the domain `login` is used for accessing Salesforce.
#### Advanced Configuration #### Advanced Configuration
{% codeInfo srNumber=8 %} {% codeInfo srNumber=9 %}
**Connection Options (Optional)**: Enter the details for any additional connection options that can be sent to database during the connection. These details must be added as Key-Value pairs. **Connection Options (Optional)**: Enter the details for any additional connection options that can be sent to database during the connection. These details must be added as Key-Value pairs.
{% /codeInfo %} {% /codeInfo %}
{% codeInfo srNumber=9 %} {% codeInfo srNumber=10 %}
**Connection Arguments (Optional)**: Enter the details for any additional connection arguments such as security or protocol configs that can be sent to database during the connection. These details must be added as Key-Value pairs. **Connection Arguments (Optional)**: Enter the details for any additional connection arguments such as security or protocol configs that can be sent to database during the connection. These details must be added as Key-Value pairs.
@ -144,19 +155,22 @@ source:
securityToken: securityToken securityToken: securityToken
``` ```
```yaml {% srNumber=5 %} ```yaml {% srNumber=5 %}
sobjectName: sobjectName organizationId: organizationId
``` ```
```yaml {% srNumber=6 %} ```yaml {% srNumber=6 %}
salesforceApiVersion: 42.0 sobjectName: sobjectName
``` ```
```yaml {% srNumber=7 %} ```yaml {% srNumber=7 %}
salesforceDomain: login salesforceApiVersion: 42.0
``` ```
```yaml {% srNumber=8 %} ```yaml {% srNumber=8 %}
salesforceDomain: login
```
```yaml {% srNumber=9 %}
# connectionOptions: # connectionOptions:
# key: value # key: value
``` ```
```yaml {% srNumber=9 %} ```yaml {% srNumber=10 %}
# connectionArguments: # connectionArguments:
# key: value # key: value
``` ```

View File

@ -13,6 +13,7 @@ slug: /main-concepts/metadata-standard/schemas/entity/services/connections/datab
- **`username`** *(string)*: Username to connect to the Salesforce. This user should have privileges to read all the metadata in Redshift. - **`username`** *(string)*: Username to connect to the Salesforce. This user should have privileges to read all the metadata in Redshift.
- **`password`** *(string)*: Password to connect to the Salesforce. - **`password`** *(string)*: Password to connect to the Salesforce.
- **`securityToken`** *(string)*: Salesforce Security Token. - **`securityToken`** *(string)*: Salesforce Security Token.
- **`organizationId`** *(string)*: Salesforce Organization ID.
- **`sobjectName`** *(string)*: Salesforce Object Name. - **`sobjectName`** *(string)*: Salesforce Object Name.
- **`databaseName`** *(string)*: Optional name to give to the database in OpenMetadata. If left blank, we will use default as the database name. - **`databaseName`** *(string)*: Optional name to give to the database in OpenMetadata. If left blank, we will use default as the database name.
- **`salesforceApiVersion`** *(string)*: API version of the Salesforce instance. Default: `42.0`. - **`salesforceApiVersion`** *(string)*: API version of the Salesforce instance. Default: `42.0`.

View File

@ -37,6 +37,11 @@
"type": "string", "type": "string",
"format": "password" "format": "password"
}, },
"organizationId": {
"title": "Salesforce Organization ID",
"description": "Salesforce Organization ID is the unique identifier for your Salesforce identity",
"type": "string"
},
"sobjectName": { "sobjectName": {
"title": "Object Name", "title": "Object Name",
"description": "Salesforce Object Name.", "description": "Salesforce Object Name.",

View File

@ -275,6 +275,8 @@ test.describe('Observability Alert Flow', () => {
test(`${sourceDisplayName} alert`, async ({ page }) => { test(`${sourceDisplayName} alert`, async ({ page }) => {
const ALERT_NAME = generateAlertName(); const ALERT_NAME = generateAlertName();
test.slow(true);
await test.step('Create alert', async () => { await test.step('Create alert', async () => {
await inputBasicAlertInformation({ await inputBasicAlertInformation({
page, page,

View File

@ -70,14 +70,16 @@ test.afterAll('Cleanup', async ({ browser }) => {
for (const EntityClass of entities) { for (const EntityClass of entities) {
const defaultEntity = new EntityClass(); const defaultEntity = new EntityClass();
test.fixme( test(`Lineage creation from ${defaultEntity.getType()} entity`, async ({
`Lineage creation from ${defaultEntity.getType()} entity`, browser,
async ({ browser }) => { }) => {
test.slow(true); test.slow(true);
const { page } = await createNewPage(browser); const { page } = await createNewPage(browser);
const { currentEntity, entities, cleanup } = const { currentEntity, entities, cleanup } = await setupEntitiesForLineage(
await setupEntitiesForLineage(page, defaultEntity); page,
defaultEntity
);
await test.step('Should create lineage for the entity', async () => { await test.step('Should create lineage for the entity', async () => {
await redirectToHomePage(page); await redirectToHomePage(page);
@ -111,9 +113,7 @@ for (const EntityClass of entities) {
} }
}); });
await test.step( await test.step('Remove lineage between nodes for the entity', async () => {
'Remove lineage between nodes for the entity',
async () => {
await redirectToHomePage(page); await redirectToHomePage(page);
await currentEntity.visitEntityPage(page); await currentEntity.visitEntityPage(page);
await visitLineageTab(page); await visitLineageTab(page);
@ -123,15 +123,13 @@ for (const EntityClass of entities) {
for (const entity of entities) { for (const entity of entities) {
await deleteEdge(page, currentEntity, entity); await deleteEdge(page, currentEntity, entity);
} }
} });
);
await cleanup(); await cleanup();
} });
);
} }
test.fixme('Verify column lineage between tables', async ({ browser }) => { test('Verify column lineage between tables', async ({ browser }) => {
const { page } = await createNewPage(browser); const { page } = await createNewPage(browser);
const { apiContext, afterAction } = await getApiContext(page); const { apiContext, afterAction } = await getApiContext(page);
const table1 = new TableClass(); const table1 = new TableClass();
@ -169,9 +167,7 @@ test.fixme('Verify column lineage between tables', async ({ browser }) => {
await afterAction(); await afterAction();
}); });
test.fixme( test('Verify column lineage between table and topic', async ({ browser }) => {
'Verify column lineage between table and topic',
async ({ browser }) => {
const { page } = await createNewPage(browser); const { page } = await createNewPage(browser);
const { apiContext, afterAction } = await getApiContext(page); const { apiContext, afterAction } = await getApiContext(page);
const table = new TableClass(); const table = new TableClass();
@ -204,12 +200,11 @@ test.fixme(
await topic.delete(apiContext); await topic.delete(apiContext);
await afterAction(); await afterAction();
} });
);
test.fixme( test('Verify column lineage between topic and api endpoint', async ({
'Verify column lineage between topic and api endpoint', browser,
async ({ browser }) => { }) => {
const { page } = await createNewPage(browser); const { page } = await createNewPage(browser);
const { apiContext, afterAction } = await getApiContext(page); const { apiContext, afterAction } = await getApiContext(page);
const topic = new TopicClass(); const topic = new TopicClass();
@ -243,12 +238,11 @@ test.fixme(
await apiEndpoint.delete(apiContext); await apiEndpoint.delete(apiContext);
await afterAction(); await afterAction();
} });
);
test.fixme( test('Verify column lineage between table and api endpoint', async ({
'Verify column lineage between table and api endpoint', browser,
async ({ browser }) => { }) => {
const { page } = await createNewPage(browser); const { page } = await createNewPage(browser);
const { apiContext, afterAction } = await getApiContext(page); const { apiContext, afterAction } = await getApiContext(page);
const table = new TableClass(); const table = new TableClass();
@ -281,5 +275,4 @@ test.fixme(
await apiEndpoint.delete(apiContext); await apiEndpoint.delete(apiContext);
await afterAction(); await afterAction();
} });
);

View File

@ -348,6 +348,11 @@ export const assignTag = async (
await searchTags; await searchTags;
await page.getByTestId(`tag-${tag}`).click(); await page.getByTestId(`tag-${tag}`).click();
await page.waitForSelector(
'.ant-select-dropdown [data-testid="saveAssociatedTag"]',
{ state: 'visible' }
);
await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled(); await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled();
await page.getByTestId('saveAssociatedTag').click(); await page.getByTestId('saveAssociatedTag').click();
@ -393,6 +398,11 @@ export const assignTagToChildren = async ({
(response) => response.request().method() === 'PATCH' (response) => response.request().method() === 'PATCH'
); );
await page.waitForSelector(
'.ant-select-dropdown [data-testid="saveAssociatedTag"]',
{ state: 'visible' }
);
await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled(); await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled();
await page.getByTestId('saveAssociatedTag').click(); await page.getByTestId('saveAssociatedTag').click();
@ -425,6 +435,11 @@ export const removeTag = async (page: Page, tags: string[]) => {
(response) => response.request().method() === 'PATCH' (response) => response.request().method() === 'PATCH'
); );
await page.waitForSelector(
'.ant-select-dropdown [data-testid="saveAssociatedTag"]',
{ state: 'visible' }
);
await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled(); await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled();
await page.getByTestId('saveAssociatedTag').click(); await page.getByTestId('saveAssociatedTag').click();
@ -467,6 +482,11 @@ export const removeTagsFromChildren = async ({
(response) => response.request().method() === 'PATCH' (response) => response.request().method() === 'PATCH'
); );
await page.waitForSelector(
'.ant-select-dropdown [data-testid="saveAssociatedTag"]',
{ state: 'visible' }
);
await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled(); await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled();
await page.getByTestId('saveAssociatedTag').click(); await page.getByTestId('saveAssociatedTag').click();
@ -507,6 +527,11 @@ export const assignGlossaryTerm = async (
await searchGlossaryTerm; await searchGlossaryTerm;
await page.getByTestId(`tag-${glossaryTerm.fullyQualifiedName}`).click(); await page.getByTestId(`tag-${glossaryTerm.fullyQualifiedName}`).click();
await page.waitForSelector(
'.ant-select-dropdown [data-testid="saveAssociatedTag"]',
{ state: 'visible' }
);
await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled(); await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled();
await page.getByTestId('saveAssociatedTag').click(); await page.getByTestId('saveAssociatedTag').click();
@ -549,6 +574,11 @@ export const assignGlossaryTermToChildren = async ({
(response) => response.request().method() === 'PATCH' (response) => response.request().method() === 'PATCH'
); );
await page.waitForSelector(
'.ant-select-dropdown [data-testid="saveAssociatedTag"]',
{ state: 'visible' }
);
await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled(); await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled();
await page.getByTestId('saveAssociatedTag').click(); await page.getByTestId('saveAssociatedTag').click();
@ -585,6 +615,11 @@ export const removeGlossaryTerm = async (
(response) => response.request().method() === 'PATCH' (response) => response.request().method() === 'PATCH'
); );
await page.waitForSelector(
'.ant-select-dropdown [data-testid="saveAssociatedTag"]',
{ state: 'visible' }
);
await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled(); await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled();
await page.getByTestId('saveAssociatedTag').click(); await page.getByTestId('saveAssociatedTag').click();
@ -628,6 +663,11 @@ export const removeGlossaryTermFromChildren = async ({
(response) => response.request().method() === 'PATCH' (response) => response.request().method() === 'PATCH'
); );
await page.waitForSelector(
'.ant-select-dropdown [data-testid="saveAssociatedTag"]',
{ state: 'visible' }
);
await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled(); await expect(page.getByTestId('saveAssociatedTag')).toBeEnabled();
await page.getByTestId('saveAssociatedTag').click(); await page.getByTestId('saveAssociatedTag').click();

View File

@ -867,7 +867,7 @@ export const createDescriptionTaskForGlossary = async (
await assigneeField.click(); await assigneeField.click();
const userSearchResponse = page.waitForResponse( const userSearchResponse = page.waitForResponse(
`/api/v1/search/query?q=*${value.assignee}**&index=user_search_index%2Cteam_search_index` `/api/v1/search/suggest?q=${value.assignee}&index=user_search_index%2Cteam_search_index`
); );
await assigneeField.fill(value.assignee); await assigneeField.fill(value.assignee);
await userSearchResponse; await userSearchResponse;
@ -922,7 +922,7 @@ export const createTagTaskForGlossary = async (
); );
await assigneeField.click(); await assigneeField.click();
const userSearchResponse = page.waitForResponse( const userSearchResponse = page.waitForResponse(
`/api/v1/search/query?q=*${value.assignee}**&index=user_search_index%2Cteam_search_index` `/api/v1/search/suggest?q=${value.assignee}&index=user_search_index%2Cteam_search_index`
); );
await assigneeField.fill(value.assignee); await assigneeField.fill(value.assignee);
await userSearchResponse; await userSearchResponse;

View File

@ -32,6 +32,16 @@ $$section
Salesforce Security Token is required to access the metadata through APIs. You can check out [this doc](https://help.salesforce.com/s/articleView?id=sf.user_security_token.htm&type=5) on how to get the security token. Salesforce Security Token is required to access the metadata through APIs. You can check out [this doc](https://help.salesforce.com/s/articleView?id=sf.user_security_token.htm&type=5) on how to get the security token.
$$ $$
$$section
### Organization ID $(id="organizationId")
Salesforce Organization ID is the unique identifier for your Salesforce identity. You can check out [this doc](https://help.salesforce.com/s/articleView?id=000385215&type=1) on how to get the your Salesforce Organization ID.
**Note**: You need to provide `15` digit organization id in this section. for e.g. `00DIB000004nDEq`, which you can find by following the steps mentioned in above doc (`Salesforce dashboard->Setup->Company Profile->Company Information->Salesforce.com Organization Id`).
**Note**: If you want to access salesforce metadata without token(only by using organization id), you will need to setup your ip in trusted ip ranges. You can go (`Salesforce dashboard->Setup->Security->Network Access->Trusted IP Ranges`) to configure this. You can check [here](https://help.salesforce.com/s/articleView?id=sf.security_networkaccess.htm&type=5) to configure your ip in trusted ip ranges.
$$
$$section $$section
### Object Name $(id="sobjectName") ### Object Name $(id="sobjectName")