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.
This commit is contained in:
gnezim
2026-04-05 19:25:03 +03:00
parent 21c6ed4f82
commit 60e2149072
31032 changed files with 5222883 additions and 2 deletions
+9
View File
@@ -0,0 +1,9 @@
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
export * from './testing-architect-host';
export * from './test-project-host';
+26
View File
@@ -0,0 +1,26 @@
"use strict";
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./testing-architect-host"), exports);
__exportStar(require("./test-project-host"), exports);
//# sourceMappingURL=index.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,2DAAyC;AACzC,sDAAoC"}
+32
View File
@@ -0,0 +1,32 @@
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import { Path, PathFragment, virtualFs } from '@angular-devkit/core';
import { NodeJsSyncHost } from '@angular-devkit/core/node';
import { Stats } from 'node:fs';
import { Observable } from 'rxjs';
/**
* @deprecated
*/
export declare class TestProjectHost extends NodeJsSyncHost {
protected _templateRoot: Path;
private _currentRoot;
private _scopedSyncHost;
constructor(_templateRoot: Path);
root(): Path;
scopedSync(): virtualFs.SyncDelegateHost<Stats>;
initialize(): Observable<void>;
restore(): Observable<void>;
writeMultipleFiles(files: {
[path: string]: string | ArrayBufferLike | Buffer;
}): void;
replaceInFile(path: string, match: RegExp | string, replacement: string): void;
appendToFile(path: string, str: string): void;
fileMatchExists(dir: string, regex: RegExp): PathFragment | undefined;
copyFile(from: string, to: string): void;
private findUniqueFolderPath;
}
+110
View File
@@ -0,0 +1,110 @@
"use strict";
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestProjectHost = void 0;
const core_1 = require("@angular-devkit/core");
const node_1 = require("@angular-devkit/core/node");
const rxjs_1 = require("rxjs");
/**
* @deprecated
*/
class TestProjectHost extends node_1.NodeJsSyncHost {
_templateRoot;
_currentRoot = null;
_scopedSyncHost = null;
constructor(_templateRoot) {
super();
this._templateRoot = _templateRoot;
}
root() {
if (this._currentRoot === null) {
throw new Error('TestProjectHost must be initialized before being used.');
}
return this._currentRoot;
}
scopedSync() {
if (this._currentRoot === null || this._scopedSyncHost === null) {
throw new Error('TestProjectHost must be initialized before being used.');
}
return this._scopedSyncHost;
}
initialize() {
const recursiveList = (path) => this.list(path).pipe(
// Emit each fragment individually.
(0, rxjs_1.concatMap)((fragments) => (0, rxjs_1.from)(fragments)),
// Join the path with fragment.
(0, rxjs_1.map)((fragment) => (0, core_1.join)(path, fragment)),
// Emit directory content paths instead of the directory path.
(0, rxjs_1.mergeMap)((path) => this.isDirectory(path).pipe((0, rxjs_1.concatMap)((isDir) => (isDir ? recursiveList(path) : (0, rxjs_1.of)(path))))));
// Find a unique folder that we can write to use as current root.
return this.findUniqueFolderPath().pipe(
// Save the path and create a scoped host for it.
(0, rxjs_1.tap)((newFolderPath) => {
this._currentRoot = newFolderPath;
this._scopedSyncHost = new core_1.virtualFs.SyncDelegateHost(new core_1.virtualFs.ScopedHost(this, this.root()));
}),
// List all files in root.
(0, rxjs_1.concatMap)(() => recursiveList(this._templateRoot)),
// Copy them over to the current root.
(0, rxjs_1.concatMap)((from) => {
const to = (0, core_1.join)(this.root(), (0, core_1.relative)(this._templateRoot, from));
return this.read(from).pipe((0, rxjs_1.concatMap)((buffer) => this.write(to, buffer)));
}), (0, rxjs_1.map)(() => { }));
}
restore() {
if (this._currentRoot === null) {
return rxjs_1.EMPTY;
}
// Delete the current root and clear the variables.
// Wait 50ms and retry up to 10 times, to give time for file locks to clear.
return this.exists(this.root()).pipe((0, rxjs_1.delay)(50), (0, rxjs_1.concatMap)((exists) => (exists ? this.delete(this.root()) : rxjs_1.EMPTY)), (0, rxjs_1.retry)(10), (0, rxjs_1.finalize)(() => {
this._currentRoot = null;
this._scopedSyncHost = null;
}));
}
writeMultipleFiles(files) {
Object.keys(files).forEach((fileName) => {
let content = files[fileName];
if (typeof content == 'string') {
content = core_1.virtualFs.stringToFileBuffer(content);
}
else if (content instanceof Buffer) {
content = content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength);
}
this.scopedSync().write((0, core_1.normalize)(fileName), content);
});
}
replaceInFile(path, match, replacement) {
const content = core_1.virtualFs.fileBufferToString(this.scopedSync().read((0, core_1.normalize)(path)));
this.scopedSync().write((0, core_1.normalize)(path), core_1.virtualFs.stringToFileBuffer(content.replace(match, replacement)));
}
appendToFile(path, str) {
const content = core_1.virtualFs.fileBufferToString(this.scopedSync().read((0, core_1.normalize)(path)));
this.scopedSync().write((0, core_1.normalize)(path), core_1.virtualFs.stringToFileBuffer(content.concat(str)));
}
fileMatchExists(dir, regex) {
const [fileName] = this.scopedSync()
.list((0, core_1.normalize)(dir))
.filter((name) => name.match(regex));
return fileName || undefined;
}
copyFile(from, to) {
const content = this.scopedSync().read((0, core_1.normalize)(from));
this.scopedSync().write((0, core_1.normalize)(to), content);
}
findUniqueFolderPath() {
// 11 character alphanumeric string.
const randomString = Math.random().toString(36).slice(2);
const newFolderName = `test-project-host-${(0, core_1.basename)(this._templateRoot)}-${randomString}`;
const newFolderPath = (0, core_1.join)((0, core_1.dirname)(this._templateRoot), newFolderName);
return this.exists(newFolderPath).pipe((0, rxjs_1.concatMap)((exists) => (exists ? this.findUniqueFolderPath() : (0, rxjs_1.of)(newFolderPath))));
}
}
exports.TestProjectHost = TestProjectHost;
//# sourceMappingURL=test-project-host.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"test-project-host.js","sourceRoot":"","sources":["test-project-host.ts"],"names":[],"mappings":"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"}
+42
View File
@@ -0,0 +1,42 @@
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import { json } from '@angular-devkit/core';
import { BuilderInfo, Target } from '../src';
import { ArchitectHost, Builder } from '../src/internal';
export declare class TestingArchitectHost implements ArchitectHost {
workspaceRoot: string;
currentDirectory: string;
private _backendHost;
private _builderImportMap;
private _builderMap;
private _targetMap;
/**
* Can provide a backend host, in case of integration tests.
* @param workspaceRoot The workspace root to use.
* @param currentDirectory The current directory to use.
* @param _backendHost A host to defer calls that aren't resolved here.
*/
constructor(workspaceRoot?: string, currentDirectory?: string, _backendHost?: ArchitectHost | null);
addBuilder(builderName: string, builder: Builder, description?: string, optionSchema?: json.schema.JsonSchema): void;
addBuilderFromPackage(packageName: string): Promise<void>;
addTarget(target: Target, builderName: string, options?: json.JsonObject): void;
getBuilderNameForTarget(target: Target): Promise<string | null>;
/**
* Resolve a builder. This needs to return a string which will be used in a dynamic `import()`
* clause. This should throw if no builder can be found. The dynamic import will throw if
* it is unsupported.
* @param builderName The name of the builder to be used.
* @returns All the info needed for the builder itself.
*/
resolveBuilder(builderName: string): Promise<BuilderInfo | null>;
getCurrentDirectory(): Promise<string>;
getWorkspaceRoot(): Promise<string>;
getOptionsForTarget(target: Target): Promise<json.JsonObject | null>;
getProjectMetadata(target: Target | string): Promise<json.JsonObject | null>;
loadBuilder(info: BuilderInfo): Promise<Builder | null>;
}
+135
View File
@@ -0,0 +1,135 @@
"use strict";
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestingArchitectHost = void 0;
const src_1 = require("../src");
class TestingArchitectHost {
workspaceRoot;
currentDirectory;
_backendHost;
_builderImportMap = new Map();
_builderMap = new Map();
_targetMap = new Map();
/**
* Can provide a backend host, in case of integration tests.
* @param workspaceRoot The workspace root to use.
* @param currentDirectory The current directory to use.
* @param _backendHost A host to defer calls that aren't resolved here.
*/
constructor(workspaceRoot = '', currentDirectory = workspaceRoot, _backendHost = null) {
this.workspaceRoot = workspaceRoot;
this.currentDirectory = currentDirectory;
this._backendHost = _backendHost;
}
addBuilder(builderName, builder, description = 'Testing only builder.', optionSchema = { type: 'object' }) {
this._builderImportMap.set(builderName, builder);
this._builderMap.set(builderName, { builderName, description, optionSchema });
}
async addBuilderFromPackage(packageName) {
const packageJson = await Promise.resolve(`${packageName + '/package.json'}`).then(s => __importStar(require(s)));
if (!('builders' in packageJson)) {
throw new Error('Invalid package.json, builders key not found.');
}
if (!packageJson.name) {
throw new Error('Invalid package name');
}
const builderJsonPath = packageName + '/' + packageJson['builders'];
const builderJson = await Promise.resolve(`${builderJsonPath}`).then(s => __importStar(require(s)));
const builders = builderJson['builders'];
if (!builders) {
throw new Error('Invalid builders.json, builders key not found.');
}
for (const builderName of Object.keys(builders)) {
const b = builders[builderName];
// TODO: remove this check as v1 is not supported anymore.
if (!b.implementation) {
continue;
}
const handler = (await Promise.resolve(`${builderJsonPath + '/../' + b.implementation}`).then(s => __importStar(require(s)))).default;
const optionsSchema = await Promise.resolve(`${builderJsonPath + '/../' + b.schema}`).then(s => __importStar(require(s)));
this.addBuilder(`${packageJson.name}:${builderName}`, handler, b.description, optionsSchema);
}
}
addTarget(target, builderName, options = {}) {
this._targetMap.set((0, src_1.targetStringFromTarget)(target), { builderName, options });
}
async getBuilderNameForTarget(target) {
const name = (0, src_1.targetStringFromTarget)(target);
const maybeTarget = this._targetMap.get(name);
if (!maybeTarget) {
return this._backendHost?.getBuilderNameForTarget(target) ?? null;
}
return maybeTarget.builderName;
}
/**
* Resolve a builder. This needs to return a string which will be used in a dynamic `import()`
* clause. This should throw if no builder can be found. The dynamic import will throw if
* it is unsupported.
* @param builderName The name of the builder to be used.
* @returns All the info needed for the builder itself.
*/
async resolveBuilder(builderName) {
return (this._builderMap.get(builderName) || (this._backendHost?.resolveBuilder(builderName) ?? null));
}
async getCurrentDirectory() {
return this.currentDirectory;
}
async getWorkspaceRoot() {
return this.workspaceRoot;
}
async getOptionsForTarget(target) {
const name = (0, src_1.targetStringFromTarget)(target);
const maybeTarget = this._targetMap.get(name);
if (!maybeTarget) {
return this._backendHost?.getOptionsForTarget(target) ?? null;
}
return maybeTarget.options;
}
async getProjectMetadata(target) {
return this._backendHost?.getProjectMetadata(target) ?? null;
}
async loadBuilder(info) {
return (this._builderImportMap.get(info.builderName) || (this._backendHost?.loadBuilder(info) ?? null));
}
}
exports.TestingArchitectHost = TestingArchitectHost;
//# sourceMappingURL=testing-architect-host.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"testing-architect-host.js","sourceRoot":"","sources":["testing-architect-host.ts"],"names":[],"mappings":"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"}