import { Hono } from 'hono' import * as IpAllowlist from './IpAllowlist.js' describe('isRule', () => { test.each([ ['203.0.113.7', true], ['0.0.0.0/0', true], ['203.0.113.0/24', true], ['203.0.113.7/32', true], ['2001:db8::7', true], ['::/0', true], ['2001:db8::/32', true], ['2001:db8::7/128', true], ['::ffff:192.0.2.1', true], ['203.0.113.0/33', false], ['2001:db8::/129', false], ['203.0.113.0/-1', false], ['203.0.113.999', false], ['2001:db8::1%eth0', false], ['203.0.113.0/24/1', false], [' 203.0.113.7', false], ['203.0.113.7 ', false], ['*', false], ['', false], ])('%s -> %s', (rule, expected) => { expect(IpAllowlist.isRule(rule)).toBe(expected) }) }) describe('allows', () => { test.each([ ['203.0.113.7', ['203.0.113.7'], true], ['203.0.113.7', ['0.0.0.0/0'], true], ['203.0.113.7', ['203.0.113.0/24'], true], ['203.0.113.0', ['203.0.113.0/24'], true], ['203.0.113.255', ['203.0.113.0/24'], true], ['203.0.114.7', ['203.0.113.0/24'], false], ['2001:db8:1::7', ['2001:db8::/32'], true], ['2001:db8::7', ['2001:db8::7/128'], true], ['2001:db8::8', ['2001:db8::7/128'], false], ['2001:db9::7', ['2001:db8::/32'], false], ['203.0.113.7', ['2001:db8::/32'], false], ['::ffff:192.0.2.1', ['::ffff:192.0.2.1'], true], ['not-an-ip', ['203.0.113.0/24'], false], ])('%s in %j -> %s', async (address, rules, expected) => { const app = new Hono().get('/', async (c) => c.json({ allowed: await IpAllowlist.allows(c, { address, rules }) }), ) expect(await (await app.request('/')).json()).toEqual({ allowed: expected }) }) })