diff --git a/ingestion/setup.py b/ingestion/setup.py index 625904a3087..28f1a0389ba 100644 --- a/ingestion/setup.py +++ b/ingestion/setup.py @@ -62,7 +62,7 @@ base_plugins = { plugins: Dict[str, Set[str]] = { "amundsen": {"neo4j~=4.4.0"}, "athena": {"PyAthena[SQLAlchemy]"}, - "bigquery": {"sqlalchemy-bigquery==1.2.2", "pyarrow-6.0.1"}, + "bigquery": {"sqlalchemy-bigquery==1.2.2", "pyarrow~=6.0.1"}, "bigquery-usage": {"google-cloud-logging", "cachetools"}, # "docker": {"docker==5.0.3"}, "docker": {"python_on_whales==0.34.0"}, diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Modals/RulesModal/AddRuleModal.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Modals/RulesModal/AddRuleModal.tsx index 652cc84bec8..854ac870d6c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Modals/RulesModal/AddRuleModal.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Modals/RulesModal/AddRuleModal.tsx @@ -101,6 +101,7 @@ const AddRuleModal: FC = ({ 'focus:tw-outline-none focus:tw-border-focus hover:tw-border-hover tw-h-10 tw-bg-white', { 'tw-cursor-not-allowed tw-opacity-60': isEditing } )} + data-testid="select-operation" disabled={isEditing} name="operation" value={data.operation} @@ -123,6 +124,7 @@ const AddRuleModal: FC = ({ className="tw-text-sm tw-appearance-none tw-border tw-border-main tw-rounded tw-w-full tw-py-2 tw-px-3 tw-text-grey-body tw-leading-tight focus:tw-outline-none focus:tw-border-focus hover:tw-border-hover tw-h-10 tw-bg-white" + data-testid="select-access" name="access" value={access} onChange={(e) => setAccess(e.target.value as RuleAccess)}> diff --git a/openmetadata-ui/src/test/java/org/openmetadata/catalog/selenium/pages/roles/RolesPageTest.java b/openmetadata-ui/src/test/java/org/openmetadata/catalog/selenium/pages/roles/RolesPageTest.java new file mode 100644 index 00000000000..75132f7f013 --- /dev/null +++ b/openmetadata-ui/src/test/java/org/openmetadata/catalog/selenium/pages/roles/RolesPageTest.java @@ -0,0 +1,136 @@ +package org.openmetadata.catalog.selenium.pages.roles; + +import com.github.javafaker.Faker; +import java.time.Duration; +import java.util.ArrayList; +import java.util.logging.Logger; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.openmetadata.catalog.selenium.events.Events; +import org.openmetadata.catalog.selenium.properties.Property; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.Assert; + +@Order(19) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class RolesPageTest { + + private static final Logger LOG = Logger.getLogger(RolesPageTest.class.getName()); + + static WebDriver webDriver; + static String url = Property.getInstance().getURL(); + static Faker faker = new Faker(); + static String roleDisplayName = faker.name().firstName(); + static String enterDescription = "//div[@data-testid='enterDescription']/div/div[2]/div/div/div/div/div/div"; + static Actions actions; + static WebDriverWait wait; + Integer waitTime = Property.getInstance().getSleepTime(); + + @BeforeEach + public void openMetadataWindow() { + System.setProperty("webdriver.chrome.driver", "src/test/resources/drivers/linux/chromedriver"); + ChromeOptions options = new ChromeOptions(); + options.addArguments("--headless"); + options.addArguments("--window-size=1280,800"); + webDriver = new ChromeDriver(options); + actions = new Actions(webDriver); + wait = new WebDriverWait(webDriver, Duration.ofSeconds(30)); + webDriver.manage().window().maximize(); + webDriver.get(url); + } + + @Test + @Order(1) + public void openRolesPage() throws InterruptedException { + Events.click(webDriver, By.cssSelector("[data-testid='closeWhatsNew']")); // Close What's new + Events.click(webDriver, By.cssSelector("[data-testid='menu-button'][id='menu-button-Settings']")); // Setting + Events.click(webDriver, By.cssSelector("[data-testid='menu-item-Roles']")); // Setting/Roles + Thread.sleep(waitTime); + } + + @Test + @Order(2) + public void addRole() throws InterruptedException { + openRolesPage(); + Events.click(webDriver, By.cssSelector("[data-testid='add-role']")); + Events.sendKeys(webDriver, By.name("name"), faker.name().firstName()); // name + Events.sendKeys(webDriver, By.name("displayName"), roleDisplayName); // displayName + Events.sendKeys(webDriver, By.xpath(enterDescription), faker.address().toString()); + Events.click(webDriver, By.cssSelector("[data-testid='boldButton']")); + Events.click(webDriver, By.cssSelector("[data-testid='italicButton']")); + Events.click(webDriver, By.cssSelector("[data-testid='linkButton']")); + Events.click(webDriver, By.cssSelector("[data-testid='saveButton']")); + } + + @Test + @Order(3) + public void editDescription() throws InterruptedException { + openRolesPage(); + Events.click(webDriver, By.xpath("//*[text()[contains(.,'" + roleDisplayName + "')]] ")); + Events.click(webDriver, By.cssSelector("[data-testid='edit-description']")); + wait.until(ExpectedConditions.elementToBeClickable(By.xpath(enterDescription))); + Events.sendKeys(webDriver, By.xpath(enterDescription), faker.address().toString()); + Events.click(webDriver, By.cssSelector("[data-testid='save']")); + } + + @Test + @Order(4) + public void addRules() throws InterruptedException { + openRolesPage(); + Events.click(webDriver, By.xpath("//*[text()[contains(.,'" + roleDisplayName + "')]] ")); + Events.click(webDriver, By.cssSelector("[data-testid='add-new-user-button']")); + Events.click(webDriver, By.cssSelector("[data-testid='select-operation']")); + Events.click(webDriver, By.cssSelector("[value='UpdateDescription']")); + Events.click(webDriver, By.cssSelector("[data-testid='select-access']")); + Events.click(webDriver, By.cssSelector("[value='allow']")); + Events.click(webDriver, By.cssSelector("[data-testid='rule-switch']")); + Events.click(webDriver, By.cssSelector("[data-testid='saveButton']")); + } + + @Test + @Order(5) + public void editRule() throws InterruptedException { + openRolesPage(); + Events.click(webDriver, By.xpath("//*[text()[contains(.,'" + roleDisplayName + "')]] ")); + Events.click(webDriver, By.xpath("//tbody[@data-testid='table-body']/tr/td[4]/div/span")); + Events.click(webDriver, By.cssSelector("[data-testid='select-access']")); + Events.click(webDriver, By.cssSelector("[value='deny']")); + Events.click(webDriver, By.cssSelector("[data-testid='saveButton']")); + Thread.sleep(2000); + String access = + webDriver.findElement(By.xpath("//tbody[@data-testid='table-body']/tr/td[2]/p")).getAttribute("innerHTML"); + Assert.assertEquals(access, "DENY"); + } + + @Test + @Order(6) + public void deleteRule() throws InterruptedException { + openRolesPage(); + Events.click(webDriver, By.xpath("//*[text()[contains(.,'" + roleDisplayName + "')]] ")); + Events.click(webDriver, By.cssSelector("[data-testid='image'][title='Delete']")); + Events.click(webDriver, By.cssSelector("[data-testid='save-button']")); + } + + @AfterEach + public void closeTabs() { + ArrayList tabs = new ArrayList<>(webDriver.getWindowHandles()); + String originalHandle = webDriver.getWindowHandle(); + for (String handle : webDriver.getWindowHandles()) { + if (!handle.equals(originalHandle)) { + webDriver.switchTo().window(handle); + webDriver.close(); + } + } + webDriver.switchTo().window(tabs.get(0)).close(); + } +}