feat(unifi): implement comprehensive UniFi API client with controllers, protect, access, account, managers, resources, HTTP client, interfaces, logging, plugins, and tests

This commit is contained in:
2026-02-02 15:46:41 +00:00
parent aaa9e67835
commit 740b70cd83
38 changed files with 6275 additions and 15 deletions

143
test/test.network.ts Normal file
View File

@@ -0,0 +1,143 @@
import { expect, tap } from '@git.zone/tstest/tapbundle';
import { Qenv } from '@push.rocks/qenv';
import * as unifi from '../ts/index.js';
// =============================================================================
// NETWORK CONTROLLER API INTEGRATION TESTS (Local API)
// Tests may use live production keys to test specific features at scale.
// Make sure to avoid dangerous, destructive or security relevant operations.
// =============================================================================
const testQenv = new Qenv('./', './.nogit/');
let testController: unifi.UnifiController;
tap.test('setup - create UnifiController with API key', async () => {
const host = await testQenv.getEnvVarOnDemand('UNIFI_CONSOLE_IP');
const apiKey = await testQenv.getEnvVarOnDemand('UNIFI_NETWORK_DEV_KEY');
testController = new unifi.UnifiController({
host,
apiKey,
controllerType: 'unifi-os',
verifySsl: false,
});
// With API key, already authenticated
expect(testController.isAuthenticated()).toBeTrue();
console.log('UnifiController created with API key authentication');
});
// READ-ONLY: List devices
tap.test('READ-ONLY - should list devices', async () => {
const devices = await testController.deviceManager.listDevices();
console.log(`Found ${devices.length} devices`);
expect(devices).toBeArray();
for (const device of devices) {
expect(device).toBeInstanceOf(unifi.UnifiDevice);
console.log(` - ${device.getDisplayName()} (${device.model}) - ${device.isOnline() ? 'online' : 'offline'}`);
}
});
// READ-ONLY: List access points
tap.test('READ-ONLY - should list access points', async () => {
const accessPoints = await testController.deviceManager.getAccessPoints();
console.log(`Found ${accessPoints.length} access points`);
expect(accessPoints).toBeArray();
for (const ap of accessPoints) {
console.log(` - AP: ${ap.getDisplayName()} (${ap.ip})`);
}
});
// READ-ONLY: List switches
tap.test('READ-ONLY - should list switches', async () => {
const switches = await testController.deviceManager.getSwitches();
console.log(`Found ${switches.length} switches`);
expect(switches).toBeArray();
for (const sw of switches) {
console.log(` - Switch: ${sw.getDisplayName()} (${sw.ip})`);
}
});
// READ-ONLY: List gateways
tap.test('READ-ONLY - should list gateways', async () => {
const gateways = await testController.deviceManager.getGateways();
console.log(`Found ${gateways.length} gateways`);
expect(gateways).toBeArray();
for (const gw of gateways) {
console.log(` - Gateway: ${gw.getDisplayName()} (${gw.ip})`);
}
});
// READ-ONLY: List active clients
tap.test('READ-ONLY - should list active clients', async () => {
const clients = await testController.clientManager.listActiveClients();
console.log(`Found ${clients.length} active clients`);
expect(clients).toBeArray();
for (const client of clients.slice(0, 10)) {
console.log(` - ${client.getDisplayName()} (${client.ip || 'no IP'}) - ${client.getConnectionType()}`);
}
if (clients.length > 10) {
console.log(` ... and ${clients.length - 10} more`);
}
});
// READ-ONLY: List wireless clients
tap.test('READ-ONLY - should list wireless clients', async () => {
const wirelessClients = await testController.clientManager.getWirelessClients();
console.log(`Found ${wirelessClients.length} wireless clients`);
expect(wirelessClients).toBeArray();
});
// READ-ONLY: List wired clients
tap.test('READ-ONLY - should list wired clients', async () => {
const wiredClients = await testController.clientManager.getWiredClients();
console.log(`Found ${wiredClients.length} wired clients`);
expect(wiredClients).toBeArray();
});
// READ-ONLY: Get system info
tap.test('READ-ONLY - should get system info', async () => {
const sysInfo = await testController.getSystemInfo();
console.log('System info retrieved');
expect(sysInfo).toBeDefined();
});
// READ-ONLY: Get health
tap.test('READ-ONLY - should get health status', async () => {
const health = await testController.getHealth();
console.log('Health status retrieved');
expect(health).toBeDefined();
});
// READ-ONLY: Get WLANs
tap.test('READ-ONLY - should list WLANs', async () => {
const wlans = await testController.getWlans();
console.log('WLANs retrieved');
expect(wlans).toBeDefined();
});
// READ-ONLY: Get networks
tap.test('READ-ONLY - should list networks', async () => {
const networks = await testController.getNetworks();
console.log('Networks retrieved');
expect(networks).toBeDefined();
});
export default tap.start();