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); });