owpengram-server/internal/app/authdiagnostics/service_test.go
2026-07-24 11:56:59 +08:00

81 lines
2.7 KiB
Go

package authdiagnostics
import (
"context"
"crypto/sha256"
"errors"
"testing"
"time"
"telesrv/internal/domain"
"telesrv/internal/store"
"telesrv/internal/store/memory"
)
func TestReportMissingCodeValidatesLiveDeliveryAndStoresOnlyHashes(t *testing.T) {
ctx := context.Background()
codes := memory.NewCodeStore()
reports := memory.NewAuthDeliveryReportStore()
const (
phone = "15550001234"
codeHash = "login-code-hash"
)
if err := codes.Set(ctx, codeHash, store.PhoneCode{
Version: store.PhoneCodeVersionCurrent, Phone: phone, Code: "12345",
DeliveryID: "delivery-1", Channel: store.PhoneCodeChannelSMS,
IssuedUserID: 42,
}, time.Hour); err != nil {
t.Fatal(err)
}
service := NewService(codes, reports)
now := time.Now().UTC()
req := domain.AuthMissingCodeReportRequest{
AuthKeyID: [8]byte{1, 2, 3}, SessionID: 99, ClientType: "tdesktop",
Phone: "+1 (555) 000-1234", PhoneCodeHash: codeHash, MNC: "46000",
CreatedAt: now,
}
first, created, err := service.ReportMissingCode(ctx, req)
if err != nil || !created {
t.Fatalf("first report created=%v err=%v", created, err)
}
second, created, err := service.ReportMissingCode(ctx, req)
if err != nil || created || second.ID != first.ID {
t.Fatalf("retry report=%+v created=%v err=%v", second, created, err)
}
stored := reports.Reports()
if len(stored) != 1 {
t.Fatalf("stored reports=%d, want 1", len(stored))
}
if stored[0].PhoneHash != sha256.Sum256([]byte(phone)) ||
stored[0].CodeHash != sha256.Sum256([]byte(codeHash)) {
t.Fatalf("stored hashes do not match normalized delivery identity: %+v", stored[0])
}
if stored[0].DeliveryID != "delivery-1" || stored[0].IssuedUserID != 42 ||
stored[0].Channel != domain.AuthCodeDeliverySMS {
t.Fatalf("stored delivery metadata=%+v", stored[0])
}
}
func TestReportMissingCodeRejectsUnknownOrMismatchedLoginState(t *testing.T) {
ctx := context.Background()
codes := memory.NewCodeStore()
service := NewService(codes, memory.NewAuthDeliveryReportStore())
now := time.Now().UTC()
base := domain.AuthMissingCodeReportRequest{
AuthKeyID: [8]byte{1}, SessionID: 10, Phone: "15550002222",
PhoneCodeHash: "missing", CreatedAt: now,
}
if _, _, err := service.ReportMissingCode(ctx, base); !errors.Is(err, domain.ErrPhoneCodeExpired) {
t.Fatalf("missing hash err=%v, want phone-code expired", err)
}
if err := codes.Set(ctx, "current", store.PhoneCode{
Version: store.PhoneCodeVersionCurrent, Phone: "15550003333",
Channel: store.PhoneCodeChannelPhone,
}, time.Hour); err != nil {
t.Fatal(err)
}
base.PhoneCodeHash = "current"
if _, _, err := service.ReportMissingCode(ctx, base); !errors.Is(err, domain.ErrPhoneCodeInvalid) {
t.Fatalf("mismatched phone err=%v, want phone-code invalid", err)
}
}