from __future__ import annotations
import unittest
import srt_seats
SEAT_HTML = "\n".join([
'
일반실
1호차',
'일반실
4호차',
'일반실
5호차',
'특실
3호차',
'6C(정방향, 내측)',
'3A(역방향, 창측)',
"5C(정방향, 내측, 선택불가)",
])
MISSING_DETAIL_HTML = "\n".join([
'9A()',
])
class SrtSeatParserTests(unittest.TestCase):
def test_normalize_car_and_seat_maps_srt_html(self) -> None:
cars = srt_seats.parse_cars(SEAT_HTML)
seats = srt_seats.parse_seats(SEAT_HTML)
self.assertEqual([car["car_no"] for car in cars if car["available"]], [4, 5])
self.assertEqual(cars[1]["room_class"], "일반실")
self.assertTrue(cars[1]["current"])
self.assertEqual([seat["seat"] for seat in seats if seat["available"]], ["6C", "3A"])
self.assertEqual([seat["seat"] for seat in seats if not seat["available"]], ["5C"])
self.assertEqual(seats[0]["direction"], "정방향")
self.assertEqual(seats[0]["position"], "내측")
self.assertEqual(seats[2]["notes"], ["선택불가"])
def test_booking_priority_sorts_middle_cars_before_end_cars(self) -> None:
cars: list[srt_seats.SrtCar] = [
{"car_no": 1, "car_no_raw": "0001", "room_class": "일반실", "available": True, "current": False},
{"car_no": 8, "car_no_raw": "0008", "room_class": "일반실", "available": True, "current": False},
{"car_no": 2, "car_no_raw": "0002", "room_class": "일반실", "available": True, "current": False},
{"car_no": 7, "car_no_raw": "0007", "room_class": "일반실", "available": True, "current": False},
{"car_no": 3, "car_no_raw": "0003", "room_class": "일반실", "available": True, "current": False},
{"car_no": 6, "car_no_raw": "0006", "room_class": "일반실", "available": True, "current": False},
{"car_no": 4, "car_no_raw": "0004", "room_class": "일반실", "available": True, "current": False},
{"car_no": 5, "car_no_raw": "0005", "room_class": "일반실", "available": True, "current": False},
]
sorted_cars = srt_seats.sort_cars_for_booking(cars)
self.assertEqual([car["car_no"] for car in sorted_cars], [4, 5, 3, 6, 2, 7, 1, 8])
def test_booking_priority_sorts_forward_window_before_other_seats(self) -> None:
seats: list[srt_seats.SrtSeat] = [
{"seat": "3A", "seat_no": "11", "available": True, "direction": "역방향", "position": "창측", "notes": []},
{"seat": "6C", "seat_no": "23", "available": True, "direction": "정방향", "position": "내측", "notes": []},
{"seat": "2A", "seat_no": "7", "available": True, "direction": "정방향", "position": "창측", "notes": []},
]
sorted_seats = srt_seats.sort_seats_for_booking(seats, "forward-window")
self.assertEqual([seat["seat"] for seat in sorted_seats], ["2A", "6C", "3A"])
def test_booking_priority_treats_single_seat_as_window_preference(self) -> None:
seats: list[srt_seats.SrtSeat] = [
{"seat": "1C", "seat_no": "3", "available": True, "direction": "정방향", "position": "내측", "notes": []},
{"seat": "2A", "seat_no": "5", "available": True, "direction": "정방향", "position": "1인석", "notes": []},
]
sorted_seats = srt_seats.sort_seats_for_booking(seats, "window-forward")
self.assertEqual([seat["seat"] for seat in sorted_seats], ["2A", "1C"])
def test_parse_seat_page_marks_missing_detail_attributes_unknown(self) -> None:
seats = srt_seats.parse_seats(MISSING_DETAIL_HTML)
self.assertEqual(seats[0]["direction"], "unknown")
self.assertEqual(seats[0]["position"], "unknown")
if __name__ == "__main__":
unittest.main()