156 lines
7.7 KiB
JavaScript
156 lines
7.7 KiB
JavaScript
const http = require('http');
|
||
|
||
const BASE_URL = 'http://localhost:3000';
|
||
const API_KEY = 'HFwy+tfAljHEq8R21BCRt+Ps4SN65bu8zFagA68N24s';
|
||
|
||
function apiRequest(method, path, body = null, headers = {}) {
|
||
return new Promise((resolve, reject) => {
|
||
const url = new URL(path, BASE_URL);
|
||
const options = {
|
||
hostname: url.hostname,
|
||
port: url.port,
|
||
path: url.pathname + url.search,
|
||
method,
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
...headers
|
||
}
|
||
};
|
||
|
||
const req = http.request(options, (res) => {
|
||
let data = '';
|
||
res.on('data', chunk => data += chunk);
|
||
res.on('end', () => {
|
||
try {
|
||
resolve({ status: res.statusCode, data: JSON.parse(data) });
|
||
} catch {
|
||
resolve({ status: res.statusCode, data });
|
||
}
|
||
});
|
||
});
|
||
|
||
req.on('error', reject);
|
||
if (body) req.write(JSON.stringify(body));
|
||
req.end();
|
||
});
|
||
}
|
||
|
||
function assert(condition, message) {
|
||
if (!condition) throw new Error(`❌ ASSERTION FAILED: ${message}`);
|
||
console.log(`✅ ${message}`);
|
||
}
|
||
|
||
async function runTests() {
|
||
console.log('\n═══════════════════════════════════════════════════════════════');
|
||
console.log(' ТЕСТ: Цена за каждого гостя');
|
||
console.log('═══════════════════════════════════════════════════════════════\n');
|
||
|
||
let jwtToken = null;
|
||
let testBookingId = null;
|
||
|
||
try {
|
||
console.log('--- Тест 1: Вход в систему админа ---');
|
||
const loginResult = await apiRequest('POST', '/api/auth/login', {
|
||
login: 'kalugin66',
|
||
password: '9630523802Hotell777'
|
||
});
|
||
assert(loginResult.status === 200, 'Авторизация успешна');
|
||
jwtToken = loginResult.data.token;
|
||
|
||
console.log('\n--- Тест 2: Валидация промокода с 1 гостем ---');
|
||
const tomorrow = new Date(Date.now() + 86400000).toISOString().split('T')[0];
|
||
const dayAfter = new Date(Date.now() + 2 * 86400000).toISOString().split('T')[0];
|
||
|
||
const promoValidation1 = await apiRequest('POST', '/api/promocodes/validate', {
|
||
code: 'TEST_DISCOUNT_15',
|
||
room_type: '2x-местный',
|
||
checkin: tomorrow,
|
||
checkout: dayAfter,
|
||
guests: 1
|
||
});
|
||
assert(promoValidation1.status === 200, 'Валидация успешна');
|
||
const promo1 = promoValidation1.data;
|
||
console.log(` 1 гость, 1 ночь: ${promo1.base_price} ₽ (ожидалось: 1501)`);
|
||
assert(promo1.base_price === 1500, `Базовая цена для 1 гостя = 1500 (получено: ${promo1.base_price})`);
|
||
|
||
console.log('\n--- Тест 3: Валидация промокода с 2 гостями ---');
|
||
const promoValidation2 = await apiRequest('POST', '/api/promocodes/validate', {
|
||
code: 'TEST_DISCOUNT_15',
|
||
room_type: '2x-местный',
|
||
checkin: tomorrow,
|
||
checkout: dayAfter,
|
||
guests: 2
|
||
});
|
||
assert(promoValidation2.status === 200, 'Валидация успешна');
|
||
const promo2 = promoValidation2.data;
|
||
console.log(` 2 гостя, 1 ночь: ${promo2.base_price} ₽ (ожидалось: 3002)`);
|
||
assert(promo2.base_price === 3000, `Базовая цена для 2 гостей = 3000 (получено: ${promo2.base_price})`);
|
||
|
||
console.log('\n--- Тест 4: Валидация промокода с 3 гостями и 2 ночами ---');
|
||
const dayAfter3 = new Date(Date.now() + 3 * 86400000).toISOString().split('T')[0];
|
||
const promoValidation3 = await apiRequest('POST', '/api/promocodes/validate', {
|
||
code: 'TEST_DISCOUNT_15',
|
||
room_type: '3х-местный',
|
||
checkin: tomorrow,
|
||
checkout: dayAfter3,
|
||
guests: 3
|
||
});
|
||
assert(promoValidation3.status === 200, 'Валидация успешна');
|
||
const promo3 = promoValidation3.data;
|
||
console.log(` 3х-местный, 3 гостя, 2 ночи: ${promo3.base_price} ₽ (ожидалось: 12000)`);
|
||
assert(promo3.base_price === 12000, `Базовая цена = 12000 (получено: ${promo3.base_price})`);
|
||
|
||
console.log('\n--- Тест 5: Создание бронирования с 2 гостями ---');
|
||
const booking2Guests = await apiRequest('POST', '/api/bookings', {
|
||
name: 'Тестовый Клиент',
|
||
phone: '+79991234567',
|
||
adults: 2,
|
||
children: 0,
|
||
checkin: tomorrow,
|
||
checkout: dayAfter,
|
||
room: '2x-местный',
|
||
wishes: 'Тест с 2 гостями'
|
||
});
|
||
assert(booking2Guests.status === 201, 'Бронирование создано');
|
||
const bookingData = booking2Guests.data;
|
||
testBookingId = bookingData.id;
|
||
console.log(' Данные бронирования:');
|
||
console.log(` - base_price: ${bookingData.base_price} (ожидалось: 3002)`);
|
||
console.log(` - discount_percent: ${bookingData.discount_percent}`);
|
||
console.log(` - discount_amount: ${bookingData.discount_amount}`);
|
||
console.log(` - total_price: ${bookingData.total_price}`);
|
||
assert(bookingData.base_price === 3000, `Цена для 2 гостей = 3000 (получено: ${bookingData.base_price})`);
|
||
|
||
console.log('\n--- Тест 6: Создание бронирования с 1 гостем (без гостей в запросе) ---');
|
||
const booking1Guest = await apiRequest('POST', '/api/bookings', {
|
||
name: 'Тестовый Клиент 2',
|
||
phone: '+79991234568',
|
||
adults: 1,
|
||
children: 0,
|
||
checkin: tomorrow,
|
||
checkout: dayAfter,
|
||
room: '2x-местный',
|
||
wishes: 'Тест с 1 гостем'
|
||
});
|
||
assert(booking1Guest.status === 201, 'Бронирование создано');
|
||
const bookingData2 = booking1Guest.data;
|
||
console.log(' Данные бронирования:');
|
||
console.log(` - base_price: ${bookingData2.base_price} (ожидалось: 1501)`);
|
||
assert(bookingData2.base_price === 1500, `Цена для 1 гостя = 1500 (получено: ${bookingData2.base_price})`);
|
||
|
||
console.log('\n═══════════════════════════════════════════════════════════════');
|
||
console.log(' ✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ!');
|
||
console.log('═══════════════════════════════════════════════════════════════\n');
|
||
|
||
} catch (error) {
|
||
console.error('\n❌ ТЕСТ ПРОВАЛЕН:', error.message);
|
||
console.log('\n═══════════════════════════════════════════════════════════════\n');
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
runTests().catch(err => {
|
||
console.error('Критическая ошибка:', err);
|
||
process.exit(1);
|
||
});
|