utils.spec.jsx 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. import {mount} from 'enzyme';
  2. import {initializeOrg} from 'app-test/helpers/initializeOrg';
  3. import {
  4. getFieldRenderer,
  5. getAggregateAlias,
  6. getEventTagSearchUrl,
  7. } from 'app/views/eventsV2/utils';
  8. describe('eventTagSearchUrl()', function() {
  9. let location;
  10. beforeEach(function() {
  11. location = {
  12. pathname: '/organization/org-slug/events/',
  13. query: {},
  14. };
  15. });
  16. it('adds a query', function() {
  17. expect(getEventTagSearchUrl('browser', 'firefox', location)).toEqual({
  18. pathname: location.pathname,
  19. query: {query: 'browser:firefox'},
  20. });
  21. });
  22. it('removes eventSlug', function() {
  23. location.query.eventSlug = 'project-slug:deadbeef';
  24. expect(getEventTagSearchUrl('browser', 'firefox 69', location)).toEqual({
  25. pathname: location.pathname,
  26. query: {query: 'browser:"firefox 69"'},
  27. });
  28. });
  29. it('appends to an existing query', function() {
  30. location.query.query = 'failure';
  31. expect(getEventTagSearchUrl('browser', 'firefox', location)).toEqual({
  32. pathname: location.pathname,
  33. query: {query: 'failure browser:firefox'},
  34. });
  35. });
  36. });
  37. describe('getAggregateAlias', function() {
  38. it('no-ops simple fields', function() {
  39. expect(getAggregateAlias('field')).toEqual('field');
  40. expect(getAggregateAlias('under_field')).toEqual('under_field');
  41. });
  42. it('handles 0 arg functions', function() {
  43. expect(getAggregateAlias('count()')).toEqual('count');
  44. expect(getAggregateAlias('count_unique()')).toEqual('count_unique');
  45. });
  46. it('handles 1 arg functions', function() {
  47. expect(getAggregateAlias('count(id)')).toEqual('count_id');
  48. expect(getAggregateAlias('count_unique(user)')).toEqual('count_unique_user');
  49. expect(getAggregateAlias('count_unique(issue.id)')).toEqual('count_unique_issue_id');
  50. });
  51. });
  52. describe('getFieldRenderer', function() {
  53. let location, context, project, organization, data;
  54. beforeEach(function() {
  55. context = initializeOrg({
  56. project: TestStubs.Project(),
  57. });
  58. organization = context.organization;
  59. project = context.project;
  60. location = {
  61. pathname: '/events',
  62. query: {},
  63. };
  64. data = {
  65. title: 'ValueError: something bad',
  66. transaction: 'api.do_things',
  67. boolValue: 1,
  68. numeric: 1.23,
  69. createdAt: new Date(2019, 9, 3, 12, 13, 14),
  70. url: '/example',
  71. latest_event: 'deadbeef',
  72. 'project.name': project.slug,
  73. };
  74. });
  75. it('can render string fields', function() {
  76. const renderer = getFieldRenderer('url', {url: 'string'});
  77. expect(renderer).toBeInstanceOf(Function);
  78. const wrapper = mount(renderer(data, {location, organization}));
  79. const link = wrapper.find('QueryLink');
  80. expect(link).toHaveLength(1);
  81. expect(link.props().to).toEqual({
  82. pathname: location.pathname,
  83. query: {query: 'url:/example'},
  84. });
  85. expect(link.text()).toEqual(data.url);
  86. });
  87. it('can render boolean fields', function() {
  88. const renderer = getFieldRenderer('boolValue', {boolValue: 'boolean'});
  89. expect(renderer).toBeInstanceOf(Function);
  90. const wrapper = mount(renderer(data, {location, organization}));
  91. const link = wrapper.find('QueryLink');
  92. expect(link).toHaveLength(1);
  93. expect(link.props().to).toEqual({
  94. pathname: location.pathname,
  95. query: {query: 'boolValue:1'},
  96. });
  97. });
  98. it('can render integer fields', function() {
  99. const renderer = getFieldRenderer('numeric', {numeric: 'integer'});
  100. expect(renderer).toBeInstanceOf(Function);
  101. const wrapper = mount(renderer(data, {location, organization}));
  102. const value = wrapper.find('Count');
  103. expect(value).toHaveLength(1);
  104. expect(value.props().value).toEqual(data.numeric);
  105. });
  106. it('can render date fields', function() {
  107. const renderer = getFieldRenderer('createdAt', {createdAt: 'date'});
  108. expect(renderer).toBeInstanceOf(Function);
  109. const wrapper = mount(renderer(data, {location, organization}));
  110. const value = wrapper.find('StyledDateTime');
  111. expect(value).toHaveLength(1);
  112. expect(value.props().date).toEqual(data.createdAt);
  113. });
  114. it('can render null date fields', function() {
  115. const renderer = getFieldRenderer('nope', {nope: 'date'});
  116. expect(renderer).toBeInstanceOf(Function);
  117. const wrapper = mount(renderer(data, {location, organization}));
  118. const value = wrapper.find('StyledDateTime');
  119. expect(value).toHaveLength(0);
  120. expect(wrapper.text()).toEqual('n/a');
  121. });
  122. it('can render transaction as a link', function() {
  123. const renderer = getFieldRenderer('transaction', {transaction: 'string'});
  124. expect(renderer).toBeInstanceOf(Function);
  125. const wrapper = mount(renderer(data, {location, organization}));
  126. const value = wrapper.find('OverflowLink');
  127. expect(value).toHaveLength(1);
  128. expect(value.props().to).toEqual({
  129. pathname: location.pathname,
  130. query: {
  131. eventSlug: `${project.slug}:deadbeef`,
  132. },
  133. });
  134. expect(value.text()).toEqual(data.transaction);
  135. });
  136. it('can render title as a link', function() {
  137. const renderer = getFieldRenderer('title', {title: 'string'});
  138. expect(renderer).toBeInstanceOf(Function);
  139. const wrapper = mount(renderer(data, {location, organization}));
  140. const value = wrapper.find('OverflowLink');
  141. expect(value).toHaveLength(1);
  142. expect(value.props().to).toEqual({
  143. pathname: location.pathname,
  144. query: {
  145. eventSlug: `${project.slug}:deadbeef`,
  146. },
  147. });
  148. expect(value.text()).toEqual(data.title);
  149. });
  150. it('can render project as an avatar', function() {
  151. const renderer = getFieldRenderer('project', {'project.name': 'string'});
  152. expect(renderer).toBeInstanceOf(Function);
  153. const wrapper = mount(
  154. renderer(data, {location, organization}),
  155. context.routerContext
  156. );
  157. const value = wrapper.find('ProjectBadge');
  158. expect(value).toHaveLength(1);
  159. expect(value.props().project).toEqual(project);
  160. });
  161. it('can coerce string field to a link', function() {
  162. const renderer = getFieldRenderer('url', {url: 'string'}, true);
  163. expect(renderer).toBeInstanceOf(Function);
  164. const wrapper = mount(
  165. renderer(data, {location, organization}),
  166. context.routerContext
  167. );
  168. // No basic link should be present.
  169. expect(wrapper.find('QueryLink')).toHaveLength(0);
  170. const link = wrapper.find('OverflowLink');
  171. expect(link.props().to).toEqual({
  172. pathname: location.pathname,
  173. query: {
  174. eventSlug: `${project.slug}:deadbeef`,
  175. },
  176. });
  177. expect(link.text()).toEqual('/example');
  178. });
  179. it('can coerce number field to a link', function() {
  180. const renderer = getFieldRenderer('numeric', {numeric: 'number'}, true);
  181. expect(renderer).toBeInstanceOf(Function);
  182. const wrapper = mount(
  183. renderer(data, {location, organization}),
  184. context.routerContext
  185. );
  186. const link = wrapper.find('OverflowLink');
  187. expect(link.props().to).toEqual({
  188. pathname: location.pathname,
  189. query: {
  190. eventSlug: `${project.slug}:deadbeef`,
  191. },
  192. });
  193. expect(link.find('Count').props().value).toEqual(data.numeric);
  194. });
  195. it('can coerce date field to a link', function() {
  196. const renderer = getFieldRenderer('createdAt', {createdAt: 'date'}, true);
  197. expect(renderer).toBeInstanceOf(Function);
  198. const wrapper = mount(
  199. renderer(data, {location, organization}),
  200. context.routerContext
  201. );
  202. const link = wrapper.find('OverflowLink');
  203. expect(link.props().to).toEqual({
  204. pathname: location.pathname,
  205. query: {
  206. eventSlug: `${project.slug}:deadbeef`,
  207. },
  208. });
  209. expect(link.find('StyledDateTime').props().date).toEqual(data.createdAt);
  210. });
  211. });