Skip to content

Commit 6b8e755

Browse files
committed
migrate blog test
1 parent 39e999a commit 6b8e755

File tree

3 files changed

+138
-27
lines changed

3 files changed

+138
-27
lines changed

src/routes/v1/blog/index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { SuccessResponse } from '../../../core/ApiResponse';
33
import asyncHandler from '../../../helpers/asyncHandler';
44
import validator, { ValidationSource } from '../../../helpers/validator';
55
import schema from './schema';
6-
import { BadRequestError } from '../../../core/ApiError';
6+
import { NotFoundError } from '../../../core/ApiError';
77
import BlogRepo from '../../../database/repository/BlogRepo';
88
import { Types } from 'mongoose';
99
import writer from './writer';
@@ -21,13 +21,13 @@ router.get(
2121
asyncHandler(async (req, res) => {
2222
const blogUrl = req.query.endpoint as string;
2323
let blog = await BlogCache.fetchByUrl(blogUrl);
24-
24+
2525
if (!blog) {
2626
blog = await BlogRepo.findPublishedByUrl(blogUrl);
2727
if (blog) await BlogCache.save(blog);
2828
}
29-
30-
if (!blog) throw new BadRequestError('Blog not found');
29+
30+
if (!blog) throw new NotFoundError('Blog not found');
3131
return new SuccessResponse('success', blog).send(res);
3232
}),
3333
);
@@ -44,7 +44,7 @@ router.get(
4444
if (blog) await BlogCache.save(blog);
4545
}
4646

47-
if (!blog) throw new BadRequestError('Blog not found');
47+
if (!blog) throw new NotFoundError('Blog not found');
4848
return new SuccessResponse('success', blog).send(res);
4949
}),
5050
);

tests/routes/v1/blog/index/mock.ts

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,74 @@ import { Types } from 'mongoose';
44
jest.unmock('../../../../../src/database/repository/BlogRepo');
55

66
export const BLOG_ID = new Types.ObjectId();
7+
export const BLOG_2_ID = new Types.ObjectId();
8+
79
export const BLOG_URL = 'abc';
10+
export const BLOG_2_URL = 'abc2';
11+
12+
export const mockBlogCacheFetchByUrl = jest.fn(async (blogUrl: string): Promise<Blog | null> => {
13+
if (blogUrl === BLOG_URL)
14+
return {
15+
_id: BLOG_ID,
16+
blogUrl: blogUrl,
17+
} as Blog;
18+
return null;
19+
});
20+
21+
export const mockBlogCacheFetchById = jest.fn(async (id: Types.ObjectId): Promise<Blog | null> => {
22+
if (BLOG_ID.equals(id))
23+
return {
24+
_id: BLOG_ID,
25+
blogUrl: BLOG_URL,
26+
} as Blog;
27+
return null;
28+
});
29+
30+
export const mockBlogCacheSave = jest.fn(async (blog: Blog): Promise<string> => {
31+
return JSON.stringify(blog);
32+
});
833

9-
export const mockBlogFindByUrl = jest.fn(async (blogUrl: string): Promise<Blog | null> => {
34+
export const mockPublishedBlogFindByUrl = jest.fn(async (blogUrl: string): Promise<Blog | null> => {
1035
if (blogUrl === BLOG_URL)
1136
return {
1237
_id: BLOG_ID,
1338
blogUrl: blogUrl,
1439
} as Blog;
40+
41+
if (blogUrl === BLOG_2_URL)
42+
return {
43+
_id: BLOG_2_ID,
44+
blogUrl: blogUrl,
45+
} as Blog;
46+
1547
return null;
1648
});
1749

18-
export const mockFindInfoWithTextById = jest.fn(
50+
export const mockPublishedBlogFindById = jest.fn(
1951
async (id: Types.ObjectId): Promise<Blog | null> => {
2052
if (BLOG_ID.equals(id))
2153
return {
2254
_id: BLOG_ID,
2355
blogUrl: BLOG_URL,
2456
} as Blog;
57+
58+
if (BLOG_2_ID.equals(id))
59+
return {
60+
_id: BLOG_2_ID,
61+
blogUrl: BLOG_2_URL,
62+
} as Blog;
63+
2564
return null;
2665
},
2766
);
2867

68+
jest.mock('../../../../../src/cache/repository/BlogCache', () => ({
69+
save: mockBlogCacheSave,
70+
fetchByUrl: mockBlogCacheFetchByUrl,
71+
fetchById: mockBlogCacheFetchById,
72+
}));
73+
2974
jest.mock('../../../../../src/database/repository/BlogRepo', () => ({
30-
findByUrl: mockBlogFindByUrl,
31-
findInfoForPublishedById: mockFindInfoWithTextById,
75+
findPublishedByUrl: mockPublishedBlogFindByUrl,
76+
findInfoForPublishedById: mockPublishedBlogFindById,
3277
}));
Lines changed: 84 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
import { addHeaders } from '../../../../auth/authentication/mock';
22

3-
import { mockBlogFindByUrl, mockFindInfoWithTextById, BLOG_ID, BLOG_URL } from './mock';
3+
import {
4+
mockBlogCacheFetchById,
5+
mockBlogCacheFetchByUrl,
6+
mockBlogCacheSave,
7+
mockPublishedBlogFindByUrl,
8+
mockPublishedBlogFindById,
9+
BLOG_ID,
10+
BLOG_URL,
11+
BLOG_2_URL,
12+
BLOG_2_ID,
13+
} from './mock';
414

515
import supertest from 'supertest';
616
import app from '../../../../../src/app';
717
import { Types } from 'mongoose';
818

919
describe('BlogDetail by URL route', () => {
1020
beforeEach(() => {
11-
mockBlogFindByUrl.mockClear();
21+
mockBlogCacheFetchByUrl.mockClear();
22+
mockBlogCacheSave.mockClear();
23+
mockPublishedBlogFindByUrl.mockClear();
1224
});
1325

1426
const request = supertest(app);
@@ -19,7 +31,7 @@ describe('BlogDetail by URL route', () => {
1931
expect(response.status).toBe(400);
2032
expect(response.body.message).toMatch(/endpoint/);
2133
expect(response.body.message).toMatch(/required/);
22-
expect(mockBlogFindByUrl).not.toBeCalled();
34+
expect(mockPublishedBlogFindByUrl).not.toBeCalled();
2335
});
2436

2537
it('Should send error when url endpoint is more that 200 chars', async () => {
@@ -28,31 +40,60 @@ describe('BlogDetail by URL route', () => {
2840
expect(response.status).toBe(400);
2941
expect(response.body.message).toMatch(/length must/);
3042
expect(response.body.message).toMatch(/200/);
31-
expect(mockBlogFindByUrl).not.toBeCalled();
43+
expect(mockPublishedBlogFindByUrl).not.toBeCalled();
3244
});
3345

3446
it('Should send error when blog do not exists for url', async () => {
3547
const response = await addHeaders(request.get(endpoint).query({ endpoint: 'xyz' }));
36-
expect(response.status).toBe(400);
37-
expect(response.body.message).toMatch(/do not exists/);
38-
expect(mockBlogFindByUrl).toBeCalledTimes(1);
39-
expect(mockBlogFindByUrl).toBeCalledWith('xyz');
48+
expect(response.status).toBe(404);
49+
expect(response.body.message).toMatch(/not found/);
50+
expect(mockBlogCacheFetchByUrl).toBeCalledTimes(1);
51+
expect(mockBlogCacheFetchByUrl).toBeCalledWith('xyz');
52+
expect(mockBlogCacheSave).not.toBeCalled();
53+
expect(mockPublishedBlogFindByUrl).toBeCalledTimes(1);
54+
expect(mockPublishedBlogFindByUrl).toBeCalledWith('xyz');
4055
});
4156

42-
it('Should send data when blog exists for url', async () => {
57+
it('Should send cache data when blog exists for url in cache', async () => {
4358
const response = await addHeaders(request.get(endpoint).query({ endpoint: BLOG_URL }));
4459
expect(response.status).toBe(200);
4560
expect(response.body.message).toMatch(/success/);
4661
expect(response.body.data).toBeDefined();
4762
expect(response.body.data).toHaveProperty('_id');
48-
expect(mockBlogFindByUrl).toBeCalledTimes(1);
49-
expect(mockBlogFindByUrl).toBeCalledWith(BLOG_URL);
63+
64+
expect(mockBlogCacheFetchByUrl).toBeCalledTimes(1);
65+
expect(mockBlogCacheFetchByUrl).toBeCalledWith(BLOG_URL);
66+
expect(mockBlogCacheFetchByUrl).toReturnTimes(1);
67+
68+
expect(mockPublishedBlogFindByUrl).not.toBeCalled();
69+
expect(mockBlogCacheSave).not.toBeCalled();
70+
});
71+
72+
it('Should send database data when blog dont exists for url in cache', async () => {
73+
const response = await addHeaders(request.get(endpoint).query({ endpoint: BLOG_2_URL }));
74+
expect(response.status).toBe(200);
75+
expect(response.body.message).toMatch(/success/);
76+
expect(response.body.data).toBeDefined();
77+
expect(response.body.data).toHaveProperty('_id');
78+
79+
expect(mockBlogCacheFetchByUrl).toBeCalledTimes(1);
80+
expect(mockBlogCacheFetchByUrl).toBeCalledWith(BLOG_2_URL);
81+
expect(mockBlogCacheFetchByUrl).toReturnTimes(1);
82+
83+
expect(mockPublishedBlogFindByUrl).toBeCalledTimes(1);
84+
expect(mockPublishedBlogFindByUrl).toBeCalledWith(BLOG_2_URL);
85+
expect(mockPublishedBlogFindByUrl).toReturnTimes(1);
86+
87+
expect(mockBlogCacheSave).toBeCalledTimes(1);
88+
expect(mockBlogCacheSave).toReturnTimes(1);
5089
});
5190
});
5291

5392
describe('BlogDetail by id route', () => {
5493
beforeEach(() => {
55-
mockFindInfoWithTextById.mockClear();
94+
mockBlogCacheFetchById.mockClear();
95+
mockBlogCacheSave.mockClear();
96+
mockPublishedBlogFindById.mockClear();
5697
});
5798

5899
const request = supertest(app);
@@ -62,22 +103,47 @@ describe('BlogDetail by id route', () => {
62103
const response = await addHeaders(request.get(endpoint + 'abc'));
63104
expect(response.status).toBe(400);
64105
expect(response.body.message).toMatch(/invalid/);
65-
expect(mockFindInfoWithTextById).not.toBeCalled();
106+
expect(mockPublishedBlogFindById).not.toBeCalled();
66107
});
67108

68109
it('Should send error when blog do not exists for id', async () => {
69110
const response = await addHeaders(request.get(endpoint + new Types.ObjectId().toHexString()));
70-
expect(response.status).toBe(400);
71-
expect(response.body.message).toMatch(/do not exists/);
72-
expect(mockFindInfoWithTextById).toBeCalledTimes(1);
111+
expect(response.status).toBe(404);
112+
expect(response.body.message).toMatch(/not found/);
113+
expect(mockPublishedBlogFindById).toBeCalledTimes(1);
73114
});
74115

75-
it('Should send data when blog exists for id', async () => {
116+
it('Should send cache data when blog exists for id in cache', async () => {
76117
const response = await addHeaders(request.get(endpoint + BLOG_ID.toHexString()));
77118
expect(response.status).toBe(200);
78119
expect(response.body.message).toMatch(/success/);
79120
expect(response.body.data).toBeDefined();
80121
expect(response.body.data).toHaveProperty('_id');
81-
expect(mockFindInfoWithTextById).toBeCalledTimes(1);
122+
123+
expect(mockBlogCacheFetchById).toBeCalledTimes(1);
124+
expect(mockBlogCacheFetchById).toBeCalledWith(BLOG_ID);
125+
expect(mockBlogCacheFetchById).toReturnTimes(1);
126+
127+
expect(mockPublishedBlogFindById).not.toBeCalled();
128+
expect(mockBlogCacheSave).not.toBeCalled();
129+
});
130+
131+
it('Should send database data when blog dont exists for url in cache', async () => {
132+
const response = await addHeaders(request.get(endpoint + BLOG_2_ID.toHexString()));
133+
expect(response.status).toBe(200);
134+
expect(response.body.message).toMatch(/success/);
135+
expect(response.body.data).toBeDefined();
136+
expect(response.body.data).toHaveProperty('_id');
137+
138+
expect(mockBlogCacheFetchById).toBeCalledTimes(1);
139+
expect(mockBlogCacheFetchById).toBeCalledWith(BLOG_2_ID);
140+
expect(mockBlogCacheFetchById).toReturnTimes(1);
141+
142+
expect(mockPublishedBlogFindById).toBeCalledTimes(1);
143+
expect(mockPublishedBlogFindById).toBeCalledWith(BLOG_2_ID);
144+
expect(mockPublishedBlogFindById).toReturnTimes(1);
145+
146+
expect(mockBlogCacheSave).toBeCalledTimes(1);
147+
expect(mockBlogCacheSave).toReturnTimes(1);
82148
});
83149
});

0 commit comments

Comments
 (0)