fix(tests): Update dev dependencies and refactor test assertions for improved clarity
This commit is contained in:
parent
771bfe94e7
commit
7c88ecd82a
@ -1,5 +1,13 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2025-05-19 - 4.0.2 - fix(tests)
|
||||||
|
Update dev dependencies and refactor test assertions for improved clarity
|
||||||
|
|
||||||
|
- Bumped @git.zone/tsbuild version to ^2.5.1
|
||||||
|
- Bumped @git.zone/tstest version to ^1.9.0
|
||||||
|
- Updated npm test script to include the verbose flag
|
||||||
|
- Replaced expectAsync assertions with resolves based assertions in test files
|
||||||
|
|
||||||
## 2025-05-03 - 4.0.1 - fix(formatting)
|
## 2025-05-03 - 4.0.1 - fix(formatting)
|
||||||
Fix minor formatting issues and newline consistency across project files
|
Fix minor formatting issues and newline consistency across project files
|
||||||
|
|
||||||
|
@ -9,17 +9,16 @@
|
|||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(tstest test/)",
|
"test": "(tstest test/ --verbose)",
|
||||||
"build": "(tsbuild --web --allowimplicitany)",
|
"build": "(tsbuild --web --allowimplicitany)",
|
||||||
"buildDocs": "tsdoc"
|
"buildDocs": "tsdoc"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@git.zone/tsbuild": "^2.1.61",
|
"@git.zone/tsbuild": "^2.5.1",
|
||||||
"@git.zone/tsrun": "^1.2.39",
|
"@git.zone/tsrun": "^1.2.39",
|
||||||
"@git.zone/tstest": "^1.0.69",
|
"@git.zone/tstest": "^1.9.0",
|
||||||
"@push.rocks/smartenv": "^5.0.0",
|
"@push.rocks/smartenv": "^5.0.0",
|
||||||
"@push.rocks/tapbundle": "^5.0.3",
|
"@types/node": "^22.15.19"
|
||||||
"@types/node": "^22.15.3"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@push.rocks/smartping": "^1.0.7",
|
"@push.rocks/smartping": "^1.0.7",
|
||||||
|
2197
pnpm-lock.yaml
generated
2197
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -1 +1,73 @@
|
|||||||
|
# Project Analysis
|
||||||
|
|
||||||
|
## Architecture Overview
|
||||||
|
This is a comprehensive network diagnostics toolkit that provides various network-related utilities. The main entry point is the `SmartNetwork` class which orchestrates all functionality.
|
||||||
|
|
||||||
|
Key features:
|
||||||
|
- Speed testing via Cloudflare (parallelizable with duration support)
|
||||||
|
- Ping operations with statistics
|
||||||
|
- Port availability checks (local and remote)
|
||||||
|
- Network gateway discovery
|
||||||
|
- Public IP retrieval
|
||||||
|
- DNS resolution
|
||||||
|
- HTTP endpoint health checks
|
||||||
|
- Traceroute functionality (with fallback stub)
|
||||||
|
|
||||||
|
## Key Components
|
||||||
|
|
||||||
|
### SmartNetwork Class
|
||||||
|
- Central orchestrator for all network operations
|
||||||
|
- Supports caching via `cacheTtl` option for gateway and public IP lookups
|
||||||
|
- Plugin architecture for extensibility
|
||||||
|
|
||||||
|
### CloudflareSpeed Class
|
||||||
|
- Handles internet speed testing using Cloudflare's infrastructure
|
||||||
|
- Supports parallel streams and customizable test duration
|
||||||
|
- Measures both download and upload speeds using progressive chunk sizes
|
||||||
|
- Includes latency measurements (jitter, median, average)
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
- Custom `NetworkError` and `TimeoutError` classes for better error context
|
||||||
|
- Error codes follow Node.js conventions (ENOTSUP, EINVAL, ETIMEOUT)
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
- Global logger interface for consistent logging across the codebase
|
||||||
|
- Replaceable logger implementation (defaults to console)
|
||||||
|
- Used primarily for error reporting in speed tests
|
||||||
|
|
||||||
|
### Statistics Helpers
|
||||||
|
- Utility functions for statistical calculations (average, median, quartile, jitter)
|
||||||
|
- Used extensively by speed testing and ping operations
|
||||||
|
|
||||||
|
## Recent Changes (v4.0.0 - v4.0.1)
|
||||||
|
- Added configurable speed test options (parallelStreams, duration)
|
||||||
|
- Introduced plugin architecture for runtime extensibility
|
||||||
|
- Enhanced error handling with custom error classes
|
||||||
|
- Added global logging interface
|
||||||
|
- Improved connection management by disabling HTTP connection pooling
|
||||||
|
- Fixed memory leaks from listener accumulation
|
||||||
|
- Minor formatting fixes for consistency
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
- Comprehensive test suite covering all major features
|
||||||
|
- Tests run on both browser and node environments
|
||||||
|
- Uses @push.rocks/tapbundle for testing with expectAsync
|
||||||
|
- Performance tests for speed testing functionality
|
||||||
|
- Edge case handling for network errors and timeouts
|
||||||
|
|
||||||
|
## Technical Details
|
||||||
|
- ESM-only package (module type)
|
||||||
|
- TypeScript with strict typing
|
||||||
|
- Depends on external modules for specific functionality:
|
||||||
|
- @push.rocks/smartping for ICMP operations
|
||||||
|
- public-ip for external IP discovery
|
||||||
|
- systeminformation for network interface details
|
||||||
|
- isopen for remote port checking
|
||||||
|
- Uses native Node.js modules for DNS, HTTP/HTTPS, and network operations
|
||||||
|
|
||||||
|
## Design Patterns
|
||||||
|
- Factory pattern for plugin registration
|
||||||
|
- Caching pattern with TTL for expensive operations
|
||||||
|
- Promise-based async/await throughout
|
||||||
|
- Deferred promises for complex async coordination
|
||||||
|
- Error propagation with custom error types
|
@ -1,4 +1,4 @@
|
|||||||
import { tap, expect, expectAsync } from '@push.rocks/tapbundle';
|
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||||
import { SmartNetwork, NetworkError } from '../ts/index.js';
|
import { SmartNetwork, NetworkError } from '../ts/index.js';
|
||||||
import * as net from 'net';
|
import * as net from 'net';
|
||||||
import type { AddressInfo } from 'net';
|
import type { AddressInfo } from 'net';
|
||||||
@ -61,7 +61,7 @@ tap.test('traceroute fallback stub returns a single-hop stub', async () => {
|
|||||||
const sn = new SmartNetwork();
|
const sn = new SmartNetwork();
|
||||||
const hops = await sn.traceroute('example.com', { maxHops: 5 });
|
const hops = await sn.traceroute('example.com', { maxHops: 5 });
|
||||||
expect(Array.isArray(hops)).toBeTrue();
|
expect(Array.isArray(hops)).toBeTrue();
|
||||||
expect(hops).toHaveLength(1);
|
expect(hops).array.toHaveLength(1);
|
||||||
expect(hops[0]).toEqual({ ttl: 1, ip: 'example.com', rtt: null });
|
expect(hops[0]).toEqual({ ttl: 1, ip: 'example.com', rtt: null });
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ tap.test('isLocalPortUnused should detect used local port', async () => {
|
|||||||
// port is now in use
|
// port is now in use
|
||||||
const inUse = await sn.isLocalPortUnused(addr.port);
|
const inUse = await sn.isLocalPortUnused(addr.port);
|
||||||
expect(inUse).toBeFalse();
|
expect(inUse).toBeFalse();
|
||||||
await new Promise<void>((res) => server.close(res));
|
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||||
});
|
});
|
||||||
// Real traceroute integration test (skipped if `traceroute` binary is unavailable)
|
// Real traceroute integration test (skipped if `traceroute` binary is unavailable)
|
||||||
tap.test('traceroute real integration against google.com', async () => {
|
tap.test('traceroute real integration against google.com', async () => {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { tap, expect, expectAsync } from '@push.rocks/tapbundle';
|
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||||
|
|
||||||
import * as smartnetwork from '../ts/index.js';
|
import * as smartnetwork from '../ts/index.js';
|
||||||
|
|
||||||
@ -20,11 +20,11 @@ tap.test('should send a ping to Google', async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should state when a ping is not alive ', async () => {
|
tap.test('should state when a ping is not alive ', async () => {
|
||||||
await expectAsync(testSmartnetwork.ping('notthere.lossless.com')).property('alive').toBeFalse();
|
await expect(testSmartnetwork.ping('notthere.lossless.com')).resolves.property('alive').toBeFalse();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should send a ping to an IP', async () => {
|
tap.test('should send a ping to an IP', async () => {
|
||||||
await expectAsync(testSmartnetwork.ping('192.168.186.999')).property('alive').toBeFalse();
|
await expect(testSmartnetwork.ping('192.168.186.999')).resolves.property('alive').toBeFalse();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
||||||
|
10
test/test.ts
10
test/test.ts
@ -1,4 +1,4 @@
|
|||||||
import { expect, expectAsync, tap } from '@push.rocks/tapbundle';
|
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||||
import * as smartnetwork from '../ts/index.js';
|
import * as smartnetwork from '../ts/index.js';
|
||||||
|
|
||||||
let testSmartNetwork: smartnetwork.SmartNetwork;
|
let testSmartNetwork: smartnetwork.SmartNetwork;
|
||||||
@ -20,13 +20,13 @@ tap.test('should perform a speedtest', async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should determine wether a port is free', async () => {
|
tap.test('should determine wether a port is free', async () => {
|
||||||
await expectAsync(testSmartNetwork.isLocalPortUnused(8080)).toBeTrue();
|
await expect(testSmartNetwork.isLocalPortUnused(8080)).resolves.toBeTrue();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should scan a port', async () => {
|
tap.test('should scan a port', async () => {
|
||||||
await expectAsync(testSmartNetwork.isRemotePortAvailable('lossless.com:443')).toBeTrue();
|
await expect(testSmartNetwork.isRemotePortAvailable('lossless.com:443')).resolves.toBeTrue();
|
||||||
await expectAsync(testSmartNetwork.isRemotePortAvailable('lossless.com', 443)).toBeTrue();
|
await expect(testSmartNetwork.isRemotePortAvailable('lossless.com', 443)).resolves.toBeTrue();
|
||||||
await expectAsync(testSmartNetwork.isRemotePortAvailable('lossless.com:444')).toBeFalse();
|
await expect(testSmartNetwork.isRemotePortAvailable('lossless.com:444')).resolves.toBeFalse();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should get gateways', async () => {
|
tap.test('should get gateways', async () => {
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@push.rocks/smartnetwork',
|
name: '@push.rocks/smartnetwork',
|
||||||
version: '4.0.1',
|
version: '4.0.2',
|
||||||
description: 'A toolkit for network diagnostics including speed tests, port availability checks, and more.'
|
description: 'A toolkit for network diagnostics including speed tests, port availability checks, and more.'
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user