LoginOrchestrator implements
        Listenable<LoginOrchestrator.Listener> { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) static String normalizeBlogUrl(String inputBlogUrl) { return inputBlogUrl.trim().replaceFirst("^(.*)/ghost/?$", "$1"); } @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)  LoginOrchestrator(BlogUrlValidator blogUrlValidator, ApiProviderFactory apiProviderFactory,
                      CredentialSource credentialSource, CredentialSink credentialSink,
                      HACKListener hackListener); static LoginOrchestrator create(@NonNull CredentialSource credentialSource,
                                           @NonNull HACKListener hackListener); void reset(); void registerOnEventBus(); void unregisterFromEventBus(); @Override void listen(@NonNull Listener listener); @Override void unlisten(@NonNull Listener listener); void start(@NonNull String inputBlogUrl);  }
@Test public void normalizeBlogUrl_shouldTrimWhitespaceAndTrailingGhostPath() { assertThat(Arrays.asList( LoginOrchestrator.normalizeBlogUrl(" https: LoginOrchestrator.normalizeBlogUrl(" https: LoginOrchestrator.normalizeBlogUrl(" https: ), everyItem(is("https: }