60e2149072
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.
174 lines
5.1 KiB
JavaScript
174 lines
5.1 KiB
JavaScript
import { DOCUMENT_MODE } from '../common/html.js';
|
|
export const defaultTreeAdapter = {
|
|
//Node construction
|
|
createDocument() {
|
|
return {
|
|
nodeName: '#document',
|
|
mode: DOCUMENT_MODE.NO_QUIRKS,
|
|
childNodes: [],
|
|
};
|
|
},
|
|
createDocumentFragment() {
|
|
return {
|
|
nodeName: '#document-fragment',
|
|
childNodes: [],
|
|
};
|
|
},
|
|
createElement(tagName, namespaceURI, attrs) {
|
|
return {
|
|
nodeName: tagName,
|
|
tagName,
|
|
attrs,
|
|
namespaceURI,
|
|
childNodes: [],
|
|
parentNode: null,
|
|
};
|
|
},
|
|
createCommentNode(data) {
|
|
return {
|
|
nodeName: '#comment',
|
|
data,
|
|
parentNode: null,
|
|
};
|
|
},
|
|
createTextNode(value) {
|
|
return {
|
|
nodeName: '#text',
|
|
value,
|
|
parentNode: null,
|
|
};
|
|
},
|
|
//Tree mutation
|
|
appendChild(parentNode, newNode) {
|
|
parentNode.childNodes.push(newNode);
|
|
newNode.parentNode = parentNode;
|
|
},
|
|
insertBefore(parentNode, newNode, referenceNode) {
|
|
const insertionIdx = parentNode.childNodes.indexOf(referenceNode);
|
|
parentNode.childNodes.splice(insertionIdx, 0, newNode);
|
|
newNode.parentNode = parentNode;
|
|
},
|
|
setTemplateContent(templateElement, contentElement) {
|
|
templateElement.content = contentElement;
|
|
},
|
|
getTemplateContent(templateElement) {
|
|
return templateElement.content;
|
|
},
|
|
setDocumentType(document, name, publicId, systemId) {
|
|
const doctypeNode = document.childNodes.find((node) => node.nodeName === '#documentType');
|
|
if (doctypeNode) {
|
|
doctypeNode.name = name;
|
|
doctypeNode.publicId = publicId;
|
|
doctypeNode.systemId = systemId;
|
|
}
|
|
else {
|
|
const node = {
|
|
nodeName: '#documentType',
|
|
name,
|
|
publicId,
|
|
systemId,
|
|
parentNode: null,
|
|
};
|
|
defaultTreeAdapter.appendChild(document, node);
|
|
}
|
|
},
|
|
setDocumentMode(document, mode) {
|
|
document.mode = mode;
|
|
},
|
|
getDocumentMode(document) {
|
|
return document.mode;
|
|
},
|
|
detachNode(node) {
|
|
if (node.parentNode) {
|
|
const idx = node.parentNode.childNodes.indexOf(node);
|
|
node.parentNode.childNodes.splice(idx, 1);
|
|
node.parentNode = null;
|
|
}
|
|
},
|
|
insertText(parentNode, text) {
|
|
if (parentNode.childNodes.length > 0) {
|
|
const prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
|
|
if (defaultTreeAdapter.isTextNode(prevNode)) {
|
|
prevNode.value += text;
|
|
return;
|
|
}
|
|
}
|
|
defaultTreeAdapter.appendChild(parentNode, defaultTreeAdapter.createTextNode(text));
|
|
},
|
|
insertTextBefore(parentNode, text, referenceNode) {
|
|
const prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
|
|
if (prevNode && defaultTreeAdapter.isTextNode(prevNode)) {
|
|
prevNode.value += text;
|
|
}
|
|
else {
|
|
defaultTreeAdapter.insertBefore(parentNode, defaultTreeAdapter.createTextNode(text), referenceNode);
|
|
}
|
|
},
|
|
adoptAttributes(recipient, attrs) {
|
|
const recipientAttrsMap = new Set(recipient.attrs.map((attr) => attr.name));
|
|
for (let j = 0; j < attrs.length; j++) {
|
|
if (!recipientAttrsMap.has(attrs[j].name)) {
|
|
recipient.attrs.push(attrs[j]);
|
|
}
|
|
}
|
|
},
|
|
//Tree traversing
|
|
getFirstChild(node) {
|
|
return node.childNodes[0];
|
|
},
|
|
getChildNodes(node) {
|
|
return node.childNodes;
|
|
},
|
|
getParentNode(node) {
|
|
return node.parentNode;
|
|
},
|
|
getAttrList(element) {
|
|
return element.attrs;
|
|
},
|
|
//Node data
|
|
getTagName(element) {
|
|
return element.tagName;
|
|
},
|
|
getNamespaceURI(element) {
|
|
return element.namespaceURI;
|
|
},
|
|
getTextNodeContent(textNode) {
|
|
return textNode.value;
|
|
},
|
|
getCommentNodeContent(commentNode) {
|
|
return commentNode.data;
|
|
},
|
|
getDocumentTypeNodeName(doctypeNode) {
|
|
return doctypeNode.name;
|
|
},
|
|
getDocumentTypeNodePublicId(doctypeNode) {
|
|
return doctypeNode.publicId;
|
|
},
|
|
getDocumentTypeNodeSystemId(doctypeNode) {
|
|
return doctypeNode.systemId;
|
|
},
|
|
//Node types
|
|
isTextNode(node) {
|
|
return node.nodeName === '#text';
|
|
},
|
|
isCommentNode(node) {
|
|
return node.nodeName === '#comment';
|
|
},
|
|
isDocumentTypeNode(node) {
|
|
return node.nodeName === '#documentType';
|
|
},
|
|
isElementNode(node) {
|
|
return Object.prototype.hasOwnProperty.call(node, 'tagName');
|
|
},
|
|
// Source code location
|
|
setNodeSourceCodeLocation(node, location) {
|
|
node.sourceCodeLocation = location;
|
|
},
|
|
getNodeSourceCodeLocation(node) {
|
|
return node.sourceCodeLocation;
|
|
},
|
|
updateNodeSourceCodeLocation(node, endLocation) {
|
|
node.sourceCodeLocation = { ...node.sourceCodeLocation, ...endLocation };
|
|
},
|
|
};
|