package crkn_test import ( "net" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "rocketgit.ru/rsmon/worker/app/models" "rocketgit.ru/rsmon/worker/checks/crkn" "rocketgit.ru/rsmon/worker/config/database" "rocketgit.ru/rsmon/worker/internal/netaddr" ) func init() { database.Init() } func TestPerform_DomainBlocked(t *testing.T) { models.Drop() models.Migrate() require.NoError(t, models.ReplaceRknDomains([]string{"blocked.example.com"})) monitor := &models.Monitor{Host: "blocked.example.com"} result := crkn.Perform(monitor) require.NotNil(t, result) assert.Equal(t, "ERR", result.State) assert.NotNil(t, result.Error) assert.Contains(t, result.Error.Error(), "RKN registry") assert.Contains(t, result.Warnings, "Resource is blocked in Russia according to RKN registry") } func TestPerform_DomainClean(t *testing.T) { models.Drop() models.Migrate() require.NoError(t, models.ReplaceRknDomains([]string{"blocked.example.com"})) monitor := &models.Monitor{Host: "clean.example.org"} result := crkn.Perform(monitor) require.NotNil(t, result) assert.Equal(t, "OK", result.State) assert.Nil(t, result.Error) assert.Contains(t, result.Infos, "Resource is not in RKN registry") } func TestPerform_DomainSuffixMatch(t *testing.T) { models.Drop() models.Migrate() require.NoError(t, models.ReplaceRknDomains([]string{"example.com"})) monitor := &models.Monitor{Host: "sub.example.com"} result := crkn.Perform(monitor) require.NotNil(t, result) assert.Equal(t, "ERR", result.State, "subdomain must match apex via IsRknDomainBlocked") } func TestPerform_IPBlocked(t *testing.T) { models.Drop() models.Migrate() _, network, err := net.ParseCIDR("10.5.5.0/24") require.NoError(t, err) require.NoError(t, models.ReplaceRknIPs([]*net.IPNet{network})) monitor := &models.Monitor{ Host: "clean.example.org", DNSRecords: []models.DNSRecord{ {Kind: "A", Name: "clean.example.org", Value: netaddr.Inet{Inet: net.ParseIP("10.5.5.7")}}, }, } result := crkn.Perform(monitor) require.NotNil(t, result) assert.Equal(t, "ERR", result.State) assert.NotNil(t, result.Error) assert.Contains(t, result.Error.Error(), "IP is contained in RKN registry") } func TestPerform_IPClean(t *testing.T) { models.Drop() models.Migrate() _, network, err := net.ParseCIDR("10.0.0.0/8") require.NoError(t, err) require.NoError(t, models.ReplaceRknIPs([]*net.IPNet{network})) monitor := &models.Monitor{ Host: "clean.example.org", DNSRecords: []models.DNSRecord{ {Kind: "A", Name: "clean.example.org", Value: netaddr.Inet{Inet: net.ParseIP("8.8.8.8")}}, }, } result := crkn.Perform(monitor) require.NotNil(t, result) assert.Equal(t, "OK", result.State) } func TestPerform_SkipsNonADNSRecords(t *testing.T) { models.Drop() models.Migrate() _, network, err := net.ParseCIDR("10.0.0.0/8") require.NoError(t, err) require.NoError(t, models.ReplaceRknIPs([]*net.IPNet{network})) monitor := &models.Monitor{ Host: "clean.example.org", DNSRecords: []models.DNSRecord{ {Kind: "CNAME", Name: "clean.example.org", Value: netaddr.Inet{Inet: net.ParseIP("10.5.5.7")}}, {Kind: "TXT", Name: "clean.example.org", Value: netaddr.Inet{Inet: net.ParseIP("10.5.5.7")}}, }, } result := crkn.Perform(monitor) require.NotNil(t, result) assert.Equal(t, "OK", result.State, "non-A/AAAA records must be skipped") } // TestPerform_FastReadOnly verifies the refactor removed the background // goroutine that previously triggered a remote data refresh on every // check — the call must return quickly and only depend on the local DB. func TestPerform_FastReadOnly(t *testing.T) { models.Drop() models.Migrate() require.NoError(t, models.ReplaceRknDomains([]string{"blocked.example.com"})) monitor := &models.Monitor{Host: "blocked.example.com"} result := crkn.Perform(monitor) require.NotNil(t, result) assert.Equal(t, "ERR", result.State) }