--- /dev/null
+package club.wpia.gigi.passwords;
+
+import club.wpia.gigi.GigiApiException;
+
+/**
+ * A {@link PasswordChecker} that delegates checks to several other PasswordCheckers
+ * and merges their error messages.
+ */
+public class DelegatingPasswordChecker implements PasswordChecker {
+
+ private final PasswordChecker[] checkers;
+
+ public DelegatingPasswordChecker(PasswordChecker[] checkers) {
+ this.checkers = checkers;
+ }
+
+ @Override
+ public GigiApiException checkPassword(String password, String[] nameParts, String email) {
+ GigiApiException exception = new GigiApiException();
+ for (PasswordChecker checker : checkers) {
+ GigiApiException currentException = checker.checkPassword(password, nameParts, email);
+ if (currentException != null) {
+ exception.mergeInto(currentException);
+ }
+ }
+ if (exception.isEmpty()) {
+ return null;
+ } else {
+ return exception;
+ }
+ }
+}
--- /dev/null
+package club.wpia.gigi.passwords;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import club.wpia.gigi.GigiApiException;
+import club.wpia.gigi.passwords.DelegatingPasswordChecker;
+import club.wpia.gigi.passwords.PasswordChecker;
+
+public class TestDelegatingPasswordChecker {
+
+ @Test
+ public void testNoCheckers() {
+ DelegatingPasswordChecker checker = new DelegatingPasswordChecker(new PasswordChecker[0]);
+
+ assertNull(checker.checkPassword("", new String[0], ""));
+ }
+
+ @Test
+ public void testOneChecker() {
+ DelegatingPasswordChecker checker = new DelegatingPasswordChecker(new PasswordChecker[] {
+ new PasswordChecker() {
+ @Override
+ public GigiApiException checkPassword(String password, String[] nameParts, String email) {
+ return password.isEmpty() ?
+ new GigiApiException("empty password") :
+ null;
+ }
+ }
+ });
+
+ assertNull(checker.checkPassword("a strong password", new String[0], ""));
+
+ GigiApiException exception = checker.checkPassword("", new String[0], "");
+ assertNotNull(exception);
+ assertEquals("empty password", exception.getMessage());
+ }
+
+ @Test
+ public void testTwoCheckers() {
+ DelegatingPasswordChecker checker = new DelegatingPasswordChecker(new PasswordChecker[] {
+ new PasswordChecker() {
+ @Override
+ public GigiApiException checkPassword(String password, String[] nameParts, String email) {
+ return password.equals(email) ?
+ new GigiApiException("password = email") :
+ null;
+ }
+ },
+ new PasswordChecker() {
+ @Override
+ public GigiApiException checkPassword(String password, String[] nameParts, String email) {
+ return password.equals("12345") ?
+ new GigiApiException("12345 is a bad password") :
+ null;
+ }
+ }
+ });
+
+ assertNull(checker.checkPassword("a strong password", new String[0], "email"));
+
+ GigiApiException exception1 = checker.checkPassword("email", new String[0], "email");
+ assertNotNull(exception1);
+ assertEquals("password = email", exception1.getMessage());
+
+ GigiApiException exception2 = checker.checkPassword("12345", new String[0], "email");
+ assertNotNull(exception2);
+ assertEquals("12345 is a bad password", exception2.getMessage());
+
+ GigiApiException exception3 = checker.checkPassword("12345", new String[0], "12345");
+ assertNotNull(exception3);
+ assertThat(exception3.getMessage(), containsString("password = email"));
+ assertThat(exception3.getMessage(), containsString("12345 is a bad password"));
+ }
+}