diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseNewActivity.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseNewActivity.java index b8589de17a4..bd7440a0bd3 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseNewActivity.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseNewActivity.java @@ -27,12 +27,13 @@ import android.os.AsyncTask; import android.os.Bundle; import android.view.Menu; - import androidx.annotation.NonNull; - import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.contact.ContactClassification; import de.symeda.sormas.api.contact.ContactStatus; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.ValidationException; import de.symeda.sormas.api.utils.YesNoUnknown; @@ -80,8 +81,16 @@ public static void startActivityWithEmptyReportDate(Context fromActivity) { BaseEditActivity.startActivity(fromActivity, CaseNewActivity.class, buildBundleWithEmptyReportDate()); } - public static void startActivityFromContact(Context fromActivity, String contactUuid) { - BaseEditActivity.startActivity(fromActivity, CaseNewActivity.class, buildBundleWithContact(contactUuid)); + public static void startActivityFromContact(Context fromActivity, Contact contact) { + if (contact.getContactClassification() != ContactClassification.CONFIRMED) { + NotificationHelper.showNotification( + getActiveActivity(), + NotificationType.WARNING, + I18nProperties.getString(Strings.messageContactToCaseConfirmationRequired)); + return; + } + + BaseEditActivity.startActivity(fromActivity, CaseNewActivity.class, buildBundleWithContact(contact.getUuid())); } public static void startActivityFromEventPerson(Context fromActivity, EventParticipant eventParticipant) { diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/dialog/SynchronizationDialog.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/dialog/SynchronizationDialog.java index 71998ca7d4c..c2a3ad70ecd 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/component/dialog/SynchronizationDialog.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/component/dialog/SynchronizationDialog.java @@ -372,11 +372,11 @@ private void showRepullProgressItems() { addEntityIfViewAllowed(ImmunizationDto.class, Strings.entityImmunizations, allowedEntities); addEntityIfViewAllowed(EventDto.class, Strings.entityEvents, allowedEntities); addEntityIfViewAllowed(EventParticipantDto.class, Strings.entityEventParticipants, allowedEntities); + addEntityIfViewAllowed(EnvironmentDto.class, Strings.entityEnvironments, allowedEntities); + addEntityIfViewAllowed(EnvironmentSampleDto.class, Strings.entityEnvironmentSamples, allowedEntities); addEntityIfViewAllowed(SampleDto.class, Strings.entitySamples, allowedEntities); addEntityIfViewAllowed(PathogenTestDto.class, Strings.entityPathogenTests, allowedEntities); addEntityIfViewAllowed(AdditionalTestDto.class, Strings.entityAdditionalTests, allowedEntities); - addEntityIfViewAllowed(EnvironmentDto.class, Strings.entityEnvironments, allowedEntities); - addEntityIfViewAllowed(EnvironmentSampleDto.class, Strings.entityEnvironmentSamples, allowedEntities); addEntityIfViewAllowed(ContactDto.class, Strings.entityContacts, allowedEntities); addEntityIfViewAllowed(VisitDto.class, Strings.entityVisits, allowedEntities); addEntityIfViewAllowed(TaskDto.class, Strings.entityTasks, allowedEntities); diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditFragment.java index 0188b1051c7..fb41d908cc4 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditFragment.java @@ -89,7 +89,7 @@ public static ContactEditFragment newInstance(Contact activityRootData) { } private void setUpControlListeners(FragmentContactEditLayoutBinding contentBinding) { - contentBinding.createCase.setOnClickListener(v -> CaseNewActivity.startActivityFromContact(getContext(), record.getUuid())); + contentBinding.createCase.setOnClickListener(v -> CaseNewActivity.startActivityFromContact(getContext(), record)); contentBinding.openSourceCase.setOnClickListener(v -> CaseReadActivity.startActivity(getActivity(), sourceCase.getUuid(), true)); @@ -115,7 +115,7 @@ private void setUpFieldVisibilities(FragmentContactEditLayoutBinding contentBind contentBinding.contactCaseOrEventInformation.setVisibility(GONE); } - if (record.getContactClassification() != ContactClassification.CONFIRMED) { + if (record.getContactClassification() == ContactClassification.NO_CONTACT) { contentBinding.createCase.setVisibility(GONE); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java index fe11650cbd6..0daf00b0793 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java @@ -127,6 +127,9 @@ protected Predicate createRelevantDataFilter(CriteriaBuilder cb, CriteriaQuery c filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(taskQueryContext)); } + Predicate criteriaFilter = this.buildCriteriaFilter(new TaskCriteria(), taskQueryContext); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + return filter; } @@ -144,6 +147,9 @@ public List getAllActiveUuids(User user) { filter = CriteriaBuilderHelper.and(cb, filter, userFilter); } + Predicate criteriaFilter = this.buildCriteriaFilter(new TaskCriteria(), taskQueryContext); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + if (RequestContextHolder.isMobileSync()) { Predicate predicate = createLimitedChangeDateFilter(cb, from); if (predicate != null) { @@ -190,7 +196,9 @@ private boolean hasContextOrNoContext(TaskCriteria taskCriteria, TaskContext tas || !taskCriteria.hasContextCriteria() || (taskCriteria.getTaskContext() == TaskContext.TRAVEL_ENTRY || taskCriteria.getTravelEntry() != null); case ENVIRONMENT: - return taskCriteria == null || (taskCriteria.getTaskContext() == TaskContext.ENVIRONMENT || taskCriteria.getEnvironment() != null); + return taskCriteria == null + || !taskCriteria.hasContextCriteria() + || (taskCriteria.getTaskContext() == TaskContext.ENVIRONMENT || taskCriteria.getEnvironment() != null); case GENERAL: return taskCriteria == null || !taskCriteria.hasContextCriteria() || taskCriteria.getTaskContext() == TaskContext.GENERAL; default: diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java index e0903bcf925..832ebba7c29 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java @@ -241,7 +241,6 @@ public List getUsersByRegionAndRights(RegionReferenceDto regio null, null, true, - true, limitedDisease, userRights) .stream() @@ -316,7 +315,6 @@ public List getUserRefsByDistrict(DistrictReferenceDto distric districtRef != null ? Collections.singletonList(districtRef.getUuid()) : null, null, true, - true, limitedDisease, userRights) .stream() @@ -336,7 +334,6 @@ public List getUserRefsByDistrict( districtRef != null ? Collections.singletonList(districtRef.getUuid()) : null, null, true, - true, null, excludeLimitedDiseaseUsers, Arrays.asList(userRights)) @@ -355,7 +352,6 @@ public List getUserRefsByDistricts(List districtRefs.stream().map(DistrictReferenceDto::getUuid).collect(Collectors.toList()), null, true, - true, limitedDisease, userRights) .stream() @@ -392,10 +388,7 @@ public List getUserRefsByInfrastructure( @PermitAll public List getAllUserRefs(boolean includeInactive) { - return userService.getUserReferences(null, null, true, !includeInactive) - .stream() - .map(UserFacadeEjb::toReferenceDto) - .collect(Collectors.toList()); + return userService.getUserReferences(null, null, !includeInactive).stream().map(UserFacadeEjb::toReferenceDto).collect(Collectors.toList()); } private List getAssignableUsersBasedOnContext(TaskContextIndexCriteria taskContextIndexCriteria) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java index 2b11f36b0be..bdd1ab40831 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java @@ -198,43 +198,28 @@ public List getAllByDistrictsAndUserRights(List districts, Colle * @param activeOnly * @param userRights */ - public List getUserReferences( - List regionUuids, - List districtUuids, - boolean filterByCurrentUserJurisdiction, - boolean activeOnly, - UserRight... userRights) { + public List getUserReferences(List regionUuids, List districtUuids, boolean activeOnly, UserRight... userRights) { - return getUserReferences(regionUuids, districtUuids, null, filterByCurrentUserJurisdiction, activeOnly, userRights); + return getUserReferences(regionUuids, districtUuids, null, activeOnly, userRights); } public List getUserReferences( List regionUuids, List districtUuids, List communityUuids, - boolean filterByJurisdiction, boolean activeOnly, UserRight... userRights) { - return getUserReferences(regionUuids, districtUuids, communityUuids, filterByJurisdiction, activeOnly, null, userRights); + return getUserReferences(regionUuids, districtUuids, communityUuids, activeOnly, null, userRights); } public List getUserReferences( List regionUuids, List districtUuids, List communityUuids, - boolean filterByJurisdiction, boolean activeOnly, Disease limitedDisease, UserRight... userRights) { - return getUserReferences( - regionUuids, - districtUuids, - communityUuids, - filterByJurisdiction, - activeOnly, - limitedDisease, - false, - Arrays.asList(userRights)); + return getUserReferences(regionUuids, districtUuids, communityUuids, activeOnly, limitedDisease, false, Arrays.asList(userRights)); } /** @@ -254,7 +239,6 @@ public List getUserReferences( List regionUuids, List districtUuids, List communityUuids, - boolean filterByJurisdiction, boolean activeOnly, Disease limitedDisease, boolean excludeLimitedDiseaseUsers, @@ -289,7 +273,7 @@ public List getUserReferences( filter = CriteriaBuilderHelper.and(cb, filter, districtFilter); userEntityJoinUsed = true; } - if (filterByJurisdiction) { + if (!hasRight(UserRight.SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION)) { filter = CriteriaBuilderHelper.and(cb, filter, createCurrentUserJurisdictionFilter(cb, userRoot)); userEntityJoinUsed = true; } @@ -712,10 +696,6 @@ public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From from) { - if (hasRight(UserRight.SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION)) { - return cb.conjunction(); - } - User currentUser = getCurrentUser(); if (currentUser.getHealthFacility() != null) { diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java index cc328a223ad..430b0428772 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java @@ -34,6 +34,40 @@ public class UserRolesPage { public static By SAVE_BUTTON = By.cssSelector("#commit"); public static By DISCARD_BUTTON = By.cssSelector("#discard"); public static By USER_ROLE_LIST = By.cssSelector("#tab-user-userroles"); + public static By EDIT_EXISTING_CASES_CHECKBOX = By.xpath("//label[text()='Edit existing cases']"); + public static By EDIT_EXISTING_CASES_CHECKBOX_VALUE = + By.xpath("//label[text()='Edit existing cases']/preceding-sibling::input"); + public static By EDIT_CASE_INVESTIGATION_STATUS_CHECKBOX = + By.xpath("//label[text()='Edit case investigation status']"); + public static By EDIT_CASE_INVESTIGATION_STATUS_CHECKBOX_VALUE = + By.xpath("//label[text()='Edit case investigation status']/preceding-sibling::input"); + public static By EDIT_CASE_DISEASE_CHECKBOX = By.xpath("//label[text()='Edit case disease']"); + public static By EDIT_CASE_DISEASE_CHECKBOX_VALUE = + By.xpath("//label[text()='Edit case disease']/preceding-sibling::input"); + public static By TRANSFER_CASES_TO_ANOTHER_REGION_DISTRICT_FACILITY_CHECKBOX = + By.xpath("//label[text()='Transfer cases to another region/district/facility']"); + public static By TRANSFER_CASES_TO_ANOTHER_REGION_DISTRICT_FACILITY_CHECKBOX_VALUE = + By.xpath( + "//label[text()='Transfer cases to another region/district/facility']/preceding-sibling::input"); + public static By EDIT_CASE_CLASSIFICATION_AND_OUTCOME_CHECKBOX = + By.xpath("//label[text()='Edit case classification and outcome']"); + public static By EDIT_CASE_CLASSIFICATION_AND_OUTCOME_CHECKBOX_VALUE = + By.xpath("//label[text()='Edit case classification and outcome']/preceding-sibling::input"); + public static By EDIT_CASE_EPID_NUMBER_CHECKBOX = + By.xpath("//label[text()='Edit case epid number']"); + public static By EDIT_CASE_EPID_NUMBER_CHECKBOX_VALUE = + By.xpath("//label[text()='Edit case epid number']/preceding-sibling::input"); + public static By REFER_CASE_FROM_POINT_OF_ENTRY_CHECKBOX = + By.xpath("//label[text()='Refer case from point of entry']"); + public static By REFER_CASE_FROM_POINT_OF_ENTRY_CHECKBOX_VALUE = + By.xpath("//label[text()='Refer case from point of entry']/preceding-sibling::input"); + public static By CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX = + By.xpath("//label[text()='Can be responsible for a case']"); + public static By CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX_VALUE = + By.xpath("//label[text()='Can be responsible for a case']/preceding-sibling::input"); + public static By WORK_WITH_MESSAGE_CHECKBOX = By.xpath("//label[text()='Work with messages']"); + public static By WORK_WITH_MESSAGE_CHECKBOX_VALUE = + By.xpath("//label[text()='Work with messages']/preceding-sibling::input"); public static By getUserRoleCaptionByText(String caption) { return By.xpath(String.format("//td[contains(text(), '%s')]", caption)); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/BaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/BaseSteps.java index 46de90e84a2..092b78d3f22 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/BaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/BaseSteps.java @@ -28,8 +28,7 @@ import io.qameta.allure.Allure; import io.qameta.allure.Attachment; import io.qameta.allure.listener.StepLifecycleListener; -import io.restassured.RestAssured; -import io.restassured.parsing.Parser; + import java.lang.management.ManagementFactory; import java.time.Duration; import java.time.LocalDateTime; @@ -55,7 +54,7 @@ public class BaseSteps implements StepLifecycleListener { public static String locale; private final DriverManager driverManager; private final String imageType = "image/png"; - private final String pngValue = "png"; + private final String jpgValue = "jpg"; @Inject public BaseSteps(DriverManager driverManager) { @@ -77,24 +76,16 @@ public void beforeScenario(Scenario scenario) { driver = driverManager.borrowRemoteWebDriver(scenario.getName()); StepsLogger.setRemoteWebDriver(driver); WebDriver.Options options = driver.manage(); - options.timeouts().setScriptTimeout(Duration.ofMinutes(2)); + options.timeouts().scriptTimeout(Duration.ofMinutes(2)); options.timeouts().pageLoadTimeout(Duration.ofMinutes(2)); log.info("Starting test: {} with process ID [ {} ]", scenario.getName(), PROCESS_ID); } } - @Before(value = "@API") - static void setup() { - RestAssured.registerParser("text/html", Parser.JSON); - } - @SneakyThrows @After(value = "@UI") public void afterScenario(Scenario scenario) { if (isLanguageRiskScenario(scenario) && scenario.isFailed()) { - // TODO replace it with API call when implemented - log.info("Refreshing page to close any popups"); - driver.navigate().refresh(); BackupSteps.setAppLanguageToDefault(locale); } if (isNonApiScenario(scenario)) { @@ -168,7 +159,7 @@ private void takeScreenshot() { "Screenshot at :" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd-MMM-yy hh:mm:ss")), imageType, - pngValue, + jpgValue, screenShot); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/LoginSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/LoginSteps.java index 991c22354af..84f8fb591ad 100755 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/LoginSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/LoginSteps.java @@ -22,6 +22,8 @@ import static org.sormas.e2etests.pages.application.NavBarPage.*; import static org.sormas.e2etests.pages.application.dashboard.Surveillance.SurveillanceDashboardPage.LOGOUT_BUTTON; import static org.sormas.e2etests.steps.BaseSteps.locale; +import static org.sormas.e2etests.steps.web.application.users.CreateNewUserSteps.userName; +import static org.sormas.e2etests.steps.web.application.users.CreateNewUserSteps.userPass; import com.google.inject.Inject; import cucumber.api.java8.En; @@ -159,6 +161,20 @@ public LoginSteps( webDriverHelpers.clickOnWebElementBySelector(LoginPage.LOGIN_BUTTON); webDriverHelpers.waitForPageLoaded(); }); + + Then( + "I login with new created user with chosen new role", + () -> { + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( + LoginPage.USER_NAME_INPUT, 100); + log.info("Filling username"); + webDriverHelpers.fillInWebElement(LoginPage.USER_NAME_INPUT, userName); + log.info("Filling password"); + webDriverHelpers.fillInWebElement(LoginPage.USER_PASSWORD_INPUT, userPass); + log.info("Click on Login button"); + webDriverHelpers.clickOnWebElementBySelector(LoginPage.LOGIN_BUTTON); + webDriverHelpers.waitForPageLoaded(); + }); Then( "I login with last edited user on Keycloak Enabled Environment", () -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java index 7a8f2c076ab..91d338b5c9e 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java @@ -173,6 +173,7 @@ import static org.sormas.e2etests.pages.application.entries.TravelEntryPage.SELECT_ANOTHER_PERSON_DE; import static org.sormas.e2etests.pages.application.tasks.TaskManagementPage.BULK_DELETE_BUTTON; import static org.sormas.e2etests.steps.BaseSteps.locale; +import static org.sormas.e2etests.steps.web.application.cases.EditCaseSteps.caseUuid; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -289,6 +290,13 @@ public CaseDirectorySteps( webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); }); + When( + "I open the first Case result in Case Directory", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(FIRST_CASE_ID); + webDriverHelpers.clickOnWebElementBySelector(FIRST_CASE_ID); + }); + When( "I check if downloaded zip file for Quarantine Order is correct", () -> { @@ -313,6 +321,15 @@ public CaseDirectorySteps( webDriverHelpers.clickOnWebElementBySelector(SOURCE_CASE_WINDOW_SEARCH_CASE_BUTTON); }); + When( + "I search for the last {string} case on Case directory page", + (String option) -> { + webDriverHelpers.fillInWebElement(CASE_DIRECTORY_DETAILED_PAGE_FILTER_INPUT, caseUuid); + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( + CASE_APPLY_FILTERS_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(CASE_APPLY_FILTERS_BUTTON); + }); + When( "^Search for Case using Case UUID from the created Task", () -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index 4887e4c3226..688a09bb476 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -2165,6 +2165,24 @@ public EditCaseSteps( webDriverHelpers.scrollToElement(CONFIRM_ACTION); webDriverHelpers.clickOnWebElementBySelector(CONFIRM_ACTION); }); + When( + "I check that {string} button is readonly on Edit case page", + (String button) -> { + switch (button) { + case "Discard": + softly.assertEquals( + webDriverHelpers.isElementEnabled(DISCARD_BUTTON), + false, + "Discard button is editable state!"); + break; + case "Save": + softly.assertEquals( + webDriverHelpers.isElementEnabled(SAVE_BUTTON), + false, + "Save button is editable state!"); + break; + } + }); When( "I check if editable fields are enabled for the case in view", () -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index aaa2f7033e2..8a1b98ac288 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -1160,7 +1160,7 @@ public EditEventSteps( "I click on Yes option in Confirm deletion on Edit Event Page", () -> { webDriverHelpers.clickOnWebElementBySelector(ACTION_CONFIRM_POPUP_BUTTON); - webDriverHelpers.waitForPageLoadingSpinnerToDisappear(30); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(50); }); When( "I check that error message is equal to {string} in Reason for Deletion in popup", @@ -1174,6 +1174,7 @@ public EditEventSteps( When( "I check if Reason for deletion is set to {string} on Edit Event Page", (String expected) -> { + webDriverHelpers.scrollToElement(REASON_FOR_DELETION_INPUT); String collectedReason = webDriverHelpers.getValueFromWebElement(REASON_FOR_DELETION_INPUT); softly.assertEquals(expected, collectedReason, "Reasons for deletion are not equal"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java index 7ae4e392aba..22b19a54067 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java @@ -23,16 +23,32 @@ import static org.sormas.e2etests.pages.application.users.UserRolesPage.ARCHIVE_CONTACTS_CHECKBOX; import static org.sormas.e2etests.pages.application.users.UserRolesPage.CANNOT_DELETE_USER_ROLE_POPUP; import static org.sormas.e2etests.pages.application.users.UserRolesPage.CANNOT_DELETE_USER_ROLE_POPUP_OKAY_BUTTON; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX_VALUE; import static org.sormas.e2etests.pages.application.users.UserRolesPage.CAPTION_INPUT; import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_CONFIRMATION_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_USER_ROLE_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.DISCARD_BUTTON; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_CASE_CLASSIFICATION_AND_OUTCOME_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_CASE_CLASSIFICATION_AND_OUTCOME_CHECKBOX_VALUE; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_CASE_DISEASE_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_CASE_DISEASE_CHECKBOX_VALUE; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_CASE_EPID_NUMBER_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_CASE_EPID_NUMBER_CHECKBOX_VALUE; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_CASE_INVESTIGATION_STATUS_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_CASE_INVESTIGATION_STATUS_CHECKBOX_VALUE; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_EXISTING_CASES_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EDIT_EXISTING_CASES_CHECKBOX_VALUE; import static org.sormas.e2etests.pages.application.users.UserRolesPage.ENABLED_DISABLED_SEARCH_COMBOBOX; import static org.sormas.e2etests.pages.application.users.UserRolesPage.EXPORT_USER_ROLES_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.NEW_USER_ROLE_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.POPUP_DISCARD_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.POPUP_SAVE_BUTTON; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.REFER_CASE_FROM_POINT_OF_ENTRY_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.REFER_CASE_FROM_POINT_OF_ENTRY_CHECKBOX_VALUE; import static org.sormas.e2etests.pages.application.users.UserRolesPage.SAVE_BUTTON; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.TRANSFER_CASES_TO_ANOTHER_REGION_DISTRICT_FACILITY_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.TRANSFER_CASES_TO_ANOTHER_REGION_DISTRICT_FACILITY_CHECKBOX_VALUE; import static org.sormas.e2etests.pages.application.users.UserRolesPage.USER_MANAGEMENT_TAB; import static org.sormas.e2etests.pages.application.users.UserRolesPage.USER_RIGHTS_COMBOBOX; import static org.sormas.e2etests.pages.application.users.UserRolesPage.USER_RIGHTS_INPUT; @@ -40,12 +56,15 @@ import static org.sormas.e2etests.pages.application.users.UserRolesPage.USER_ROLE_ENABLE_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.USER_ROLE_LIST; import static org.sormas.e2etests.pages.application.users.UserRolesPage.USER_ROLE_TEMPLATE_COMBOBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.WORK_WITH_MESSAGE_CHECKBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.WORK_WITH_MESSAGE_CHECKBOX_VALUE; import static org.sormas.e2etests.pages.application.users.UserRolesPage.getUserRoleCaptionByText; import cucumber.api.java8.En; import java.time.LocalDate; import java.util.concurrent.TimeUnit; import javax.inject.Inject; +import org.openqa.selenium.By; import org.sormas.e2etests.helpers.WebDriverHelpers; import org.sormas.e2etests.helpers.files.FilesHelper; import org.testng.asserts.SoftAssert; @@ -104,6 +123,83 @@ public UserRolesSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { } }); + And( + "^I click checkbox to uncheck \"([^\"]*)\"$", + (String checkboxLabel) -> { + Boolean checkboxState; + switch (checkboxLabel) { + case "Edit existing cases": + webDriverHelpers.scrollToElement(EDIT_EXISTING_CASES_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent(EDIT_EXISTING_CASES_CHECKBOX); + checkboxState = webDriverHelpers.isElementChecked(EDIT_EXISTING_CASES_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, EDIT_EXISTING_CASES_CHECKBOX); + break; + case "Edit case investigation status": + webDriverHelpers.scrollToElement(EDIT_CASE_INVESTIGATION_STATUS_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent( + EDIT_CASE_INVESTIGATION_STATUS_CHECKBOX); + checkboxState = + webDriverHelpers.isElementChecked(EDIT_CASE_INVESTIGATION_STATUS_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, EDIT_CASE_INVESTIGATION_STATUS_CHECKBOX); + break; + case "Edit case disease": + webDriverHelpers.scrollToElement(EDIT_CASE_DISEASE_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent(EDIT_CASE_DISEASE_CHECKBOX); + checkboxState = webDriverHelpers.isElementChecked(EDIT_CASE_DISEASE_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, EDIT_CASE_DISEASE_CHECKBOX); + break; + case "Transfer cases to another region/district/facility": + webDriverHelpers.scrollToElement( + TRANSFER_CASES_TO_ANOTHER_REGION_DISTRICT_FACILITY_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent( + TRANSFER_CASES_TO_ANOTHER_REGION_DISTRICT_FACILITY_CHECKBOX); + checkboxState = + webDriverHelpers.isElementChecked( + TRANSFER_CASES_TO_ANOTHER_REGION_DISTRICT_FACILITY_CHECKBOX_VALUE); + uncheckCheckbox( + checkboxState, TRANSFER_CASES_TO_ANOTHER_REGION_DISTRICT_FACILITY_CHECKBOX); + break; + case "Edit case classification and outcome": + webDriverHelpers.scrollToElement(EDIT_CASE_CLASSIFICATION_AND_OUTCOME_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent( + EDIT_CASE_CLASSIFICATION_AND_OUTCOME_CHECKBOX); + checkboxState = + webDriverHelpers.isElementChecked( + EDIT_CASE_CLASSIFICATION_AND_OUTCOME_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, EDIT_CASE_CLASSIFICATION_AND_OUTCOME_CHECKBOX); + break; + case "Edit case epid number": + webDriverHelpers.scrollToElement(EDIT_CASE_EPID_NUMBER_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent(EDIT_CASE_EPID_NUMBER_CHECKBOX); + checkboxState = + webDriverHelpers.isElementChecked(EDIT_CASE_EPID_NUMBER_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, EDIT_CASE_EPID_NUMBER_CHECKBOX); + break; + case "Refer case from point of entry": + webDriverHelpers.scrollToElement(REFER_CASE_FROM_POINT_OF_ENTRY_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent( + REFER_CASE_FROM_POINT_OF_ENTRY_CHECKBOX); + checkboxState = + webDriverHelpers.isElementChecked(REFER_CASE_FROM_POINT_OF_ENTRY_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, REFER_CASE_FROM_POINT_OF_ENTRY_CHECKBOX); + break; + case "Can be responsible for a case": + webDriverHelpers.scrollToElement(CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent( + CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX); + checkboxState = + webDriverHelpers.isElementChecked(CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, CAN_BE_RESPONSIBLE_FOR_A_CASE_CHECKBOX); + break; + case "Work with message": + webDriverHelpers.scrollToElement(WORK_WITH_MESSAGE_CHECKBOX); + webDriverHelpers.waitUntilIdentifiedElementIsPresent(WORK_WITH_MESSAGE_CHECKBOX); + checkboxState = webDriverHelpers.isElementChecked(WORK_WITH_MESSAGE_CHECKBOX_VALUE); + uncheckCheckbox(checkboxState, WORK_WITH_MESSAGE_CHECKBOX); + break; + } + }); + And( "^I click SAVE button on User Role Page$", () -> { @@ -291,4 +387,8 @@ public UserRolesSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { } }); } + + private void uncheckCheckbox(Boolean checkboxState, By checkboxName) { + if (checkboxState == true) webDriverHelpers.clickOnWebElementBySelector(checkboxName); + } } diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/UserRoles.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/UserRoles.feature index 3a9793e5b9c..cd4f52b62d7 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/UserRoles.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/UserRoles.feature @@ -155,3 +155,48 @@ Feature: User roles checks And I click on the Users from navbar And I click on User roles tab from User Management Page And Validate user can see User roles tab from User Management Page + + @tmsLink=HSP-6300 @env_main + Scenario: Check Delete Case right working without Edit rights + Given I log in as a Admin User + And I click on the Users from navbar + And I check if there is any user with the "MyNationalTestUser" role and change his role + And I click on User roles tab from User Management Page + And I check if the "MyNationalTestUser" user role exist and delete it + And I click on New user role button on User Roles Page + And I choose "National User" as the user role template + And I fill caption input as "MyNationalTestUser" on Create New User Role form + And I click SAVE button on User Role Page + Then I click checkbox to uncheck "Edit existing cases" + Then I click checkbox to uncheck "Edit case investigation status" + Then I click checkbox to uncheck "Edit case disease" + Then I click checkbox to uncheck "Transfer cases to another region/district/facility" + Then I click checkbox to uncheck "Edit case classification and outcome" + Then I click checkbox to uncheck "Edit case epid number" + Then I click checkbox to uncheck "Refer case from point of entry" + Then I click checkbox to uncheck "Can be responsible for a case" + Then I click checkbox to uncheck "Work with message" + And I click SAVE button on User Role Page + And I back to the User role list + Then I click on User Management tab from User Roles Page + And I click on the NEW USER button + And I create new "MyNationalTestUser" with english language for test + Then I click on logout button from navbar + And I login with new created user with chosen new role + And I click on the Cases button from navbar + And I open the first Case result in Case Directory + Then I get the case person UUID displayed on Edit case page + Then I click on Delete button from case + And I click on Yes option in Confirm deletion popup + When I set Reason for deletion as "Deletion request by affected person according to GDPR" + And I click on Yes option in Confirm deletion popup + And I set the Relevance Status Filter to "Deleted cases" on Case Directory page + And I search for the last "deleted" case on Case directory page + Then I open the first Case result in Case Directory + And Total number of read only fields should be 17 + Then I check that "Discard" button is readonly on Edit case page + And I check that "Save" button is readonly on Edit case page + Then I click on Restore button from case + And I set the Relevance Status Filter to "Active cases" on Case Directory page + And I search for the last "restored" case on Case directory page + And I check that number of displayed cases results is 1 \ No newline at end of file