diff options
Diffstat (limited to 'spec/frontend/error_tracking/components/stacktrace_entry_spec.js')
-rw-r--r-- | spec/frontend/error_tracking/components/stacktrace_entry_spec.js | 56 |
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}`); + }); }); }); |