// test/address-validator.cjs - Tests for lib/address-validator.cjs
const test = require('brittle')
const { validateAddress } = require('../lib/address-validator.cjs')
const { loadFixture } = require('./helpers/index.cjs')
const addresses = loadFixture('addresses')
// Bitcoin Mainnet Tests
test('valid Bitcoin P2PKH mainnet', function (t) {
for (const addr of addresses.bitcoin.mainnet.p2pkh) {
const result = validateAddress(addr, 'bitcoin', 'mainnet')
t.ok(result.valid, `valid P2PKH: ${addr}`)
}
})
test('valid Bitcoin P2SH mainnet', function (t) {
for (const addr of addresses.bitcoin.mainnet.p2sh) {
const result = validateAddress(addr, 'bitcoin', 'mainnet')
t.ok(result.valid, `valid P2SH: ${addr}`)
}
})
test('valid Bitcoin Bech32 mainnet', function (t) {
for (const addr of addresses.bitcoin.mainnet.bech32) {
const result = validateAddress(addr, 'bitcoin', 'mainnet')
t.ok(result.valid, `valid Bech32: ${addr}`)
}
})
test('valid Bitcoin Bech32m mainnet', function (t) {
for (const addr of addresses.bitcoin.mainnet.bech32m) {
const result = validateAddress(addr, 'bitcoin', 'mainnet')
t.ok(result.valid, `valid Bech32m: ${addr}`)
}
})
// Bitcoin Testnet Tests
test('valid Bitcoin P2PKH testnet', function (t) {
for (const addr of addresses.bitcoin.testnet.p2pkh) {
const result = validateAddress(addr, 'bitcoin', 'testnet')
t.ok(result.valid, `valid testnet P2PKH: ${addr}`)
}
})
test('valid Bitcoin P2SH testnet', function (t) {
for (const addr of addresses.bitcoin.testnet.p2sh) {
const result = validateAddress(addr, 'bitcoin', 'testnet')
t.ok(result.valid, `valid testnet P2SH: ${addr}`)
}
})
test('valid Bitcoin Bech32 testnet', function (t) {
for (const addr of addresses.bitcoin.testnet.bech32) {
const result = validateAddress(addr, 'bitcoin', 'testnet')
t.ok(result.valid, `valid testnet Bech32: ${addr}`)
}
})
// Bitcoin Invalid Tests
test('invalid Bitcoin addresses', function (t) {
for (const addr of addresses.bitcoin.invalid) {
const result = validateAddress(addr, 'bitcoin', 'mainnet')
t.absent(result.valid, `invalid: ${addr}`)
}
})
// Ethereum Tests
test('valid Ethereum addresses', function (t) {
for (const addr of addresses.ethereum.mainnet.valid) {
const result = validateAddress(addr, 'ethereum', 'mainnet')
t.ok(result.valid, `valid ETH: ${addr}`)
}
})
test('valid Ethereum Sepolia addresses', function (t) {
for (const addr of addresses.ethereum.testnet.sepolia) {
const result = validateAddress(addr, 'ethereum', 'sepolia')
t.ok(result.valid, `valid Sepolia: ${addr}`)
}
})
test('invalid Ethereum addresses', function (t) {
for (const addr of addresses.ethereum.invalid) {
const result = validateAddress(addr, 'ethereum', 'mainnet')
t.absent(result.valid, `invalid ETH: ${addr}`)
}
})
// Network Mismatch Tests
test('reject mainnet address on testnet', function (t) {
const mainnetAddr = addresses.bitcoin.mainnet.p2pkh[0]
const result = validateAddress(mainnetAddr, 'bitcoin', 'testnet')
t.absent(result.valid, 'mainnet address rejected on testnet')
t.ok(result.reason && result.reason.includes('network'), 'reason mentions network')
})
test('reject testnet address on mainnet', function (t) {
const testnetAddr = addresses.bitcoin.testnet.p2pkh[0]
const result = validateAddress(testnetAddr, 'bitcoin', 'mainnet')
t.absent(result.valid, 'testnet address rejected on mainnet')
t.ok(result.reason && result.reason.includes('network'), 'reason mentions network')
})
// Edge Cases
test('reject empty address', function (t) {
const result = validateAddress('', 'bitcoin', 'mainnet')
t.absent(result.valid, 'empty address rejected')
})
test('reject null address', function (t) {
const result = validateAddress(null, 'bitcoin', 'mainnet')
t.absent(result.valid, 'null address rejected')
})
test('reject invalid chain', function (t) {
const result = validateAddress(addresses.bitcoin.mainnet.p2pkh[0], 'litecoin', 'mainnet')
t.absent(result.valid, 'invalid chain rejected')
})