CreateBucketModal.test.tsx 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { fireEvent, screen, waitFor } from '@testing-library/dom'
  2. import userEvent from '@testing-library/user-event'
  3. import { beforeEach, describe, expect, it, vi } from 'vitest'
  4. import { CreateBucketModal } from '../CreateBucketModal'
  5. import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext'
  6. import { customRender } from '@/tests/lib/custom-render'
  7. import { addAPIMock } from '@/tests/lib/msw'
  8. import { routerMock } from '@/tests/lib/route-mock'
  9. describe(`CreateBucketModal`, () => {
  10. beforeEach(() => {
  11. vi.mock(`hooks/misc/useCheckPermissions`, () => ({
  12. useCheckPermissions: vi.fn(),
  13. useAsyncCheckPermissions: vi.fn().mockImplementation(() => ({ can: true })),
  14. }))
  15. // useParams
  16. routerMock.setCurrentUrl(`/project/default/storage/buckets`)
  17. // useSelectedProject -> Project
  18. addAPIMock({
  19. method: `get`,
  20. path: `/platform/projects/:ref`,
  21. // @ts-expect-error
  22. response: {
  23. cloud_provider: 'localhost',
  24. id: 1,
  25. inserted_at: '2021-08-02T06:40:40.646Z',
  26. name: 'Default Project',
  27. organization_id: 1,
  28. ref: 'default',
  29. region: 'local',
  30. status: 'ACTIVE_HEALTHY',
  31. },
  32. })
  33. // useBucketCreateMutation
  34. addAPIMock({
  35. method: `post`,
  36. path: `/platform/storage/:ref/buckets`,
  37. })
  38. })
  39. it(`renders a dialog with a form`, async () => {
  40. customRender(
  41. <ProjectContextProvider projectRef="default">
  42. <CreateBucketModal open={true} onOpenChange={() => {}} />
  43. </ProjectContextProvider>,
  44. {
  45. nuqs: {
  46. searchParams: {
  47. new: 'true',
  48. },
  49. },
  50. }
  51. )
  52. await waitFor(() => {
  53. expect(screen.getByRole(`dialog`)).toBeInTheDocument()
  54. })
  55. const nameInput = screen.getByLabelText(`Bucket name`)
  56. await userEvent.type(nameInput, `test`)
  57. const publicToggle = screen.getByLabelText(`Public bucket`)
  58. expect(publicToggle).not.toBeChecked()
  59. await userEvent.click(publicToggle)
  60. expect(publicToggle).toBeChecked()
  61. const sizeLimitToggle = screen.getByLabelText(`Restrict file size`)
  62. expect(sizeLimitToggle).not.toBeChecked()
  63. await userEvent.click(sizeLimitToggle)
  64. expect(sizeLimitToggle).toBeChecked()
  65. const sizeLimitInput = screen.getByLabelText(`File size limit`)
  66. expect(sizeLimitInput).toHaveValue(null)
  67. await userEvent.type(sizeLimitInput, `25`)
  68. const sizeLimitUnitSelect = screen.getByLabelText(`File size limit unit`)
  69. expect(sizeLimitUnitSelect).toHaveTextContent(`MB`)
  70. await userEvent.click(sizeLimitUnitSelect)
  71. const bytesOption = screen.getByRole(`option`, { name: `bytes` })
  72. await userEvent.click(bytesOption)
  73. expect(sizeLimitUnitSelect).toHaveTextContent(`bytes`)
  74. const mimeTypeToggle = screen.getByLabelText(`Restrict MIME types`)
  75. expect(mimeTypeToggle).not.toBeChecked()
  76. await userEvent.click(mimeTypeToggle)
  77. expect(mimeTypeToggle).toBeChecked()
  78. const mimeTypeInput = screen.getByLabelText(`Allowed MIME types`)
  79. expect(mimeTypeInput).toHaveValue(``)
  80. await userEvent.type(mimeTypeInput, `image/jpeg, image/png`)
  81. const submitButton = screen.getByRole(`button`, { name: `Create` })
  82. fireEvent.click(submitButton)
  83. })
  84. })