[e2e] Update module structure (#2641)
This commit is contained in:
parent
bae5c39cf2
commit
eb062359a9
35 changed files with 166 additions and 228 deletions
|
@ -13,6 +13,7 @@ import com.provectus.kafka.ui.api.model.TopicCreation;
|
|||
import com.provectus.kafka.ui.models.Connector;
|
||||
import com.provectus.kafka.ui.models.Schema;
|
||||
import com.provectus.kafka.ui.models.Topic;
|
||||
import com.provectus.kafka.ui.settings.Source;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.reactive.function.client.WebClientResponseException;
|
||||
|
@ -21,7 +22,7 @@ import java.util.HashMap;
|
|||
import java.util.Map;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.sleep;
|
||||
import static com.provectus.kafka.ui.extensions.FileUtils.fileToString;
|
||||
import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
|
||||
|
||||
|
||||
@Slf4j
|
||||
|
@ -29,7 +30,7 @@ public class ApiHelper {
|
|||
|
||||
int partitions = 1;
|
||||
int replicationFactor = 1;
|
||||
String baseURL = TestConfiguration.BASE_API_URL;
|
||||
String baseURL = Source.BASE_API_URL;
|
||||
|
||||
|
||||
@SneakyThrows
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
package com.provectus.kafka.ui.helpers;
|
||||
|
||||
public class TestConfiguration {
|
||||
public static boolean CLEAR_REPORTS_DIR =
|
||||
Boolean.parseBoolean(System.getProperty("CLEAR_REPORTS_DIR", "true"));
|
||||
public static String BASE_API_URL = System.getProperty("BASE_URL", "http://localhost:8080");
|
||||
public static String BASE_WEB_URL = System.getProperty("BASE_DOCKER_URL", "http://host.testcontainers.internal:8080");
|
||||
public static boolean USE_LOCAL_BROWSER =
|
||||
Boolean.parseBoolean(System.getProperty("USE_LOCAL_BROWSER", "true"));
|
||||
public static String REPORTS_FOLDER = System.getProperty("REPORTS_FOLDER", "allure-results");
|
||||
public static Boolean SCREENSHOTS =
|
||||
Boolean.parseBoolean(System.getProperty("SCREENSHOTS", "true"));
|
||||
public static Boolean SAVE_PAGE_SOURCE =
|
||||
Boolean.parseBoolean(System.getProperty("SAVE_PAGE_SOURCE", "false"));
|
||||
public static Boolean REOPEN_BROWSER_ON_FAIL =
|
||||
Boolean.parseBoolean(System.getProperty("REOPEN_BROWSER_ON_FAIL", "true"));
|
||||
public static String BROWSER = System.getProperty("BROWSER", "chromium");
|
||||
public static String BROWSER_SIZE = System.getProperty("BROWSER_SIZE", "1920x1080");
|
||||
public static Boolean ENABLE_VNC = Boolean.parseBoolean(System.getProperty("ENABLE_VNC", "true"));
|
||||
|
||||
}
|
|
@ -3,8 +3,8 @@ package com.provectus.kafka.ui.pages;
|
|||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.Selenide;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.extensions.WaitUtils;
|
||||
import com.provectus.kafka.ui.helpers.TestConfiguration;
|
||||
import com.provectus.kafka.ui.utilities.WaitUtils;
|
||||
import com.provectus.kafka.ui.settings.Source;
|
||||
import io.qameta.allure.Step;
|
||||
import lombok.experimental.ExtensionMethod;
|
||||
import org.openqa.selenium.By;
|
||||
|
@ -19,7 +19,7 @@ public class MainPage {
|
|||
|
||||
@Step
|
||||
public MainPage goTo() {
|
||||
Selenide.open(TestConfiguration.BASE_WEB_URL + path);
|
||||
Selenide.open(Source.BASE_WEB_URL + path);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,15 +2,15 @@ package com.provectus.kafka.ui.pages.connector;
|
|||
|
||||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.extensions.WaitUtils;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import com.provectus.kafka.ui.utilities.WaitUtils;
|
||||
import io.qameta.allure.Step;
|
||||
import lombok.experimental.ExtensionMethod;
|
||||
import org.openqa.selenium.By;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.$;
|
||||
import static com.codeborne.selenide.Selenide.sleep;
|
||||
import static com.provectus.kafka.ui.screenshots.Screenshooter.log;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
import static com.provectus.kafka.ui.utilities.screenshots.Screenshooter.log;
|
||||
|
||||
@ExtensionMethod(WaitUtils.class)
|
||||
public class ConnectorCreateView {
|
||||
|
@ -28,7 +28,7 @@ public class ConnectorCreateView {
|
|||
contentTextArea.setValue("");
|
||||
contentTextArea.setValue(String.valueOf(configJson.toCharArray()));
|
||||
nameField.click();
|
||||
BrowserUtils.javaExecutorClick(submitButton);
|
||||
javaExecutorClick(submitButton);
|
||||
sleep(4000);
|
||||
log.info("Connector config is submitted");
|
||||
return new ConnectorsView();
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
package com.provectus.kafka.ui.pages.connector;
|
||||
|
||||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import io.qameta.allure.Step;
|
||||
import org.openqa.selenium.By;
|
||||
import org.openqa.selenium.Keys;
|
||||
|
||||
import static com.codeborne.selenide.Selectors.byLinkText;
|
||||
import static com.codeborne.selenide.Selenide.*;
|
||||
import static com.provectus.kafka.ui.screenshots.Screenshooter.log;
|
||||
|
||||
public class ConnectorUpdateView {
|
||||
SelenideElement submitButton = $(By.xpath("//button[@type='submit']"));
|
||||
SelenideElement contentTextArea = $("[wrap]");
|
||||
|
||||
|
||||
@Step("Update connector from new JSON")
|
||||
public ConnectorUpdateView updateConnectorConfig(String configJson) {
|
||||
BrowserUtils.javaExecutorClick($("#config"));
|
||||
String str = configJson.replace("\r\n", "");
|
||||
executeJavaScript(
|
||||
"function clearAndNot(){" +
|
||||
"var editor = ace.edit('config');" +
|
||||
"editor.setValue(\"\");" +
|
||||
"editor.setValue('" + str + "');}" +
|
||||
"clearAndNot();");
|
||||
$("#config").click();
|
||||
submitButton.click();
|
||||
$(byLinkText("Edit Config")).shouldBe(Condition.visible);
|
||||
sleep(3000);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Step("Set connector config JSON")
|
||||
public ConnectorsView updConnectorConfig(String configJson) {
|
||||
$("#config").click();
|
||||
contentTextArea.sendKeys(Keys.LEFT_CONTROL+"a");
|
||||
contentTextArea.setValue("");
|
||||
contentTextArea.setValue(String.valueOf(configJson.toCharArray()));
|
||||
$("#config").click();
|
||||
submitButton.shouldBe(Condition.enabled);
|
||||
BrowserUtils.javaExecutorClick(submitButton);
|
||||
sleep(4000);
|
||||
log.info("Connector config is submitted");
|
||||
return new ConnectorsView();
|
||||
}
|
||||
}
|
|
@ -2,16 +2,16 @@ package com.provectus.kafka.ui.pages.connector;
|
|||
|
||||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.Selenide;
|
||||
import com.provectus.kafka.ui.extensions.WaitUtils;
|
||||
import com.provectus.kafka.ui.helpers.TestConfiguration;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import com.provectus.kafka.ui.utilities.WaitUtils;
|
||||
import com.provectus.kafka.ui.settings.Source;
|
||||
import io.qameta.allure.Step;
|
||||
import lombok.experimental.ExtensionMethod;
|
||||
import org.openqa.selenium.By;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.$;
|
||||
import static com.codeborne.selenide.Selenide.$x;
|
||||
import static com.provectus.kafka.ui.extensions.WebUtils.isVisible;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
|
||||
@ExtensionMethod(WaitUtils.class)
|
||||
public class ConnectorsList {
|
||||
|
@ -20,7 +20,7 @@ public class ConnectorsList {
|
|||
|
||||
@Step("Open URL to {cluster}")
|
||||
public ConnectorsList goTo(String cluster) {
|
||||
Selenide.open(TestConfiguration.BASE_WEB_URL + String.format(path, cluster));
|
||||
Selenide.open(Source.BASE_WEB_URL + String.format(path, cluster));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,7 @@ public class ConnectorsList {
|
|||
|
||||
@Step("Click on button 'Create Connector'")
|
||||
public ConnectorCreateView clickCreateConnectorButton() {
|
||||
BrowserUtils.javaExecutorClick($x("//button[text()='Create Connector']"));
|
||||
javaExecutorClick($x("//button[text()='Create Connector']"));
|
||||
return new ConnectorCreateView();
|
||||
}
|
||||
|
||||
|
|
|
@ -3,44 +3,62 @@ package com.provectus.kafka.ui.pages.connector;
|
|||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.Selenide;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.helpers.TestConfiguration;
|
||||
import com.provectus.kafka.ui.extensions.WaitUtils;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import com.provectus.kafka.ui.settings.Source;
|
||||
import com.provectus.kafka.ui.utilities.WaitUtils;
|
||||
import io.qameta.allure.Step;
|
||||
import lombok.experimental.ExtensionMethod;
|
||||
import org.openqa.selenium.By;
|
||||
import org.openqa.selenium.Keys;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.$;
|
||||
import static com.codeborne.selenide.Selenide.$x;
|
||||
import static com.codeborne.selenide.Selenide.*;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
import static com.provectus.kafka.ui.utilities.screenshots.Screenshooter.log;
|
||||
|
||||
@ExtensionMethod(WaitUtils.class)
|
||||
public class ConnectorsView {
|
||||
private static final String path = "/ui/clusters/%s/connects/first/connectors/%s";
|
||||
protected SelenideElement submitButton = $(By.xpath("//button[@type='submit']"));
|
||||
protected SelenideElement contentTextArea = $("[wrap]");
|
||||
|
||||
@Step
|
||||
public ConnectorsView goTo(String cluster, String connector) {
|
||||
Selenide.open(String.format(TestConfiguration.BASE_WEB_URL + path, cluster, connector));
|
||||
Selenide.open(String.format(Source.BASE_WEB_URL + path, cluster, connector));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Step()
|
||||
public ConnectorUpdateView openConfigTab() {
|
||||
BrowserUtils.javaExecutorClick($(By.xpath("//a[text() ='Config']")));
|
||||
return new ConnectorUpdateView();
|
||||
public ConnectorsView openConfigTab() {
|
||||
javaExecutorClick($(By.xpath("//a[text() ='Config']")));
|
||||
return new ConnectorsView();
|
||||
}
|
||||
|
||||
@Step("Set connector config JSON")
|
||||
public ConnectorsView setConfig(String configJson) {
|
||||
$("#config").click();
|
||||
contentTextArea.sendKeys(Keys.LEFT_CONTROL+"a");
|
||||
contentTextArea.setValue("");
|
||||
contentTextArea.setValue(String.valueOf(configJson.toCharArray()));
|
||||
$("#config").click();
|
||||
submitButton.shouldBe(Condition.enabled);
|
||||
javaExecutorClick(submitButton);
|
||||
sleep(4000);
|
||||
log.info("Connector config is submitted");
|
||||
return new ConnectorsView();
|
||||
}
|
||||
|
||||
@Step("Click 'Delete' button")
|
||||
public void clickDeleteButton() {
|
||||
BrowserUtils.javaExecutorClick($x("//button[text()='Delete']"));
|
||||
javaExecutorClick($x("//button[text()='Delete']"));
|
||||
SelenideElement confirmButton = $x("//div[@role=\"dialog\"]//button[text()='Confirm']");
|
||||
confirmButton.shouldBe(Condition.enabled).click();
|
||||
confirmButton.shouldBe(Condition.disappear);
|
||||
}
|
||||
|
||||
@Step
|
||||
public void connectorIsVisibleOnOverview() {
|
||||
public ConnectorsView waitUntilScreenReady() {
|
||||
$(By.xpath("//a[text() ='Tasks']")).shouldBe(Condition.visible);
|
||||
$(By.xpath("//a[text() ='Config']")).shouldBe(Condition.visible);
|
||||
$(By.xpath("//a[text() ='Overview']")).shouldBe(Condition.visible);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,12 +2,12 @@ package com.provectus.kafka.ui.pages.schema;
|
|||
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.api.model.SchemaType;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import io.qameta.allure.Step;
|
||||
import org.openqa.selenium.By;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.$;
|
||||
import static com.codeborne.selenide.Selenide.$x;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
|
||||
public class SchemaCreateView {
|
||||
|
||||
|
@ -22,7 +22,7 @@ public class SchemaCreateView {
|
|||
}
|
||||
@Step
|
||||
public SchemaView clickSubmit() {
|
||||
BrowserUtils.javaExecutorClick(submitSchemaButton);
|
||||
javaExecutorClick(submitSchemaButton);
|
||||
return new SchemaView();
|
||||
}
|
||||
@Step
|
||||
|
|
|
@ -5,13 +5,13 @@ import com.codeborne.selenide.Selenide;
|
|||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.api.model.CompatibilityLevel;
|
||||
import com.provectus.kafka.ui.api.model.SchemaType;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import io.qameta.allure.Step;
|
||||
import org.openqa.selenium.By;
|
||||
import org.openqa.selenium.Keys;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.$;
|
||||
import static com.codeborne.selenide.Selenide.$x;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
|
||||
public class SchemaEditView {
|
||||
|
||||
|
@ -32,7 +32,7 @@ public class SchemaEditView {
|
|||
}
|
||||
@Step
|
||||
public SchemaView clickSubmit() {
|
||||
BrowserUtils.javaExecutorClick($(By.xpath("//button[@type='submit']")));
|
||||
javaExecutorClick($(By.xpath("//button[@type='submit']")));
|
||||
return new SchemaView();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,12 +2,12 @@ package com.provectus.kafka.ui.pages.schema;
|
|||
|
||||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import io.qameta.allure.Step;
|
||||
import org.openqa.selenium.By;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.*;
|
||||
import static com.provectus.kafka.ui.extensions.WebUtils.isVisible;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
|
||||
public class SchemaRegistryList {
|
||||
|
||||
|
@ -15,7 +15,7 @@ public class SchemaRegistryList {
|
|||
|
||||
@Step
|
||||
public SchemaCreateView clickCreateSchema() {
|
||||
BrowserUtils.javaExecutorClick(schemaButton);
|
||||
javaExecutorClick(schemaButton);
|
||||
return new SchemaCreateView();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,11 +2,12 @@ package com.provectus.kafka.ui.pages.schema;
|
|||
|
||||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import io.qameta.allure.Step;
|
||||
import org.openqa.selenium.By;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.*;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
|
||||
public class SchemaView {
|
||||
|
||||
protected SelenideElement dotMenuBtn = $$x("//button[@aria-label='Dropdown Toggle']").first();
|
||||
|
@ -29,7 +30,7 @@ public class SchemaView {
|
|||
}
|
||||
@Step
|
||||
public SchemaRegistryList removeSchema() {
|
||||
BrowserUtils.javaExecutorClick(dotMenuBtn);
|
||||
javaExecutorClick(dotMenuBtn);
|
||||
$(By.xpath("//*[contains(text(),'Remove')]")).click();
|
||||
SelenideElement confirmButton = $x("//div[@role=\"dialog\"]//button[text()='Confirm']");
|
||||
confirmButton.shouldBe(Condition.enabled).click();
|
||||
|
|
|
@ -6,9 +6,9 @@ import com.codeborne.selenide.ElementsCollection;
|
|||
import com.codeborne.selenide.SelenideElement;
|
||||
import io.qameta.allure.Step;
|
||||
import org.openqa.selenium.By;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.*;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class TopicCreateEditSettingsView {
|
||||
|
@ -83,7 +83,7 @@ public class TopicCreateEditSettingsView {
|
|||
}
|
||||
@Step
|
||||
public TopicView sendData() {
|
||||
BrowserUtils.javaExecutorClick($x("//button[@type='submit']"));
|
||||
javaExecutorClick($x("//button[@type='submit']"));
|
||||
return new TopicView();
|
||||
}
|
||||
@Step
|
||||
|
|
|
@ -3,14 +3,14 @@ package com.provectus.kafka.ui.pages.topic;
|
|||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.Selenide;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import com.provectus.kafka.ui.extensions.WaitUtils;
|
||||
import com.provectus.kafka.ui.helpers.TestConfiguration;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import com.provectus.kafka.ui.utilities.WaitUtils;
|
||||
import com.provectus.kafka.ui.settings.Source;
|
||||
import io.qameta.allure.Step;
|
||||
import lombok.experimental.ExtensionMethod;
|
||||
import org.openqa.selenium.By;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.*;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
|
||||
@ExtensionMethod({WaitUtils.class})
|
||||
public class TopicView {
|
||||
|
@ -20,7 +20,7 @@ public class TopicView {
|
|||
|
||||
@Step
|
||||
public TopicView goTo(String cluster, String topic) {
|
||||
Selenide.open(TestConfiguration.BASE_WEB_URL + String.format(URL_PATH, cluster, topic));
|
||||
Selenide.open(Source.BASE_WEB_URL + String.format(URL_PATH, cluster, topic));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,7 @@ public class TopicView {
|
|||
|
||||
@Step
|
||||
public TopicCreateEditSettingsView openEditSettings() {
|
||||
BrowserUtils.javaExecutorClick(dotMenuBtn);
|
||||
javaExecutorClick(dotMenuBtn);
|
||||
$x("//li[@role][text()='Edit settings']").click();
|
||||
return new TopicCreateEditSettingsView();
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ public class TopicView {
|
|||
|
||||
@Step
|
||||
public TopicsList deleteTopic() {
|
||||
BrowserUtils.javaExecutorClick(dotMenuBtn);
|
||||
javaExecutorClick(dotMenuBtn);
|
||||
$x("//ul[@role='menu']//div[text()='Remove Topic']").click();
|
||||
SelenideElement confirmButton = $x("//div[@role=\"dialog\"]//button[text()='Confirm']");
|
||||
confirmButton.shouldBe(Condition.enabled).click();
|
||||
|
@ -55,7 +55,7 @@ public class TopicView {
|
|||
|
||||
@Step
|
||||
public ProduceMessagePanel clickOnButton(String buttonName) {
|
||||
BrowserUtils.javaExecutorClick($(By.xpath(String.format("//div//button[text()='%s']", buttonName))));
|
||||
javaExecutorClick($(By.xpath(String.format("//div//button[text()='%s']", buttonName))));
|
||||
return new ProduceMessagePanel();
|
||||
}
|
||||
|
||||
|
|
|
@ -3,15 +3,15 @@ package com.provectus.kafka.ui.pages.topic;
|
|||
import com.codeborne.selenide.CollectionCondition;
|
||||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.Selenide;
|
||||
import com.provectus.kafka.ui.extensions.WaitUtils;
|
||||
import com.provectus.kafka.ui.helpers.TestConfiguration;
|
||||
import com.provectus.kafka.ui.utils.BrowserUtils;
|
||||
import com.provectus.kafka.ui.utilities.WaitUtils;
|
||||
import com.provectus.kafka.ui.settings.Source;
|
||||
import io.qameta.allure.Step;
|
||||
import lombok.experimental.ExtensionMethod;
|
||||
import org.openqa.selenium.By;
|
||||
|
||||
import static com.codeborne.selenide.Selenide.*;
|
||||
import static com.provectus.kafka.ui.extensions.WebUtils.isVisible;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.isVisible;
|
||||
import static com.provectus.kafka.ui.utilities.WebUtils.javaExecutorClick;
|
||||
|
||||
@ExtensionMethod(WaitUtils.class)
|
||||
public class TopicsList {
|
||||
|
@ -20,7 +20,7 @@ public class TopicsList {
|
|||
|
||||
@Step
|
||||
public TopicsList goTo(String cluster) {
|
||||
Selenide.open(TestConfiguration.BASE_WEB_URL + String.format(path, cluster));
|
||||
Selenide.open(Source.BASE_WEB_URL + String.format(path, cluster));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@ public class TopicsList {
|
|||
|
||||
@Step
|
||||
public TopicCreateEditSettingsView pressCreateNewTopic() {
|
||||
BrowserUtils.javaExecutorClick($x("//button[normalize-space(text()) ='Add a Topic']"));
|
||||
javaExecutorClick($x("//button[normalize-space(text()) ='Add a Topic']"));
|
||||
return new TopicCreateEditSettingsView();
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
package com.provectus.kafka.ui.settings;
|
||||
|
||||
public abstract class Source {
|
||||
|
||||
public static String BASE_API_URL = System.getProperty("BASE_URL", "http://localhost:8080");
|
||||
public static String BASE_WEB_URL = System.getProperty("BASE_DOCKER_URL", "http://host.testcontainers.internal:8080");
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package com.provectus.kafka.ui.extensions;
|
||||
package com.provectus.kafka.ui.utilities;
|
||||
|
||||
import org.testcontainers.shaded.org.apache.commons.io.IOUtils;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.provectus.kafka.ui.extensions;
|
||||
package com.provectus.kafka.ui.utilities;
|
||||
|
||||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.SelenideElement;
|
|
@ -1,12 +1,17 @@
|
|||
package com.provectus.kafka.ui.extensions;
|
||||
package com.provectus.kafka.ui.utilities;
|
||||
|
||||
import com.codeborne.selenide.Condition;
|
||||
import com.codeborne.selenide.Selenide;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class WebUtils {
|
||||
|
||||
public static void javaExecutorClick(SelenideElement element){
|
||||
Selenide.executeJavaScript("arguments[0].click();", element);
|
||||
}
|
||||
|
||||
public static boolean isVisible(SelenideElement element) {
|
||||
boolean isVisible = false;
|
||||
try {
|
|
@ -1,12 +1,11 @@
|
|||
package com.provectus.kafka.ui.utils;
|
||||
package com.provectus.kafka.ui.utilities.qaseIoUtils;
|
||||
|
||||
import org.junit.jupiter.api.DisplayNameGenerator;
|
||||
import org.junit.platform.commons.util.ClassUtils;
|
||||
import org.junit.platform.commons.util.Preconditions;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class CamelCaseToSpacedDisplayNameGenerator implements DisplayNameGenerator {
|
||||
public class DisplayNameGenerator implements org.junit.jupiter.api.DisplayNameGenerator {
|
||||
@Override
|
||||
public String generateDisplayNameForClass(Class<?> testClass) {
|
||||
String name = testClass.getName();
|
|
@ -1,6 +1,5 @@
|
|||
package com.provectus.kafka.ui.extensions;
|
||||
package com.provectus.kafka.ui.utilities.qaseIoUtils;
|
||||
|
||||
import com.provectus.kafka.ui.utils.qaseIO.TestCaseGenerator;
|
||||
import io.qase.api.QaseClient;
|
||||
import io.qase.api.StepStorage;
|
||||
import io.qase.api.exceptions.QaseException;
|
||||
|
@ -41,11 +40,9 @@ public class QaseExtension implements TestExecutionListener {
|
|||
|
||||
static {
|
||||
String qaseApiToken = System.getProperty("QASEIO_API_TOKEN");
|
||||
|
||||
if (qaseApiToken == null || StringUtils.isEmpty(qaseApiToken)) {
|
||||
throw new RuntimeException("QaseIO API token should be present");
|
||||
}
|
||||
|
||||
if ("true".equalsIgnoreCase(System.getProperty("QASEIO_CREATE_TESTRUN"))) {
|
||||
System.setProperty("QASE_RUN_NAME", "Automation run " +
|
||||
new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
|
||||
|
@ -56,7 +53,6 @@ public class QaseExtension implements TestExecutionListener {
|
|||
System.setProperty("QASE_USE_BULK", "false");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void executionStarted(TestIdentifier testIdentifier) {
|
||||
if (QaseClient.isEnabled() && testIdentifier.isTest()) {
|
|
@ -1,7 +1,8 @@
|
|||
package com.provectus.kafka.ui.utils.qaseIO;
|
||||
package com.provectus.kafka.ui.utilities.qaseIoUtils;
|
||||
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.Suite;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
|
||||
import io.qase.api.QaseClient;
|
||||
import io.qase.api.annotation.CaseId;
|
||||
import io.qase.client.ApiClient;
|
||||
|
@ -9,14 +10,13 @@ import io.qase.client.api.CasesApi;
|
|||
import io.qase.client.model.*;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.junit.Assert;
|
||||
import org.junit.platform.engine.support.descriptor.MethodSource;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
|
||||
import static io.qase.api.QaseClient.getConfig;
|
||||
|
||||
|
@ -146,9 +146,18 @@ public class TestCaseGenerator {
|
|||
return true;
|
||||
}
|
||||
|
||||
private static String formatTestCaseTitle(String testMethodName) {
|
||||
String[] split = StringUtils.splitByCharacterTypeCamelCase(testMethodName);
|
||||
String[] name = Arrays.stream(split).map(String::toLowerCase).toArray(String[]::new);
|
||||
String[] subarray = ArrayUtils.subarray(name, 1, name.length);
|
||||
ArrayList<String> stringList = new ArrayList<>(Arrays.asList(subarray));
|
||||
stringList.add(0, StringUtils.capitalize(name[0]));
|
||||
return StringUtils.join(stringList, " ");
|
||||
}
|
||||
|
||||
public static String generateTestCaseTitle(Method testMethod) {
|
||||
return getClassName(MethodSource.from(testMethod)) + "." + testMethod.getName() + " : " +
|
||||
MethodNameUtils.formatTestCaseTitle(testMethod.getName());
|
||||
formatTestCaseTitle(testMethod.getName());
|
||||
}
|
||||
|
||||
private static String getClassName(MethodSource testSource) {
|
|
@ -1,6 +1,6 @@
|
|||
package com.provectus.kafka.ui.utils.qaseIO.annotation;
|
||||
package com.provectus.kafka.ui.utilities.qaseIoUtils.annotations;
|
||||
|
||||
import com.provectus.kafka.ui.utils.qaseIO.Status;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
|
@ -1,4 +1,4 @@
|
|||
package com.provectus.kafka.ui.utils.qaseIO.annotation;
|
||||
package com.provectus.kafka.ui.utilities.qaseIoUtils.annotations;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
|
@ -1,4 +1,4 @@
|
|||
package com.provectus.kafka.ui.utils.qaseIO;
|
||||
package com.provectus.kafka.ui.utilities.qaseIoUtils.enums;
|
||||
|
||||
public enum Status {
|
||||
AUTOMATED, TO_BE_AUTOMATED, MANUAL;
|
|
@ -1,4 +1,4 @@
|
|||
package com.provectus.kafka.ui.screenshots;
|
||||
package com.provectus.kafka.ui.utilities.screenshots;
|
||||
|
||||
public class NoReferenceScreenshotFoundException extends Throwable {
|
||||
public NoReferenceScreenshotFoundException(String name) {
|
|
@ -1,4 +1,4 @@
|
|||
package com.provectus.kafka.ui.screenshots;
|
||||
package com.provectus.kafka.ui.utilities.screenshots;
|
||||
|
||||
import io.qameta.allure.Allure;
|
||||
import io.qameta.allure.Attachment;
|
||||
|
@ -29,7 +29,7 @@ public class Screenshooter {
|
|||
private static final int PIXELS_THRESHOLD =
|
||||
Integer.parseInt(System.getProperty("PIXELS_THRESHOLD", "200"));
|
||||
private static final String SCREENSHOTS_FOLDER =
|
||||
System.getProperty("SCREENSHOTS_FOLDER", "com/provectus/kafka/ui/screenshots/");
|
||||
System.getProperty("SCREENSHOTS_FOLDER", "com/provectus/kafka/ui/utilities/screenshots/");
|
||||
private static final String DIFF_SCREENSHOTS_FOLDER =
|
||||
System.getProperty("DIFF_SCREENSHOTS_FOLDER", "build/__diff__/");
|
||||
private static final String ACTUAL_SCREENSHOTS_FOLDER =
|
|
@ -1,23 +0,0 @@
|
|||
package com.provectus.kafka.ui.utils;
|
||||
|
||||
import com.codeborne.selenide.Selenide;
|
||||
import com.codeborne.selenide.SelenideElement;
|
||||
import org.openqa.selenium.NoSuchElementException;
|
||||
|
||||
public class BrowserUtils {
|
||||
|
||||
public static void javaExecutorClick(SelenideElement element){
|
||||
Selenide.executeJavaScript("arguments[0].click();", element);
|
||||
}
|
||||
|
||||
public static void waitElementPresentJavaExecutor( SelenideElement element ) {
|
||||
try {
|
||||
Selenide.executeJavaScript("return typeof(arguments[0]) != 'undefined' && arguments[0] != null;",
|
||||
element);
|
||||
}
|
||||
catch(org.openqa.selenium.StaleElementReferenceException | NoSuchElementException ex){
|
||||
Selenide.executeJavaScript("return typeof(arguments[0]) != 'undefined' && arguments[0] != null;",
|
||||
element);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package com.provectus.kafka.ui.utils.qaseIO;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class MethodNameUtils {
|
||||
|
||||
public static String formatTestCaseTitle(String testMethodName) {
|
||||
String[] split = StringUtils.splitByCharacterTypeCamelCase(testMethodName);
|
||||
|
||||
String[] name = Arrays.stream(split).map(String::toLowerCase).toArray(String[]::new);
|
||||
|
||||
String[] subarray = ArrayUtils.subarray(name, 1, name.length);
|
||||
|
||||
ArrayList<String> stringList = new ArrayList<>(Arrays.asList(subarray));
|
||||
stringList.add(0, StringUtils.capitalize(name[0]));
|
||||
|
||||
return StringUtils.join(stringList, " ");
|
||||
}
|
||||
}
|
|
@ -1 +1 @@
|
|||
com.provectus.kafka.ui.extensions.QaseExtension
|
||||
com.provectus.kafka.ui.utilities.qaseIoUtils.QaseExtension
|
|
@ -1,8 +1,8 @@
|
|||
package com.provectus.kafka.ui;
|
||||
|
||||
import com.provectus.kafka.ui.base.BaseTest;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.Status;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
|
||||
import io.qase.api.annotation.CaseId;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
|
|
@ -4,11 +4,10 @@ import com.codeborne.selenide.Configuration;
|
|||
import com.codeborne.selenide.WebDriverRunner;
|
||||
import com.codeborne.selenide.logevents.SelenideLogger;
|
||||
import com.provectus.kafka.ui.helpers.Helpers;
|
||||
import com.provectus.kafka.ui.helpers.TestConfiguration;
|
||||
import com.provectus.kafka.ui.pages.Pages;
|
||||
import com.provectus.kafka.ui.screenshots.Screenshooter;
|
||||
import com.provectus.kafka.ui.utils.CamelCaseToSpacedDisplayNameGenerator;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.TestCaseGenerator;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.DisplayNameGenerator;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.TestCaseGenerator;
|
||||
import com.provectus.kafka.ui.utilities.screenshots.Screenshooter;
|
||||
import io.github.cdimascio.dotenv.Dotenv;
|
||||
import io.qameta.allure.Allure;
|
||||
import io.qameta.allure.selenide.AllureSelenide;
|
||||
|
@ -32,7 +31,7 @@ import java.io.IOException;
|
|||
import java.util.Arrays;
|
||||
|
||||
@Slf4j
|
||||
@DisplayNameGeneration(CamelCaseToSpacedDisplayNameGenerator.class)
|
||||
@DisplayNameGeneration(DisplayNameGenerator.class)
|
||||
public class BaseTest {
|
||||
|
||||
public static final String SELENIUM_IMAGE_NAME = "selenium/standalone-chrome:103.0";
|
||||
|
@ -103,7 +102,7 @@ public class BaseTest {
|
|||
}
|
||||
}
|
||||
Dotenv.load().entries().forEach(env -> System.setProperty(env.getKey(), env.getValue()));
|
||||
if (TestConfiguration.CLEAR_REPORTS_DIR) {
|
||||
if (Config.CLEAR_REPORTS_DIR) {
|
||||
clearReports();
|
||||
}
|
||||
setup();
|
||||
|
@ -125,28 +124,27 @@ public class BaseTest {
|
|||
|
||||
@SneakyThrows
|
||||
private static void setup() {
|
||||
Configuration.reportsFolder = TestConfiguration.REPORTS_FOLDER;
|
||||
Configuration.screenshots = TestConfiguration.SCREENSHOTS;
|
||||
Configuration.savePageSource = TestConfiguration.SAVE_PAGE_SOURCE;
|
||||
Configuration.reopenBrowserOnFail = TestConfiguration.REOPEN_BROWSER_ON_FAIL;
|
||||
Configuration.browser = TestConfiguration.BROWSER;
|
||||
Configuration.baseUrl = TestConfiguration.BASE_WEB_URL;
|
||||
Configuration.reportsFolder = Config.REPORTS_FOLDER;
|
||||
Configuration.screenshots = Config.SCREENSHOTS;
|
||||
Configuration.savePageSource = Config.SAVE_PAGE_SOURCE;
|
||||
Configuration.reopenBrowserOnFail = Config.REOPEN_BROWSER_ON_FAIL;
|
||||
Configuration.browser = Config.BROWSER;
|
||||
Configuration.timeout = 10000;
|
||||
Configuration.pageLoadTimeout = 180000;
|
||||
Configuration.browserSize = TestConfiguration.BROWSER_SIZE;
|
||||
Configuration.browserSize = Config.BROWSER_SIZE;
|
||||
SelenideLogger.addListener("allure", new AllureSelenide().savePageSource(false));
|
||||
}
|
||||
|
||||
public static void clearReports() {
|
||||
log.info(String.format("Clearing reports dir [%s]...", TestConfiguration.REPORTS_FOLDER));
|
||||
File allureResults = new File(TestConfiguration.REPORTS_FOLDER);
|
||||
log.info(String.format("Clearing reports dir [%s]...", Config.REPORTS_FOLDER));
|
||||
File allureResults = new File(Config.REPORTS_FOLDER);
|
||||
if (allureResults.isDirectory()) {
|
||||
File[] list = allureResults.listFiles();
|
||||
if (list != null) {
|
||||
Arrays.stream(list)
|
||||
.sequential()
|
||||
.filter(e -> !e.getName().equals("categories.json"))
|
||||
.forEach(File::delete);
|
||||
.sequential()
|
||||
.filter(e -> !e.getName().equals("categories.json"))
|
||||
.forEach(File::delete);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
package com.provectus.kafka.ui.base;
|
||||
|
||||
public abstract class Config {
|
||||
|
||||
public static boolean CLEAR_REPORTS_DIR =
|
||||
Boolean.parseBoolean(System.getProperty("CLEAR_REPORTS_DIR", "true"));
|
||||
public static boolean USE_LOCAL_BROWSER =
|
||||
Boolean.parseBoolean(System.getProperty("USE_LOCAL_BROWSER", "true"));
|
||||
public static String REPORTS_FOLDER = System.getProperty("REPORTS_FOLDER", "allure-results");
|
||||
public static Boolean SCREENSHOTS =
|
||||
Boolean.parseBoolean(System.getProperty("SCREENSHOTS", "true"));
|
||||
public static Boolean SAVE_PAGE_SOURCE =
|
||||
Boolean.parseBoolean(System.getProperty("SAVE_PAGE_SOURCE", "false"));
|
||||
public static Boolean REOPEN_BROWSER_ON_FAIL =
|
||||
Boolean.parseBoolean(System.getProperty("REOPEN_BROWSER_ON_FAIL", "true"));
|
||||
public static String BROWSER = System.getProperty("BROWSER", "chromium");
|
||||
public static String BROWSER_SIZE = System.getProperty("BROWSER_SIZE", "1920x1080");
|
||||
public static Boolean ENABLE_VNC = Boolean.parseBoolean(System.getProperty("ENABLE_VNC", "true"));
|
||||
}
|
|
@ -4,16 +4,16 @@ import com.provectus.kafka.ui.base.BaseTest;
|
|||
import com.provectus.kafka.ui.helpers.Helpers;
|
||||
import com.provectus.kafka.ui.models.Connector;
|
||||
import com.provectus.kafka.ui.models.Topic;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.Status;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.Suite;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
|
||||
import io.qase.api.annotation.CaseId;
|
||||
import org.junit.jupiter.api.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.provectus.kafka.ui.extensions.FileUtils.getResourceAsString;
|
||||
import static com.provectus.kafka.ui.utilities.FileUtils.getResourceAsString;
|
||||
|
||||
public class ConnectorsTests extends BaseTest {
|
||||
private static final long SUITE_ID = 10;
|
||||
|
@ -80,9 +80,10 @@ public class ConnectorsTests extends BaseTest {
|
|||
pages.openConnectorsList(CLUSTER_NAME)
|
||||
.waitUntilScreenReady()
|
||||
.openConnector(CONNECTOR_FOR_UPDATE.getName());
|
||||
pages.connectorsView.connectorIsVisibleOnOverview();
|
||||
pages.connectorsView.openConfigTab()
|
||||
.updConnectorConfig(CONNECTOR_FOR_UPDATE.getConfig());
|
||||
pages.connectorsView
|
||||
.waitUntilScreenReady()
|
||||
.openConfigTab()
|
||||
.setConfig(CONNECTOR_FOR_UPDATE.getConfig());
|
||||
pages.openConnectorsList(CLUSTER_NAME);
|
||||
Assertions.assertTrue(pages.connectorsList.isConnectorVisible(CONNECTOR_FOR_UPDATE.getName()),"isConnectorVisible()");
|
||||
}
|
||||
|
|
|
@ -7,9 +7,9 @@ import com.provectus.kafka.ui.models.Schema;
|
|||
import com.provectus.kafka.ui.pages.MainPage;
|
||||
import com.provectus.kafka.ui.pages.schema.SchemaEditView;
|
||||
import com.provectus.kafka.ui.pages.schema.SchemaView;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.Status;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.Suite;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
|
||||
import io.qase.api.annotation.CaseId;
|
||||
import lombok.SneakyThrows;
|
||||
import org.junit.jupiter.api.*;
|
||||
|
@ -17,7 +17,7 @@ import org.junit.jupiter.api.*;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.provectus.kafka.ui.extensions.FileUtils.fileToString;
|
||||
import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
|
||||
|
||||
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
|
|
|
@ -6,9 +6,9 @@ import com.provectus.kafka.ui.models.Topic;
|
|||
import com.provectus.kafka.ui.pages.MainPage;
|
||||
import com.provectus.kafka.ui.pages.topic.TopicCreateEditSettingsView;
|
||||
import com.provectus.kafka.ui.pages.topic.TopicView;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.Status;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utils.qaseIO.annotation.Suite;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
|
||||
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
|
||||
import io.qase.api.annotation.CaseId;
|
||||
import org.assertj.core.api.SoftAssertions;
|
||||
import org.junit.jupiter.api.*;
|
||||
|
@ -16,7 +16,7 @@ import org.junit.jupiter.api.*;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.provectus.kafka.ui.extensions.FileUtils.fileToString;
|
||||
import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
|
||||
|
||||
public class TopicTests extends BaseTest {
|
||||
private static final long SUITE_ID = 2;
|
||||
|
|
Loading…
Add table
Reference in a new issue