),
}))
vi.mock('../add-row', () => ({
default: ({ payload, onChange, onRemove }: AddRowProps) => (
-
- ),
-}))
-
-vi.mock('../../metadata-dataset/select-metadata-modal', () => ({
- default: ({ trigger, onSelect, onSave, onManage }: SelectModalProps) => (
-
- {trigger}
-
onSelect({ id: 'new-1', name: 'new_field', type: DataType.string, value: null, isMultipleValue: false })}>Select
-
onSave({ name: 'created_field', type: DataType.string }).catch(() => { })}>Save
-
Manage
+
+ {payload.name}
+ onChange({ ...payload, value: 'new_value' })}>
+ Change
+ {' '}
+ {payload.name}
+
+
+ Remove
+ {' '}
+ {payload.name}
+
),
}))
@@ -116,6 +118,25 @@ describe('EditMetadataBatchModal', () => {
mockCheckNameResult = { errorMsg: '' }
})
+ const getEditRows = () => screen.getAllByRole('group', { name: /^Edit metadata / })
+ const getEditRow = (name: string) => screen.getByRole('group', { name: `Edit metadata ${name}` })
+ const getAddedRow = (name: string) => screen.getByRole('group', { name: `Added metadata ${name}` })
+ const queryAddedRow = (name: string) => screen.queryByRole('group', { name: `Added metadata ${name}` })
+ const openMetadataPicker = () => {
+ fireEvent.click(screen.getByRole('button', { name: 'dataset.metadata.addMetadata' }))
+ }
+ const selectMetadata = async (name = 'existing_field') => {
+ openMetadataPicker()
+ fireEvent.click(await screen.findByRole('option', { name: new RegExp(name) }))
+ }
+ const createMetadata = async (name = 'created_field') => {
+ openMetadataPicker()
+ fireEvent.click(screen.getByRole('button', { name: 'dataset.metadata.selectMetadata.newAction' }))
+ fireEvent.change(screen.getByRole('textbox', { name: 'dataset.metadata.createMetadata.name' }), { target: { value: name } })
+ const saveButtons = screen.getAllByRole('button', { name: 'common.operation.save' })
+ fireEvent.click(saveButtons[saveButtons.length - 1]!)
+ }
+
describe('Rendering', () => {
it('should render without crashing', async () => {
render(
)
@@ -134,8 +155,7 @@ describe('EditMetadataBatchModal', () => {
it('should render all edit rows for existing items', async () => {
render(
)
await waitFor(() => {
- const editRows = screen.getAllByTestId('edit-row')
- expect(editRows).toHaveLength(2)
+ expect(getEditRows()).toHaveLength(2)
})
})
@@ -150,15 +170,14 @@ describe('EditMetadataBatchModal', () => {
it('should render checkbox for apply to all', async () => {
render(
)
await waitFor(() => {
- const checkboxes = document.querySelectorAll('[data-testid*="checkbox"]')
- expect(checkboxes.length).toBeGreaterThan(0)
+ expect(screen.getByRole('checkbox', { name: 'dataset.metadata.batchEditMetadata.applyToAllSelectDocument' })).toBeInTheDocument()
})
})
- it('should render select metadata modal', async () => {
+ it('should render dataset metadata picker', async () => {
render(
)
await waitFor(() => {
- expect(screen.getByTestId('select-modal'))!.toBeInTheDocument()
+ expect(screen.getByRole('button', { name: 'dataset.metadata.addMetadata' }))!.toBeInTheDocument()
})
})
})
@@ -186,7 +205,7 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- // Find the primary save button (not the one in SelectMetadataModal)
+ // Find the primary save button (not the one in DatasetMetadataPicker)
fireEvent.click(screen.getByRole('button', { name: 'common.operation.save' }))
expect(onSave).toHaveBeenCalled()
@@ -199,16 +218,12 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- const checkboxContainer = document.querySelector('[data-testid*="checkbox"]')
- expect(checkboxContainer)!.toBeInTheDocument()
+ const checkbox = screen.getByRole('checkbox', { name: 'dataset.metadata.batchEditMetadata.applyToAllSelectDocument' })
+ fireEvent.click(checkbox)
- if (checkboxContainer) {
- fireEvent.click(checkboxContainer)
- await waitFor(() => {
- const checkIcon = screen.getByTestId('check-icon-apply-to-all')
- expect(checkIcon)!.toBeInTheDocument()
- })
- }
+ await waitFor(() => {
+ expect(checkbox).toHaveAttribute('aria-checked', 'true')
+ })
})
it('should call onHide when modal close button is clicked', async () => {
@@ -229,10 +244,10 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- fireEvent.click(screen.getByTestId('change-1'))
+ fireEvent.click(screen.getByRole('button', { name: 'Change field_one' }))
// The component should update internally
- expect(screen.getAllByTestId('edit-row').length).toBe(2)
+ expect(getEditRows()).toHaveLength(2)
})
it('should mark item as deleted when remove is clicked', async () => {
@@ -242,10 +257,10 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- fireEvent.click(screen.getByTestId('remove-1'))
+ fireEvent.click(screen.getByRole('button', { name: 'Remove field_one' }))
// The component should update internally - item marked as deleted
- expect(screen.getAllByTestId('edit-row').length).toBe(2)
+ expect(getEditRows()).toHaveLength(2)
})
it('should reset item when reset is clicked', async () => {
@@ -256,11 +271,11 @@ describe('EditMetadataBatchModal', () => {
})
// First change the item
- fireEvent.click(screen.getByTestId('change-1'))
+ fireEvent.click(screen.getByRole('button', { name: 'Change field_one' }))
// Then reset it
- fireEvent.click(screen.getByTestId('reset-1'))
+ fireEvent.click(screen.getByRole('button', { name: 'Reset field_one' }))
- expect(screen.getAllByTestId('edit-row').length).toBe(2)
+ expect(getEditRows()).toHaveLength(2)
})
})
@@ -272,11 +287,11 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- fireEvent.click(screen.getByTestId('select-metadata'))
+ await selectMetadata()
// Should now have add-row for the new item
await waitFor(() => {
- expect(screen.getByTestId('add-row'))!.toBeInTheDocument()
+ expect(getAddedRow('existing_field'))!.toBeInTheDocument()
})
})
@@ -288,17 +303,17 @@ describe('EditMetadataBatchModal', () => {
})
// First add an item
- fireEvent.click(screen.getByTestId('select-metadata'))
+ await selectMetadata()
await waitFor(() => {
- expect(screen.getByTestId('add-row'))!.toBeInTheDocument()
+ expect(getAddedRow('existing_field'))!.toBeInTheDocument()
})
// Then remove it
- fireEvent.click(screen.getByTestId('add-remove'))
+ fireEvent.click(screen.getByRole('button', { name: 'Remove existing_field' }))
await waitFor(() => {
- expect(screen.queryByTestId('add-row')).not.toBeInTheDocument()
+ expect(queryAddedRow('existing_field')).not.toBeInTheDocument()
})
})
@@ -310,16 +325,16 @@ describe('EditMetadataBatchModal', () => {
})
// First add an item
- fireEvent.click(screen.getByTestId('select-metadata'))
+ await selectMetadata()
await waitFor(() => {
- expect(screen.getByTestId('add-row'))!.toBeInTheDocument()
+ expect(getAddedRow('existing_field'))!.toBeInTheDocument()
})
// Then change it
- fireEvent.click(screen.getByTestId('add-change-new-1'))
+ fireEvent.click(screen.getByRole('button', { name: 'Change existing_field' }))
- expect(screen.getByTestId('add-row'))!.toBeInTheDocument()
+ expect(getAddedRow('existing_field'))!.toBeInTheDocument()
})
it('should call doAddMetaData when saving new metadata with valid name', async () => {
@@ -331,7 +346,7 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- fireEvent.click(screen.getByTestId('save-metadata'))
+ await createMetadata()
await waitFor(() => {
expect(mockDoAddMetaData).toHaveBeenCalled()
@@ -347,7 +362,7 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- fireEvent.click(screen.getByTestId('save-metadata'))
+ await createMetadata()
await waitFor(() => {
expect(mockDoAddMetaData).toHaveBeenCalled()
@@ -371,7 +386,7 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- fireEvent.click(screen.getByTestId('save-metadata'))
+ await createMetadata()
await waitFor(() => {
expect(mockToastNotify).toHaveBeenCalledWith(
@@ -391,7 +406,8 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- fireEvent.click(screen.getByTestId('manage-metadata'))
+ openMetadataPicker()
+ fireEvent.click(screen.getByRole('button', { name: 'dataset.metadata.selectMetadata.manageAction' }))
expect(onShowManage).toHaveBeenCalled()
})
@@ -415,7 +431,7 @@ describe('EditMetadataBatchModal', () => {
it('should handle empty list', async () => {
render(
)
await waitFor(() => {
- expect(screen.queryByTestId('edit-row')).not.toBeInTheDocument()
+ expect(screen.queryByRole('group', { name: /^Edit metadata / })).not.toBeInTheDocument()
})
})
})
@@ -427,7 +443,7 @@ describe('EditMetadataBatchModal', () => {
]
render(
)
await waitFor(() => {
- expect(screen.getByTestId('edit-row'))!.toBeInTheDocument()
+ expect(getEditRow('field'))!.toBeInTheDocument()
})
})
@@ -473,9 +489,7 @@ describe('EditMetadataBatchModal', () => {
expect(screen.getByRole('dialog'))!.toBeInTheDocument()
})
- const checkboxContainer = document.querySelector('[data-testid*="checkbox"]')
- if (checkboxContainer)
- fireEvent.click(checkboxContainer)
+ fireEvent.click(screen.getByRole('checkbox', { name: 'dataset.metadata.batchEditMetadata.applyToAllSelectDocument' }))
fireEvent.click(screen.getByRole('button', { name: 'common.operation.save' }))
@@ -497,7 +511,7 @@ describe('EditMetadataBatchModal', () => {
})
// Remove an item
- fireEvent.click(screen.getByTestId('remove-1'))
+ fireEvent.click(screen.getByRole('button', { name: 'Remove field_one' }))
fireEvent.click(screen.getByRole('button', { name: 'common.operation.save' }))
@@ -516,22 +530,22 @@ describe('EditMetadataBatchModal', () => {
})
// Add first item
- fireEvent.click(screen.getByTestId('select-metadata'))
+ await selectMetadata()
await waitFor(() => {
- expect(screen.getByTestId('add-row'))!.toBeInTheDocument()
+ expect(getAddedRow('existing_field'))!.toBeInTheDocument()
})
// Remove it
- fireEvent.click(screen.getByTestId('add-remove'))
+ fireEvent.click(screen.getByRole('button', { name: 'Remove existing_field' }))
await waitFor(() => {
- expect(screen.queryByTestId('add-row')).not.toBeInTheDocument()
+ expect(queryAddedRow('existing_field')).not.toBeInTheDocument()
})
// Add again
- fireEvent.click(screen.getByTestId('select-metadata'))
+ await selectMetadata()
await waitFor(() => {
- expect(screen.getByTestId('add-row'))!.toBeInTheDocument()
+ expect(getAddedRow('existing_field'))!.toBeInTheDocument()
})
})
})
diff --git a/web/app/components/datasets/metadata/edit-metadata-batch/modal.tsx b/web/app/components/datasets/metadata/edit-metadata-batch/modal.tsx
index abc5cb7fcc..964f48c152 100644
--- a/web/app/components/datasets/metadata/edit-metadata-batch/modal.tsx
+++ b/web/app/components/datasets/metadata/edit-metadata-batch/modal.tsx
@@ -12,9 +12,8 @@ import Divider from '@/app/components/base/divider'
import { useCreateMetaData } from '@/service/knowledge/use-metadata'
import Checkbox from '../../../base/checkbox'
import { Infotip } from '../../../base/infotip'
-import AddMetadataButton from '../add-metadata-button'
import useCheckMetadataName from '../hooks/use-check-metadata-name'
-import SelectMetadataModal from '../metadata-dataset/select-metadata-modal'
+import { DatasetMetadataPicker } from '../metadata-dataset/dataset-metadata-picker'
import { UpdateType } from '../types'
import AddedMetadataItem from './add-row'
import EditMetadataBatchItem from './edit-row'
@@ -117,14 +116,27 @@ const EditMetadataBatchModal: FC
= ({ datasetId, documentNum, list, onSav
{addedList.map((item, i) => ( ))}