Skip to content

Commit

Permalink
Merge pull request #9908 from marmelab/upgrade-fakerest
Browse files Browse the repository at this point in the history
Upgrade FakeRest to 4.0
  • Loading branch information
djhi authored Jun 11, 2024
2 parents 0d211de + dbddd4c commit 952e777
Show file tree
Hide file tree
Showing 16 changed files with 166 additions and 208 deletions.
14 changes: 2 additions & 12 deletions examples/crm/src/dataProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ import { withLifecycleCallbacks } from 'react-admin';

import generateData from './dataGenerator';

const baseDataProvider = fakeRestDataProvider(generateData(), true);
const baseDataProvider = fakeRestDataProvider(generateData(), true, 300);

const TASK_MARKED_AS_DONE = 'TASK_MARKED_AS_DONE';
const TASK_MARKED_AS_UNDONE = 'TASK_MARKED_AS_UNDONE';
const TASK_DONE_NOT_CHANGED = 'TASK_DONE_NOT_CHANGED';
let taskUpdateType = TASK_DONE_NOT_CHANGED;

const augmentedDataProvider = withLifecycleCallbacks(baseDataProvider, [
export const dataProvider = withLifecycleCallbacks(baseDataProvider, [
{
resource: 'contactNotes',
afterCreate: async (result, dataProvider) => {
Expand Down Expand Up @@ -109,13 +109,3 @@ const augmentedDataProvider = withLifecycleCallbacks(baseDataProvider, [
},
},
]);

export const dataProvider = new Proxy(augmentedDataProvider, {
get: (target, name: string) => (resource: string, params: any) =>
new Promise(resolve =>
setTimeout(
() => resolve(augmentedDataProvider[name](resource, params)),
300
)
),
});
2 changes: 1 addition & 1 deletion examples/data-generator/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { Invoice } from './invoices';
import type { Review } from './reviews';
import { Settings } from './finalize';

export interface Db {
export interface Db extends Record<string, any> {
customers: Customer[];
categories: Category[];
products: Product[];
Expand Down
3 changes: 1 addition & 2 deletions examples/demo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,13 @@
"clsx": "^2.1.1",
"data-generator-retail": "^5.0.0-alpha.0",
"date-fns": "^3.6.0",
"fakerest": "^3.0.0",
"fakerest": "^4.0.0",
"fetch-mock": "~9.11.0",
"graphql": "^15.6.0",
"graphql-tag": "^2.12.6",
"inflection": "^3.0.0",
"json-graphql-server": "~3.0.1",
"query-string": "^7.1.3",
"ra-data-fakerest": "^5.0.0-alpha.0",
"ra-data-graphql": "^5.0.0-alpha.0",
"ra-data-graphql-simple": "^5.0.0-alpha.0",
"ra-data-simple-rest": "^5.0.0-alpha.0",
Expand Down
21 changes: 1 addition & 20 deletions examples/demo/src/dataProvider/rest.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,3 @@
import simpleRestProvider from 'ra-data-simple-rest';

const restProvider = simpleRestProvider('http://localhost:4000');

const delayedDataProvider = new Proxy(restProvider, {
get: (target, name, self) => {
// as we await for the dataProvider, JS calls then on it. We must trap that call or else the dataProvider will be called with the then method
if (name === 'then') {
return self;
}
return (resource: string, params: any) =>
new Promise(resolve =>
setTimeout(
() =>
resolve(restProvider[name as string](resource, params)),
500
)
);
},
});

export default delayedDataProvider;
export default simpleRestProvider('http://localhost:4000');
15 changes: 9 additions & 6 deletions examples/demo/src/fakeServer/rest.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import FakeRest from 'fakerest';
import { FetchMockAdapter, withDelay } from 'fakerest';
import fetchMock from 'fetch-mock';
import generateData from 'data-generator-retail';

export default () => {
const data = generateData();
const restServer = new FakeRest.FetchServer('http://localhost:4000');
const adapter = new FetchMockAdapter({
baseUrl: 'http://localhost:4000',
data,
loggingEnabled: true,
middlewares: [withDelay(500)],
});
if (window) {
window.restServer = restServer; // give way to update data in the console
window.restServer = adapter.server; // give way to update data in the console
}
restServer.init(data);
restServer.toggleLogging(); // logging is off by default, enable it
fetchMock.mock('begin:http://localhost:4000', restServer.getHandler());
fetchMock.mock('begin:http://localhost:4000', adapter.getHandler());
return () => fetchMock.restore();
};
1 change: 0 additions & 1 deletion examples/demo/src/fakerest.d.ts

This file was deleted.

19 changes: 2 additions & 17 deletions examples/simple/src/dataProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import data from './data';
import addUploadFeature from './addUploadFeature';
import { queryClient } from './queryClient';

const dataProvider = withLifecycleCallbacks(fakeRestProvider(data, true), [
const dataProvider = withLifecycleCallbacks(fakeRestProvider(data, true, 300), [
{
resource: 'posts',
beforeDelete: async ({ id }, dp) => {
Expand Down Expand Up @@ -111,23 +111,8 @@ const sometimesFailsDataProvider = new Proxy(uploadCapableDataProvider, {
},
});

const delayedDataProvider = new Proxy(sometimesFailsDataProvider, {
get: (target, name) => (resource, params) => {
if (typeof name === 'symbol' || name === 'then') {
return;
}
return new Promise(resolve =>
setTimeout(
() =>
resolve(sometimesFailsDataProvider[name](resource, params)),
300
)
);
},
});

interface ResponseError extends Error {
status?: number;
}

export default delayedDataProvider;
export default sometimesFailsDataProvider;
Original file line number Diff line number Diff line change
Expand Up @@ -40,21 +40,7 @@ const data = {
],
};

const baseDataProvider = fakeRestProvider(data);

const dataProvider = new Proxy(baseDataProvider, {
get: (target, name) => (resource, params) => {
if (typeof name === 'symbol' || name === 'then') {
return;
}
return new Promise(resolve =>
setTimeout(
() => resolve(baseDataProvider[name](resource, params)),
300
)
);
},
});
const dataProvider = fakeRestProvider(data, undefined, 300);

const BookListView = () => {
const { data, isPending, sort, setSort, filterValues, setFilters } =
Expand Down
16 changes: 1 addition & 15 deletions packages/ra-core/src/controller/list/ListBase.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,7 @@ const data = {
],
};

const baseDataProvider = fakeRestProvider(data, true);

const dataProvider = new Proxy(baseDataProvider, {
get: (target, name) => (resource, params) => {
if (typeof name === 'symbol' || name === 'then') {
return;
}
return new Promise(resolve =>
setTimeout(
() => resolve(baseDataProvider[name](resource, params)),
300
)
);
},
});
const dataProvider = fakeRestProvider(data, true, 300);

const BookListView = () => {
const {
Expand Down
40 changes: 24 additions & 16 deletions packages/ra-core/src/dataProvider/useDelete.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -289,22 +289,30 @@ describe('useDelete', () => {
jest.spyOn(console, 'error').mockImplementation(() => {});
render(<ErrorCasePessimistic />);
screen.getByText('Delete first post').click();
await waitFor(() => {
expect(screen.queryByText('success')).toBeNull();
expect(screen.queryByText('something went wrong')).toBeNull();
expect(screen.queryByText('Hello')).not.toBeNull();
expect(screen.queryByText('World')).not.toBeNull();
expect(screen.queryByText('mutating')).not.toBeNull();
});
await waitFor(() => {
expect(screen.queryByText('success')).toBeNull();
expect(
screen.queryByText('something went wrong')
).not.toBeNull();
expect(screen.queryByText('Hello')).not.toBeNull();
expect(screen.queryByText('World')).not.toBeNull();
expect(screen.queryByText('mutating')).toBeNull();
});
await waitFor(
() => {
expect(screen.queryByText('success')).toBeNull();
expect(
screen.queryByText('something went wrong')
).toBeNull();
expect(screen.queryByText('Hello')).not.toBeNull();
expect(screen.queryByText('World')).not.toBeNull();
expect(screen.queryByText('mutating')).not.toBeNull();
},
{ timeout: 4000 }
);
await waitFor(
() => {
expect(screen.queryByText('success')).toBeNull();
expect(
screen.queryByText('something went wrong')
).not.toBeNull();
expect(screen.queryByText('Hello')).not.toBeNull();
expect(screen.queryByText('World')).not.toBeNull();
expect(screen.queryByText('mutating')).toBeNull();
},
{ timeout: 4000 }
);
});
it('when optimistic, displays result and success side effects right away', async () => {
jest.spyOn(console, 'log').mockImplementation(() => {});
Expand Down
28 changes: 28 additions & 0 deletions packages/ra-data-fakerest/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,34 @@ const App = () => (
);
```

## Delay

You can pass a delay in milliseconds as the third argument to the constructor. This will simulate a network delay for each request.

```jsx
// in src/App.js
import * as React from "react";
import { Admin, Resource } from 'react-admin';
import fakeDataProvider from 'ra-data-fakerest';

const dataProvider = fakeDataProvider({ /* data here */ }, false, 1000);

const App = () => (
<Admin dataProvider={dataProvider}>
// ...
</Admin>
);
```

## Inspecting the Data

`ra-data-fakerest` makes its internal database accessible in the global scope under the `_database` key. You can use it to inspect the data in your browser console.

```js
_database.getOne('posts', 1);
// { id: 1, title: 'FooBar' }
```

## Features

This data provider uses [FakeRest](https://github.com/marmelab/FakeRest) under the hood. That means that it offers the same features:
Expand Down
2 changes: 1 addition & 1 deletion packages/ra-data-fakerest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
"watch": "tsc --outDir dist/esm --module es2015 --watch"
},
"dependencies": {
"fakerest": "^3.0.0"
"fakerest": "^4.0.0"
},
"devDependencies": {
"@types/jest": "^29.5.2",
Expand Down
Loading

0 comments on commit 952e777

Please sign in to comment.