Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit a2f4a1e3 authored by Mihai BOZ's avatar Mihai BOZ
Browse files

Pull request #62: added tests for edit resource page. Added logs.

Merge in EDELIVERY/smp from EDELIVERY-12408-Progress-on-the-automation-of-the-DomiSMP-UI-tests---Part-8 to development

* commit 'a8427901':
  added tests for edit resource page. Added logs.
parents 69bdd0e4 a8427901
No related branches found
No related tags found
No related merge requests found
Pipeline #130240 failed
Showing
with 239 additions and 41 deletions
......@@ -157,9 +157,10 @@ public class SmallGrid extends DComponent {
}
if (columnIndex == -1) {
LOG.error("No element found");
throw new NoSuchElementException("Column not found");
}
boolean isElementPresent = false;
for (int pageNr = 1; pageNr < numOfPages + 1; pageNr++) {
for (int pageNr = 0; pageNr < numOfPages + 1; pageNr++) {
List<WebElement> rows = getRows();
for (WebElement row : rows) {
......
......@@ -7,6 +7,7 @@ import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;
import pages.administration.editResourcesPage.editResourceDocumentPage.EditResourceDocumentPage;
/**
* Page object Resource details tab of Edit Resource page. This contains the locators of the page and the methods for the behaviour of the page
......
package pages.administration.editResourcesPage;
package pages.administration.editResourcesPage.editResourceDocumentPage;
import ddsl.DomiSMPPage;
import org.openqa.selenium.WebDriver;
......@@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
/**
* Page object for the Edit resource document page. This contains the locators of the page and the methods for the behaviour of the page
......@@ -20,6 +21,8 @@ public class EditResourceDocumentPage extends DomiSMPPage {
private WebElement generateBtn;
@FindBy(id = "validateResource_id")
private WebElement validateBtn;
@FindBy(id = "documentWizard_id")
private WebElement documentWizardBtn;
@FindBy(css = "smp-titled-label[title=\"Resource identifier:\"] div.smp-tl-value")
private WebElement resourceIdentifierLbl;
@FindBy(css = "smp-titled-label[title=\"Resource scheme:\"] div.smp-tl-value")
......@@ -44,7 +47,7 @@ public class EditResourceDocumentPage extends DomiSMPPage {
private List<WebElement> codeEditorReadValueElement;
protected EditResourceDocumentPage(WebDriver driver) {
public EditResourceDocumentPage(WebDriver driver) {
super(driver);
LOG.debug("Loading Edit resource document page.");
}
......@@ -75,7 +78,13 @@ public class EditResourceDocumentPage extends DomiSMPPage {
weToDButton(validateBtn).click();
}
public void selectDocumentVersion(int version) {
weToDSelect(versionDdl).selectValue(String.valueOf(version));
public EditResourceDocumentWizardDialog clickOnDocumentWizard() {
if (documentNameLbl.getText().contains("1.0")) {
weToDButton(documentWizardBtn).click();
return new EditResourceDocumentWizardDialog(driver);
}
LOG.error("Document type {%d} doesn't have wizard", documentNameLbl.getText());
throw new NoSuchElementException("Document wizard button is not present");
}
}
package pages.administration.editResourcesPage.editResourceDocumentPage;
import ddsl.dcomponents.DComponent;
import ddsl.dobjects.DInput;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;
/**
* Page object of Document Wizard for Resources with Oasis 1 from EditResourceDocument page. This contains the locators of the page and the methods for the behaviour of the page
*/
public class EditResourceDocumentWizardDialog extends DComponent {
@FindBy(id = "ExtensionID_id")
private WebElement extensionIdInput;
@FindBy(id = "ExtensionName_id")
private WebElement extensionNamenput;
@FindBy(id = "ExtensionAgencyID_id")
private WebElement extensionAgencyIdnput;
@FindBy(id = "ExtensionAgencyName_id")
private WebElement extensionAgencyNameInput;
@FindBy(id = "ExtensionAgencyURI_id")
private WebElement extensionAgencyURIInput;
@FindBy(id = "ExtensionVersionID_id")
private WebElement extensionVersionIDInput;
@FindBy(id = "ExtensionURI_id")
private WebElement extensionURIInput;
@FindBy(id = "ExtensionReasonCode_id")
private WebElement extensionReasonCodeInput;
@FindBy(id = "ExtensionReason_id")
private WebElement extensionReasonInput;
@FindBy(id = "generateDocumentButton")
private WebElement okBtn;
public EditResourceDocumentWizardDialog(WebDriver driver) {
super(driver);
PageFactory.initElements(new AjaxElementLocatorFactory(driver, data.getWaitTimeShort()), this);
}
public void clickOK() {
weToDButton(okBtn).click();
}
public DInput getExtensionIdInput() {
return weToDInput(extensionIdInput);
}
public DInput getExtensionNamenput() {
return weToDInput(extensionNamenput);
}
public DInput getExtensionAgencyIdnput() {
return weToDInput(extensionAgencyIdnput);
}
public DInput getExtensionAgencyNameInput() {
return weToDInput(extensionAgencyNameInput);
}
public DInput getExtensionAgencyURIInput() {
return weToDInput(extensionAgencyURIInput);
}
public DInput getExtensionVersionIDInput() {
return weToDInput(extensionVersionIDInput);
}
public DInput getExtensionURIInput() {
return weToDInput(extensionURIInput);
}
public DInput getExtensionReasonCodeInput() {
return weToDInput(extensionReasonCodeInput);
}
public DInput getExtensionReasonInput() {
return weToDInput(extensionReasonInput);
}
}
......@@ -75,13 +75,13 @@ public class BaseRestClient {
protected WebResource.Builder decorateBuilder(WebResource resource) {
WebResource.Builder builder = resource.getRequestBuilder();
cookies = TestRunData.getInstance().getCookies();;
cookies = TestRunData.getInstance().getCookies();
if (null != cookies) {
log.debug("");
for (NewCookie cookie : cookies) {
builder = builder.cookie(new Cookie(cookie.getName(), cookie.getValue(), "/", ""));
log.debug("cookie " + cookie + " is added to the builder");
}
} else {
log.error("No cookie are present in the builder");
}
if (null != TestRunData.getInstance().getXSRFToken()) {
builder = builder.header("X-XSRF-TOKEN", TestRunData.getInstance().getXSRFToken());
......@@ -136,7 +136,11 @@ public class BaseRestClient {
WebResource.Builder builder = decorateBuilder(resource.path(RestServicePaths.CONNECTED));
int response = builder.get(ClientResponse.class).getStatus();
log.debug("Connected endpoint returns: " + response);
if (response != 200) {
log.debug("Connected endpoint returns " + response);
}
return (!(response == 401));
}
......
......@@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.jersey.api.client.ClientResponse;
import ddsl.enums.ResourceTypes;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rest.models.DomainModel;
import rest.models.GroupModel;
import rest.models.MemberModel;
......@@ -18,6 +20,9 @@ public class DomainClient extends BaseRestClient {
/**
* Rest client for domain actions
*/
private final static Logger LOG = LoggerFactory.getLogger(DomainClient.class);
public DomainClient() {
super();
}
......@@ -34,7 +39,7 @@ public class DomainClient extends BaseRestClient {
throw new RuntimeException(e);
}
}
log.debug("Domain: " + domainModel.getDomainCode() + " has been created successfully!");
LOG.debug("Domain: " + domainModel.getDomainCode() + " has been created successfully!");
return response.getEntity(DomainModel.class);
}
......@@ -51,7 +56,7 @@ public class DomainClient extends BaseRestClient {
throw new RuntimeException(e);
}
}
log.debug("Member: " + domainMember.getUsername() + " has been added!");
LOG.debug("Member: " + domainMember.getUsername() + " has been added!");
return response.getEntity(MemberModel.class);
}
......@@ -72,7 +77,7 @@ public class DomainClient extends BaseRestClient {
throw new RuntimeException(e);
}
}
log.debug("Resources have been added!");
LOG.debug("Resources have been added!");
return response.getEntity(DomainModel.class);
}
......@@ -87,7 +92,7 @@ public class DomainClient extends BaseRestClient {
throw new RuntimeException(e);
}
}
log.debug("Group have been added!");
LOG.debug("Group have been added!");
return response.getEntity(GroupModel.class);
}
}
......@@ -3,6 +3,8 @@ package rest;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.jersey.api.client.ClientResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rest.models.DomainModel;
import rest.models.GroupModel;
import rest.models.MemberModel;
......@@ -12,6 +14,7 @@ import utils.TestRunData;
* Rest client for group actions
*/
public class GroupClient extends BaseRestClient {
private final static Logger LOG = LoggerFactory.getLogger(GroupClient.class);
public GroupClient() {
super();
......@@ -31,7 +34,7 @@ public class GroupClient extends BaseRestClient {
throw new RuntimeException(e);
}
}
log.debug("Member: " + groupMember.getUsername() + " has been added!");
LOG.debug("Member: " + groupMember.getUsername() + " has been added!");
return response.getEntity(MemberModel.class);
}
}
......@@ -4,6 +4,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.jersey.api.client.ClientResponse;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rest.models.DomainModel;
import rest.models.GroupModel;
import rest.models.MemberModel;
......@@ -14,6 +16,8 @@ import utils.TestRunData;
* Rest client for group actions
*/
public class ResourceClient extends BaseRestClient {
private final static Logger LOG = LoggerFactory.getLogger(ResourceClient.class);
public ResourceModel createResourceForGroup(DomainModel domainModel, GroupModel groupModel, ResourceModel resourceModelToBeCreated) {
JSONObject resourceJson = new JSONObject(resourceModelToBeCreated);
String createResourcePath = RestServicePaths.getCreateResourcePath(TestRunData.getInstance().getUserId(), domainModel.getDomainId(), groupModel.getGroupId());
......@@ -25,7 +29,7 @@ public class ResourceClient extends BaseRestClient {
throw new RuntimeException(e);
}
}
log.debug("Resource have been added!");
LOG.debug("Resource have been added!");
return response.getEntity(ResourceModel.class);
}
......@@ -43,7 +47,7 @@ public class ResourceClient extends BaseRestClient {
throw new RuntimeException(e);
}
}
log.debug("Member: " + groupMember.getUsername() + " has been added!");
LOG.debug("Member: " + groupMember.getUsername() + " has been added!");
return response.getEntity(MemberModel.class);
}
}
......@@ -12,5 +12,10 @@ public class SMPRestException extends Exception {
message,
"STATUS = " + response.getStatus(),
"CONTENT = " + response.getEntity(String.class)));
log.error(String.format("%s \n %s \n %s \n",
message,
"STATUS = " + response.getStatus(),
"CONTENT = " + response.getEntity(String.class)));
}
}
......@@ -2,6 +2,8 @@ package rest;
import com.sun.jersey.api.client.ClientResponse;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rest.models.UserModel;
import utils.TestRunData;
......@@ -9,6 +11,9 @@ import utils.TestRunData;
* Rest client for user actions
*/
public class UserClient extends BaseRestClient {
private final static Logger LOG = LoggerFactory.getLogger(UserClient.class);
public UserClient(String username, String password) {
super(username, password);
}
......@@ -33,7 +38,7 @@ public class UserClient extends BaseRestClient {
throw new RuntimeException(e);
}
}
log.debug("User: " + user.getUsername() + " has been created successfully!");
LOG.debug("User: " + user.getUsername() + " has been created successfully!");
return responseBody;
}
......@@ -45,6 +50,16 @@ public class UserClient extends BaseRestClient {
passwordChangeBody.put("currentPassword", password);
passwordChangeBody.put("newPassword", newPassword);
ClientResponse response = jsonPUT(resource.path(changePasswordPath), passwordChangeBody);
if (response.getStatus() != 200) {
try {
throw new SMPRestException("Could not create user", response);
} catch (SMPRestException e) {
throw new RuntimeException(e);
}
}
LOG.debug(" Password was changed successfully!");
return new JSONObject(response.getEntity(String.class));
}
......
......@@ -96,5 +96,15 @@ public class ResourceModel {
return resourceModel;
}
public static ResourceModel generatePublicResource(ResourceTypes resourceType) {
ResourceModel resourceModel = new ResourceModel();
resourceModel.identifierScheme = StringUtils.lowerCase(Generator.randomAlphabeticalValue(3) + "-" + Generator.randomAlphaNumericValue(3) + "-" + Generator.randomAlphaNumericValue(3));
resourceModel.identifierValue = "AUT_resIden_" + Generator.randomAlphaNumericValue(4).toLowerCase();
resourceModel.smlRegistered = false;
resourceModel.resourceTypeIdentifier = StringUtils.lowerCase(resourceType.getName());
resourceModel.visibility = "PUBLIC";
return resourceModel;
}
}
......@@ -172,7 +172,6 @@ public class TestRunData {
public String getUiBaseUrl() {
String url = getPropertyValue(TestEnvironmentProperty.APPLICATION_UI_URL);
LOG.debug("UI URL [{}]", url);
return url;
}
......
......@@ -5,6 +5,7 @@ import org.apache.xml.serialize.XMLSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
......@@ -47,14 +48,17 @@ public class XMLUtils {
return nList.getLength() != 0;
}
// public boolean isNodeContaingValue(String nodeName) {
//
// NodeList nList = doc.getChildNodes();
// for(Integer i=0; i = nList.getLength()){
//
// }
//
//
// }
public void setContextValueForNode(String nodeName, String attributeName, String attributeValue) {
NodeList nList = doc.getElementsByTagName(nodeName);
Node nNode = nList.item(0);
nNode.setTextContent(attributeValue);
}
public String getNodeValue(String nodeName) {
NodeList nList = doc.getElementsByTagName(nodeName);
if (nList.getLength() > 0) {
return nList.item(0).getTextContent();
}
return null;
}
}
......@@ -40,7 +40,7 @@
<logger name="domiSMPTests" level="DEBUG"/>
<logger name="ddsl" level="DEBUG"/>
<logger name="pages" level="DEBUG"/>
<logger name="res" level="DEBUG"/>
<logger name="rest" level="DEBUG"/>
<logger name="utils" level="DEBUG"/>
<root level="WARN">
<appender-ref ref="file"/>
......
......@@ -5,7 +5,6 @@ import ddsl.enums.Pages;
import domiSMPTests.SeleniumTest;
import org.openqa.selenium.WebElement;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Ignore;
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;
import pages.LoginPage;
......@@ -18,10 +17,10 @@ import rest.models.UserModel;
/**
* This class has the tests against Domains Page
*/
@Ignore("DomainsPgTests:beforeTest Failing tests: org.openqa.selenium.ElementClickInterceptedException: Element <select id=\"signatureKeyAlias_id\" " +
"class=\"mat-mdc-input-element mat-mdc-tooltip-trigger ng-tns-c1205077789-11 ng-untouched ng-pristine ng-valid " +
"mat-mdc-form-field-input-control mdc-text-field__input cdk-text-field-autofill-monitored cdk-focused cdk-program-focused\"> " +
"is not clickable at point (1014,364) because another element <mat-label class=\"ng-tns-c1205077789-11\"> obscures it" )
//@Ignore("DomainsPgTests:beforeTest Failing tests: org.openqa.selenium.ElementClickInterceptedException: Element <select id=\"signatureKeyAlias_id\" " +
// "class=\"mat-mdc-input-element mat-mdc-tooltip-trigger ng-tns-c1205077789-11 ng-untouched ng-pristine ng-valid " +
// "mat-mdc-form-field-input-control mdc-text-field__input cdk-text-field-autofill-monitored cdk-focused cdk-program-focused\"> " +
// "is not clickable at point (1014,364) because another element <mat-label class=\"ng-tns-c1205077789-11\"> obscures it" )
public class DomainsPgTests extends SeleniumTest {
DomiSMPPage homePage;
LoginPage loginPage;
......@@ -51,7 +50,9 @@ public class DomainsPgTests extends SeleniumTest {
domainsPage.getLeftSideGrid().searchAndGetElementInColumn("Domain code", domainModel.getDomainCode()).click();
soft.assertEquals(domainModel.getSignatureKeyAlias(), domainsPage.getDomainTab().getResponseSignatureCertificateSelectedValue());
soft.assertEquals(domainModel.getVisibility(), domainsPage.getDomainTab().getVisibilityOfDomainSelectedValue());
soft.assertEquals("To complete domain configuration, please select at least one resource type from the Resource Types tab", domainsPage.getDomainWarningMessage());
soft.assertEquals(domainsPage.getDomainWarningMessage(), "To complete domain configuration, please:\n" +
"select at least one resource type from the Resource Types tab\n" +
"add a domain member with 'ADMIN' role from the Members tab!");
soft.assertAll();
}
......
package domiSMPTests.ui;
import com.fasterxml.jackson.core.JsonProcessingException;
import ddsl.DomiSMPPage;
import ddsl.enums.Pages;
import ddsl.enums.ResourceTypes;
import domiSMPTests.SeleniumTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Ignore;
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;
import pages.LoginPage;
import pages.administration.editResourcesPage.EditResourceDocumentPage;
import pages.administration.editResourcesPage.EditResourcePage;
import pages.administration.editResourcesPage.editResourceDocumentPage.EditResourceDocumentPage;
import pages.administration.editResourcesPage.editResourceDocumentPage.EditResourceDocumentWizardDialog;
import rest.models.*;
import utils.Generator;
import utils.TestRunData;
import utils.XMLUtils;
......@@ -19,7 +21,6 @@ import javax.xml.parsers.ParserConfigurationException;
import java.util.Arrays;
import java.util.List;
@Ignore("All tests fails with java.util.NoSuchElementException: Value [ ... ] was not found in the grid")
public class EditResourcePgTests extends SeleniumTest {
DomiSMPPage homePage;
LoginPage loginPage;
......@@ -196,18 +197,72 @@ public class EditResourcePgTests extends SeleniumTest {
soft.assertAll();
}
@Ignore //TODO: continue test with select version
@Test(description = "EDTRES-04 Resource admins are able to add generated document", priority = 1)
public void resourceAdminsAreAbleToAddGeneratedDocument2() throws ParserConfigurationException {
@Test(description = "EDTRES-04 Resource admins are able to add document using Document wizard for Oasis 1.0", priority = 1)
public void resourceAdminsAreAbleToAddDocimentUsingDocumentWizardOasis1() throws ParserConfigurationException, JsonProcessingException {
ResourceModel resourceModelOasis1 = ResourceModel.generatePublicResource(ResourceTypes.OASIS1);
//add resource to group
resourceModelOasis1 = rest.resources().createResourceForGroup(domainModel, groupModel, resourceModelOasis1);
rest.resources().addMembersToResource(domainModel, groupModel, resourceModelOasis1, adminMember);
editResourcePage.refreshPage();
editResourcePage.selectDomain(domainModel, groupModel, resourceModelOasis1);
editResourcePage.goToTab("Resource details");
EditResourceDocumentPage editResourceDocumentPage = editResourcePage.getResourceDetailsTab().clickOnEditDocument();
editResourceDocumentPage.clickOnGenerate();
editResourceDocumentPage.clickOnSave();
editResourceDocumentPage.getAlertArea().closeAlert();
XMLUtils document1 = new XMLUtils(editResourceDocumentPage.getDocumentValue());
editResourceDocumentPage.clickOnValidate();
soft.assertEquals(editResourceDocumentPage.getAlertArea().getAlertMessage(), "Document is Valid.");
EditResourceDocumentWizardDialog editResourceDocumentWizardDialog = editResourceDocumentPage.clickOnDocumentWizard();
String generatedExtensionIdvalue = Generator.randomAlphaNumericValue(8);
String generatedExtensionNamevalue = Generator.randomAlphaNumericValue(8);
String generatedExtensionAgencyIdvalue = Generator.randomAlphaNumericValue(8);
String generatedExtensionAgencyNamevalue = Generator.randomAlphaNumericValue(8);
String generatedExtensionAgencyURIvalue = "www." + Generator.randomAlphaNumericValue(8) + ".com";
String generatedExtensionVersionIdvalue = Generator.randomAlphaNumericValue(8);
String generatedExtensionURIvalue = "www." + Generator.randomAlphaNumericValue(8) + ".com";
String generatedExtensionReasonCodevalue = Generator.randomAlphaNumericValue(8);
String generatedExtensionReasonvalue = Generator.randomAlphaNumericValue(8);
editResourceDocumentWizardDialog.getExtensionIdInput().fill(generatedExtensionIdvalue);
editResourceDocumentWizardDialog.getExtensionNamenput().fill(generatedExtensionNamevalue);
editResourceDocumentWizardDialog.getExtensionAgencyIdnput().fill(generatedExtensionAgencyIdvalue);
editResourceDocumentWizardDialog.getExtensionAgencyNameInput().fill(generatedExtensionAgencyNamevalue);
editResourceDocumentWizardDialog.getExtensionAgencyURIInput().fill(generatedExtensionAgencyURIvalue);
editResourceDocumentWizardDialog.getExtensionVersionIDInput().fill(generatedExtensionVersionIdvalue);
editResourceDocumentWizardDialog.getExtensionURIInput().fill(generatedExtensionURIvalue);
editResourceDocumentWizardDialog.getExtensionReasonCodeInput().fill(generatedExtensionReasonCodevalue);
editResourceDocumentWizardDialog.getExtensionReasonInput().fill(generatedExtensionReasonvalue);
editResourceDocumentWizardDialog.clickOK();
editResourceDocumentPage.clickOnSave();
editResourceDocumentPage.clickOnValidate();
String document = editResourceDocumentPage.getDocumentValue();
XMLUtils documentXML = new XMLUtils(document);
soft.assertEquals(documentXML.getNodeValue("ExtensionID"), generatedExtensionIdvalue, "Wrong ExtensionId value");
soft.assertEquals(documentXML.getNodeValue("ExtensionName"), generatedExtensionNamevalue, "Wrong ExtensionName value");
soft.assertEquals(documentXML.getNodeValue("ExtensionAgencyID"), generatedExtensionAgencyIdvalue, "Wrong ExtensionAgencyID value");
soft.assertEquals(documentXML.getNodeValue("ExtensionAgencyName"), generatedExtensionAgencyNamevalue, "Wrong ExtensionAgencyName value");
soft.assertEquals(documentXML.getNodeValue("ExtensionAgencyURI"), generatedExtensionAgencyURIvalue, "Wrong ExtensionAgencyURI value");
soft.assertEquals(documentXML.getNodeValue("ExtensionVersionID"), generatedExtensionVersionIdvalue, "Wrong ExtensionVersionID value");
soft.assertEquals(documentXML.getNodeValue("ExtensionURI"), generatedExtensionURIvalue, "Wrong ExtensionURI value");
soft.assertEquals(documentXML.getNodeValue("ExtensionReasonCode"), generatedExtensionReasonCodevalue, "Wrong ExtensionReasonCode value");
soft.assertEquals(documentXML.getNodeValue("ExtensionReason"), generatedExtensionReasonvalue, "Wrong ExtensionReason value");
soft.assertAll();
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment