private Stream<SubscriberAndChannel> toSubscriberAndChannels(String dispatcherKey, String projectKey, NotificationChannel notificationChannel) { Set<Subscriber> usersForNotification = dbClient.propertiesDao().findUsersForNotification(dispatcherKey, notificationChannel.getKey(), projectKey); return usersForNotification .stream() .map(login -> new SubscriberAndChannel(login, notificationChannel)); }
@Test public void shouldFindSubscribedRecipientForGivenResource() { String projectUuid = "uuid_45"; when(propertiesDao.findUsersForNotification("NewViolations", "Email", projectUuid)) .thenReturn(newHashSet(new Subscriber("user1", false), new Subscriber("user3", false), new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", "uuid_56")) .thenReturn(newHashSet(new Subscriber("user2", false))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewAlerts", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user4", false))); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user1", "user3"), projectUuid, "user")) .thenReturn(newHashSet("user1", "user3")); Multimap<String, NotificationChannel> multiMap = underTest.findSubscribedRecipientsForDispatcher(dispatcher, projectUuid, SubscriberPermissionsOnProject.ALL_MUST_HAVE_ROLE_USER); assertThat(multiMap.entries()).hasSize(3); Map<String, Collection<NotificationChannel>> map = multiMap.asMap(); assertThat(map.get("user1")).containsOnly(emailChannel); assertThat(map.get("user2")).isNull(); assertThat(map.get("user3")).containsOnly(emailChannel, twitterChannel); assertThat(map.get("user4")).isNull(); // code is optimized to perform only 1 SQL requests for all channels verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), anyString()); }
@Test public void do_not_call_db_for_project_permission_filtering_if_there_is_no_project_subscriber() { String globalPermission = RandomStringUtils.randomAlphanumeric(4); String projectPermission = RandomStringUtils.randomAlphanumeric(5); String projectUuid = "uuid_45"; when(propertiesDao.findUsersForNotification("NewViolations", "Email", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", true))); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user3"), projectUuid, globalPermission)) .thenReturn(newHashSet("user3")); Multimap<String, NotificationChannel> multiMap = underTest.findSubscribedRecipientsForDispatcher(dispatcher, projectUuid, new SubscriberPermissionsOnProject(globalPermission, projectPermission)); assertThat(multiMap.entries()).hasSize(2); Map<String, Collection<NotificationChannel>> map = multiMap.asMap(); assertThat(map.get("user3")).containsOnly(emailChannel, twitterChannel); verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(globalPermission)); verify(authorizationDao, times(0)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(projectPermission)); }
@Test public void do_not_call_db_for_project_permission_filtering_if_there_is_no_global_subscriber() { String globalPermission = RandomStringUtils.randomAlphanumeric(4); String projectPermission = RandomStringUtils.randomAlphanumeric(5); String projectUuid = "uuid_45"; when(propertiesDao.findUsersForNotification("NewViolations", "Email", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", false))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", false))); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user3"), projectUuid, projectPermission)) .thenReturn(newHashSet("user3")); Multimap<String, NotificationChannel> multiMap = underTest.findSubscribedRecipientsForDispatcher(dispatcher, projectUuid, new SubscriberPermissionsOnProject(globalPermission, projectPermission)); assertThat(multiMap.entries()).hasSize(2); Map<String, Collection<NotificationChannel>> map = multiMap.asMap(); assertThat(map.get("user3")).containsOnly(emailChannel, twitterChannel); verify(authorizationDao, times(0)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(globalPermission)); verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(projectPermission)); } }
@Test public void should_apply_distinct_permission_filtering_global_or_project_subscribers() { String globalPermission = RandomStringUtils.randomAlphanumeric(4); String projectPermission = RandomStringUtils.randomAlphanumeric(5); String projectUuid = "uuid_45"; when(propertiesDao.findUsersForNotification("NewViolations", "Email", projectUuid)) .thenReturn(newHashSet(new Subscriber("user1", false), new Subscriber("user3", false), new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", "uuid_56")) .thenReturn(newHashSet(new Subscriber("user2", false))); when(propertiesDao.findUsersForNotification("NewViolations", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user3", true))); when(propertiesDao.findUsersForNotification("NewAlerts", "Twitter", projectUuid)) .thenReturn(newHashSet(new Subscriber("user4", false))); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user3", "user4"), projectUuid, globalPermission)) .thenReturn(newHashSet("user3")); when(authorizationDao.keepAuthorizedLoginsOnProject(dbSession, newHashSet("user1", "user3"), projectUuid, projectPermission)) .thenReturn(newHashSet("user1", "user3")); Multimap<String, NotificationChannel> multiMap = underTest.findSubscribedRecipientsForDispatcher(dispatcher, projectUuid, new SubscriberPermissionsOnProject(globalPermission, projectPermission)); assertThat(multiMap.entries()).hasSize(3); Map<String, Collection<NotificationChannel>> map = multiMap.asMap(); assertThat(map.get("user1")).containsOnly(emailChannel); assertThat(map.get("user2")).isNull(); assertThat(map.get("user3")).containsOnly(emailChannel, twitterChannel); assertThat(map.get("user4")).isNull(); // code is optimized to perform only 2 SQL requests for all channels verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(globalPermission)); verify(authorizationDao, times(1)).keepAuthorizedLoginsOnProject(eq(dbSession), anySet(), anyString(), eq(projectPermission)); }
db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project2); assertThat(underTest.findUsersForNotification("NewViolations", "Email", null)) .isEmpty(); assertThat(underTest.findUsersForNotification("NewViolations", "Email", "uuid_78")) .isEmpty(); assertThat(underTest.findUsersForNotification("NewViolations", "Email", project1.getKey())) .containsOnly(new Subscriber("user2", false)); assertThat(underTest.findUsersForNotification("NewViolations", "Email", project2.getKey())) .isEmpty(); assertThat(underTest.findUsersForNotification("NewViolations", "Twitter", null)) .containsOnly(new Subscriber("user3", true)); assertThat(underTest.findUsersForNotification("NewViolations", "Twitter", "uuid_78")) .containsOnly(new Subscriber("user3", true)); assertThat(underTest.findUsersForNotification("NewViolations", "Twitter", project1.getKey())) .containsOnly(new Subscriber("user2", false), new Subscriber("user3", true)); assertThat(underTest.findUsersForNotification("NewViolations", "Twitter", project2.getKey())) .containsOnly(new Subscriber("user1", false), new Subscriber("user3", true), new Subscriber("user3", false));
private Stream<SubscriberAndChannel> toSubscriberAndChannels(String dispatcherKey, String projectKey, NotificationChannel notificationChannel) { Set<Subscriber> usersForNotification = dbClient.propertiesDao().findUsersForNotification(dispatcherKey, notificationChannel.getKey(), projectKey); return usersForNotification .stream() .map(login -> new SubscriberAndChannel(login, notificationChannel)); }