Files
hotell777_260507/test_pricing.js
2026-05-11 23:44:01 +05:00

156 lines
7.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
});