Files
Bridge-and-Join-s/internal/license/license_test.go
zuevav 9737c787f9 feat: живой цикл M2M с НРД + мастер установки ключа на флешку
Инфраструктура M2M (живой обмен с НРД через ИШ):
- обработка M2MTransferResponse: ERROR(M2Mxx) → заявка Отклонена, сохранение
  ответа; INFO → ждём Decision; идемпотентность поллера
- fallback-корреляция ответов с нулевым GUID (M2M14/M2M17) по FIFO
- сырой XML ответа НРД в карточке заявки (для пересылки в ТП)
- тестовый пакет роботу приведён к эталону m2m_robot_samples (CostInfo=Yes,
  4 бумаги, IsolationStatus, DocumentSeries=сценарий); override паспорта
- редирект из теста сразу в карточку заявки

Мастер установки ключа Валидаты на флешку (admin/setup/keywizard):
- пошаговый: загрузка .7z+пароль → выбор флешки → запись → справочник
  сертификатов (CRL) → перезапуск+проверка ИШ → готово
- привилегированный воркер (bj-keymedia) в host-namespace через файл-обмен,
  bj-server остаётся в песочнице
- сохранение структуры профиля архива (spr<N>), перечисление съёмных USB

Прочее:
- пакет-доказательство для ТП НРД + форма регистрации участника M2M
- эталонные образцы робота (DOC/m2m_robot_samples)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:03:21 +03:00

66 lines
1.8 KiB
Go

package license
import (
"crypto/ed25519"
"crypto/rand"
"testing"
"time"
)
func mkLicense(plan Plan, expires time.Time, feats ...string) *License {
return &License{
ID: "test-id", Tenant: "ООО Тест", Product: "bj-server",
Plan: plan, IssuedAt: time.Now().UTC().Add(-time.Hour),
ExpiresAt: expires, Features: feats,
}
}
func TestSignVerifyAndEncode(t *testing.T) {
pub, priv, _ := ed25519.GenerateKey(rand.Reader)
l := mkLicense(PlanPro, time.Now().Add(365*24*time.Hour), "updates")
tok, err := Sign(l, priv, "main")
if err != nil {
t.Fatal(err)
}
// round-trip через компактную строку
dec, err := DecodeToken(tok.Encode())
if err != nil {
t.Fatal(err)
}
got, err := Verify(dec, pub)
if err != nil {
t.Fatalf("Verify: %v", err)
}
if got.Tenant != l.Tenant || got.Plan != PlanPro || !got.AllowsUpdates() {
t.Fatalf("mismatch: %+v", got)
}
}
func TestExpired(t *testing.T) {
l := mkLicense(PlanPro, time.Now().Add(-time.Hour), "updates")
if err := l.Valid(time.Now().UTC()); err == nil {
t.Fatal("истёкшая лицензия прошла Valid")
}
}
func TestFeaturesAndEnterprise(t *testing.T) {
pro := mkLicense(PlanPro, time.Now().Add(time.Hour), "updates")
if !pro.HasFeature("updates") || pro.HasFeature("web-cabinet") {
t.Fatal("pro features неверны")
}
ent := mkLicense(PlanEnterprise, time.Now().Add(time.Hour))
if !ent.HasFeature("anything") || !ent.AllowsUpdates() {
t.Fatal("enterprise должен включать всё")
}
}
func TestVerifyRejectsWrongKey(t *testing.T) {
_, priv, _ := ed25519.GenerateKey(rand.Reader)
other, _, _ := ed25519.GenerateKey(rand.Reader)
l := mkLicense(PlanPro, time.Now().Add(time.Hour))
tok, _ := Sign(l, priv, "main")
if _, err := Verify(tok, other); err == nil {
t.Fatal("Verify принял подпись чужим ключом")
}
}