summaryrefslogtreecommitdiff
path: root/spec/frontend/error_tracking/components/stacktrace_entry_spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/error_tracking/components/stacktrace_entry_spec.js')
-rw-r--r--spec/frontend/error_tracking/components/stacktrace_entry_spec.js56
1 files changed, 42 insertions, 14 deletions
diff --git a/spec/frontend/error_tracking/components/stacktrace_entry_spec.js b/spec/frontend/error_tracking/components/stacktrace_entry_spec.js
index 95958408770..942585d5370 100644
--- a/spec/frontend/error_tracking/components/stacktrace_entry_spec.js
+++ b/spec/frontend/error_tracking/components/stacktrace_entry_spec.js
@@ -7,26 +7,23 @@ import Icon from '~/vue_shared/components/icon.vue';
describe('Stacktrace Entry', () => {
let wrapper;
+ const lines = [
+ [22, ' def safe_thread(name, \u0026block)\n'],
+ [23, ' Thread.new do\n'],
+ [24, " Thread.current['sidekiq_label'] = name\n"],
+ [25, ' watchdog(name, \u0026block)\n'],
+ ];
+
function mountComponent(props) {
wrapper = shallowMount(StackTraceEntry, {
propsData: {
filePath: 'sidekiq/util.rb',
- lines: [
- [22, ' def safe_thread(name, \u0026block)\n'],
- [23, ' Thread.new do\n'],
- [24, " Thread.current['sidekiq_label'] = name\n"],
- [25, ' watchdog(name, \u0026block)\n'],
- ],
errorLine: 24,
...props,
},
});
}
- beforeEach(() => {
- mountComponent();
- });
-
afterEach(() => {
if (wrapper) {
wrapper.destroy();
@@ -34,16 +31,47 @@ describe('Stacktrace Entry', () => {
});
it('should render stacktrace entry collapsed', () => {
+ mountComponent({ lines });
expect(wrapper.find(StackTraceEntry).exists()).toBe(true);
expect(wrapper.find(ClipboardButton).exists()).toBe(true);
expect(wrapper.find(Icon).exists()).toBe(true);
expect(wrapper.find(FileIcon).exists()).toBe(true);
- expect(wrapper.element.querySelectorAll('table').length).toBe(0);
+ expect(wrapper.find('table').exists()).toBe(false);
});
it('should render stacktrace entry table expanded', () => {
- mountComponent({ expanded: true });
- expect(wrapper.element.querySelectorAll('tr.line_holder').length).toBe(4);
- expect(wrapper.element.querySelectorAll('.line_content.old').length).toBe(1);
+ mountComponent({ expanded: true, lines });
+ expect(wrapper.find('table').exists()).toBe(true);
+ expect(wrapper.findAll('tr.line_holder').length).toBe(4);
+ expect(wrapper.findAll('.line_content.old').length).toBe(1);
+ });
+
+ describe('no code block', () => {
+ const findFileHeaderContent = () => wrapper.find('.file-header-content').html();
+
+ it('should hide collapse icon and render error fn name and error line when there is no code block', () => {
+ const extraInfo = { errorLine: 34, errorFn: 'errorFn', errorColumn: 77 };
+ mountComponent({ expanded: false, lines: [], ...extraInfo });
+ expect(wrapper.find(Icon).exists()).toBe(false);
+ expect(findFileHeaderContent()).toContain(
+ `in ${extraInfo.errorFn} at line ${extraInfo.errorLine}:${extraInfo.errorColumn}`,
+ );
+ });
+
+ it('should render only lineNo:columnNO when there is no errorFn ', () => {
+ const extraInfo = { errorLine: 34, errorFn: null, errorColumn: 77 };
+ mountComponent({ expanded: false, lines: [], ...extraInfo });
+ expect(findFileHeaderContent()).not.toContain(`in ${extraInfo.errorFn}`);
+ expect(findFileHeaderContent()).toContain(`${extraInfo.errorLine}:${extraInfo.errorColumn}`);
+ });
+
+ it('should render only lineNo when there is no errorColumn ', () => {
+ const extraInfo = { errorLine: 34, errorFn: 'errorFn', errorColumn: null };
+ mountComponent({ expanded: false, lines: [], ...extraInfo });
+ expect(findFileHeaderContent()).toContain(
+ `in ${extraInfo.errorFn} at line ${extraInfo.errorLine}`,
+ );
+ expect(findFileHeaderContent()).not.toContain(`:${extraInfo.errorColumn}`);
+ });
});
});