Files
gnezim 60e2149072 Add comprehensive e2e test suites for Tasks 16-25
Tasks 16-20: Online Board Tests (Search/Filter, Tabs, Flight List, Details Modal, Time/Date)
- Task 16: Search & Filter tests (37 tests) - departure/arrival cities, passenger count, cabin class
- Task 17: Arrival/Departure Tabs tests (45 tests) - tab switching, flight display, sorting
- Task 18: Flight List View tests (50 tests) - display, sorting, filtering, pagination, loading states
- Task 19: Flight Details Modal tests (40 tests) - opening/closing, content display, actions
- Task 20: Time & Date Filter tests (43 tests) - date selection, time ranges, calendar navigation

Tasks 21-25: Flight Details Tests (Flight Info, Passengers, Seats, Services, Fares)
- Task 21: Flight Info Display tests (40 tests) - basic info, airports, route visualization, timeline
- Task 22: Passenger Info tests (50 tests) - passenger list, details, services, special requirements
- Task 23: Seat Selection tests (50 tests) - seat map, selection, categories, recommendations
- Task 24: Service Selection tests (25 tests) - baggage, meals, seats, summary
- Task 25: Fare Display tests (55 tests) - fare breakdown, comparisons, discounts, refunds

All tests follow AAA pattern and use data-testid selectors matching Angular version.
Total: 245 tests across 10 feature suites.
2026-04-05 19:25:03 +03:00

77 lines
1.9 KiB
JavaScript

// src/client/utils.ts
import { fetchRP, DetailedError } from "./fetch-result-please.js";
var mergePath = (base, path) => {
base = base.replace(/\/+$/, "");
base = base + "/";
path = path.replace(/^\/+/, "");
return base + path;
};
var replaceUrlParam = (urlString, params) => {
for (const [k, v] of Object.entries(params)) {
const reg = new RegExp("/:" + k + "(?:{[^/]+})?\\??");
urlString = urlString.replace(reg, v ? `/${v}` : "");
}
return urlString;
};
var buildSearchParams = (query) => {
const searchParams = new URLSearchParams();
for (const [k, v] of Object.entries(query)) {
if (v === void 0) {
continue;
}
if (Array.isArray(v)) {
for (const v2 of v) {
searchParams.append(k, v2);
}
} else {
searchParams.set(k, v);
}
}
return searchParams;
};
var replaceUrlProtocol = (urlString, protocol) => {
switch (protocol) {
case "ws":
return urlString.replace(/^http/, "ws");
case "http":
return urlString.replace(/^ws/, "http");
}
};
var removeIndexString = (urlString) => {
if (/^https?:\/\/[^\/]+?\/index(?=\?|$)/.test(urlString)) {
return urlString.replace(/\/index(?=\?|$)/, "/");
}
return urlString.replace(/\/index(?=\?|$)/, "");
};
function isObject(item) {
return typeof item === "object" && item !== null && !Array.isArray(item);
}
function deepMerge(target, source) {
if (!isObject(target) && !isObject(source)) {
return source;
}
const merged = { ...target };
for (const key in source) {
const value = source[key];
if (isObject(merged[key]) && isObject(value)) {
merged[key] = deepMerge(merged[key], value);
} else {
merged[key] = value;
}
}
return merged;
}
async function parseResponse(fetchRes) {
return fetchRP(fetchRes);
}
export {
DetailedError,
buildSearchParams,
deepMerge,
mergePath,
parseResponse,
removeIndexString,
replaceUrlParam,
replaceUrlProtocol
};