File size: 2,567 Bytes
b593f0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { headersToObject } from 'headers-polyfill'
import { HttpResponse, http } from 'msw'

export type Post = {
  id: number
  title: string
  body: string
}

export const posts: Record<string, Post> = {
  1: { id: 1, title: 'hello', body: 'extra body!' },
}

export const handlers = [
  http.get(
    'https://example.com',
    async ({ request, params, cookies, requestId }) => {
      HttpResponse.json({ value: 'success' })
    },
  ),
  http.get(
    'https://example.com/echo',
    async ({ request, params, cookies, requestId }) => {
      return HttpResponse.json({
        ...request,
        params,
        cookies,
        requestId,
        url: new URL(request.url),
        headers: headersToObject(request.headers),
      })
    },
  ),

  http.post(
    'https://example.com/echo',
    async ({ request, cookies, params, requestId }) => {
      let body

      try {
        body =
          headersToObject(request.headers)['content-type'] === 'text/html'
            ? await request.text()
            : await request.json()
      } catch (err) {
        body = request.body
      }

      return HttpResponse.json({
        ...request,
        cookies,
        params,
        requestId,
        body,
        url: new URL(request.url),
        headers: headersToObject(request.headers),
      })
    },
  ),

  http.get('https://example.com/success', () =>
    HttpResponse.json({ value: 'success' }),
  ),

  http.post('https://example.com/success', () =>
    HttpResponse.json({ value: 'success' }),
  ),

  http.get('https://example.com/empty', () => new HttpResponse('')),

  http.get('https://example.com/error', () =>
    HttpResponse.json({ value: 'error' }, { status: 500 }),
  ),

  http.post('https://example.com/error', () =>
    HttpResponse.json({ value: 'error' }, { status: 500 }),
  ),

  http.get('https://example.com/nonstandard-error', () =>
    HttpResponse.json(
      {
        success: false,
        message: 'This returns a 200 but is really an error',
      },
      { status: 200 },
    ),
  ),

  http.get('https://example.com/mirror', ({ params }) =>
    HttpResponse.json(params),
  ),

  http.post('https://example.com/mirror', ({ params }) =>
    HttpResponse.json(params),
  ),

  http.get('https://example.com/posts/random', () => {
    // just simulate an api that returned a random ID
    const { id } = posts[1]
    return HttpResponse.json({ id })
  }),

  http.get<{ id: string }, any, Pick<Post, 'id'>>(
    'https://example.com/post/:id',
    ({ params }) => HttpResponse.json(posts[params.id]),
  ),
]