package user import ( "context" "testing" "time" "hyapp/pkg/appcode" userdomain "hyapp/services/user-service/internal/domain/user" ) func TestSubmitReportAcceptsExactlyOneTarget(t *testing.T) { repository := &fakeModerationRepository{} svc := New(repository, WithClock(func() time.Time { return time.UnixMilli(1_778_000_000_000).UTC() })) ctx := appcode.WithContext(context.Background(), "lalu") report, err := svc.SubmitReport(ctx, 10001, 10002, "", " Pornography ", " reason ", []string{" https://cdn.example.com/report.png "}, "req-report") if err != nil { t.Fatalf("SubmitReport failed: %v", err) } if report.ReportID == "" || report.TargetType != userdomain.ReportTargetUser || report.ReportType != "pornography" || report.Reason != "reason" || len(report.ImageURLs) != 1 { t.Fatalf("report normalization mismatch: %+v", report) } if repository.lastReport.ReporterUserID != 10001 || repository.lastReport.UserID != 10002 || repository.lastReport.RequestID != "req-report" || repository.lastReport.CreatedAtMs != 1_778_000_000_000 { t.Fatalf("repository report mismatch: %+v", repository.lastReport) } } func TestSubmitReportRejectsMissingOrMixedTarget(t *testing.T) { svc := New(&fakeModerationRepository{}) ctx := appcode.WithContext(context.Background(), "lalu") tests := []struct { name string userID int64 roomID string }{ {name: "missing target"}, {name: "mixed target", userID: 10002, roomID: "room_1"}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { if _, err := svc.SubmitReport(ctx, 10001, test.userID, test.roomID, "fraud", "", nil, "req-report"); err == nil { t.Fatalf("SubmitReport must reject target combination user=%d room=%q", test.userID, test.roomID) } }) } }