]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-13637 Handle errors
authorJeremy Davis <jeremy.davis@sonarsource.com>
Thu, 6 Aug 2020 13:51:57 +0000 (15:51 +0200)
committersonartech <sonartech@sonarsource.com>
Mon, 17 Aug 2020 20:06:23 +0000 (20:06 +0000)
server/sonar-web/src/main/js/apps/create/project/GitlabProjectCreate.tsx
server/sonar-web/src/main/js/apps/create/project/__tests__/GitlabProjectCreate-test.tsx

index 87e35b9dd72096da338be882626af25cde918637..eacbe599c708c3504fbc749b9182ef28b49c15c5 100644 (file)
@@ -111,7 +111,6 @@ export default class GitlabProjectCreate extends React.PureComponent<Props, Stat
         });
       } else {
         this.setState({
-          tokenIsValid,
           loading: false
         });
       }
@@ -128,34 +127,54 @@ export default class GitlabProjectCreate extends React.PureComponent<Props, Stat
     return checkPersonalAccessTokenIsValid(settings.key).catch(() => false);
   };
 
-  fetchProjects = (pageIndex = 1, query?: string) => {
+  handleError = () => {
+    if (this.mounted) {
+      this.setState({ tokenIsValid: false });
+    }
+
+    return undefined;
+  };
+
+  fetchProjects = async (pageIndex = 1, query?: string) => {
     const { settings } = this.state;
 
     if (!settings) {
       return Promise.resolve(undefined);
     }
 
-    return getGitlabProjects({
-      almSetting: settings.key,
-      page: pageIndex,
-      pageSize: GITLAB_PROJECTS_PAGESIZE,
-      query
-    }).catch(() => undefined);
+    try {
+      return await getGitlabProjects({
+        almSetting: settings.key,
+        page: pageIndex,
+        pageSize: GITLAB_PROJECTS_PAGESIZE,
+        query
+      });
+    } catch (_) {
+      return this.handleError();
+    }
   };
 
-  handleImport = async (gitlabProjectId: string) => {
+  doImport = async (gitlabProjectId: string) => {
     const { settings } = this.state;
 
     if (!settings) {
-      return;
+      return Promise.resolve(undefined);
+    }
+
+    try {
+      return await importGitlabProject({
+        almSetting: settings.key,
+        gitlabProjectId
+      });
+    } catch (_) {
+      return this.handleError();
     }
+  };
 
+  handleImport = async (gitlabProjectId: string) => {
     this.setState({ importingGitlabProjectId: gitlabProjectId });
 
-    const result = await importGitlabProject({
-      almSetting: settings.key,
-      gitlabProjectId
-    }).catch(() => undefined);
+    const result = await this.doImport(gitlabProjectId);
 
     if (this.mounted) {
       this.setState({ importingGitlabProjectId: undefined });
index b7c84ffdba484cbee9989a20406ac6a2039cb1aa..c6d0116591c72de18634ab6fb6566c81bf48ae0a 100644 (file)
@@ -67,6 +67,14 @@ it('should correctly check PAT when settings are added after mount', async () =>
 
 it('should correctly handle a valid PAT', async () => {
   (checkPersonalAccessTokenIsValid as jest.Mock).mockResolvedValueOnce(true);
+  (getGitlabProjects as jest.Mock).mockResolvedValueOnce({
+    projects: [mockGitlabProject()],
+    projectsPaging: {
+      pageIndex: 1,
+      pageSize: 10,
+      total: 1
+    }
+  });
   const wrapper = shallowRender();
   await waitAndUpdate(wrapper);
   expect(wrapper.state().tokenIsValid).toBe(true);
@@ -250,6 +258,37 @@ it('should do nothing with missing settings', async () => {
   expect(setAlmPersonalAccessToken).not.toHaveBeenCalled();
 });
 
+it('should handle errors when fetching projects', async () => {
+  (getGitlabProjects as jest.Mock).mockRejectedValueOnce({});
+
+  const wrapper = shallowRender();
+  await waitAndUpdate(wrapper);
+
+  expect(wrapper.state().tokenIsValid).toBe(false);
+});
+
+it('should handle errors when importing a project', async () => {
+  (importGitlabProject as jest.Mock).mockRejectedValueOnce({});
+  (getGitlabProjects as jest.Mock).mockResolvedValueOnce({
+    projects: [mockGitlabProject()],
+    projectsPaging: {
+      pageIndex: 1,
+      pageSize: 10,
+      total: 1
+    }
+  });
+
+  const wrapper = shallowRender();
+  await waitAndUpdate(wrapper);
+
+  expect(wrapper.state().tokenIsValid).toBe(true);
+
+  await wrapper.instance().handleImport('gitlabId');
+  await waitAndUpdate(wrapper);
+
+  expect(wrapper.state().tokenIsValid).toBe(false);
+});
+
 function shallowRender(props: Partial<GitlabProjectCreate['props']> = {}) {
   return shallow<GitlabProjectCreate>(
     <GitlabProjectCreate