noProjectMessage.spec.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import {Organization} from 'sentry-fixture/organization';
  2. import {render, screen} from 'sentry-test/reactTestingLibrary';
  3. import NoProjectMessage from 'sentry/components/noProjectMessage';
  4. import ConfigStore from 'sentry/stores/configStore';
  5. import ProjectsStore from 'sentry/stores/projectsStore';
  6. import TeamStore from 'sentry/stores/teamStore';
  7. describe('NoProjectMessage', function () {
  8. beforeEach(function () {
  9. ProjectsStore.reset();
  10. });
  11. const org = Organization();
  12. it('renders', function () {
  13. const organization = Organization({slug: 'org-slug'});
  14. const childrenMock = jest.fn().mockReturnValue(null);
  15. ProjectsStore.loadInitialData([]);
  16. render(
  17. <NoProjectMessage organization={organization}>{childrenMock}</NoProjectMessage>
  18. );
  19. expect(childrenMock).not.toHaveBeenCalled();
  20. expect(screen.getByText('Remain Calm')).toBeInTheDocument();
  21. });
  22. it('shows "Create Project" button when there are no projects', function () {
  23. ProjectsStore.loadInitialData([]);
  24. render(<NoProjectMessage organization={org} />);
  25. expect(screen.getByRole('button', {name: 'Create project'})).toBeEnabled();
  26. });
  27. it('disable "Create Project" when user has no org-level access', function () {
  28. ProjectsStore.loadInitialData([]);
  29. render(<NoProjectMessage organization={Organization({access: []})} />);
  30. expect(screen.getByRole('button', {name: 'Create project'})).toBeDisabled();
  31. });
  32. it('shows "Create Project" button when user has team-level access', function () {
  33. ProjectsStore.loadInitialData([]);
  34. TeamStore.loadInitialData([
  35. {...TestStubs.Team(), access: ['team:admin', 'team:write', 'team:read']},
  36. ]);
  37. // No org-level access
  38. render(<NoProjectMessage organization={Organization({access: []})} />);
  39. expect(screen.getByRole('button', {name: 'Create project'})).toBeEnabled();
  40. });
  41. it('has no "Join a Team" button when projects are missing', function () {
  42. ProjectsStore.loadInitialData([]);
  43. render(<NoProjectMessage organization={org} />);
  44. expect(screen.queryByRole('button', {name: 'Join a Team'})).not.toBeInTheDocument();
  45. expect(screen.getByRole('button', {name: 'Create project'})).toBeEnabled();
  46. });
  47. it('has a "Join a Team" button when no projects but org has projects', function () {
  48. ProjectsStore.loadInitialData([TestStubs.Project({hasAccess: false})]);
  49. render(<NoProjectMessage organization={org} />);
  50. expect(screen.getByRole('button', {name: 'Join a Team'})).toBeInTheDocument();
  51. });
  52. it('has a disabled "Join a Team" button if no access to `team:read`', function () {
  53. ProjectsStore.loadInitialData([TestStubs.Project({hasAccess: false})]);
  54. render(<NoProjectMessage organization={{...org, access: []}} />);
  55. expect(screen.getByRole('button', {name: 'Join a Team'})).toBeDisabled();
  56. });
  57. it('shows empty message to superusers that are not members', function () {
  58. ProjectsStore.loadInitialData([
  59. TestStubs.Project({hasAccess: true, isMember: false}),
  60. ]);
  61. ConfigStore.set('user', {...ConfigStore.get('user'), isSuperuser: true});
  62. render(
  63. <NoProjectMessage organization={org} superuserNeedsToBeProjectMember>
  64. {null}
  65. </NoProjectMessage>
  66. );
  67. expect(
  68. screen.getByText('You need at least one project to use this view')
  69. ).toBeInTheDocument();
  70. });
  71. });