Radim Štěpaník
Testování v Node.js
Co není automatizované tak prostě ve světě IT nefunguje.
(motivace pro začátek - ukazujte si čísla)
Easy part - just npm run test 🍾
Hard part
export const getUser = async (req: Request, res: Response) => {
const user = await UserMongooseModel.findOne({entityId: req.params.userId}).exec()
return res.json(user);
};
const DEFAULT_AVATAR = "/defaultAvatar.jpg"
export const getUser = async (req: Request, res: Response) => {
const user = await UserMongooseModel.findOne({entityId: req.params.userId}).exec()
const avatar = user.avatar ?? DEFAULT_AVATAR
return res.json({...user, avatar});
};
const DEFAULT_AVATAR = "/defaultAvatar.jpg"
export const getUser = async (req: Request, res: Response) => {
const user = await UserMongooseModel.findOne({entityId: req.params.userId}).exec()
const avatar = user ?? DEFAULT_AVATAR
const numberOfVisits = await EntranceHistory.find({userId: req.params.userId})
.count()
.exec()
let membership = "basic"
if (numberOfVisits > 50 ) {
membership = "gold"
}
return res.json({...user, avatar, membership});
};
const DEFAULT_AVATAR = "/defaultAvatar.jpg"
export const getUser = async (req: Request, res: Response) => {
const user = await UserMongooseModel.findOne({entityId: req.params.userId}).exec()
const avatar = user ?? DEFAULT_AVATAR
const numberOfVisits = await EntranceHistory.findOne({userId: req.params.userId}).count().exec()
let membership = "basic"
if (numberOfVisits > 50 ) {
membership = "gold"
}
const hrSystemApi = axios.create(config.internalHRSystemUrl)
const response = await hrSystemApi.get(`/user/${req.params.userId}`)
const meta = {hrSystemInfo: response.data}
return res.json({...user, avatar, membership, meta});
};
const DEFAULT_AVATAR = "/defaultAvatar.jpg"
export const getUser = async (req: Request, res: Response) => {
const user = await UserMongooseModel.findOne({entityId: req.params.userId}).exec()
const avatar = user ?? DEFAULT_AVATAR
const numberOfVisits = await EntranceHistory.findOne({userId: req.params.userId}).count().exec()
let membership = "basic"
if (numberOfVisits > 50 ) {
membership = "gold"
}
const hrSystemApi = axios.create(config.internalHRSystemUrl)
const response = await hrSystemApi.get(`/user/${req.params.userId}`)
const meta = {hrSystemInfo: response.data}
const calendarApi = axios.create(config.calendarApiUrl)
const isFullMoon = (await calendarApi.get(`/date/${user.birthDate}/isFullMoon`)).data
const wheaterApi = axios.create(config.wheaterAppUrl)
const wheater = (await wheaterApi.get(`/whater`)).data
if (meta.hrSystemInfo && isFullMoon && wheater.temperature > 30 && wheater.currentConditions === "sunlight") {
membership = "supergold"
}
return res.json({...user, avatar, membership, meta});
};
Integration tests
Special test for HRSystem
Testing of business logic
export const getUser = (fullUserService: FullUserService) => {
return async (req: Request, res: Response) => {
const user = fullUserService.getUser((req.params.id))
return res.json(user);
};
}
class FullUserService {
constructor(
private dataProvider: FullUserDataProvider,
private membershipResolver: MembershipResolver
) {}
async getUser(id: string): FullUser {
const user = this.dataProvider.getUser(id)
const [ hrSystemInfo, wheater, numberOfVisits] = await Promise.all([
this.dataProvider.getWheater(),
this.dataProvider.isFullMoon(user.birthDate),
this.dataProvider.numberOfVisits(user)
])
const membershipData = {user, hrSystemInfo, wheater, numberOfVisits}
const membership = this.membershipResolver.resolve(membershipData)
return {...user, membership}
}
}