Files
worker/app/models/rkn_ip_test.go
Gleb Tv 2c884c5612
Некоторые проверки не удались
CI / test (push) Successful in 2m5s
Docker / Build and publish worker image (push) Failing after 31s
refactor: adopt worker module path
2026-07-13 17:56:12 +03:00

115 строки
2.7 KiB
Go

package models_test
import (
"net"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"rocketgit.ru/rsmon/worker/app/models"
)
func mustIPNet(t *testing.T, cidr string) *net.IPNet {
t.Helper()
_, n, err := net.ParseCIDR(cidr)
require.NoError(t, err)
return n
}
func TestReplaceRknIPs_BulkAndDedup(t *testing.T) {
models.Drop()
models.Migrate()
input := []*net.IPNet{
mustIPNet(t, "10.0.0.0/8"),
mustIPNet(t, "10.5.0.0/8"), // same canonical /8 — dedup
mustIPNet(t, "192.168.1.0/24"),
mustIPNet(t, "2001:db8::/32"),
}
require.NoError(t, models.ReplaceRknIPs(input))
// The uniqueIndex on rkn_ips.network ensures the dedup actually drops
// duplicates; ReplaceRknIPs does an in-memory dedup, but the DB-level
// constraint is the guarantee.
var count int64
assert.NoError(t, models.DB().Model(&models.RknIP{}).Count(&count).Error)
assert.Equal(t, int64(3), count, "expected dedup to 3 unique CIDRs")
}
func TestReplaceRknIPs_ReplacesExisting(t *testing.T) {
models.Drop()
models.Migrate()
require.NoError(t, models.ReplaceRknIPs([]*net.IPNet{
mustIPNet(t, "8.8.8.0/24"),
}))
var n int64
assert.NoError(t, models.DB().Model(&models.RknIP{}).Count(&n).Error)
assert.Equal(t, int64(1), n)
require.NoError(t, models.ReplaceRknIPs([]*net.IPNet{
mustIPNet(t, "1.0.0.0/8"),
mustIPNet(t, "2.0.0.0/8"),
}))
assert.NoError(t, models.DB().Model(&models.RknIP{}).Count(&n).Error)
assert.Equal(t, int64(2), n)
}
func TestIsRknIPBlocked(t *testing.T) {
models.Drop()
models.Migrate()
require.NoError(t, models.ReplaceRknIPs([]*net.IPNet{
mustIPNet(t, "10.0.0.0/8"),
mustIPNet(t, "192.168.1.0/24"),
mustIPNet(t, "2001:db8::/32"),
}))
cases := []struct {
ip string
want bool
}{
{"10.5.7.9", true},
{"10.255.255.255", true},
{"192.168.1.42", true},
{"11.0.0.1", false},
{"8.8.8.8", false},
{"2001:db8::1", true},
{"2001:db9::1", false},
{"", false},
}
for _, c := range cases {
t.Run(c.ip, func(t *testing.T) {
got, err := models.IsRknIPBlocked(c.ip)
require.NoError(t, err)
assert.Equal(t, c.want, got, "ip=%s", c.ip)
})
}
}
func TestEnsureRknIndexes_Idempotent(t *testing.T) {
// Calling EnsureRknIndexes twice must not error — it's used both by
// Migrate() and could be called from boot scripts.
models.Drop()
models.Migrate()
require.NoError(t, models.EnsureRknIndexes())
require.NoError(t, models.EnsureRknIndexes())
// GiST index must exist on rkn_ips.network.
var exists bool
err := models.DB().Raw(`
SELECT EXISTS (
SELECT 1 FROM pg_indexes
WHERE schemaname='public' AND tablename='rkn_ips'
AND indexname='idx_rkn_ips_network'
)
`).Scan(&exists).Error
require.NoError(t, err)
assert.True(t, exists, "idx_rkn_ips_network must exist")
}