todoApp/node_modules/fakerest/example/sinon.ts

91 lines
3.0 KiB
TypeScript

import sinon from 'sinon';
import simpleRestProvider from 'ra-data-simple-rest';
import { HttpError, type Options } from 'react-admin';
import { SinonAdapter } from '../src';
import { data } from './data';
import { middlewares } from './middlewares';
export const initializeSinon = () => {
const restServer = new SinonAdapter({
baseUrl: 'http://localhost:3000',
data,
loggingEnabled: true,
middlewares,
});
// use sinon.js to monkey-patch XmlHttpRequest
const server = sinon.fakeServer.create();
// this is required when doing asynchronous XmlHttpRequest
server.autoRespond = true;
if (window) {
// @ts-ignore
window.restServer = restServer; // give way to update data in the console
// @ts-ignore
window.sinonServer = server; // give way to update data in the console
}
server.respondWith(restServer.getHandler());
};
// An HttpClient based on XMLHttpRequest to use with Sinon
const httpClient = (url: string, options: Options = {}): Promise<any> => {
const request = new XMLHttpRequest();
request.open(options.method ?? 'GET', url);
const persistedUser = localStorage.getItem('user');
const user = persistedUser ? JSON.parse(persistedUser) : null;
if (user) {
request.setRequestHeader('Authorization', `Bearer ${user.id}`);
}
// add content-type header
request.overrideMimeType('application/json');
request.send(typeof options.body === 'string' ? options.body : undefined);
return new Promise((resolve, reject) => {
request.onloadend = (e) => {
let json: any;
try {
json = JSON.parse(request.responseText);
} catch (e) {
// not json, no big deal
}
// Get the raw header string
const headersAsString = request.getAllResponseHeaders();
// Convert the header string into an array
// of individual headers
const arr = headersAsString.trim().split(/[\r\n]+/);
// Create a map of header names to values
const headers = new Headers();
for (const line of arr) {
const parts = line.split(': ');
const header = parts.shift();
if (!header) continue;
const value = parts.join(': ');
headers.set(header, value);
}
if (request.status < 200 || request.status >= 300) {
return reject(
new HttpError(
json?.message || request.statusText,
request.status,
json,
),
);
}
resolve({
status: request.status,
headers,
body: request.responseText,
json,
});
};
});
};
export const dataProvider = simpleRestProvider(
'http://localhost:3000',
httpClient,
);