import { faker } from '@faker-js/faker' import { fireEvent, screen, waitFor } from '@testing-library/dom' import userEvent from '@testing-library/user-event' import { useState } from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' import { EditBucketModal } from '../EditBucketModal' import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext' import { Bucket } from '@/data/storage/buckets-query' import { render } from '@/tests/helpers' import { addAPIMock } from '@/tests/lib/msw' const bucket: Bucket = { id: faker.string.uuid(), name: `test`, owner: faker.string.uuid(), public: false, allowed_mime_types: [], file_size_limit: undefined, type: 'STANDARD', created_at: faker.date.recent().toISOString(), updated_at: faker.date.recent().toISOString(), } const Page = ({ onClose }: { onClose: () => void }) => { const [open, setOpen] = useState(false) return ( { setOpen(false) onClose() }} /> ) } describe(`EditBucketModal`, () => { beforeEach(() => { // useSelectedProject -> Project addAPIMock({ method: `get`, path: `/platform/projects/:ref`, // @ts-expect-error response: { cloud_provider: 'localhost', id: 1, inserted_at: '2021-08-02T06:40:40.646Z', name: 'Default Project', organization_id: 1, ref: 'default', region: 'local', status: 'ACTIVE_HEALTHY', }, }) // useBucketUpdateMutation addAPIMock({ method: `patch`, path: `/platform/storage/:ref/buckets/:id`, }) }) it(`renders a dialog with a form`, async () => { const onClose = vi.fn() render() const openButton = screen.getByRole(`button`, { name: `Open` }) await userEvent.click(openButton) await screen.findByRole(`dialog`) const nameInput = screen.getByLabelText(`Bucket name`) expect(nameInput).toHaveValue(`test`) expect(nameInput).toBeDisabled() const publicToggle = screen.getByLabelText(`Public bucket`) expect(publicToggle).not.toBeChecked() await userEvent.click(publicToggle) expect(publicToggle).toBeChecked() const sizeLimitToggle = screen.getByLabelText(`Restrict file size`) expect(sizeLimitToggle).not.toBeChecked() await userEvent.click(sizeLimitToggle) expect(sizeLimitToggle).toBeChecked() const sizeLimitInput = screen.getByLabelText(`File size limit`) expect(sizeLimitInput).toHaveValue(null) await userEvent.type(sizeLimitInput, `25`) const sizeLimitUnitSelect = screen.getByLabelText(`File size limit unit`) expect(sizeLimitUnitSelect).toHaveTextContent(`MB`) await userEvent.click(sizeLimitUnitSelect) const mbOption = screen.getByRole(`option`, { name: `GB` }) await userEvent.click(mbOption) expect(sizeLimitUnitSelect).toHaveTextContent(`GB`) const mimeTypeToggle = screen.getByLabelText(`Restrict MIME types`) expect(mimeTypeToggle).not.toBeChecked() await userEvent.click(mimeTypeToggle) expect(mimeTypeToggle).toBeChecked() const mimeTypeInput = screen.getByLabelText(`Allowed MIME types`) expect(mimeTypeInput).toHaveValue(``) await userEvent.type(mimeTypeInput, `image/jpeg, image/png`) const confirmButton = screen.getByRole(`button`, { name: `Save` }) fireEvent.click(confirmButton) await waitFor(() => expect(onClose).toHaveBeenCalledOnce()) }) })