diff --git a/avni-server-api/src/main/java/org/avni/server/domain/JsonObject.java b/avni-server-api/src/main/java/org/avni/server/domain/JsonObject.java index 0f8365601..4aa01a603 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/JsonObject.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/JsonObject.java @@ -39,4 +39,8 @@ public List getList(String key) { } return (List) o; } + + public Boolean getBoolean(String key) { + return (Boolean) this.get(key); + } } diff --git a/avni-server-api/src/main/java/org/avni/server/domain/Locale.java b/avni-server-api/src/main/java/org/avni/server/domain/Locale.java index 3ebdb5a44..e38f63b50 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/Locale.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/Locale.java @@ -24,9 +24,9 @@ public enum Locale { this.name = name; } - public static Locale valueByName(@Nullable String name) { + public static Locale valueByNameIgnoreCase(@Nullable String name) { for (Locale value : Locale.values()) { - if (value.name.equals(name)) return value; + if (value.name.equalsIgnoreCase(name)) return value; } return null; } diff --git a/avni-server-api/src/main/java/org/avni/server/domain/User.java b/avni-server-api/src/main/java/org/avni/server/domain/User.java index 129b49fa9..55793c5fc 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/User.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/User.java @@ -120,6 +120,10 @@ public List getSyncSettingsList() { return ObjectMapperSingleton.getObjectMapper().convertValue(syncSettings.get(User.SyncSettingKeys.subjectTypeSyncSettings.name()), new TypeReference>() {}); } + public boolean isPartOfUserGroup(String userGroup) { + return this.getUserGroups().stream().anyMatch(ug -> ug.getGroup().getName().equals(userGroup)); + } + public enum SyncSettingKeys { syncAttribute1, syncAttribute2, diff --git a/avni-server-api/src/main/java/org/avni/server/domain/UserSettings.java b/avni-server-api/src/main/java/org/avni/server/domain/UserSettings.java index e34481254..7d8090392 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/UserSettings.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/UserSettings.java @@ -1,13 +1,27 @@ package org.avni.server.domain; +import org.avni.server.util.CollectionUtil; + +import java.util.Arrays; +import java.util.List; + public class UserSettings { private final JsonObject jsonObject; public static final String ID_PREFIX = "idPrefix"; + public static final String DATE_PICKER_MODE = "datePickerMode"; + public static final String LOCALE = "locale"; + public static final String ENABLE_BENEFICIARY_MODE = "showBeneficiaryMode"; + public static final String TRACK_LOCATION = "trackLocation"; + public static final List DATE_PICKER_MODE_OPTIONS = Arrays.asList("calendar", "spinner"); public UserSettings(JsonObject jsonObject) { this.jsonObject = jsonObject; } + public static String createDatePickerMode(String datePickerMode) { + return CollectionUtil.findMatchingIgnoreCase(DATE_PICKER_MODE_OPTIONS, datePickerMode); + } + public String getIdPrefix() { return UserSettings.getIdPrefix(this.jsonObject); } @@ -16,4 +30,20 @@ public static String getIdPrefix(JsonObject jsonObject) { if (jsonObject == null) return null; return jsonObject.getString(ID_PREFIX); } + + public String getDatePickerMode() { + return jsonObject.getString(DATE_PICKER_MODE); + } + + public String getLocale() { + return jsonObject.getString(LOCALE); + } + + public boolean isEnableBeneficiaryMode() { + return jsonObject.getBoolean(ENABLE_BENEFICIARY_MODE); + } + + public boolean isTrackLocation() { + return jsonObject.getBoolean(TRACK_LOCATION); + } } diff --git a/avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/UserAndCatchmentWriter.java b/avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/UserAndCatchmentWriter.java index a2045fbd4..c854ec735 100644 --- a/avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/UserAndCatchmentWriter.java +++ b/avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/UserAndCatchmentWriter.java @@ -9,6 +9,7 @@ import org.avni.server.importer.batch.csv.writer.header.UsersAndCatchmentsHeaders; import org.avni.server.importer.batch.model.Row; import org.avni.server.service.*; +import org.avni.server.util.CollectionUtil; import org.avni.server.util.PhoneNumberUtil; import org.avni.server.util.RegionUtil; import org.avni.server.util.S; @@ -24,10 +25,10 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import static java.lang.String.format; import static org.avni.server.domain.OperatingIndividualScope.ByCatchment; +import static org.avni.server.domain.UserSettings.DATE_PICKER_MODE_OPTIONS; import static org.avni.server.importer.batch.csv.writer.header.UsersAndCatchmentsHeaders.*; @Component @@ -55,7 +56,6 @@ public class UserAndCatchmentWriter implements ItemWriter, Serializable { private static final String ERR_MSG_INVALID_CONCEPT_ANSWER = "'%s' is not a valid value for the concept '%s'. " + "To input this value, add this as an answer to the coded concept '%s'."; private static final String METADATA_ROW_START_STRING = "Mandatory field."; - private static final List DATE_PICKER_MODE_OPTIONS = Arrays.asList("calendar", "spinner"); @Autowired public UserAndCatchmentWriter(CatchmentService catchmentService, @@ -134,7 +134,7 @@ private void write(Row row) throws IDPException { String idPrefix = row.get(IDENTIFIER_PREFIX); String groupsSpecified = row.get(USER_GROUPS); AddressLevel location = locationRepository.findByTitleLineageIgnoreCase(fullAddress).orElse(null); - Locale locale = S.isEmpty(language) ? Locale.en : Locale.valueByName(language); + Locale locale = S.isEmpty(language) ? Locale.en : Locale.valueByNameIgnoreCase(language); Organisation organisation = UserContextHolder.getUserContext().getOrganisation(); String userSuffix = "@".concat(organisation.getEffectiveUsernameSuffix()); JsonObject syncSettings = constructSyncSettings(row, rowValidationErrorMsgs); @@ -158,10 +158,10 @@ private void write(Row row) throws IDPException { user.setSyncSettings(syncSettings); user.setSettings(new JsonObject() - .with("locale", locale) - .with("trackLocation", trackLocation) - .withEmptyCheckAndTrim("datePickerMode", datePickerMode) - .with("showBeneficiaryMode", beneficiaryMode) + .with(UserSettings.LOCALE, locale) + .with(UserSettings.TRACK_LOCATION, trackLocation) + .withEmptyCheckAndTrim(UserSettings.DATE_PICKER_MODE, UserSettings.createDatePickerMode(datePickerMode)) + .with(UserSettings.ENABLE_BENEFICIARY_MODE, beneficiaryMode) .withEmptyCheckAndTrim(UserSettings.ID_PREFIX, idPrefix)); user.setOrganisationId(organisation.getId()); @@ -188,8 +188,7 @@ private void validateRowAndAssimilateErrors(List rowValidationErrorMsgs, addErrMsgIfValidationFails(StringUtils.isEmpty(location), rowValidationErrorMsgs, format(ERR_MSG_LOCATION_FIELD, fullAddress)); addErrMsgIfValidationFails(StringUtils.isEmpty(locale), rowValidationErrorMsgs, format(ERR_MSG_LOCALE_FIELD, language)); - addErrMsgIfValidationFails(StringUtils.isEmpty(datePickerMode) || !DATE_PICKER_MODE_OPTIONS.contains(datePickerMode), - rowValidationErrorMsgs, format(ERR_MSG_DATE_PICKER_FIELD, datePickerMode)); + addErrMsgIfValidationFails(!StringUtils.isEmpty(datePickerMode) && !CollectionUtil.containsIgnoreCase(DATE_PICKER_MODE_OPTIONS, datePickerMode), rowValidationErrorMsgs, format(ERR_MSG_DATE_PICKER_FIELD, datePickerMode)); addErrMsgIfValidationFails(trackLocation == null && !StringUtils.isEmpty(trackLocationValueProvidedByUser), rowValidationErrorMsgs, format(ERR_MSG_INVALID_TRACK_LOCATION, trackLocationValueProvidedByUser)); addErrMsgIfValidationFails(beneficiaryMode == null && !StringUtils.isEmpty(beneficiaryModeValueProvidedByUser), rowValidationErrorMsgs, format(ERR_MSG_INVALID_ENABLE_BENEFICIARY_MODE, beneficiaryModeValueProvidedByUser)); diff --git a/avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/header/UsersAndCatchmentsHeaders.java b/avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/header/UsersAndCatchmentsHeaders.java index 7d1d99005..63a9a8b22 100644 --- a/avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/header/UsersAndCatchmentsHeaders.java +++ b/avni-server-api/src/main/java/org/avni/server/importer/batch/csv/writer/header/UsersAndCatchmentsHeaders.java @@ -18,7 +18,7 @@ public class UsersAndCatchmentsHeaders implements Headers { public static final String IDENTIFIER_PREFIX = "Identifier Prefix"; public static final String USER_GROUPS = "User Groups"; - private static final List OPTIONAL_HEADERS = Arrays.asList(ENABLE_BENEFICIARY_MODE, TRACK_LOCATION); + private static final List OPTIONAL_HEADERS = Arrays.asList(ENABLE_BENEFICIARY_MODE, TRACK_LOCATION, PREFERRED_LANGUAGE, DATE_PICKER_MODE, IDENTIFIER_PREFIX, USER_GROUPS); @Override public String[] getAllHeaders() { diff --git a/avni-server-api/src/main/java/org/avni/server/service/UserService.java b/avni-server-api/src/main/java/org/avni/server/service/UserService.java index 0706df892..257449fd1 100644 --- a/avni-server-api/src/main/java/org/avni/server/service/UserService.java +++ b/avni-server-api/src/main/java/org/avni/server/service/UserService.java @@ -152,7 +152,7 @@ public void addToGroups(User user, String groupsSpecified) { Arrays.stream(groupNames).distinct().forEach(groupName -> { if (!StringUtils.hasLength(groupName.trim())) return; - Group group = this.groupRepository.findByName(groupName); + Group group = this.groupRepository.findByNameIgnoreCase(groupName); if (group == null) { String errorMessage = String.format("Group '%s' not found", groupName); throw new RuntimeException(errorMessage); diff --git a/avni-server-api/src/main/java/org/avni/server/util/CollectionUtil.java b/avni-server-api/src/main/java/org/avni/server/util/CollectionUtil.java index e2a0cf818..2d2ce55bb 100644 --- a/avni-server-api/src/main/java/org/avni/server/util/CollectionUtil.java +++ b/avni-server-api/src/main/java/org/avni/server/util/CollectionUtil.java @@ -31,7 +31,15 @@ public static boolean hasOnlyTrailingEmptyStrings(List values) { return hasNoEmptyStrings(trimmed); } + public static boolean containsIgnoreCase(List list, String value) { + return list.stream().anyMatch(x -> !StringUtils.isEmpty(x) && x.equalsIgnoreCase(value)); + } + public static boolean anyStartsWith(List values, String prefix) { return values.stream().anyMatch(x -> !StringUtils.isEmpty(x) && x.startsWith(prefix)); } + + public static String findMatchingIgnoreCase(List values, String value) { + return values.stream().filter(x -> !StringUtils.isEmpty(x) && x.equalsIgnoreCase(value)).findFirst().orElse(null); + } } diff --git a/avni-server-api/src/test/java/org/avni/server/importer/batch/csv/writer/UserAndCatchmentWriterIntegrationTest.java b/avni-server-api/src/test/java/org/avni/server/importer/batch/csv/writer/UserAndCatchmentWriterIntegrationTest.java index c09eab837..7f20a6f6f 100644 --- a/avni-server-api/src/test/java/org/avni/server/importer/batch/csv/writer/UserAndCatchmentWriterIntegrationTest.java +++ b/avni-server-api/src/test/java/org/avni/server/importer/batch/csv/writer/UserAndCatchmentWriterIntegrationTest.java @@ -2,10 +2,7 @@ import org.avni.server.dao.CatchmentRepository; import org.avni.server.dao.UserRepository; -import org.avni.server.domain.AddressLevel; -import org.avni.server.domain.AddressLevelType; -import org.avni.server.domain.Concept; -import org.avni.server.domain.ConceptDataType; +import org.avni.server.domain.*; import org.avni.server.domain.factory.AddressLevelBuilder; import org.avni.server.domain.factory.AddressLevelTypeBuilder; import org.avni.server.domain.metadata.SubjectTypeBuilder; @@ -23,8 +20,7 @@ import java.util.Collections; import java.util.UUID; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; @Sql(value = {"/tear-down.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(value = {"/tear-down.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) @@ -78,10 +74,21 @@ private boolean catchmentCreated(boolean b) { return b; } - private boolean userCreated(boolean b) { + private boolean userCreatedDetails(boolean b) { return b; } + private boolean userCreatedDetails(String userName, String datePickerMode, String language, boolean trackLocation, boolean enableBeneficiaryMode, String userGroup) { + User user = userRepository.findByUsername(userName); + UserSettings userSettings = user.getUserSettings(); + assertEquals(userSettings.getDatePickerMode(), datePickerMode); + assertEquals(userSettings.getLocale(), language); + assertEquals(userSettings.isTrackLocation(), trackLocation); + assertEquals(userSettings.isEnableBeneficiaryMode(), enableBeneficiaryMode); + assertTrue(user.isPartOfUserGroup(userGroup)); + return true; + } + private String[] has(String... errors) { return errors; } @@ -150,6 +157,30 @@ private void treatAsDescriptor(String[] headers, String... additionalHeaders) th success(headers, additionalHeaders, false, false); } + private String language(String language) { + return language; + } + + private boolean trackLocation(boolean b) { + return b; + } + + private boolean enableBeneficiaryMode(boolean b) { + return b; + } + + private String userGroup(String userGroup) { + return userGroup; + } + + private String datePickerMode(String spinner) { + return spinner; + } + + private String user(String user) { + return user; + } + @Test public void shouldCreateUpdate() throws IDPException { // new catchment, new user @@ -157,43 +188,49 @@ public void shouldCreateUpdate() throws IDPException { header("Location with full hierarchy", "Catchment Name", "Username", "Full Name of User", "Email Address", "Mobile Number", "Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", "Identifier Prefix", "User Groups", "SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow("Bihar, District1, Block11", "Catchment 1", "username1@example", "User 1", "username1@example.com", "9455509147", "English", "true", "spinner", "false", "", "User Group 1", "Answer 1"), catchmentCreated(true), - userCreated(true)); + userCreatedDetails(true)); // existing catchment new user success( header("Location with full hierarchy", "Catchment Name", "Username", "Full Name of User", "Email Address", "Mobile Number", "Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", "Identifier Prefix", "User Groups", "SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow("Bihar, District1, Block11", "Catchment 1", "username2@example", "User 2", "username2@example.com", "9455509147", "English", "true", "spinner", "false", "", "User Group 1", "Answer 1"), catchmentCreated(false), - userCreated(true)); + userCreatedDetails(true)); // new catchment existing user success( header("Location with full hierarchy", "Catchment Name", "Username", "Full Name of User", "Email Address", "Mobile Number", "Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", "Identifier Prefix", "User Groups", "SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow("Bihar, District1, Block11", "Catchment 3", "username2@example", "User 2", "username2@example.com", "9455509147", "English", "true", "spinner", "false", "", "User Group 1", "Answer 1"), catchmentCreated(true), - userCreated(false)); + userCreatedDetails(false)); // existing catchment existing user success( header("Location with full hierarchy", "Catchment Name", "Username", "Full Name of User", "Email Address", "Mobile Number", "Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", "Identifier Prefix", "User Groups", "SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow("Bihar, District1, Block11", "Catchment 3", "username2@example", "User 2", "username2@example.com", "9455509147", "English", "true", "spinner", "false", "", "User Group 1", "Answer 1"), catchmentCreated(false), - userCreated(false)); + userCreatedDetails(false)); // with spaces success( header(" Location with full hierarchy", " Catchment Name", "Username ", " Full Name of User", "Email Address", "Mobile Number", " Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", " Identifier Prefix", " User Groups", " SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow(" Bihar, District1, Block11", " Catchment 4", " username3@example", " User 3", " username3@example.com ", " 9455509147 ", "English ", "true ", " spinner", " false", "", " User Group 1", " Answer 1"), catchmentCreated(true), - userCreated(true)); + userCreatedDetails(true)); // without mandatory fields success( header(" Location with full hierarchy", " Catchment Name", "Username ", " Full Name of User", "Email Address", "Mobile Number", " Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", " Identifier Prefix", " User Groups", " SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow(" Bihar, District1, Block11", " Catchment 5", " username6@example", " User 6", " username6@example.com ", " 9455509147 ", "English ", "", " spinner", " ", "", " User Group 1", " Answer 1"), catchmentCreated(true), - userCreated(true)); + userCreatedDetails(true)); // without mandatory fields and including in header success( header(" Location with full hierarchy", " Catchment Name", "Username ", " Full Name of User", "Email Address", "Mobile Number", " Preferred Language", "Date picker mode", " Identifier Prefix", " User Groups", " SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow(" Bihar, District1, Block11", " Catchment 6", " username7@example", " User 7", " username6@example.com ", " 9455509147 ", "English ", " spinner", "", " User Group 1", " Answer 1"), catchmentCreated(true), - userCreated(true)); + userCreatedDetails(true)); + // without mandatory fields and including in header including ones with default value + success( + header(" Location with full hierarchy", " Catchment Name", "Username ", " Full Name of User", "Email Address", "Mobile Number", " SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), + dataRow(" Bihar, District1, Block11", " Catchment 6", " username8@example", " User 8", " username8@example.com ", " 9455509147 ", "Answer 1"), + catchmentCreated(false), + userCreatedDetails(true)); // wrong - username, email, phone number, language, track location, date picker mode, enable beneficiary mode failure( @@ -218,8 +255,8 @@ public void shouldCreateUpdate() throws IDPException { error("Invalid or Empty value specified for mandatory field Username."), error("Invalid or Empty value specified for mandatory field Full Name of User."), error("Invalid or Empty value specified for mandatory field Email Address."), - error("Invalid or Empty value specified for mandatory field Mobile Number."), - error("Provided value '' for Date picker mode is invalid.")) + error("Invalid or Empty value specified for mandatory field Mobile Number.") + ) ); // invalid User Group Name @@ -233,7 +270,7 @@ public void shouldCreateUpdate() throws IDPException { header("Location with full hierarchy", "Catchment Name", "Username", "Full Name of User", "Email Address", "Mobile Number", "Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", "Identifier Prefix", "User Groups", "SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow("Bihar, District1, Block11", "Catchment 3", "username4@example", "User 4", "username4@example.com", "9455509147", "English", "true", "spinner", "false", "", "User Group 1,User Group 1", "Answer 1"), catchmentCreated(false), - userCreated(true) + userCreatedDetails(true) ); // invalid sync attribute @@ -258,7 +295,7 @@ public void shouldCreateUpdate() throws IDPException { // Missing headers - all failsOnMissingHeader( header(), - has(error("Mandatory columns are missing from uploaded file - Identifier Prefix, Mobile Number, User Groups, Username, SubjectTypeWithSyncAttributeBasedSync->Sync Concept, Preferred Language, Catchment Name, Location with full hierarchy, Date picker mode, Full Name of User, Email Address. Please refer to sample file for the list of mandatory headers.")), + has(error("Mandatory columns are missing from uploaded file - Mobile Number, Username, SubjectTypeWithSyncAttributeBasedSync->Sync Concept, Catchment Name, Location with full hierarchy, Full Name of User, Email Address.")), doesntHaveError("\"Mandatory columns are missing from uploaded file - Identifier Prefix, Mobile Number, User Groups, Username, SubjectTypeWithSyncAttributeBasedSync->Sync Concept, Preferred Language, Catchment Name, Location with full hierarchy, Date picker mode, Full Name of User, Email Address. Please refer to sample file for the list of mandatory headers.") ); @@ -267,8 +304,17 @@ public void shouldCreateUpdate() throws IDPException { header("Location with full hierarchy", "Catchment Name", "Username", "Full Name of User", "Email Address", "Mobile Number", "Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", "Identifier Prefix", "User Groups", "SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), dataRow("Bihar, District1, Block11", "Catchment 3", "username5@example", "User 5", "username5@example.com", "9455509147", "English", "true", "spinner", "false", "", "User Group 1", "Answer 1", "Foo"), catchmentCreated(false), - userCreated(true) + userCreatedDetails(true) + ); + + // case in-sensitive columns for date picker mode, preferred language, track location, enable beneficiary mode, user groups + success( + header("Location with full hierarchy", "Catchment Name", "Username", "Full Name of User", "Email Address", "Mobile Number", "Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", "Identifier Prefix", "User Groups", "SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), + dataRow("Bihar, District1, Block11", "Catchment 3", "username9@example", "User 9", "username9@example.com", "9455509147", "ENglish", "TruE", "SPinner", "FalsE", "", "User GROUP 1", "Answer 1"), + catchmentCreated(false), + userCreatedDetails(true) ); + userCreatedDetails(user("username9@example"), datePickerMode("spinner"), language("en"), trackLocation(true), enableBeneficiaryMode(false), userGroup("User Group 1")); treatAsDescriptor( header("Location with full hierarchy", "Catchment Name", "Username", "Full Name of User", "Email Address", "Mobile Number", "Preferred Language", "Track Location", "Date picker mode", "Enable Beneficiary mode", "Identifier Prefix", "User Groups", "SubjectTypeWithSyncAttributeBasedSync->Sync Concept"), diff --git a/avni-server-api/src/test/java/org/avni/server/service/UserServiceTest.java b/avni-server-api/src/test/java/org/avni/server/service/UserServiceTest.java index 23572168b..71309d83f 100644 --- a/avni-server-api/src/test/java/org/avni/server/service/UserServiceTest.java +++ b/avni-server-api/src/test/java/org/avni/server/service/UserServiceTest.java @@ -45,7 +45,7 @@ public void shouldAddToSpecifiedGroupsAndEveryone() { Group group = new Group(); Group everyone = new Group(); String group1 = "Group 1"; - when(groupRepository.findByName(group1)).thenReturn(group); + when(groupRepository.findByNameIgnoreCase(group1)).thenReturn(group); when(groupRepository.findByNameAndOrganisationId(Group.Everyone, orgId)).thenReturn(everyone); @@ -80,8 +80,8 @@ public void shouldDeduplicateListOfGroupsSpecified() { Group group1 = new Group(); Group group2 = new Group(); Group everyone = new Group(); - when(groupRepository.findByName("group1")).thenReturn(group1); - when(groupRepository.findByName("group2")).thenReturn(group2); + when(groupRepository.findByNameIgnoreCase("group1")).thenReturn(group1); + when(groupRepository.findByNameIgnoreCase("group2")).thenReturn(group2); when(groupRepository.findByNameAndOrganisationId(Group.Everyone, orgId)).thenReturn(group1); userService.addToGroups(user, "group1,group2,group1");