Skip to content

Commit 597967b

Browse files
Marcellin NshimiyimanaMarcellin Nshimiyimana
Marcellin Nshimiyimana
authored and
Marcellin Nshimiyimana
committed
feat($post-request): add support for mocking post requests
added the method along with all implementation inside react-mock class, it is probably better to put logic in a separate file for ease of scalabilty
1 parent c2cd180 commit 597967b

File tree

5 files changed

+316
-0
lines changed

5 files changed

+316
-0
lines changed

src/react-mock/index.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,28 @@ export default class ServerClass {
6363
})
6464
// END save handler to our pretender map
6565
}
66+
67+
mockPost(
68+
endPoint: string,
69+
handler: (
70+
req: Object,
71+
generator: IDataGenerator
72+
) => ResponseData | Promise<ResponseData>,
73+
...rest: Array<any>
74+
): void {
75+
// START save handler to our pretender map
76+
let dataGenerator = this.dataGenerator
77+
this.routeMapList.push(function routeMap(this: Pretender) {
78+
this.post(
79+
endPoint,
80+
(req: Object) => {
81+
return handler(req, dataGenerator)
82+
},
83+
...rest
84+
)
85+
})
86+
// END save handler to our pretender map
87+
}
6688
}
6789

6890
export const Faker = faker

test/acceptance/mock-delete.test.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// import ServerClass, { Server, Faker, uid } from 'react-mock'
2+
import axios from 'axios'
3+
import ServerClass, {
4+
Server,
5+
Faker,
6+
uid,
7+
IDataGenerator
8+
} from '../../src/react-mock'
9+
10+
describe('Get Request', () => {
11+
afterEach(() => {
12+
return Server.off()
13+
})
14+
15+
const apiRoute = '/api/v1/guides'
16+
17+
const schema = {
18+
description: () => Faker.lorem.sentence(),
19+
createdAt: () => Faker.date.past(),
20+
favoredCount: () => Faker.random.number(),
21+
isPublic: () => Faker.random.boolean(),
22+
author: {
23+
id: uid.next(),
24+
name: Faker.name.findName(),
25+
picture: Faker.internet.avatar()
26+
}
27+
}
28+
29+
it('mocks get request with array response', () => {
30+
const requestHandler = (request, generator): [number, any, string] => {
31+
const guides = generator.next(5, schema)
32+
return [
33+
200,
34+
{ 'Content-Type': 'application/json' },
35+
JSON.stringify(guides)
36+
]
37+
}
38+
39+
Server.mockGet(apiRoute, requestHandler, 1000)
40+
41+
return Server.on()
42+
.then(() => {
43+
return axios.get('/api/v1/guides').then(({ data }) => {
44+
// console.log('[axios] /api/v1/guides', data)
45+
// we assert that data is an array of 10 objects in it
46+
return expect(data.length).toEqual(5)
47+
})
48+
})
49+
.then(() => {
50+
return Server.off()
51+
})
52+
})
53+
54+
it('mocks get request with map response', () => {
55+
const requestHandler = (request, generator): [number, any, string] => {
56+
const guides = generator.next(5, schema, true)
57+
return [
58+
200,
59+
{ 'Content-Type': 'application/json' },
60+
JSON.stringify(guides)
61+
]
62+
}
63+
64+
Server.mockGet(apiRoute, requestHandler, 1000)
65+
66+
return Server.on()
67+
.then(() => {
68+
return axios.get('/api/v1/guides').then(({ data }) => {
69+
// console.log('[axios] /api/v1/guides', data)
70+
// we assert that data is a map of 10 objects where key is the id of each object
71+
let firstKey = Object.keys(data)[0]
72+
let firstObject = data[firstKey]
73+
return expect(firstObject.id).toEqual(firstKey)
74+
})
75+
})
76+
.then(() => {
77+
return Server.off()
78+
})
79+
})
80+
})

test/acceptance/mock-patch.test.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// import ServerClass, { Server, Faker, uid } from 'react-mock'
2+
import axios from 'axios'
3+
import ServerClass, {
4+
Server,
5+
Faker,
6+
uid,
7+
IDataGenerator
8+
} from '../../src/react-mock'
9+
10+
describe('Get Request', () => {
11+
afterEach(() => {
12+
return Server.off()
13+
})
14+
15+
const apiRoute = '/api/v1/guides'
16+
17+
const schema = {
18+
description: () => Faker.lorem.sentence(),
19+
createdAt: () => Faker.date.past(),
20+
favoredCount: () => Faker.random.number(),
21+
isPublic: () => Faker.random.boolean(),
22+
author: {
23+
id: uid.next(),
24+
name: Faker.name.findName(),
25+
picture: Faker.internet.avatar()
26+
}
27+
}
28+
29+
it('mocks get request with array response', () => {
30+
const requestHandler = (request, generator): [number, any, string] => {
31+
const guides = generator.next(5, schema)
32+
return [
33+
200,
34+
{ 'Content-Type': 'application/json' },
35+
JSON.stringify(guides)
36+
]
37+
}
38+
39+
Server.mockGet(apiRoute, requestHandler, 1000)
40+
41+
return Server.on()
42+
.then(() => {
43+
return axios.get('/api/v1/guides').then(({ data }) => {
44+
// console.log('[axios] /api/v1/guides', data)
45+
// we assert that data is an array of 10 objects in it
46+
return expect(data.length).toEqual(5)
47+
})
48+
})
49+
.then(() => {
50+
return Server.off()
51+
})
52+
})
53+
54+
it('mocks get request with map response', () => {
55+
const requestHandler = (request, generator): [number, any, string] => {
56+
const guides = generator.next(5, schema, true)
57+
return [
58+
200,
59+
{ 'Content-Type': 'application/json' },
60+
JSON.stringify(guides)
61+
]
62+
}
63+
64+
Server.mockGet(apiRoute, requestHandler, 1000)
65+
66+
return Server.on()
67+
.then(() => {
68+
return axios.get('/api/v1/guides').then(({ data }) => {
69+
// console.log('[axios] /api/v1/guides', data)
70+
// we assert that data is a map of 10 objects where key is the id of each object
71+
let firstKey = Object.keys(data)[0]
72+
let firstObject = data[firstKey]
73+
return expect(firstObject.id).toEqual(firstKey)
74+
})
75+
})
76+
.then(() => {
77+
return Server.off()
78+
})
79+
})
80+
})

test/acceptance/mock-post.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// import ServerClass, { Server, Faker, uid } from 'react-mock'
2+
import axios from 'axios'
3+
import ServerClass, {
4+
Server,
5+
Faker,
6+
uid,
7+
IDataGenerator
8+
} from '../../src/react-mock'
9+
10+
describe('Get Request', () => {
11+
afterEach(() => {
12+
return Server.off()
13+
})
14+
15+
const apiRoute = '/api/v1/guides'
16+
17+
const schema = {
18+
description: Faker.lorem.sentence(),
19+
createdAt: Faker.date.past(),
20+
favoredCount: Faker.random.number(),
21+
isPublic: Faker.random.boolean(),
22+
author: {
23+
id: uid.next(),
24+
name: Faker.name.findName(),
25+
picture: Faker.internet.avatar()
26+
}
27+
}
28+
29+
const id = uid.next()
30+
it('mocks post request with an object response that has id', () => {
31+
const requestHandler = (request, generator): [number, any, string] => {
32+
const guide = { ...schema, id }
33+
return [
34+
200,
35+
{ 'Content-Type': 'application/json' },
36+
JSON.stringify(guide)
37+
]
38+
}
39+
40+
Server.mockPost(apiRoute, requestHandler, 1000)
41+
42+
return Server.on()
43+
.then(() => {
44+
return axios.post('/api/v1/guides').then(({ data }) => {
45+
// console.log('[axios] /api/v1/guides', data)
46+
// we assert that data is an object that has an id value in it
47+
return expect(data.id).toEqual(id)
48+
})
49+
})
50+
.then(() => {
51+
return Server.off()
52+
})
53+
})
54+
})

test/acceptance/mock-put.test.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// import ServerClass, { Server, Faker, uid } from 'react-mock'
2+
import axios from 'axios'
3+
import ServerClass, {
4+
Server,
5+
Faker,
6+
uid,
7+
IDataGenerator
8+
} from '../../src/react-mock'
9+
10+
describe('Get Request', () => {
11+
afterEach(() => {
12+
return Server.off()
13+
})
14+
15+
const apiRoute = '/api/v1/guides'
16+
17+
const schema = {
18+
description: () => Faker.lorem.sentence(),
19+
createdAt: () => Faker.date.past(),
20+
favoredCount: () => Faker.random.number(),
21+
isPublic: () => Faker.random.boolean(),
22+
author: {
23+
id: uid.next(),
24+
name: Faker.name.findName(),
25+
picture: Faker.internet.avatar()
26+
}
27+
}
28+
29+
it('mocks get request with array response', () => {
30+
const requestHandler = (request, generator): [number, any, string] => {
31+
const guides = generator.next(5, schema)
32+
return [
33+
200,
34+
{ 'Content-Type': 'application/json' },
35+
JSON.stringify(guides)
36+
]
37+
}
38+
39+
Server.mockGet(apiRoute, requestHandler, 1000)
40+
41+
return Server.on()
42+
.then(() => {
43+
return axios.get('/api/v1/guides').then(({ data }) => {
44+
// console.log('[axios] /api/v1/guides', data)
45+
// we assert that data is an array of 10 objects in it
46+
return expect(data.length).toEqual(5)
47+
})
48+
})
49+
.then(() => {
50+
return Server.off()
51+
})
52+
})
53+
54+
it('mocks get request with map response', () => {
55+
const requestHandler = (request, generator): [number, any, string] => {
56+
const guides = generator.next(5, schema, true)
57+
return [
58+
200,
59+
{ 'Content-Type': 'application/json' },
60+
JSON.stringify(guides)
61+
]
62+
}
63+
64+
Server.mockGet(apiRoute, requestHandler, 1000)
65+
66+
return Server.on()
67+
.then(() => {
68+
return axios.get('/api/v1/guides').then(({ data }) => {
69+
// console.log('[axios] /api/v1/guides', data)
70+
// we assert that data is a map of 10 objects where key is the id of each object
71+
let firstKey = Object.keys(data)[0]
72+
let firstObject = data[firstKey]
73+
return expect(firstObject.id).toEqual(firstKey)
74+
})
75+
})
76+
.then(() => {
77+
return Server.off()
78+
})
79+
})
80+
})

0 commit comments

Comments
 (0)