Опыт и задачи
- Опыт и самые интересные задачи которые доводилось делать
Тестирование запроса c cURL
- Протестировать запрос посредством курла (курл скинули просто в гугл мите). Необходимо было рассказать как бы я это тестил, плюс рассказать какие баги вижу, и как бы я их локализовывал (Там было пару проблем, что некоторые поля не возвращались)
POST http://shop.bugred.ru/api/items/create/
body : {
"section":"Платья",
"description":"345",
"color": "RED",
"size": 44,
"price": ,
"params": "dress",
"name": "asd"
}
Ревью и рефакторинг функции
- Провести ревью кода функции и переписать ее
//Review
// 1
function calc(numbers) {
if (numbers === undefined numbers === null numbers.length === 0) {
return 0;
} else if (typeof numbers !== 'object' || !Array.isArray(numbers)) {
throw new Error('Input must be an array of numbers');
} else {
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
if (typeof numbers[i] !== 'number') {
throw new Error('Array must contain only numbers');
}
sum += numbers[i];
}
return sum;
}
}
Мой переписанный код:
const calc = (numbers) => Array.isArray(numbers) && numbers.reduce((acc, cum) => acc + cum)
Event Loop
- Объяснить как работает евент луп
- Что в какой последовательности выведется
console.log('Start');
setTimeout(() => {
console.log('Timeout');
}, 0);
Promise.resolve()
.then(() => {
console.log('Promise 1');
})
.then(() => {
console.log('Promise 2');
});
console.log('End');
Ревью системного теста
- Ревью написанного теста (надо было рассказать про то что ненужные части нужно декомпозировать и ввынести в отдельную утилиту)
// tests
// system
Scenario(
'Попытка авторизация сотрудника несколько раз по невалидным кодам',
async () => {
const phone = dataGenerator.generatePhoneNumber();
const email = dataGenerator.generateRandomEmail();
const user = await employeeCreateService.registerDefaultUser(phone, email);
const code = await authService.getAuthCode(user);
try {
const authByCodePromiseArr = [];
for (let i = 0; i < AUTH_TRY_COUNT; i += 1) {
const fakeCode = dataGenerator.generateRandomCode();
authByCodePromiseArr.push(authService.authByCode(user, fakeCode));
}
const results = await Promise.allSettled(authByCodePromiseArr);
const errors = results.filter(
(result): result is PromiseRejectedResult =>
result.status === 'rejected'
);
errors.forEach((error) => {
const { response } = error.reason;
if (response.data.code !== 'invalid_code') {
throw new Error(
'Unexpected response data code. Should be invalid_code'
);
}
});
await authService.authByCode(user, code);
} catch (error) {
const { response } = error;
expect(response.status).toEqual(httpStatus.BAD_REQUEST);
expect(response.data.code).toBe('auth_locked');
} finally {
await employeeRemoveService.removeEmployee(user?.id);
}
}
);
Ревью юнит теста
- Ревью юнит теста
//unit
jest.mock('#Libs/blocker', () => ({
del: jest.fn(),
}));
jest.mock('#Libs/redis', () => ({
del: jest.fn(),
}));
jest.mock('#Libs/redisSub', () => ({
del: jest.fn(),
}));
const run = async (body: Request): Promise<Response> => {
return CancelManualInventoryBacks(body);
};
beforeAll(async () => {
await Database.waitMongooseConnection();
await Database.checkDbIsConnected();
await Inventories.Model.insertMany(Fixtures.Inventories());
});
afterAll(async () => {
await Database.waitMongooseDisconnection();
sinon.restore();
});
afterEach(async () => {
sinon.resetHistory();
Slogger.resetCollectedLogs();
});
beforeEach(async () => {
await Remnants.Model.deleteMany();
});
it('ошибка, инвентаризация не найдена', async () => {
await run({
event: PickerInventoryEventTypes.inventory_cancelled,
inventory_id: '620e39332cce3291f90e25f3',
data: {},
});
});