| import { describe, expect, it } from 'vitest'; |
|
|
| import { classify } from '../src/security/bindClassify'; |
|
|
| describe('classify', () => { |
| describe('loopback', () => { |
| it.each([['127.0.0.1'], ['127.255.255.255'], ['::1'], ['localhost']])( |
| '%s β loopback', |
| (host) => { |
| expect(classify(host)).toBe('loopback'); |
| }, |
| ); |
| }); |
|
|
| describe('lan', () => { |
| it.each([ |
| ['192.168.1.5'], |
| ['10.0.0.1'], |
| ['172.16.0.1'], |
| ['172.31.255.255'], |
| ['169.254.1.1'], |
| ['fe80::1'], |
| ['fe80:0000:0000:0000:0000:0000:0000:0001'], |
| ['febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff'], |
| ])('%s β lan', (host) => { |
| expect(classify(host)).toBe('lan'); |
| }); |
| }); |
|
|
| describe('public', () => { |
| it.each([ |
| ['8.8.8.8'], |
| ['172.32.0.1'], |
| ['203.0.113.5'], |
| ['2001:4860:4860::8888'], |
| ['fec0::1'], |
| ['example.com'], |
| ])('%s β public', (host) => { |
| expect(classify(host)).toBe('public'); |
| }); |
| }); |
|
|
| describe('wildcard binds default to public unless relaxed', () => { |
| it('0.0.0.0 β public by default', () => { |
| expect(classify('0.0.0.0')).toBe('public'); |
| }); |
|
|
| it('0.0.0.0 β lan when bindClass=lan', () => { |
| expect(classify('0.0.0.0', { bindClass: 'lan' })).toBe('lan'); |
| }); |
|
|
| it('0.0.0.0 β public when bindClass=public', () => { |
| expect(classify('0.0.0.0', { bindClass: 'public' })).toBe('public'); |
| }); |
|
|
| it(':: β public by default', () => { |
| expect(classify('::')).toBe('public'); |
| }); |
|
|
| it(':: β lan when bindClass=lan', () => { |
| expect(classify('::', { bindClass: 'lan' })).toBe('lan'); |
| }); |
|
|
| it('empty string β public by default', () => { |
| expect(classify('')).toBe('public'); |
| }); |
| }); |
|
|
| it('bindClass override does not reclassify a concrete loopback/lan host', () => { |
| expect(classify('127.0.0.1', { bindClass: 'public' })).toBe('loopback'); |
| expect(classify('192.168.1.5', { bindClass: 'public' })).toBe('lan'); |
| }); |
| }); |
|
|