From: Grégoire Aubert Date: Thu, 27 Jun 2019 08:56:15 +0000 (+0200) Subject: SC-764 Don't sync members when binding personal github org. X-Git-Tag: 8.0~392 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3d4b6b483f8bfccf322f53f61e995ef72f3ca7e4;p=sonarqube.git SC-764 Don't sync members when binding personal github org. --- diff --git a/server/sonar-web/src/main/js/api/organizations.ts b/server/sonar-web/src/main/js/api/organizations.ts index cc2d8c0f205..140ed739887 100644 --- a/server/sonar-web/src/main/js/api/organizations.ts +++ b/server/sonar-web/src/main/js/api/organizations.ts @@ -39,7 +39,7 @@ export function getOrganization(key: string): Promise { wrapper.setProps({ organization }); wrapper.find('PlanStep').prop('createOrganization')(); - const alm = { + const alm: T.Organization['alm'] = { key: 'github', membersSync: true, + personal: false, url: 'http://github.com/thing' }; expect(createOrganization).toBeCalledWith({ ...organization, alm, installationId: 'id-foo' }); diff --git a/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/AutoOrganizationCreate-test.tsx.snap b/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/AutoOrganizationCreate-test.tsx.snap index 21741e56c96..9b74fb68d47 100644 --- a/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/AutoOrganizationCreate-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/AutoOrganizationCreate-test.tsx.snap @@ -73,6 +73,7 @@ exports[`should display choice between import or creation 1`] = ` "description": "description-foo", "key": "foo", "name": "foo", + "personal": false, "privateRepos": 0, "publicRepos": 3, "url": "http://example.com/foo", @@ -162,6 +163,7 @@ exports[`should render prefilled and create org 1`] = ` "description": "description-foo", "key": "foo", "name": "foo", + "personal": false, "privateRepos": 0, "publicRepos": 3, "url": "http://example.com/foo", @@ -187,6 +189,7 @@ exports[`should render prefilled and create org 1`] = ` "description": "description-foo", "key": "foo", "name": "foo", + "personal": false, "privateRepos": 0, "publicRepos": 3, "url": "http://example.com/foo", diff --git a/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/CreateOrganization-test.tsx.snap b/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/CreateOrganization-test.tsx.snap index 3e5bdda098a..46829d9e422 100644 --- a/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/CreateOrganization-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/CreateOrganization-test.tsx.snap @@ -361,6 +361,7 @@ exports[`should render with organization bind page 2`] = ` "description": "description-foo", "key": "foo", "name": "foo", + "personal": false, "privateRepos": 0, "publicRepos": 3, "url": "http://example.com/foo", diff --git a/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/PlanStep-test.tsx.snap b/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/PlanStep-test.tsx.snap index 0d38c7b12b9..ca7cb711940 100644 --- a/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/PlanStep-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/create/organization/__tests__/__snapshots__/PlanStep-test.tsx.snap @@ -30,6 +30,7 @@ exports[`should preselect paid plan 1`] = ` "description": "description-foo", "key": "foo", "name": "foo", + "personal": false, "privateRepos": 5, "publicRepos": 0, "url": "http://example.com/foo", diff --git a/server/sonar-web/src/main/js/apps/create/organization/__tests__/actions-test.ts b/server/sonar-web/src/main/js/apps/create/organization/__tests__/actions-test.ts index eb0a5cb17fc..0a3bb15ea84 100644 --- a/server/sonar-web/src/main/js/apps/create/organization/__tests__/actions-test.ts +++ b/server/sonar-web/src/main/js/apps/create/organization/__tests__/actions-test.ts @@ -62,4 +62,18 @@ describe('#createOrganization', () => { await promise; expect(syncMembers).toHaveBeenCalledWith(org.key); }); + + it('should not sync members for personal Github orgs', async () => { + const { alm, ...org } = mockOrganizationWithAlm( + {}, + { key: 'github', membersSync: true, personal: true, url: 'https://github.com/foo' } + ); + + (createOrganization as jest.Mock).mockResolvedValueOnce(org); + const promise = actions.createOrganization({ alm, ...org })(dispatch); + + expect(createOrganization).toHaveBeenCalledWith(org); + await promise; + expect(syncMembers).not.toBeCalled(); + }); }); diff --git a/server/sonar-web/src/main/js/apps/create/organization/actions.ts b/server/sonar-web/src/main/js/apps/create/organization/actions.ts index 950156f2876..8184ad205b2 100644 --- a/server/sonar-web/src/main/js/apps/create/organization/actions.ts +++ b/server/sonar-web/src/main/js/apps/create/organization/actions.ts @@ -31,7 +31,7 @@ export function createOrganization({ .createOrganization({ ...organization, name: organization.name || organization.key }) .then((newOrganization: T.Organization) => { dispatch(actions.createOrganization({ ...newOrganization, alm })); - if (alm && alm.membersSync && isGithub(alm.key)) { + if (alm && alm.membersSync && !alm.personal && isGithub(alm.key)) { api.syncMembers(newOrganization.key); } return newOrganization.key; diff --git a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/AutoProjectCreate-test.tsx.snap b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/AutoProjectCreate-test.tsx.snap index 61c5ce222bb..9e3f0583a8b 100644 --- a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/AutoProjectCreate-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/AutoProjectCreate-test.tsx.snap @@ -15,6 +15,7 @@ exports[`should display the bound organizations dropdown with the remote reposit "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", @@ -25,6 +26,7 @@ exports[`should display the bound organizations dropdown with the remote reposit "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "bar", @@ -54,6 +56,7 @@ exports[`should display the bound organizations dropdown with the remote reposit "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", diff --git a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/CreateProjectPageSonarCloud-test.tsx.snap b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/CreateProjectPageSonarCloud-test.tsx.snap index e2fc083cdee..71566a53266 100644 --- a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/CreateProjectPageSonarCloud-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/CreateProjectPageSonarCloud-test.tsx.snap @@ -87,6 +87,7 @@ exports[`should render correctly 2`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "bar", @@ -152,6 +153,7 @@ exports[`should render with Custom creation only 1`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "bar", @@ -222,6 +224,7 @@ exports[`should switch tabs 1`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "bar", diff --git a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/OrganizationInput-test.tsx.snap b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/OrganizationInput-test.tsx.snap index a655ac75dbe..7f2483a621e 100644 --- a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/OrganizationInput-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/OrganizationInput-test.tsx.snap @@ -34,6 +34,7 @@ exports[`should render correctly 1`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "bar", diff --git a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/RemoteRepositories-test.tsx.snap b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/RemoteRepositories-test.tsx.snap index d5f81a64131..ffd95a3904c 100644 --- a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/RemoteRepositories-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/RemoteRepositories-test.tsx.snap @@ -39,6 +39,7 @@ exports[`should display the list of repositories 1`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", @@ -140,6 +141,7 @@ exports[`should display the list of repositories 2`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", @@ -166,6 +168,7 @@ exports[`should display the organization upgrade box 1`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", diff --git a/server/sonar-web/src/main/js/apps/organizationMembers/MembersPageHeader.tsx b/server/sonar-web/src/main/js/apps/organizationMembers/MembersPageHeader.tsx index a520f22a579..0fbc42ebcf3 100644 --- a/server/sonar-web/src/main/js/apps/organizationMembers/MembersPageHeader.tsx +++ b/server/sonar-web/src/main/js/apps/organizationMembers/MembersPageHeader.tsx @@ -43,6 +43,8 @@ export default function MembersPageHeader(props: Props) { const almKey = organization.alm && sanitizeAlmId(organization.alm.key); const hasMemberSync = organization.alm && organization.alm.membersSync; const showSyncNotif = isAdmin && organization.alm && !hasMemberSync; + const isSyncEligible = + almKey && isGithub(almKey) && organization.alm && !organization.alm.personal; return (
@@ -50,7 +52,7 @@ export default function MembersPageHeader(props: Props) { {isAdmin && (
- {almKey && isGithub(almKey) && !showSyncNotif && ( + {isSyncEligible && !showSyncNotif && ( 1} @@ -85,7 +87,7 @@ export default function MembersPageHeader(props: Props) { ) }} /> - {almKey && isGithub(almKey) && showSyncNotif && ( + {almKey && isSyncEligible && showSyncNotif && ( {translateWithParameters( 'organization.members.auto_sync_members_from_org_x', diff --git a/server/sonar-web/src/main/js/apps/organizationMembers/__tests__/MembersPageHeader-test.tsx b/server/sonar-web/src/main/js/apps/organizationMembers/__tests__/MembersPageHeader-test.tsx index 43921cdcace..98cae6d4a69 100644 --- a/server/sonar-web/src/main/js/apps/organizationMembers/__tests__/MembersPageHeader-test.tsx +++ b/server/sonar-web/src/main/js/apps/organizationMembers/__tests__/MembersPageHeader-test.tsx @@ -48,6 +48,13 @@ it('should render for GitHub bound organization without sync', () => { expect(shallowRender({ organization })).toMatchSnapshot(); }); +it('should render for personal GitHub bound organization without sync', () => { + const organization = mockOrganizationWithAlm(mockOrganizationWithAdminActions(), { + personal: true + }); + expect(shallowRender({ organization })).toMatchSnapshot(); +}); + it('should render for bound organization with sync', () => { const organization = mockOrganizationWithAlm(mockOrganizationWithAdminActions(), { membersSync: true diff --git a/server/sonar-web/src/main/js/apps/organizationMembers/__tests__/__snapshots__/MembersPageHeader-test.tsx.snap b/server/sonar-web/src/main/js/apps/organizationMembers/__tests__/__snapshots__/MembersPageHeader-test.tsx.snap index 9cc1eb93b37..fe3b38ed772 100644 --- a/server/sonar-web/src/main/js/apps/organizationMembers/__tests__/__snapshots__/MembersPageHeader-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/organizationMembers/__tests__/__snapshots__/MembersPageHeader-test.tsx.snap @@ -66,6 +66,7 @@ exports[`should render for Bitbucket bound organization 1`] = ` "alm": Object { "key": "bitbucket", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", @@ -132,6 +133,7 @@ exports[`should render for GitHub bound organization without sync 1`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", @@ -184,6 +186,7 @@ exports[`should render for GitHub bound organization without sync 1`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", @@ -258,3 +261,70 @@ exports[`should render for admin 1`] = `
`; + +exports[`should render for personal GitHub bound organization without sync 1`] = ` +
+

+ organization.members.page +

+ +
+
+ + +
+
+
+ + organization.members.manage_a_team + , + } + } + /> +
+
+`; diff --git a/server/sonar-web/src/main/js/apps/organizations/navigation/__tests__/__snapshots__/OrganizationNavigationHeader-test.tsx.snap b/server/sonar-web/src/main/js/apps/organizations/navigation/__tests__/__snapshots__/OrganizationNavigationHeader-test.tsx.snap index 828f54920e8..0394cb0be1d 100644 --- a/server/sonar-web/src/main/js/apps/organizations/navigation/__tests__/__snapshots__/OrganizationNavigationHeader-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/organizations/navigation/__tests__/__snapshots__/OrganizationNavigationHeader-test.tsx.snap @@ -116,6 +116,7 @@ exports[`renders with alm integration 1`] = ` "alm": Object { "key": "github", "membersSync": false, + "personal": false, "url": "https://github.com/foo", }, "key": "foo", diff --git a/server/sonar-web/src/main/js/helpers/testMocks.ts b/server/sonar-web/src/main/js/helpers/testMocks.ts index 7e9b7eb4d1e..a9b33558b36 100644 --- a/server/sonar-web/src/main/js/helpers/testMocks.ts +++ b/server/sonar-web/src/main/js/helpers/testMocks.ts @@ -43,6 +43,7 @@ export function mockAlmOrganization(overrides: Partial = {}): description: 'description-foo', key: 'foo', name: 'foo', + personal: false, privateRepos: 0, publicRepos: 3, url: 'http://example.com/foo', @@ -491,7 +492,13 @@ export function mockOrganizationWithAlm( almOverrides: Partial = {} ): T.Organization { return mockOrganization({ - alm: { key: 'github', membersSync: false, url: 'https://github.com/foo', ...almOverrides }, + alm: { + key: 'github', + membersSync: false, + personal: false, + url: 'https://github.com/foo', + ...almOverrides + }, ...overrides }); }