import {mountWithTheme} from 'sentry-test/enzyme'; import {initializeOrg} from 'sentry-test/initializeOrg'; import {Client} from 'sentry/api'; import {TeamProjects as OrganizationTeamProjects} from 'sentry/views/settings/organizationTeams/teamProjects'; describe('OrganizationTeamProjects', function () { let team; let getMock; let putMock; let postMock; let deleteMock; const project = TestStubs.Project({teams: [team]}); const project2 = TestStubs.Project({ id: '3', slug: 'project-slug-2', name: 'Project Name 2', }); const {routerContext, organization} = initializeOrg({ organization: TestStubs.Organization({slug: 'org-slug'}), projects: [project, project2], }); beforeEach(function () { team = TestStubs.Team({slug: 'team-slug'}); getMock = Client.addMockResponse({ url: '/organizations/org-slug/projects/', body: [project, project2], }); putMock = Client.addMockResponse({ method: 'PUT', url: '/projects/org-slug/project-slug/', body: project, }); postMock = Client.addMockResponse({ method: 'POST', url: `/projects/org-slug/${project2.slug}/teams/${team.slug}/`, body: {...project2, teams: [team]}, status: 201, }); deleteMock = Client.addMockResponse({ method: 'DELETE', url: `/projects/org-slug/${project2.slug}/teams/${team.slug}/`, body: {...project2, teams: []}, status: 204, }); }); afterEach(function () { Client.clearMockResponses(); }); it('fetches linked and unlinked projects', function () { mountWithTheme( , routerContext ); expect(getMock).toHaveBeenCalledTimes(2); expect(getMock.mock.calls[0][1].query.query).toBe('team:team-slug'); expect(getMock.mock.calls[1][1].query.query).toBe('!team:team-slug'); }); it('Should render', async function () { const wrapper = mountWithTheme( , routerContext ); await tick(); wrapper.update(); expect(wrapper).toSnapshot(); expect(wrapper.find('ProjectBadge').first().text()).toBe('project-slug'); }); it('Should allow bookmarking', async function () { const wrapper = mountWithTheme( , routerContext ); await tick(); wrapper.update(); const stars = wrapper.find('BookmarkStar'); expect(stars).toHaveLength(2); stars.first().simulate('click'); expect(wrapper.find('BookmarkStar').first().prop('isBookmarked')).toBeTruthy(); expect(putMock).toHaveBeenCalledTimes(1); }); it('Should allow adding and removing projects', async function () { const wrapper = mountWithTheme( , routerContext ); await tick(); wrapper.update(); const add = wrapper.find('DropdownButton').first(); add.simulate('click'); const el = wrapper.find('AutoCompleteItem').at(1); el.simulate('click'); wrapper.update(); expect(postMock).toHaveBeenCalledTimes(1); await tick(); wrapper.update(); // find second project's remove button const remove = wrapper.find('PanelBody Button[aria-label="Remove"]').at(1); remove.simulate('click'); expect(deleteMock).toHaveBeenCalledTimes(1); }); it('handles filtering unlinked projects', async function () { const wrapper = mountWithTheme( , routerContext ); await tick(); wrapper.update(); expect(getMock).toHaveBeenCalledTimes(2); const add = wrapper.find('DropdownButton').first(); add.simulate('click'); const input = wrapper.find('StyledInput'); input.simulate('change', {target: {value: 'a'}}); expect(getMock).toHaveBeenCalledTimes(3); expect(getMock).toHaveBeenCalledWith( '/organizations/org-slug/projects/', expect.objectContaining({ query: expect.objectContaining({ query: '!team:team-slug a', }), }) ); }); });