import React from 'react'; import {mountWithTheme} from 'sentry-test/enzyme'; import SuggestedOwners from 'app/components/group/suggestedOwners'; import MemberListStore from 'app/stores/memberListStore'; import {Client} from 'app/api'; describe('SuggestedOwners', function() { const event = TestStubs.Event(); const user = TestStubs.User(); const organization = TestStubs.Organization(); const project = TestStubs.Project(); const group = TestStubs.Group({firstRelease: {}}); const routerContext = TestStubs.routerContext([ { organization, }, ]); const endpoint = `/projects/${organization.slug}/${project.slug}/events/${event.id}`; beforeEach(function() { MemberListStore.loadInitialData([user, TestStubs.CommitAuthor()]); }); afterEach(function() { Client.clearMockResponses(); }); it('Renders suggested owners', function() { Client.addMockResponse({ url: `${endpoint}/committers/`, body: { committers: [ { author: TestStubs.CommitAuthor(), commits: [TestStubs.Commit()], }, ], }, }); Client.addMockResponse({ url: `${endpoint}/owners/`, body: { owners: [{type: 'user', ...user}], rules: [[['path', 'sentry/tagstore/*'], [['user', user.email]]]], }, }); const wrapper = mountWithTheme( , routerContext ); expect(wrapper.find('ActorAvatar')).toHaveLength(2); // One includes committers, the other includes ownership rules expect( wrapper .find('SuggestedOwnerHovercard') .map(node => node.props()) .some(p => p.commits === undefined && p.rules !== undefined) ).toBe(true); expect( wrapper .find('SuggestedOwnerHovercard') .map(node => node.props()) .some(p => p.commits !== undefined && p.rules === undefined) ).toBe(true); }); it('does not call committers endpoint if `group.firstRelease` does not exist', function() { const committers = Client.addMockResponse({ url: `${endpoint}/committers/`, body: { committers: [ { author: TestStubs.CommitAuthor(), commits: [TestStubs.Commit()], }, ], }, }); Client.addMockResponse({ url: `${endpoint}/owners/`, body: { owners: [{type: 'user', ...user}], rules: [[['path', 'sentry/tagstore/*'], [['user', user.email]]]], }, }); const wrapper = mountWithTheme( , routerContext ); expect(committers).not.toHaveBeenCalled(); expect(wrapper.find('ActorAvatar')).toHaveLength(1); }); it('Merges owner matching rules and having suspect commits', function() { const author = TestStubs.CommitAuthor(); Client.addMockResponse({ url: `${endpoint}/committers/`, body: { committers: [{author, commits: [TestStubs.Commit()]}], }, }); Client.addMockResponse({ url: `${endpoint}/owners/`, body: { owners: [{type: 'user', ...author}], rules: [[['path', 'sentry/tagstore/*'], [['user', author.email]]]], }, }); const wrapper = mountWithTheme( , routerContext ); expect(wrapper.find('ActorAvatar')).toHaveLength(1); const hovercardProps = wrapper.find('SuggestedOwnerHovercard').props(); expect(hovercardProps.commits).not.toBeUndefined(); expect(hovercardProps.rules).not.toBeUndefined(); }); });