@homebridge-plugins/homebridge-air
Version:
The AirNow plugin allows you to monitor the current AirQuality for your Zip Code from HomeKit and Siri.
96 lines • 4.32 kB
JavaScript
import { describe, expect, it } from 'vitest';
import { AqicnUrl, HomeKitAQI, REQUEST_RATE_LIMIT_CONFIG, REQUEST_TIMEOUT_CONFIG, resolveAqicnLocationSegment } from '../settings.js';
describe('homeKitAQI', () => {
it('should return 0 for undefined AQI', () => {
expect(HomeKitAQI(undefined)).toBe(0);
});
it('should return 1 for AQI <= 50', () => {
expect(HomeKitAQI(50)).toBe(1);
expect(HomeKitAQI(0)).toBe(1);
});
it('should return 2 for AQI between 51 and 100', () => {
expect(HomeKitAQI(51)).toBe(2);
expect(HomeKitAQI(100)).toBe(2);
});
it('should return 3 for AQI between 101 and 150', () => {
expect(HomeKitAQI(101)).toBe(3);
expect(HomeKitAQI(150)).toBe(3);
});
it('should return 4 for AQI between 151 and 200', () => {
expect(HomeKitAQI(151)).toBe(4);
expect(HomeKitAQI(200)).toBe(4);
});
it('should return 5 for AQI > 200', () => {
expect(HomeKitAQI(201)).toBe(5);
expect(HomeKitAQI(300)).toBe(5);
});
it('should return 0 for invalid AQI', () => {
expect(HomeKitAQI(-1)).toBe(0);
});
});
describe('uRL construction for AQICN API (issue #49)', () => {
it('should construct HTTPS URLs for AQICN API requests', () => {
// Verify the base URL uses HTTPS
expect(AqicnUrl).toBe('https://api.waqi.info/feed/');
// Test URL construction for the scenario mentioned in issue #49
const cityId = 'A92323';
const token = 'myToken';
const expectedUrl = `https://api.waqi.info/feed/${cityId}/?token=${token}`;
const constructedUrl = `${AqicnUrl}${cityId}/?token=${token}`;
expect(constructedUrl).toBe(expectedUrl);
expect(constructedUrl).toMatch(/^https:\/\//);
});
});
describe('rEQUEST_TIMEOUT_CONFIG constants', () => {
it('should have properly defined timeout constants', () => {
expect(REQUEST_TIMEOUT_CONFIG.DEFAULT_TIMEOUT).toBe(30000);
expect(REQUEST_TIMEOUT_CONFIG.MAX_RETRY_TIMEOUT).toBe(30000);
expect(REQUEST_TIMEOUT_CONFIG.MIN_RETRY_TIMEOUT).toBe(500);
expect(REQUEST_TIMEOUT_CONFIG.IDLE_TIMEOUT).toBe(4000);
expect(REQUEST_TIMEOUT_CONFIG.GEOCODE_TIMEOUT).toBe(10000);
expect(REQUEST_TIMEOUT_CONFIG.AUTO_SELECT_FAMILY_ATTEMPT_TIMEOUT).toBe(250);
});
it('should have timeout values that make logical sense', () => {
// Default timeout should be reasonable (30 seconds)
expect(REQUEST_TIMEOUT_CONFIG.DEFAULT_TIMEOUT).toBeGreaterThan(0);
expect(REQUEST_TIMEOUT_CONFIG.DEFAULT_TIMEOUT).toBeLessThanOrEqual(60000); // No more than 1 minute
// Min retry timeout should be less than max retry timeout
expect(REQUEST_TIMEOUT_CONFIG.MIN_RETRY_TIMEOUT).toBeLessThan(REQUEST_TIMEOUT_CONFIG.MAX_RETRY_TIMEOUT);
// Idle timeout should be shorter than default timeout
expect(REQUEST_TIMEOUT_CONFIG.IDLE_TIMEOUT).toBeLessThan(REQUEST_TIMEOUT_CONFIG.DEFAULT_TIMEOUT);
});
});
describe('rEQUEST_RATE_LIMIT_CONFIG constants', () => {
it('should define shared cache and rate limit values', () => {
expect(REQUEST_RATE_LIMIT_CONFIG.CACHE_MAX_AGE).toBe(600000);
expect(REQUEST_RATE_LIMIT_CONFIG.CALL_WINDOW_MS).toBe(3600000);
expect(REQUEST_RATE_LIMIT_CONFIG.MAX_CALLS_PER_WINDOW).toBe(60);
});
});
describe('resolveAqicnLocationSegment', () => {
it('should prefer explicit station paths over coordinates', () => {
const segment = resolveAqicnLocationSegment({
city: '/station/@92323',
latitude: 47.5,
longitude: 8.7,
});
expect(segment).toBe('station/@92323');
});
it('should parse full AQICN station URL', () => {
const segment = resolveAqicnLocationSegment({
city: 'https://aqicn.org/station/@92323/',
latitude: undefined,
longitude: undefined,
});
expect(segment).toBe('station/@92323');
});
it('should fall back to geo when explicit path is absent', () => {
const segment = resolveAqicnLocationSegment({
city: 'A92323',
latitude: 47.5,
longitude: 8.7,
});
expect(segment).toBe('geo:47.5;8.7');
});
});
//# sourceMappingURL=settings.test.js.map