EditBucketModal.test.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { faker } from '@faker-js/faker'
  2. import { fireEvent, screen, waitFor } from '@testing-library/dom'
  3. import userEvent from '@testing-library/user-event'
  4. import { useState } from 'react'
  5. import { beforeEach, describe, expect, it, vi } from 'vitest'
  6. import { EditBucketModal } from '../EditBucketModal'
  7. import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext'
  8. import { Bucket } from '@/data/storage/buckets-query'
  9. import { render } from '@/tests/helpers'
  10. import { addAPIMock } from '@/tests/lib/msw'
  11. const bucket: Bucket = {
  12. id: faker.string.uuid(),
  13. name: `test`,
  14. owner: faker.string.uuid(),
  15. public: false,
  16. allowed_mime_types: [],
  17. file_size_limit: undefined,
  18. type: 'STANDARD',
  19. created_at: faker.date.recent().toISOString(),
  20. updated_at: faker.date.recent().toISOString(),
  21. }
  22. const Page = ({ onClose }: { onClose: () => void }) => {
  23. const [open, setOpen] = useState(false)
  24. return (
  25. <ProjectContextProvider projectRef="default">
  26. <button onClick={() => setOpen(true)}>Open</button>
  27. <EditBucketModal
  28. visible={open}
  29. bucket={bucket}
  30. onClose={() => {
  31. setOpen(false)
  32. onClose()
  33. }}
  34. />
  35. </ProjectContextProvider>
  36. )
  37. }
  38. describe(`EditBucketModal`, () => {
  39. beforeEach(() => {
  40. // useSelectedProject -> Project
  41. addAPIMock({
  42. method: `get`,
  43. path: `/platform/projects/:ref`,
  44. // @ts-expect-error
  45. response: {
  46. cloud_provider: 'localhost',
  47. id: 1,
  48. inserted_at: '2021-08-02T06:40:40.646Z',
  49. name: 'Default Project',
  50. organization_id: 1,
  51. ref: 'default',
  52. region: 'local',
  53. status: 'ACTIVE_HEALTHY',
  54. },
  55. })
  56. // useBucketUpdateMutation
  57. addAPIMock({
  58. method: `patch`,
  59. path: `/platform/storage/:ref/buckets/:id`,
  60. })
  61. })
  62. it(`renders a dialog with a form`, async () => {
  63. const onClose = vi.fn()
  64. render(<Page onClose={onClose} />)
  65. const openButton = screen.getByRole(`button`, { name: `Open` })
  66. await userEvent.click(openButton)
  67. await screen.findByRole(`dialog`)
  68. const nameInput = screen.getByLabelText(`Bucket name`)
  69. expect(nameInput).toHaveValue(`test`)
  70. expect(nameInput).toBeDisabled()
  71. const publicToggle = screen.getByLabelText(`Public bucket`)
  72. expect(publicToggle).not.toBeChecked()
  73. await userEvent.click(publicToggle)
  74. expect(publicToggle).toBeChecked()
  75. const sizeLimitToggle = screen.getByLabelText(`Restrict file size`)
  76. expect(sizeLimitToggle).not.toBeChecked()
  77. await userEvent.click(sizeLimitToggle)
  78. expect(sizeLimitToggle).toBeChecked()
  79. const sizeLimitInput = screen.getByLabelText(`File size limit`)
  80. expect(sizeLimitInput).toHaveValue(null)
  81. await userEvent.type(sizeLimitInput, `25`)
  82. const sizeLimitUnitSelect = screen.getByLabelText(`File size limit unit`)
  83. expect(sizeLimitUnitSelect).toHaveTextContent(`MB`)
  84. await userEvent.click(sizeLimitUnitSelect)
  85. const mbOption = screen.getByRole(`option`, { name: `GB` })
  86. await userEvent.click(mbOption)
  87. expect(sizeLimitUnitSelect).toHaveTextContent(`GB`)
  88. const mimeTypeToggle = screen.getByLabelText(`Restrict MIME types`)
  89. expect(mimeTypeToggle).not.toBeChecked()
  90. await userEvent.click(mimeTypeToggle)
  91. expect(mimeTypeToggle).toBeChecked()
  92. const mimeTypeInput = screen.getByLabelText(`Allowed MIME types`)
  93. expect(mimeTypeInput).toHaveValue(``)
  94. await userEvent.type(mimeTypeInput, `image/jpeg, image/png`)
  95. const confirmButton = screen.getByRole(`button`, { name: `Save` })
  96. fireEvent.click(confirmButton)
  97. await waitFor(() => expect(onClose).toHaveBeenCalledOnce())
  98. })
  99. })