]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-17117 migrate project import feature trigger to /api/features/list endpoint
authorMatteo Mara <matteo.mara@sonarsource.com>
Fri, 23 Sep 2022 13:53:13 +0000 (15:53 +0200)
committersonartech <sonartech@sonarsource.com>
Mon, 26 Sep 2022 20:03:17 +0000 (20:03 +0000)
server/sonar-web/src/main/js/apps/projectDump/ProjectDumpApp.tsx
server/sonar-web/src/main/js/apps/projectDump/__tests__/ProjectDumpApp-test.tsx
server/sonar-web/src/main/js/types/appstate.ts
server/sonar-web/src/main/js/types/features.ts
server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/GlobalAction.java
server/sonar-webserver-webapi/src/main/resources/org/sonar/server/ui/ws/global-example.json
server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/GlobalActionTest.java

index 471e6f22599913699325c45dab1646ba5deddc88..0e9dd698d057cd576c684fcf7e759a280761229c 100644 (file)
 import * as React from 'react';
 import { getActivity } from '../../api/ce';
 import { getStatus } from '../../api/project-dump';
-import withAppStateContext from '../../app/components/app-state/withAppStateContext';
+import withAvailableFeatures, {
+  WithAvailableFeaturesProps
+} from '../../app/components/available-features/withAvailableFeatures';
 import withComponentContext from '../../app/components/componentContext/withComponentContext';
 import { throwGlobalError } from '../../helpers/error';
 import { translate } from '../../helpers/l10n';
-import { AppState } from '../../types/appstate';
+import { Feature } from '../../types/features';
 import { DumpStatus, DumpTask } from '../../types/project-dump';
 import { ActivityRequestParameters, TaskStatuses, TaskTypes } from '../../types/tasks';
 import { Component } from '../../types/types';
@@ -34,8 +36,7 @@ import './styles.css';
 
 const POLL_INTERNAL = 5000;
 
-interface Props {
-  appState: AppState;
+interface Props extends WithAvailableFeaturesProps {
   component: Component;
 }
 
@@ -84,10 +85,7 @@ export class ProjectDumpApp extends React.Component<Props, State> {
   }
 
   getLastTaskOfEachType(componentKey: string) {
-    const {
-      appState: { projectImportFeatureEnabled }
-    } = this.props;
-
+    const projectImportFeatureEnabled = this.props.hasFeature(Feature.ProjectImport);
     const all = projectImportFeatureEnabled
       ? [
           this.getLastTask(componentKey, TaskTypes.ProjectExport),
@@ -154,10 +152,8 @@ export class ProjectDumpApp extends React.Component<Props, State> {
   };
 
   render() {
-    const {
-      component,
-      appState: { projectImportFeatureEnabled }
-    } = this.props;
+    const { component } = this.props;
+    const projectImportFeatureEnabled = this.props.hasFeature(Feature.ProjectImport);
     const { lastAnalysisTask, lastExportTask, lastImportTask, status } = this.state;
 
     return (
@@ -200,4 +196,4 @@ export class ProjectDumpApp extends React.Component<Props, State> {
   }
 }
 
-export default withComponentContext(withAppStateContext(ProjectDumpApp));
+export default withComponentContext(withAvailableFeatures(ProjectDumpApp));
index 928cf3dd6ff2b5bef8af5fcb76e558c240b073f6..255e926dca15534fd8ba16a3d02fdfbd71a03883 100644 (file)
@@ -22,7 +22,7 @@ import * as React from 'react';
 import { getActivity } from '../../../api/ce';
 import { getStatus } from '../../../api/project-dump';
 import { mockComponent } from '../../../helpers/mocks/component';
-import { mockAppState, mockDumpStatus, mockDumpTask } from '../../../helpers/testMocks';
+import { mockDumpStatus, mockDumpTask } from '../../../helpers/testMocks';
 import { waitAndUpdate } from '../../../helpers/testUtils';
 import { TaskStatuses } from '../../../types/tasks';
 import { ProjectDumpApp } from '../ProjectDumpApp';
@@ -58,7 +58,7 @@ it('should render correctly', async () => {
 
   expect(wrapper).toMatchSnapshot('loaded');
 
-  wrapper = shallowRender({ appState: mockAppState({ projectImportFeatureEnabled: false }) });
+  wrapper = shallowRender({ hasFeature: jest.fn().mockReturnValue(false) });
   await waitAndUpdate(wrapper);
   expect(wrapper).toMatchSnapshot('loaded without import');
 });
@@ -91,7 +91,7 @@ it('should poll for task status update', async () => {
 function shallowRender(overrides: Partial<ProjectDumpApp['props']> = {}) {
   return shallow<ProjectDumpApp>(
     <ProjectDumpApp
-      appState={mockAppState({ projectImportFeatureEnabled: true })}
+      hasFeature={jest.fn().mockReturnValue(true)}
       component={mockComponent()}
       {...overrides}
     />
index 625551487645725c8aeb560c32892788a2070da0..8124f143bb12b9f015c352a51bd9e12b35bd4ac3 100644 (file)
@@ -29,7 +29,6 @@ export interface AppState {
   canAdmin?: boolean;
   edition?: EditionKey;
   globalPages?: Extension[];
-  projectImportFeatureEnabled?: boolean;
   instanceUsesDefaultAdminCredentials?: boolean;
   multipleAlmEnabled?: boolean;
   needIssueSync?: boolean;
index cb4210542bcbfa0956209cc0c90527742c35ca4d..87363ff5c2f18c41baaaa18d0cd556d66fb8863b 100644 (file)
@@ -20,5 +20,6 @@
 
 export enum Feature {
   MonoRepositoryPullRequestDecoration = 'monorepo',
-  RegulatoryReport = 'regulatory-reports'
+  RegulatoryReport = 'regulatory-reports',
+  ProjectImport = 'project-import'
 }
index e08588d7149bc95476725c8c3c6483aba3a5b5cb..0eaf0ec4ac558b8cfe657f3ae98da7334abeff73 100644 (file)
@@ -140,7 +140,6 @@ public class GlobalAction implements NavigationWsAction, Startable {
       writeBranchSupport(json);
       writeInstanceUsesDefaultAdminCredentials(json);
       writeMultipleAlmEnabled(json);
-      writeProjectImportFeature(json);
       editionProvider.get().ifPresent(e -> json.prop("edition", e.name().toLowerCase(Locale.ENGLISH)));
       writeNeedIssueSync(json);
       json.prop("standalone", webServer.isStandalone());
@@ -207,12 +206,6 @@ public class GlobalAction implements NavigationWsAction, Startable {
     json.prop("multipleAlmEnabled", multipleAlmFeatureProvider.enabled());
   }
 
-  private void writeProjectImportFeature(JsonWriter json) {
-    Edition edition = editionProvider.get().orElse(null);
-    boolean isEnabled = isEditionEEorDCE(edition);
-    json.prop("projectImportFeatureEnabled", isEnabled);
-  }
-
   private void writeNeedIssueSync(JsonWriter json) {
     try (DbSession dbSession = dbClient.openSession(false)) {
       json.prop("needIssueSync", issueIndexSyncChecker.isIssueSyncInProgress(dbSession));
index 7a110f13d789b17f4bfd269264a066dd831001cb..700eee264bc63ef24358c7b8dffecdfb11092abf 100644 (file)
@@ -26,7 +26,6 @@
   "version": "6.2",
   "productionDatabase": true,
   "branchesEnabled": false,
-  "projectImportFeatureEnabled": false,
   "canAdmin": false,
   "standalone": true,
   "edition": "community"
index b37184ad49b45bc4bcfd980c1fe7ce0651ea8275..efa3d9568eca6d7c8366043f0175660e9c6fab68 100644 (file)
@@ -52,7 +52,6 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
-import static org.sonar.core.platform.EditionProvider.Edition.*;
 import static org.sonar.test.JsonAssert.assertJson;
 
 public class GlobalActionTest {
@@ -238,30 +237,6 @@ public class GlobalActionTest {
 
   }
 
-  @Test
-  public void project_import_feature_enabled_ee_dce() {
-    init();
-    when(editionProvider.get()).thenReturn(Optional.of(ENTERPRISE));
-    assertJson(call()).isSimilarTo("{\"projectImportFeatureEnabled\":true}");
-
-    when(editionProvider.get()).thenReturn(Optional.of(DATACENTER));
-    assertJson(call()).isSimilarTo("{\"projectImportFeatureEnabled\":true}");
-  }
-
-  @Test
-  public void project_import_feature_disabled_ce_de() {
-    init();
-    when(editionProvider.get()).thenReturn(Optional.of(COMMUNITY));
-    assertJson(call()).isSimilarTo("{\"projectImportFeatureEnabled\":false}");
-
-    when(editionProvider.get()).thenReturn(Optional.of(DEVELOPER));
-    assertJson(call()).isSimilarTo("{\"projectImportFeatureEnabled\":false}");
-
-    when(editionProvider.get()).thenReturn(Optional.empty());
-    assertJson(call()).isSimilarTo("{\"projectImportFeatureEnabled\":false}");
-  }
-
-
   @Test
   public void return_need_issue_sync() {
     init();