zimicjs / zimic

TypeScript-first HTTP request mocking
https://npmjs.com/package/zimic
MIT License
9 stars 2 forks source link

Support rejecting unhandled requests in local interceptors #387

Open diego-aquino opened 1 month ago

diego-aquino commented 1 month ago

The native Response.error() can be used to return a network error in intercepted requests. MSW supports it as documented here.

This might finally allow Zimic to reject unhandled requests in local interceptors and make the behavior consistent with remote interceptors. I'll look more into it and update this issue accordingly.

Proposal

We should support choosing whether to bypass or reject unhandled requests in local and remote interceptors.

const interceptor = httpInterceptor.create<Schema>({
  type: 'local',
  // ...
  onUnhandledRequest: 'bypass' | 'reject', // local interceptors can bypass or reject
});
const interceptor = httpInterceptor.create<Schema>({
  type: 'remote',
  // ...
  onUnhandledRequest: 'reject', // remote interceptors can only reject
});
const interceptor = httpInterceptor.create<Schema>({
  // ...
  // using an object to customize the logging behavior
  onUnhandledRequest: { action: 'bypass', log: true },
});
const interceptor = httpInterceptor.create<Schema>({
  // ...
  // using an factory for maximum flexibility
  onUnhandledRequest: (request) => {
    if (request.url.includes('localhost') {
      return { action: 'bypass', log: false }
    }
    if (request.url.endsWith('/error') {
      return 'reject' 
    }
    return { action: 'bypass', log: true } 
  },
});

When using httpInterceptor.defaults, we could have a similar structure.

httpInterceptor.defaults.local.onUnhandledRequest = 'bypass' | 'reject'
httpInterceptor.defaults.local.onUnhandledRequest = { action: 'bypass', log: false }
httpInterceptor.defaults.local.onUnhandledRequest = (request) => {
  if (request.url.includes('localhost') {
    return { action: 'bypass', log: false }
  }
  if (request.url.endsWith('/error') {
    return 'reject' 
  }
  return { action: 'bypass', log: true } 
});
httpInterceptor.defaults.remote.onUnhandledRequest = 'reject'
httpInterceptor.defaults.remote.onUnhandledRequest = { action: 'reject', log: false }
httpInterceptor.defaults.remote.onUnhandledRequest = (request) => {
  if (request.url.includes('localhost') {
    return { action: 'reject', log: false }
  }
  return 'reject' 
});