diff --git a/bellatrix.data/src/main/java/solutions/bellatrix/data/http/infrastructure/HttpRepository.java b/bellatrix.data/src/main/java/solutions/bellatrix/data/http/infrastructure/HttpRepository.java index bf9d351d..9a98c489 100644 --- a/bellatrix.data/src/main/java/solutions/bellatrix/data/http/infrastructure/HttpRepository.java +++ b/bellatrix.data/src/main/java/solutions/bellatrix/data/http/infrastructure/HttpRepository.java @@ -30,7 +30,7 @@ public abstract class HttpRepository implements protected final HttpContext repositoryContext; private final Class entityType; private final ObjectConverter objectConverter; - private HttpContext requestContext; + protected HttpContext requestContext; protected HttpRepository(Class entityType, ObjectConverter objectConverter, Supplier repositoryContext) { this.entityType = entityType; @@ -158,7 +158,7 @@ private RequestSpecification client() { return RestAssured.given().spec(requestContext.requestSpecification()); } - private R deserializeInternal(HttpResponse response, DeserializationMode mode) { + protected R deserializeInternal(HttpResponse response, DeserializationMode mode) { try { if (mode == DeserializationMode.LIST) { List entities = objectConverter.fromStringToList(response.getBody(), entityType); @@ -174,7 +174,7 @@ private R deserializeInternal(HttpResponse response, DeserializationMode mod } } - private Response broadcastRequest(Supplier responseSupplier) { + protected Response broadcastRequest(Supplier responseSupplier) { try { SENDING_REQUEST.broadcast(new HttpRequestEventArgs(requestContext)); Response response = responseSupplier.get(); diff --git a/bellatrix.servicenow/pom.xml b/bellatrix.servicenow/pom.xml new file mode 100644 index 00000000..0e166fe7 --- /dev/null +++ b/bellatrix.servicenow/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + solutions.bellatrix + bellatrix + 1.0-SNAPSHOT + + + bellatrix.servicenow + + + 19 + 19 + UTF-8 + 1.0 + + + + + org.junit.jupiter + junit-jupiter + RELEASE + test + + + solutions.bellatrix + bellatrix.core + 1.0 + compile + + + solutions.bellatrix + bellatrix.web + 1.0 + compile + + + solutions.bellatrix + bellatrix.api + ${bellatrix.framework.version} + + + com.github.javafaker + javafaker + 1.0.2 + compile + + + + solutions.bellatrix + bellatrix.data + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/baseTest/ServiceNowBaseTest.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/baseTest/ServiceNowBaseTest.java new file mode 100644 index 00000000..9f0c25f6 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/baseTest/ServiceNowBaseTest.java @@ -0,0 +1,42 @@ +package solutions.bellatrix.servicenow.baseTest; + + +import solutions.bellatrix.servicenow.listeners.AutoWaitListener; +import solutions.bellatrix.servicenow.pages.serviceNowPage.ServiceNowPage; +import solutions.bellatrix.servicenow.pages.serviceNowTableViewPage.ServiceNowTableViewPage; +import solutions.bellatrix.servicenow.plugins.authentication.AuthenticationPlugin; +import solutions.bellatrix.servicenow.plugins.fileuploads.FileUploadPlugin; +import solutions.bellatrix.core.plugins.junit.BaseTest; +import solutions.bellatrix.web.infrastructure.BrowserLifecyclePlugin; +import solutions.bellatrix.web.infrastructure.LogLifecyclePlugin; +import solutions.bellatrix.web.services.App; + +public class ServiceNowBaseTest extends BaseTest { + protected ServiceNowPage serviceNowPage; + protected ServiceNowTableViewPage serviceNowTableViewPage; + + protected App app() { + return new App(); + } + + @Override + protected void configure() { + addPlugin(FileUploadPlugin.class); + addPlugin(LogLifecyclePlugin.class); + addPlugin(BrowserLifecyclePlugin.class); + addPlugin(AuthenticationPlugin.class); + addListener(AutoWaitListener.class); + } + + @Override + protected void beforeEach() throws Exception { + super.beforeEach(); + serviceNowPage = app().createPage(ServiceNowPage.class); + serviceNowTableViewPage = app().createPage(ServiceNowTableViewPage.class); + } + + @Override + protected void afterEach() { + super.afterEach(); + } +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/InputRole.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/InputRole.java new file mode 100644 index 00000000..7f308b48 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/InputRole.java @@ -0,0 +1,17 @@ +package solutions.bellatrix.servicenow.components.enums; + +public enum InputRole { + COMBOBOX("combobox"), + SPINBUTTON("spinbutton"), + TEXTBOX("textbox"); + + private final String role; + + InputRole(String role) { + this.role = role; + } + + public String getRole() { + return role; + } +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/OperationsAttributes.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/OperationsAttributes.java new file mode 100644 index 00000000..60ab5147 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/OperationsAttributes.java @@ -0,0 +1,44 @@ +package solutions.bellatrix.servicenow.components.enums; + +public enum OperationsAttributes { + EQUALS("Equals", "=", "Equals"), + DOES_NOT_EQUAL("Does not equal", "!=", "DoesNotEqual"), + IS_LESS_THAN("Is less than", "<", "IsLessThan"), + IS_GREATER_THAN("Is greater than", ">", "IsGreaterThan"), + IS_LESS_THAN_OR_EQUAL_TO("Is less than or equal to", "<=", "IsLessThanOrEqualTo"), + IS_GREATER_THAN_OR_EQUAL_TO("Is greater than or equal to", ">=", "IsGreaterThanOrEqualTo"), + IS_BLANK("Is blank", "", "IsBlank"), + IS_NOT_BLANK("Is not blank", "", "IsNotBlank"), + IS_BETWEEN("Is between", "", "IsBetween"), + CONTAINS("Contains", "", "Contains"), + DOES_NOT_CONTAIN("Does not contain", "", "DoesNotContain"), + STARTS_WITH("Starts with", "", "StartsWith"), + ENDS_WITH("Ends with", "", "EndsWith"); + + private final String value; + private final String sign; + private final String nameMethod; + + OperationsAttributes(String value, String sign, String nameMethod) { + this.value = value; + this.sign = sign; + this.nameMethod = nameMethod; + } + + public String getValue() { + return this.value; + } + + public String getSign() { + return sign; + } + + public String getNameMethod() { + return nameMethod; + } + + @Override + public String toString() { + return this.value; + } +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/SnComponentType.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/SnComponentType.java new file mode 100644 index 00000000..4a408cc8 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/SnComponentType.java @@ -0,0 +1,38 @@ +package solutions.bellatrix.servicenow.components.enums; + +public enum SnComponentType { + CHOICE("choice"), + DATE("date"), + DATE_TIME("date_time"), + DOCUMENT_ID("document_id"), + REFERENCE("reference"), + STRING("string"), + TABLE_NAME("table_name"), + PICK_LIST("pick_list"), + BOOLEAN("boolean"), + FLOAT("float"), + INTEGER("integer"), + PERCENT_COMPLETE("percent_complete"), + CURRENCY_2("currency2"), + GLIDE_LIST("glide_list"), + GLIDE_TIME("glide_time"), + DURATION("glide_duration"), + HTML("html"), + CURRENCY("currency2"), + JOURNAL_INPUT("journal_input"), + CURRENCY2("currency2"), + FIELD_NAME("field_name"), + SN_CONDITION_ROW("condition_row"), + SEARCH("search"); + + private final String componentType; + + SnComponentType(String componentType) { + this.componentType = componentType; + } + + @Override + public String toString() { + return componentType; + } +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/StyleAlignment.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/StyleAlignment.java new file mode 100644 index 00000000..822fe07f --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/StyleAlignment.java @@ -0,0 +1,17 @@ +package solutions.bellatrix.servicenow.components.enums; + +public enum StyleAlignment { + LEFT("left"), + RIGHT("right"), + CENTER("center"); + + private final String value; + + StyleAlignment(String label) { + this.value = label; + } + + public String getValue() { + return "text-align: " + this.value + ";"; + } +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/UibComponentType.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/UibComponentType.java new file mode 100644 index 00000000..6ea93278 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/enums/UibComponentType.java @@ -0,0 +1,38 @@ +package solutions.bellatrix.servicenow.components.enums; + +public enum UibComponentType { + CHOICE("choice"), + DATE("date"), + DATE_TIME("date_time"), + DOCUMENT_ID("document_id"), + REFERENCE("reference"), + STRING("string"), + TEXTAREA("textarea"), + TABLE_NAME("table_name"), + PICK_LIST("pick_list"), + BOOLEAN("boolean"), + FLOAT("float"), + INTEGER("integer"), + PERCENT_COMPLETE("percent_complete"), + CURRENCY_2("currency2"), + GLIDE_LIST("glide_list"), + GLIDE_TIME("glide_time"), + DURATION("glide_duration"), + HTML("html"), + CURRENCY("currency2"), + JOURNAL_INPUT("journal_input"), + CURRENCY2("currency2"), + FIELD_NAME("field_name"), + SN_CONDITION_ROW("condition_row"); + + private final String componentType; + + UibComponentType(String componentType) { + this.componentType = componentType; + } + + @Override + public String toString() { + return componentType; + } +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ComponentFilterGroupModel.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ComponentFilterGroupModel.java new file mode 100644 index 00000000..6f28a075 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ComponentFilterGroupModel.java @@ -0,0 +1,18 @@ +package solutions.bellatrix.servicenow.components.models; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +@Data +@SuperBuilder +public class ComponentFilterGroupModel { + @SerializedName("operation") + private String operation; + @SerializedName("condition") + private String condition; + @SerializedName("operationType") + private String operationType; + @SerializedName("filterValue") + private String filterValue; +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ComponentFilterModel.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ComponentFilterModel.java new file mode 100644 index 00000000..916944e8 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ComponentFilterModel.java @@ -0,0 +1,14 @@ +package solutions.bellatrix.servicenow.components.models; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +@Data +@SuperBuilder +public class ComponentFilterModel { + @SerializedName("groupOperation") + private String groupOperation; + @SerializedName("groupedFilters") + private ComponentFilterGroupModel[] vulnerability; +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/GridFilter.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/GridFilter.java new file mode 100644 index 00000000..cac2cf44 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/GridFilter.java @@ -0,0 +1,15 @@ +package solutions.bellatrix.servicenow.components.models; + +import lombok.Data; +import lombok.experimental.SuperBuilder; +import solutions.bellatrix.servicenow.components.enums.OperationsAttributes; + +import java.util.List; + +@Data +@SuperBuilder +public class GridFilter { + private String gridColumnHeader; + private OperationsAttributes operation; + private List conditionValue; +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ServiceNowForm.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ServiceNowForm.java new file mode 100644 index 00000000..d4c7673b --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/models/ServiceNowForm.java @@ -0,0 +1,33 @@ +package solutions.bellatrix.servicenow.components.models; + +import lombok.Data; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.NotImplementedException; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; + +@Data +@SuperBuilder +public class ServiceNowForm { + public String getNumber() { + throw new NotImplementedException("Implement in child classes"); + } + + public ServiceNowForm() { + } + + public void setNumber(String number) { + } + + public
List getNotNullFields() { + return Arrays.stream(this.getClass().getDeclaredFields()).filter(f -> { + try { + f.setAccessible(true); + return f.get(this) != null; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }).toList(); + } +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/serviceNow/SnBoolean.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/serviceNow/SnBoolean.java new file mode 100644 index 00000000..076953f3 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/serviceNow/SnBoolean.java @@ -0,0 +1,59 @@ +package solutions.bellatrix.servicenow.components.serviceNow; + + +import solutions.bellatrix.servicenow.components.enums.SnComponentType; +import solutions.bellatrix.core.plugins.EventListener; +import solutions.bellatrix.web.components.Button; +import solutions.bellatrix.web.components.CheckBox; +import solutions.bellatrix.web.components.ComponentActionEventArgs; + +public class SnBoolean extends SnDefaultComponent { + public final static EventListener CLICKING = new EventListener<>(); + public final static EventListener CLICKED = new EventListener<>(); + + @Override + public SnComponentType componentType() { + return SnComponentType.BOOLEAN; + } + + @Override + protected Class getSetTextParamClass() { + return Boolean.class; + } + + @Override + protected String formControlXpathLocator() { + return ".//input[@type='checkbox']"; + } + + public void click() { + defaultClick(CLICKING, CLICKED); + } + + protected CheckBox inputWithActualCheckboxState() { + var xpathLocator = ".//div[contains(@class,'input_controls')]/input[@type='hidden']"; + return this.createByXPath(CheckBox.class, xpathLocator); + } + + protected Button labelToClick() { + var xpathLocator = ".//label[contains(concat(' ',normalize-space(@class),' '),' checkbox-label ')]"; + return this.createByXPath(Button.class, xpathLocator); + } + + @Override + public String getText() { + return inputWithActualCheckboxState().getAttribute("value"); + } + + public void setText(Boolean checkboxValue) { + this.setText(checkboxValue.toString()); + } + + @Override + public void setText(String text) { + if (!getText().equals(text)) { + labelToClick().click(); + invokeValueSetEvent(text); + } + } +} \ No newline at end of file diff --git a/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/serviceNow/SnChoice.java b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/serviceNow/SnChoice.java new file mode 100644 index 00000000..1265f4f2 --- /dev/null +++ b/bellatrix.servicenow/src/main/java/solutions/bellatrix/servicenow/components/serviceNow/SnChoice.java @@ -0,0 +1,80 @@ +package solutions.bellatrix.servicenow.components.serviceNow; + +import lombok.SneakyThrows; +import solutions.bellatrix.servicenow.components.enums.SnComponentType; +import solutions.bellatrix.core.utilities.SingletonFactory; +import solutions.bellatrix.web.components.Option; +import solutions.bellatrix.web.components.Select; +import solutions.bellatrix.web.components.WebComponent; +import solutions.bellatrix.web.validations.ComponentValidator; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; + +public class SnChoice extends SnDefaultComponent { + @Override + public SnComponentType componentType() { + return SnComponentType.CHOICE; + } + + public Select selectElement() { + var xpathLocator = ".//select"; + return this.createByXPath(Select.class, xpathLocator); + } + + public Option getSelectedOption() { + var xpathLocator = "./option"; + var options = selectElement().createAllByXPath(Option.class, xpathLocator); + + return options.stream().filter(x -> x.getWrappedElement().getDomProperty("selected").equals("true")).findAny().get(); + } + + @Override + public String getText() { + return getSelectedOption().getText(); + } + + @Override + public void setText(String text) { + selectElement().selectByText(text); + invokeValueSetEvent(text); + } + + @Override + public Boolean isDisabled() { + var readonlyAttribute = formControl().getAttribute("readonly"); + Boolean isReadonly = false; + + if (readonlyAttribute != null) { + isReadonly = Boolean.parseBoolean(readonlyAttribute); + } + + return super.isDisabled() || isReadonly; + } + + private List getAllOptions() { + return selectElement().getAllOptions().stream().map(Option::getText).toList(); + } + + public List