{"record":{"id":"23ee3b9b8d2b74c0","repo":"marmelab/react-admin","slug":"deletemany-is-not-implemented","errorCode":null,"errorMessage":"deleteMany is not implemented","messagePattern":"deleteMany is not implemented","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/ra-core/src/dataProvider/testDataProvider.ts","lineNumber":20,"sourceCode":"\n/**\n * A dataProvider meant to be used in tests only. You can override any of its methods by passing a partial dataProvider.\n *\n * @example\n * const dataProvider = testDataProvider({\n *    getOne: async () => ({ data: { id: 123, title: 'foo' }})\n * })\n */\n\nconst defaultTestDataProvider: DataProvider = {\n    create: async () => {\n        throw new Error('create is not implemented');\n    },\n    delete: async () => {\n        throw new Error('delete not implemented');\n    },\n    deleteMany: async () => {\n        throw new Error('deleteMany is not implemented');\n    },\n    getList: async () => {\n        throw new Error('getList is not implemented');\n    },\n    getMany: async () => {\n        throw new Error('getMany is not implemented');\n    },\n    getManyReference: async () => {\n        throw new Error('getManyReference is not implemented');\n    },\n    getOne: async () => {\n        throw new Error('getOne is not implemented');\n    },\n    update: async () => {\n        throw new Error('update not implemented');\n    },\n    updateMany: async () => {\n        throw new Error('updateMany not implemented');","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/marmelab/react-admin/blob/051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0/packages/ra-core/src/dataProvider/testDataProvider.ts#L2-L38","documentation":"Like all testDataProvider defaults, deleteMany throws unless explicitly overridden. It fails the test immediately rather than returning fake data, so tests only pass when they define the behavior they depend on.","triggerScenarios":"A test path that calls dataProvider.deleteMany (useDeleteMany, BulkDeleteButton, bulk selection delete) against testDataProvider() with no deleteMany override.","commonSituations":"Testing a datagrid's bulk delete toolbar; batch cleanup logic in unit tests; forgetting bulk methods while stubbing single delete only.","solutions":["Stub deleteMany: testDataProvider({ deleteMany: async () => ({ data: [123, 456] }) })","Switch to mockProvider which returns sensible defaults for all methods","Assert only on single-record delete paths if bulk behavior isn't the target"],"exampleFix":"// before\nconst dataProvider = testDataProvider();\n// after\nconst dataProvider = testDataProvider({\n  deleteMany: async () => ({ data: [1, 2, 3] }),\n});","handlingStrategy":"try-catch","validationCode":"if (!dataProviderOverrides.deleteMany) throw new Error('test must stub deleteMany');","typeGuard":null,"tryCatchPattern":"try { await dataProvider.deleteMany(r, { ids }); } catch (e) { /* stub deleteMany */ throw e; }","preventionTips":["Stub bulk methods alongside single ones","Use mockProvider for bulk delete tests","Audit components under test for bulk actions"],"tags":["react-admin","testing","data-provider"],"backgroundTag":"unimplemented-method","analyzedSha":"051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0","analyzedAt":"2026-08-30T02:28:14.926Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}