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 { DeleteBucketModal } from '../DeleteBucketModal'
import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext'
import { Bucket } from '@/data/storage/buckets-query'
import { customRender } from '@/tests/lib/custom-render'
import { addAPIMock } from '@/tests/lib/msw'
import { routerMock } from '@/tests/lib/route-mock'
const bucket: Bucket = {
id: 'test',
name: 'test',
owner: faker.string.uuid(),
public: faker.datatype.boolean(),
allowed_mime_types: faker.helpers.multiple(() => faker.system.mimeType(), {
count: { min: 1, max: 5 },
}),
file_size_limit: faker.number.int({ min: 0, max: 25165824 }),
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(`DeleteBucketModal`, () => {
beforeEach(() => {
// useParams
routerMock.setCurrentUrl(`/project/default/storage/files`)
// useProjectContext
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',
},
})
// usePaginatedBucketsQuery
addAPIMock({
method: `get`,
path: `/platform/storage/:ref/buckets`,
response: [bucket],
})
// useDatabasePoliciesQuery
addAPIMock({
method: `get`,
path: `/platform/pg-meta/:ref/policies`,
response: [
{
id: faker.number.int({ min: 1 }),
name: faker.word.noun(),
action: faker.helpers.arrayElement(['PERMISSIVE', 'RESTRICTIVE']),
command: faker.helpers.arrayElement(['SELECT', 'INSERT', 'UPDATE', 'DELETE', 'ALL']),
table: faker.word.noun(),
table_id: faker.number.int({ min: 1 }),
check: null,
definition: null,
schema: faker.lorem.sentence(),
roles: faker.helpers.multiple(() => faker.word.noun(), {
count: { min: 1, max: 5 },
}),
},
],
})
// useBucketDeleteMutation - empty bucket
addAPIMock({
method: `post`,
path: `/platform/storage/:ref/buckets/:id/empty`,
})
// useBucketDeleteMutation - poll for empty bucket
addAPIMock({
method: `post`,
path: `/platform/storage/:ref/buckets/:id/objects/list`,
response: [], // Return empty array to indicate bucket is empty
})
// useBucketDeleteMutation - delete bucket
addAPIMock({
method: `delete`,
path: `/platform/storage/:ref/buckets/:id`,
})
})
it(`renders a confirmation dialog`, async () => {
const onClose = vi.fn()
customRender()
const openButton = screen.getByRole(`button`, { name: `Open` })
await userEvent.click(openButton)
await screen.findByRole(`dialog`)
const input = screen.getByPlaceholderText(`Type bucket name`)
await userEvent.type(input, `test`)
const confirmButton = screen.getByRole(`button`, { name: `Delete bucket` })
fireEvent.click(confirmButton)
await waitFor(() => expect(onClose).toHaveBeenCalledOnce())
expect(routerMock.asPath).toStrictEqual(`/project/default/storage/files`)
})
})