ea451885af
Extend splitIps to accept comma/semicolon/newline delimiters with dedupe, and reuse it in DetailPanel for both the IP list and the service-URL host. Fixes ServiceBadge links pointing at concatenated string when IPs were entered with ';' or newline separators. Adds tests for new delimiters.
94 lines
2.6 KiB
TypeScript
94 lines
2.6 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import { maskIp, splitIps, primaryIp } from '../maskIp'
|
|
|
|
describe('maskIp', () => {
|
|
// IPv4
|
|
it('masks last two octets of a standard IPv4', () => {
|
|
expect(maskIp('192.168.1.115')).toBe('192.168.XX.XX')
|
|
})
|
|
|
|
it('masks any IPv4', () => {
|
|
expect(maskIp('10.0.0.1')).toBe('10.0.XX.XX')
|
|
expect(maskIp('172.16.254.1')).toBe('172.16.XX.XX')
|
|
})
|
|
|
|
// IPv6
|
|
it('masks second group and last group of an IPv6 address', () => {
|
|
expect(maskIp('2001:db8::1')).toBe('2001:XX::XX')
|
|
})
|
|
|
|
it('masks a full IPv6 address', () => {
|
|
expect(maskIp('fe80:0000:0000:0000:0202:b3ff:fe1e:8329')).toBe('fe80:XX:0000:0000:0202:b3ff:fe1e:XX')
|
|
})
|
|
|
|
it('masks loopback IPv6', () => {
|
|
// ::1 splits into ['', '', '1'] — groups[1] and last are masked
|
|
expect(maskIp('::1')).toBe(':XX:XX')
|
|
})
|
|
|
|
// Comma-separated
|
|
it('masks all IPs in a comma-separated string', () => {
|
|
expect(maskIp('192.168.1.1, 2001:db8::1')).toBe('192.168.XX.XX, 2001:XX::XX')
|
|
})
|
|
|
|
it('handles comma-separated without spaces', () => {
|
|
expect(maskIp('10.0.0.1,10.0.0.2')).toBe('10.0.XX.XX, 10.0.XX.XX')
|
|
})
|
|
|
|
// Edge cases
|
|
it('passes through non-IP strings unchanged', () => {
|
|
expect(maskIp('hostname')).toBe('hostname')
|
|
expect(maskIp('')).toBe('')
|
|
})
|
|
})
|
|
|
|
describe('splitIps', () => {
|
|
it('returns array of trimmed IPs', () => {
|
|
expect(splitIps('192.168.1.1, 2001:db8::1')).toEqual(['192.168.1.1', '2001:db8::1'])
|
|
})
|
|
|
|
it('returns single-element array for single IP', () => {
|
|
expect(splitIps('10.0.0.1')).toEqual(['10.0.0.1'])
|
|
})
|
|
|
|
it('returns empty array for empty string', () => {
|
|
expect(splitIps('')).toEqual([])
|
|
expect(splitIps(' ')).toEqual([])
|
|
})
|
|
|
|
it('splits on semicolons', () => {
|
|
expect(splitIps('10.0.0.1; 10.0.0.2')).toEqual(['10.0.0.1', '10.0.0.2'])
|
|
})
|
|
|
|
it('splits on newlines', () => {
|
|
expect(splitIps('10.0.0.1\n10.0.0.2')).toEqual(['10.0.0.1', '10.0.0.2'])
|
|
})
|
|
|
|
it('splits on mixed delimiters', () => {
|
|
expect(splitIps('10.0.0.1,10.0.0.2; 10.0.0.3\n10.0.0.4')).toEqual([
|
|
'10.0.0.1',
|
|
'10.0.0.2',
|
|
'10.0.0.3',
|
|
'10.0.0.4',
|
|
])
|
|
})
|
|
|
|
it('deduplicates repeated IPs', () => {
|
|
expect(splitIps('10.0.0.1, 10.0.0.1; 10.0.0.2')).toEqual(['10.0.0.1', '10.0.0.2'])
|
|
})
|
|
})
|
|
|
|
describe('primaryIp', () => {
|
|
it('returns first IP from comma-separated string', () => {
|
|
expect(primaryIp('192.168.1.1, 2001:db8::1')).toBe('192.168.1.1')
|
|
})
|
|
|
|
it('returns the only IP when single', () => {
|
|
expect(primaryIp('10.0.0.1')).toBe('10.0.0.1')
|
|
})
|
|
|
|
it('returns empty string for empty input', () => {
|
|
expect(primaryIp('')).toBe('')
|
|
})
|
|
})
|