import {mountWithTheme} from 'sentry-test/enzyme';
import {StacktraceLink} from 'sentry/components/events/interfaces/frame/stacktraceLink';
describe('StacktraceLink', function () {
const org = TestStubs.Organization();
const project = TestStubs.Project();
const event = TestStubs.Event({projectID: project.id});
const integration = TestStubs.GitHubIntegration();
const repo = TestStubs.Repository({integrationId: integration.id});
const frame = {filename: '/sentry/app.py', lineNo: 233};
const platform = 'python';
const config = TestStubs.RepositoryProjectPathConfig(project, repo, integration);
beforeEach(function () {
MockApiClient.clearMockResponses();
});
it('does not render setup CTA for members', async function () {
const memberOrg = TestStubs.Organization({
slug: 'hello-org',
access: [],
});
MockApiClient.addMockResponse({
url: `/projects/${memberOrg.slug}/${project.slug}/stacktrace-link/`,
query: {file: frame.filename, commitId: 'master', platform},
body: {config: null, sourceUrl: null, integrations: [integration]},
});
MockApiClient.addMockResponse({
method: 'GET',
url: '/prompts-activity/',
body: {},
});
const wrapper = mountWithTheme(
);
await tick();
wrapper.update();
expect(wrapper.find('CodeMappingButtonContainer').exists()).toBe(false);
});
it('renders setup CTA with integration but no configs', async function () {
MockApiClient.addMockResponse({
url: `/projects/${org.slug}/${project.slug}/stacktrace-link/`,
query: {file: frame.filename, commitId: 'master', platform},
body: {config: null, sourceUrl: null, integrations: [integration]},
});
MockApiClient.addMockResponse({
method: 'GET',
url: '/prompts-activity/',
body: {},
});
const wrapper = mountWithTheme(
);
await tick();
wrapper.update();
expect(wrapper.find('CodeMappingButtonContainer').text()).toContain(
'Link your stack trace to your source code.'
);
});
it('renders source url link', function () {
MockApiClient.addMockResponse({
url: `/projects/${org.slug}/${project.slug}/stacktrace-link/`,
query: {file: frame.filename, commitId: 'master', platform},
body: {config, sourceUrl: 'https://something.io', integrations: [integration]},
});
const wrapper = mountWithTheme(
);
expect(wrapper.state('match').sourceUrl).toEqual('https://something.io');
expect(wrapper.find('OpenInName').text()).toEqual('GitHub');
});
it('renders file_not_found message', function () {
MockApiClient.addMockResponse({
url: `/projects/${org.slug}/${project.slug}/stacktrace-link/`,
query: {file: frame.filename, commitId: 'master', platform},
body: {
config,
sourceUrl: null,
error: 'file_not_found',
integrations: [integration],
attemptedUrl: 'https://something.io/blah',
},
});
const wrapper = mountWithTheme(
);
expect(wrapper.state('match').sourceUrl).toBeFalsy();
expect(wrapper.find('CodeMappingButtonContainer').text()).toContain(
'Source file not found.'
);
expect(wrapper.state('match').attemptedUrl).toEqual('https://something.io/blah');
});
it('renders stack_root_mismatch message', function () {
MockApiClient.addMockResponse({
url: `/projects/${org.slug}/${project.slug}/stacktrace-link/`,
query: {file: frame.filename, commitId: 'master', platform},
body: {
config,
sourceUrl: null,
error: 'stack_root_mismatch',
integrations: [integration],
},
});
const wrapper = mountWithTheme(
);
expect(wrapper.state('match').sourceUrl).toBeFalsy();
expect(wrapper.find('CodeMappingButtonContainer').text()).toContain(
'Error matching your configuration.'
);
});
it('renders default error message', function () {
MockApiClient.addMockResponse({
url: `/projects/${org.slug}/${project.slug}/stacktrace-link/`,
query: {file: frame.filename, commitId: 'master', platform},
body: {
config,
sourceUrl: null,
integrations: [integration],
},
});
const wrapper = mountWithTheme(
);
expect(wrapper.state('match').sourceUrl).toBeFalsy();
expect(wrapper.find('CodeMappingButtonContainer').text()).toContain(
'There was an error encountered with the code mapping for this project'
);
});
});