import {mountWithTheme} from 'sentry-test/enzyme'; import ContextSummary from 'sentry/components/events/contextSummary'; import ContextSummaryGPU from 'sentry/components/events/contextSummary/contextSummaryGPU'; import ContextSummaryOS from 'sentry/components/events/contextSummary/contextSummaryOS'; import ContextSummaryUser from 'sentry/components/events/contextSummary/contextSummaryUser'; import {FILTER_MASK} from 'sentry/constants'; const CONTEXT_USER = { email: 'mail@example.org', id: '1', }; const CONTEXT_DEVICE = { arch: 'x86', family: 'iOS', model: 'iPhone10,5', type: 'device', }; const CONTEXT_OS = { kernel_version: '17.5.0', version: '10.13.4', type: 'os', build: '17E199', name: 'Mac OS X', }; const CONTEXT_OS_SERVER = { kernel_version: '4.3.0', version: '4.3.0', type: 'os', build: '123123123', name: 'Linux', }; const CONTEXT_RUNTIME = { version: '1.7.13', type: 'runtime', name: 'Electron', }; const CONTEXT_BROWSER = { version: '65.0.3325', name: 'Chrome', }; describe('ContextSummary', function () { describe('render()', function () { it('renders nothing without contexts', () => { const event = { id: '', contexts: {}, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('renders nothing with a single user context', () => { const event = { id: '', user: CONTEXT_USER, contexts: {}, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('should bail out with empty contexts', () => { const event = { id: '', user: CONTEXT_USER, contexts: { device: {}, os: {}, }, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('renders at least three contexts', () => { const event = { id: '', user: CONTEXT_USER, contexts: { device: CONTEXT_DEVICE, }, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('renders up to four contexts', () => { const event = { id: '', user: CONTEXT_USER, contexts: { os: CONTEXT_OS, browser: CONTEXT_BROWSER, runtime: CONTEXT_RUNTIME, device: CONTEXT_DEVICE, // must be omitted }, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('should prefer client_os over os', () => { const event = { id: '', user: CONTEXT_USER, contexts: { client_os: CONTEXT_OS, os: CONTEXT_OS_SERVER, browser: CONTEXT_BROWSER, runtime: CONTEXT_RUNTIME, }, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('renders client_os too', () => { const event = { id: '', user: CONTEXT_USER, contexts: { client_os: CONTEXT_OS, browser: CONTEXT_BROWSER, runtime: CONTEXT_RUNTIME, }, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('should skip non-default named contexts', () => { const event = { id: '', user: CONTEXT_USER, contexts: { os: CONTEXT_OS, chrome: CONTEXT_BROWSER, // non-standard context runtime: CONTEXT_RUNTIME, device: CONTEXT_DEVICE, }, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('should skip a missing user context', () => { const event = { id: '', contexts: { os: CONTEXT_OS, chrome: CONTEXT_BROWSER, // non-standard context runtime: CONTEXT_RUNTIME, device: CONTEXT_DEVICE, }, }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); }); }); describe('OsSummary', function () { describe('render()', function () { it('renders the version string', () => { const os = { kernel_version: '17.5.0', version: '10.13.4', type: 'os', build: '17E199', name: 'Mac OS X', }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('renders the kernel version when no version', () => { const os = { kernel_version: '17.5.0', type: 'os', build: '17E199', name: 'Mac OS X', }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('renders unknown when no version', () => { const os = { type: 'os', build: '17E199', name: 'Mac OS X', }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); }); }); describe('GpuSummary', function () { describe('render()', function () { it('renders name and vendor', () => { const gpu = { name: 'Mali-T880', vendor_name: 'ARM', version: 'OpenGL ES 3.2 v1.r22p0-01rel0.f294e54ceb2cb2d81039204fa4b0402e', }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); it('renders unknown when no vendor', () => { const gpu = { type: 'gpu', name: 'Apple A8 GPU', }; const wrapper = mountWithTheme(); expect(wrapper).toSnapshot(); }); }); }); describe('UserSummary', function () { describe('render', function () { it('prefers email, then IP, then id, then username for title', function () { const user1 = { email: 'maisey@dogsrule.com', ip_address: '12.31.20.12', id: '26', username: 'maiseythedog', name: 'Maisey Dog', data: {siblings: ['Charlie Dog'], dreamsOf: 'squirrels'}, }; const wrapper1 = mountWithTheme(); expect(wrapper1.find('[data-test-id="user-title"]').render().text()).toEqual( user1.email ); const user2 = { ip_address: '12.31.20.12', id: '26', username: 'maiseythedog', name: 'Maisey Dog', data: {siblings: ['Charlie Dog'], dreamsOf: 'squirrels'}, }; const wrapper2 = mountWithTheme(); expect(wrapper2.find('[data-test-id="user-title"]').render().text()).toEqual( user2.ip_address ); const user3 = { id: '26', username: 'maiseythedog', name: 'Maisey Dog', data: {siblings: ['Charlie Dog'], dreamsOf: 'squirrels'}, }; const wrapper3 = mountWithTheme(); expect(wrapper3.find('[data-test-id="user-title"]').render().text()).toEqual( user3.id ); const user4 = { username: 'maiseythedog', name: 'Maisey Dog', data: {siblings: ['Charlie Dog'], dreamsOf: 'squirrels'}, }; const wrapper4 = mountWithTheme(); expect(wrapper4.find('[data-test-id="user-title"]').render().text()).toEqual( user4.username ); }); it('renders NoSummary if no email, IP, id, or username', function () { const user = { name: 'Maisey Dog', data: {siblings: ['Charlie Dog'], dreamsOf: 'squirrels'}, }; const wrapper = mountWithTheme(); expect(wrapper.find('[data-test-id="user-title"]')).toHaveLength(0); expect(wrapper.find('[data-test-id="no-summary-title"]').text()).toEqual( 'Unknown User' ); }); it('does not use filtered values for title', function () { const user1 = { email: FILTER_MASK, }; const wrapper1 = mountWithTheme(); expect(wrapper1.find('[data-test-id="user-title"]')).toHaveLength(0); expect(wrapper1.find('[data-test-id="no-summary-title"]').text()).toEqual( 'Unknown User' ); // TODO: currently, the IP filter just eliminates IP addresses rather than // filtering them like other user data, so here, where you'd expect a filtered // IP address, there isn't one. Add a similar entry to the above and below // if/when that changes. const user2 = { id: FILTER_MASK, }; const wrapper2 = mountWithTheme(); expect(wrapper2.find('[data-test-id="user-title"]')).toHaveLength(0); expect(wrapper2.find('[data-test-id="no-summary-title"]').text()).toEqual( 'Unknown User' ); const user3 = { username: FILTER_MASK, }; const wrapper3 = mountWithTheme(); expect(wrapper3.find('[data-test-id="user-title"]')).toHaveLength(0); expect(wrapper3.find('[data-test-id="no-summary-title"]').text()).toEqual( 'Unknown User' ); }); it('does not use filtered values for avatar', function () { // id is never used for avatar purposes, but is enough to keep us from // ending up with a NoSummary component where the UserSummary component // should be const user1 = { id: '26', name: FILTER_MASK, }; const wrapper1 = mountWithTheme(); expect(wrapper1.find('LetterAvatar').text()).toEqual('?'); const user2 = { id: '26', email: FILTER_MASK, }; const wrapper2 = mountWithTheme(); expect(wrapper2.find('LetterAvatar').text()).toEqual('?'); const user3 = { id: '26', username: FILTER_MASK, }; const wrapper3 = mountWithTheme(); expect(wrapper3.find('LetterAvatar').text()).toEqual('?'); }); }); });