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.
264 lines
7.2 KiB
JavaScript
264 lines
7.2 KiB
JavaScript
'use strict';
|
|
|
|
var expect = require('expect.js');
|
|
var promiseRetry = require('../');
|
|
var promiseDelay = require('sleep-promise');
|
|
|
|
describe('promise-retry', function () {
|
|
it('should call fn again if retry was called', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function (retry) {
|
|
count += 1;
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
if (count <= 2) {
|
|
retry(new Error('foo'));
|
|
}
|
|
|
|
return 'final';
|
|
});
|
|
}, { factor: 1 })
|
|
.then(function (value) {
|
|
expect(value).to.be('final');
|
|
expect(count).to.be(3);
|
|
}, function () {
|
|
throw new Error('should not fail');
|
|
});
|
|
});
|
|
|
|
it('should call fn with the attempt number', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function (retry, number) {
|
|
count += 1;
|
|
expect(count).to.equal(number);
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
if (count <= 2) {
|
|
retry(new Error('foo'));
|
|
}
|
|
|
|
return 'final';
|
|
});
|
|
}, { factor: 1 })
|
|
.then(function (value) {
|
|
expect(value).to.be('final');
|
|
expect(count).to.be(3);
|
|
}, function () {
|
|
throw new Error('should not fail');
|
|
});
|
|
});
|
|
|
|
it('should not retry on fulfillment if retry was not called', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function () {
|
|
count += 1;
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
return 'final';
|
|
});
|
|
})
|
|
.then(function (value) {
|
|
expect(value).to.be('final');
|
|
expect(count).to.be(1);
|
|
}, function () {
|
|
throw new Error('should not fail');
|
|
});
|
|
});
|
|
|
|
it('should not retry on rejection if retry was not called', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function () {
|
|
count += 1;
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
throw new Error('foo');
|
|
});
|
|
})
|
|
.then(function () {
|
|
throw new Error('should not succeed');
|
|
}, function (err) {
|
|
expect(err.message).to.be('foo');
|
|
expect(count).to.be(1);
|
|
});
|
|
});
|
|
|
|
it('should not retry on rejection if nr of retries is 0', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function (retry) {
|
|
count += 1;
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
throw new Error('foo');
|
|
})
|
|
.catch(retry);
|
|
}, { retries : 0 })
|
|
.then(function () {
|
|
throw new Error('should not succeed');
|
|
}, function (err) {
|
|
expect(err.message).to.be('foo');
|
|
expect(count).to.be(1);
|
|
});
|
|
});
|
|
|
|
it('should reject the promise if the retries were exceeded', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function (retry) {
|
|
count += 1;
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
throw new Error('foo');
|
|
})
|
|
.catch(retry);
|
|
}, { retries: 2, factor: 1 })
|
|
.then(function () {
|
|
throw new Error('should not succeed');
|
|
}, function (err) {
|
|
expect(err.message).to.be('foo');
|
|
expect(count).to.be(3);
|
|
});
|
|
});
|
|
|
|
it('should pass options to the underlying retry module', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function (retry) {
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
if (count < 2) {
|
|
count += 1;
|
|
retry(new Error('foo'));
|
|
}
|
|
|
|
return 'final';
|
|
});
|
|
}, { retries: 1, factor: 1 })
|
|
.then(function () {
|
|
throw new Error('should not succeed');
|
|
}, function (err) {
|
|
expect(err.message).to.be('foo');
|
|
});
|
|
});
|
|
|
|
it('should convert direct fulfillments into promises', function () {
|
|
return promiseRetry(function () {
|
|
return 'final';
|
|
}, { factor: 1 })
|
|
.then(function (value) {
|
|
expect(value).to.be('final');
|
|
}, function () {
|
|
throw new Error('should not fail');
|
|
});
|
|
});
|
|
|
|
it('should convert direct rejections into promises', function () {
|
|
promiseRetry(function () {
|
|
throw new Error('foo');
|
|
}, { retries: 1, factor: 1 })
|
|
.then(function () {
|
|
throw new Error('should not succeed');
|
|
}, function (err) {
|
|
expect(err.message).to.be('foo');
|
|
});
|
|
});
|
|
|
|
it('should not crash on undefined rejections', function () {
|
|
return promiseRetry(function () {
|
|
throw undefined;
|
|
}, { retries: 1, factor: 1 })
|
|
.then(function () {
|
|
throw new Error('should not succeed');
|
|
}, function (err) {
|
|
expect(err).to.be(undefined);
|
|
})
|
|
.then(function () {
|
|
return promiseRetry(function (retry) {
|
|
retry();
|
|
}, { retries: 1, factor: 1 });
|
|
})
|
|
.then(function () {
|
|
throw new Error('should not succeed');
|
|
}, function (err) {
|
|
expect(err).to.be(undefined);
|
|
});
|
|
});
|
|
|
|
it('should retry if retry() was called with undefined', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function (retry) {
|
|
count += 1;
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
if (count <= 2) {
|
|
retry();
|
|
}
|
|
|
|
return 'final';
|
|
});
|
|
}, { factor: 1 })
|
|
.then(function (value) {
|
|
expect(value).to.be('final');
|
|
expect(count).to.be(3);
|
|
}, function () {
|
|
throw new Error('should not fail');
|
|
});
|
|
});
|
|
|
|
it('should work with several retries in the same chain', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry(function (retry) {
|
|
count += 1;
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
retry(new Error('foo'));
|
|
})
|
|
.catch(function (err) {
|
|
retry(err);
|
|
});
|
|
}, { retries: 1, factor: 1 })
|
|
.then(function () {
|
|
throw new Error('should not succeed');
|
|
}, function (err) {
|
|
expect(err.message).to.be('foo');
|
|
expect(count).to.be(2);
|
|
});
|
|
});
|
|
|
|
it('should allow options to be passed first', function () {
|
|
var count = 0;
|
|
|
|
return promiseRetry({ factor: 1 }, function (retry) {
|
|
count += 1;
|
|
|
|
return promiseDelay(10)
|
|
.then(function () {
|
|
if (count <= 2) {
|
|
retry(new Error('foo'));
|
|
}
|
|
|
|
return 'final';
|
|
});
|
|
}).then(function (value) {
|
|
expect(value).to.be('final');
|
|
expect(count).to.be(3);
|
|
}, function () {
|
|
throw new Error('should not fail');
|
|
});
|
|
});
|
|
});
|