forked from paypay/FullStackEngineerChallenge
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Feature] implement api of review (#3)
* refactor: extract healthy api * rename User to Users model * create reviews model * implement review api
- Loading branch information
1 parent
fc23e42
commit afcff3d
Showing
29 changed files
with
639 additions
and
131 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
module.exports = () => { | ||
require('../../server'); // eslint-disable-line global-require | ||
module.exports = async () => { | ||
/** | ||
* Start server for api test | ||
*/ | ||
require('../../server'); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,10 @@ | ||
const server = require('../../server'); | ||
module.exports = async () => { | ||
const server = require('../../server'); | ||
const db = require('../../server/db/models'); | ||
|
||
module.exports = () => { | ||
// Close db connections | ||
await db.sequelize.close(); | ||
|
||
// Shutdown server | ||
server.close(); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
const { users, reviews } = require('../../db/mockData'); | ||
const { initMockData, getCookieByUser } = require('./utils'); | ||
|
||
const api = global.createApi('/api/v1/me'); | ||
|
||
const currentUser = users[0]; | ||
|
||
beforeAll(async () => { | ||
/** | ||
* Create data for test | ||
*/ | ||
await initMockData(); | ||
|
||
/** | ||
* Get cookies | ||
*/ | ||
currentUser.cookie = await getCookieByUser(currentUser); | ||
}); | ||
|
||
describe('get me', () => { | ||
it('should succeed', async () => { | ||
const { status, data } = await api.get('/', { | ||
headers: { | ||
Cookie: currentUser.cookie, | ||
}, | ||
}); | ||
|
||
expect(status).toBe(200); | ||
expect(data.data).toMatchObject({ | ||
id: currentUser.id, | ||
email: currentUser.email, | ||
}); | ||
}); | ||
}); | ||
|
||
describe('get requiring reviews', () => { | ||
it('should succeed', async () => { | ||
const requiringReviews = reviews | ||
.filter(review => review.reviewerId === currentUser.id) | ||
.map(({ reviewerId, revieweeId, ...review }) => | ||
expect.objectContaining({ | ||
...review, | ||
reviewee: users.find(user => user.id === revieweeId).email, | ||
}) | ||
); | ||
|
||
const { status, data } = await api.get('/requiringReviews', { | ||
headers: { | ||
Cookie: currentUser.cookie, | ||
}, | ||
}); | ||
|
||
expect(status).toBe(200); | ||
expect(data.data).toEqual(expect.arrayContaining(requiringReviews)); | ||
}); | ||
}); | ||
|
||
describe('get feedbacks', () => { | ||
it('should succeed', async () => { | ||
const feedbacks = reviews | ||
.filter(review => review.revieweeId === currentUser.id) | ||
.map(({ reviewerId, revieweeId, ...review }) => | ||
expect.objectContaining({ | ||
...review, | ||
reviewer: users.find(user => user.id === reviewerId).email, | ||
}) | ||
); | ||
|
||
const { status, data } = await api.get('/feedbacks', { | ||
headers: { | ||
Cookie: currentUser.cookie, | ||
}, | ||
}); | ||
|
||
expect(status).toBe(200); | ||
expect(data.data).toEqual(expect.arrayContaining(feedbacks)); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
const db = require('../../db/models'); | ||
const { admin, users } = require('../../db/mockData'); | ||
const generateReview = require('../../db/utils/generateReview'); | ||
const { initMockData, getCookieByUser } = require('./utils'); | ||
|
||
const api = global.createApi('/api/v1/reviews'); | ||
|
||
const currentUser = users[0]; | ||
|
||
beforeAll(async () => { | ||
await initMockData(); | ||
|
||
/** | ||
* Get cookies | ||
*/ | ||
admin.cookie = await getCookieByUser(admin); | ||
currentUser.cookie = await getCookieByUser(currentUser); | ||
}); | ||
|
||
describe('create a review', () => { | ||
let reviewId; | ||
|
||
beforeEach(() => { | ||
reviewId = null; | ||
}); | ||
|
||
afterEach(async () => { | ||
if (reviewId) { | ||
await db.Reviews.destroy({ where: { id: reviewId } }); | ||
} | ||
}); | ||
|
||
it('should succeed with admin user', async () => { | ||
const review = { | ||
reviewerId: currentUser.id, | ||
revieweeId: admin.id, | ||
}; | ||
|
||
const { status, data } = await api.post('/', review, { | ||
headers: { | ||
Cookie: admin.cookie, | ||
}, | ||
}); | ||
|
||
reviewId = data.data.id; | ||
|
||
expect(status).toBe(200); | ||
expect(data.data).toMatchObject(review); | ||
}); | ||
}); | ||
|
||
describe('upsert a feedback for target review', () => { | ||
const review = generateReview(admin, currentUser); | ||
let reviewId; | ||
|
||
beforeEach(async () => { | ||
reviewId = (await db.Reviews.create(review)).get('id'); | ||
}); | ||
|
||
afterEach(async () => { | ||
if (reviewId) { | ||
await db.Reviews.destroy({ where: { id: reviewId } }); | ||
reviewId = null; | ||
} | ||
}); | ||
|
||
it('should succeed with reviewer', async () => { | ||
const feedback = { | ||
rating: 5, | ||
content: 'fake feedback', | ||
}; | ||
|
||
const { status, data } = await api.post(`/${reviewId}/feedback`, feedback, { | ||
headers: { | ||
Cookie: admin.cookie, | ||
}, | ||
}); | ||
|
||
expect(status).toBe(200); | ||
expect(data.data).toMatchObject(feedback); | ||
}); | ||
}); | ||
|
||
describe('delete a review', () => { | ||
const review = generateReview(admin, currentUser); | ||
let reviewId; | ||
|
||
beforeEach(async () => { | ||
reviewId = (await db.Reviews.create(review)).get('id'); | ||
}); | ||
|
||
afterEach(async () => { | ||
if (reviewId) { | ||
await db.Reviews.destroy({ where: { id: reviewId } }); | ||
} | ||
}); | ||
|
||
it('should succeed with admin user', async () => { | ||
const { status } = await api.delete(`/${reviewId}`, { | ||
headers: { | ||
Cookie: admin.cookie, | ||
}, | ||
}); | ||
|
||
expect(status).toBe(200); | ||
}); | ||
}); |
Oops, something went wrong.