plugin/tst/software/aws/toolkits/eclipse/amazonq/views/router/ViewRouterTest.java (107 lines of code) (raw):
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package software.aws.toolkits.eclipse.amazonq.views.router;
import static org.mockito.Mockito.verify;
import java.util.stream.Stream;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.plugins.RxJavaPlugins;
import io.reactivex.rxjava3.schedulers.Schedulers;
import io.reactivex.rxjava3.subjects.PublishSubject;
import software.aws.toolkits.eclipse.amazonq.broker.EventBroker;
import software.aws.toolkits.eclipse.amazonq.broker.events.AmazonQLspState;
import software.aws.toolkits.eclipse.amazonq.broker.events.AmazonQViewType;
import software.aws.toolkits.eclipse.amazonq.broker.events.BrowserCompatibilityState;
import software.aws.toolkits.eclipse.amazonq.broker.events.ChatWebViewAssetState;
import software.aws.toolkits.eclipse.amazonq.broker.events.ToolkitLoginWebViewAssetState;
import software.aws.toolkits.eclipse.amazonq.extensions.implementation.ActivatorStaticMockExtension;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthState;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthStateType;
public final class ViewRouterTest {
private PublishSubject<Object> publishSubject;
private Observable<AuthState> authStateObservable;
private Observable<AmazonQLspState> lspStateObservable;
private Observable<BrowserCompatibilityState> browserCompatibilityStateObservable;
private Observable<ChatWebViewAssetState> chatWebViewAssetStateObservable;
private Observable<ToolkitLoginWebViewAssetState> toolkitLoginWebViewAssetStateObservable;
private ViewRouter viewRouter;
private EventBroker eventBrokerMock;
@RegisterExtension
private static ActivatorStaticMockExtension activatorStaticMockExtension = new ActivatorStaticMockExtension();
@BeforeEach
void setupBeforeEach() {
// ensure event handlers run on same thread
RxJavaPlugins.setComputationSchedulerHandler(scheduler -> Schedulers.trampoline());
publishSubject = PublishSubject.create();
authStateObservable = publishSubject.ofType(AuthState.class);
lspStateObservable = publishSubject.ofType(AmazonQLspState.class);
browserCompatibilityStateObservable = publishSubject.ofType(BrowserCompatibilityState.class);
chatWebViewAssetStateObservable = publishSubject.ofType(ChatWebViewAssetState.class);
toolkitLoginWebViewAssetStateObservable = publishSubject.ofType(ToolkitLoginWebViewAssetState.class);
eventBrokerMock = activatorStaticMockExtension.getMock(EventBroker.class);
viewRouter = ViewRouter.builder().withAuthStateObservable(authStateObservable)
.withLspStateObservable(lspStateObservable)
.withBrowserCompatibilityStateObservable(browserCompatibilityStateObservable)
.withChatWebViewAssetStateObservable(chatWebViewAssetStateObservable)
.withToolkitLoginWebViewAssetStateObservable(toolkitLoginWebViewAssetStateObservable).build();
}
@AfterEach
public void resetAfterEach() {
RxJavaPlugins.reset();
}
@ParameterizedTest
@MethodSource("provideStateSource")
void testActiveViewResolutionBasedOnPluginState(final AmazonQLspState lspState, final AuthState authState,
final BrowserCompatibilityState browserCompatibilityState,
final ChatWebViewAssetState chatWebViewAssetState,
final ToolkitLoginWebViewAssetState toolkitLoginWebViewAssetState,
final AmazonQViewType expectedActiveViewType) {
publishSubject.onNext(authState);
publishSubject.onNext(lspState);
publishSubject.onNext(browserCompatibilityState);
publishSubject.onNext(chatWebViewAssetState);
publishSubject.onNext(toolkitLoginWebViewAssetState);
verify(eventBrokerMock).post(AmazonQViewType.class, expectedActiveViewType);
}
private static Stream<Arguments> provideStateSource() {
return Stream.of(
Arguments.of(AmazonQLspState.ACTIVE, getAuthStateObject(AuthStateType.LOGGED_IN),
BrowserCompatibilityState.DEPENDENCY_MISSING, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.DEPENDENCY_MISSING_VIEW),
Arguments.of(AmazonQLspState.ACTIVE, getAuthStateObject(AuthStateType.LOGGED_IN),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.DEPENDENCY_MISSING,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.CHAT_ASSET_MISSING_VIEW),
Arguments.of(AmazonQLspState.ACTIVE, getAuthStateObject(AuthStateType.LOGGED_IN),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.DEPENDENCY_MISSING, AmazonQViewType.CHAT_ASSET_MISSING_VIEW),
Arguments.of(AmazonQLspState.FAILED, getAuthStateObject(AuthStateType.LOGGED_IN),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.LSP_STARTUP_FAILED_VIEW),
Arguments.of(AmazonQLspState.FAILED, getAuthStateObject(AuthStateType.LOGGED_OUT),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.LSP_STARTUP_FAILED_VIEW),
Arguments.of(AmazonQLspState.FAILED, getAuthStateObject(AuthStateType.EXPIRED),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.LSP_STARTUP_FAILED_VIEW),
Arguments.of(AmazonQLspState.PENDING, getAuthStateObject(AuthStateType.LOGGED_OUT),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.TOOLKIT_LOGIN_VIEW),
Arguments.of(AmazonQLspState.ACTIVE, getAuthStateObject(AuthStateType.LOGGED_OUT),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.TOOLKIT_LOGIN_VIEW),
Arguments.of(AmazonQLspState.PENDING, getAuthStateObject(AuthStateType.EXPIRED),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.RE_AUTHENTICATE_VIEW),
Arguments.of(AmazonQLspState.ACTIVE, getAuthStateObject(AuthStateType.EXPIRED),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.RE_AUTHENTICATE_VIEW),
Arguments.of(AmazonQLspState.ACTIVE, getAuthStateObject(AuthStateType.LOGGED_IN),
BrowserCompatibilityState.COMPATIBLE, ChatWebViewAssetState.RESOLVED,
ToolkitLoginWebViewAssetState.RESOLVED, AmazonQViewType.CHAT_VIEW));
}
private static AuthState getAuthStateObject(final AuthStateType authStateType) {
return new AuthState(authStateType, null, null, null, null);
}
}