Skip to content

Commit

Permalink
SLVSCODE-747 get user organizations
Browse files Browse the repository at this point in the history
  • Loading branch information
sophio-japharidze-sonarsource committed Jul 1, 2024
1 parent b7ba519 commit a8cba91
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import org.sonarsource.sonarlint.core.rpc.protocol.backend.binding.GetSharedConnectedModeConfigFileParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.binding.GetSharedConnectedModeConfigFileResponse;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.auth.HelpGenerateUserTokenResponse;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.org.OrganizationDto;
import org.sonarsource.sonarlint.core.rpc.protocol.client.binding.GetBindingSuggestionsResponse;

public interface SonarLintExtendedLanguageServer extends LanguageServer {
Expand Down Expand Up @@ -705,4 +706,7 @@ enum BindingCreationMode {
@JsonNotification("sonarlint/didCreateBinding")
void didCreateBinding(BindingCreationMode creationMode);

@JsonRequest("sonarlint/listUserOrganizations")
CompletableFuture<List<OrganizationDto>> listUserOrganizations(String token);

}
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@
import org.sonarsource.sonarlint.core.rpc.protocol.backend.binding.GetSharedConnectedModeConfigFileParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.binding.GetSharedConnectedModeConfigFileResponse;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.auth.HelpGenerateUserTokenResponse;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.org.ListUserOrganizationsResponse;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.org.OrganizationDto;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.validate.ValidateConnectionParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.hotspot.CheckStatusChangePermittedParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.hotspot.HotspotStatus;
Expand Down Expand Up @@ -837,6 +839,12 @@ public void didCreateBinding(BindingCreationMode creationMode) {
}
}

@Override
public CompletableFuture<List<OrganizationDto>> listUserOrganizations(String token) {
return backendServiceFacade.getBackendService().listUserOrganizations(token)
.thenApply(ListUserOrganizationsResponse::getUserOrganizations);
}

@Override
public CompletableFuture<CheckIssueStatusChangePermittedResponse> checkIssueStatusChangePermitted(CheckIssueStatusChangePermittedParams params) {
var bindingWrapperOpt = bindingManager.getBinding(create(params.getFolderUri()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.config.DidUpdateConnectionsParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.config.SonarCloudConnectionConfigurationDto;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.config.SonarQubeConnectionConfigurationDto;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.org.ListUserOrganizationsParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.org.ListUserOrganizationsResponse;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.projects.GetAllProjectsParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.projects.GetAllProjectsResponse;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.projects.GetProjectNamesByKeyParams;
Expand Down Expand Up @@ -91,6 +93,7 @@
import org.sonarsource.sonarlint.core.rpc.protocol.client.binding.GetBindingSuggestionsResponse;
import org.sonarsource.sonarlint.core.rpc.protocol.common.ClientFileDto;
import org.sonarsource.sonarlint.core.rpc.protocol.common.Either;
import org.sonarsource.sonarlint.core.rpc.protocol.common.TokenDto;
import org.sonarsource.sonarlint.ls.SonarLintExtendedLanguageClient;
import org.sonarsource.sonarlint.ls.SonarLintExtendedLanguageServer;
import org.sonarsource.sonarlint.ls.connected.ProjectBinding;
Expand Down Expand Up @@ -362,4 +365,9 @@ public CompletableFuture<AnalyzeFilesResponse> analyzeFilesAndTrack(String confi
shouldFetchServerIssues, System.currentTimeMillis());
return backend.getAnalysisService().analyzeFilesAndTrack(params);
}

public CompletableFuture<ListUserOrganizationsResponse> listUserOrganizations(String token) {
var params = new ListUserOrganizationsParams(Either.forLeft(new TokenDto(token)));
return initializedBackend().getConnectionService().listUserOrganizations(params);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.sonarsource.sonarlint.core.rpc.protocol.SonarLintRpcServer;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.binding.BindingRpcService;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.binding.GetSharedConnectedModeConfigFileParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.config.ConfigurationRpcService;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.config.binding.DidUpdateBindingParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.ConnectionRpcService;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.connection.org.ListUserOrganizationsParams;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.hotspot.HotspotRpcService;
import org.sonarsource.sonarlint.core.rpc.protocol.backend.hotspot.OpenHotspotInBrowserParams;
import org.sonarsource.sonarlint.ls.SonarLintExtendedLanguageClient;
Expand All @@ -48,6 +51,7 @@ class BackendServiceTests {
HotspotRpcService hotspotService = mock(HotspotRpcService.class);
ConfigurationRpcService configurationService = mock(ConfigurationRpcService.class);
BindingRpcService bindingRpcService = mock(BindingRpcService.class);
ConnectionRpcService connectionRpcService = mock(ConnectionRpcService.class);
static LanguageClientLogger lsLogOutput = mock(LanguageClientLogger.class);
static SonarLintExtendedLanguageClient client = mock(SonarLintExtendedLanguageClient.class);
static BackendService underTest = new BackendService(backend, lsLogOutput, client);
Expand All @@ -63,6 +67,7 @@ void init() {
when(backend.getHotspotService()).thenReturn(hotspotService);
when(backend.getConfigurationService()).thenReturn(configurationService);
when(backend.getBindingService()).thenReturn(bindingRpcService);
when(backend.getConnectionService()).thenReturn(connectionRpcService);
}

@Test
Expand Down Expand Up @@ -114,4 +119,16 @@ void getSharedConnectedModeFileContents() {
verify(bindingRpcService).getSharedConnectedModeConfigFileContents(params);
}

@Test
void shouldListUserOrganizations() {
var argumentCaptor = ArgumentCaptor.forClass(ListUserOrganizationsParams.class);
var token = "token";
underTest.listUserOrganizations(token);

verify(connectionRpcService).listUserOrganizations(argumentCaptor.capture());

assertThat(argumentCaptor.getValue().getCredentials().isLeft()).isTrue();
assertThat(argumentCaptor.getValue().getCredentials().getLeft().getToken()).isEqualTo(token);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@
import org.eclipse.lsp4j.WorkspaceFoldersChangeEvent;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonarsource.sonarlint.core.serverapi.proto.sonarcloud.ws.Organizations;
import org.sonarsource.sonarlint.core.serverapi.proto.sonarqube.ws.Common;
import testutils.MockWebServerExtension;

import static java.util.concurrent.TimeUnit.SECONDS;
import static org.assertj.core.api.Assertions.assertThat;
Expand All @@ -49,9 +53,13 @@ class LanguageServerWithFoldersMediumTests extends AbstractLanguageServerMediumT
private static Path folder1BaseDir;

private static Path folder2BaseDir;
@RegisterExtension
private static final MockWebServerExtension sonarCloudWebServer = new MockWebServerExtension(40000);

@BeforeAll
public static void initialize() throws Exception {
System.setProperty("sonarlint.internal.sonarcloud.url", "http://localhost:40000");
System.setProperty("sonarlint.internal.sonarcloud.websocket.url", "http://localhost:40000");
folder1BaseDir = makeStaticTempDir();
folder2BaseDir = makeStaticTempDir();
initialize(Map.of(
Expand Down Expand Up @@ -205,4 +213,26 @@ void shouldOpenRuleDescFromCodeAction() throws Exception {
assertThat(client.ruleDesc.getSeverity()).isEqualTo("MINOR");
}

@Test
void list_user_organizations() {
var paging = Common.Paging.newBuilder()
.setPageSize(500)
.setTotal(1)
.setPageIndex(1)
.build();
var organization = Organizations.Organization.newBuilder()
.setKey("key")
.setName("name")
.build();
sonarCloudWebServer.addProtobufResponse("/api/organizations/search.protobuf?member=true&ps=500&p=1",
Organizations.SearchWsResponse.newBuilder()
.addAllOrganizations(List.of(organization))
.setPaging(paging)
.build());
var token = "123456";
var result = lsProxy.listUserOrganizations(token).join();
assertThat(result).hasSize(1);
assertThat(result.get(0).getKey()).isEqualTo("key");
}

}
14 changes: 13 additions & 1 deletion src/test/java/testutils/MockWebServerExtension.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,20 @@

public class MockWebServerExtension implements BeforeEachCallback, AfterEachCallback {

private final Integer port;
private MockWebServer server;
protected final Map<String, MockResponse> responsesByPath = new HashMap<>();

public MockWebServerExtension() {
this.server = new MockWebServer();
this.port = null;
}

public MockWebServerExtension(int port) {
this.server = new MockWebServer();
this.port = port;
}

@Override
public void beforeEach(ExtensionContext context) throws Exception {
server = new MockWebServer();
Expand All @@ -60,7 +68,11 @@ public MockResponse dispatch(RecordedRequest request) {
}
};
server.setDispatcher(dispatcher);
server.start();
if (this.port != null) {
server.start(this.port);
} else {
server.start();
}
}

@Override
Expand Down

0 comments on commit a8cba91

Please sign in to comment.