Ctrl K
ComunidadGuías…

internal/store/postgres/ephemeral_report_integration_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package postgres

import (
	"context"
	"encoding/json"
	"testing"
	"time"

	"telesrv/internal/domain"
)

func TestEphemeralReportStoreDurableEvidenceAndIdempotency(t *testing.T) {
	pool := testPool(t)
	ctx := context.Background()
	now := time.Now()
	reporter := now.UnixNano()&0x3fffffff + 1000
	sender := reporter + 1
	messageID := int(now.UnixNano()&0x3fffffff) + 1
	message := domain.EphemeralMessage{
		ID: messageID, Peer: domain.Peer{Type: domain.PeerTypeChannel, ID: reporter + 2},
		SenderUserID: sender, ReceiverUserID: reporter, Date: int(now.Unix()), RandomID: 99,
		Content:      domain.EphemeralContent{Message: "abuse evidence"},
		OriginDevice: domain.EphemeralDevice{UserID: reporter, BusinessAuthKeyID: [8]byte{1, 2, 3}, SessionID: 44},
		Version:      1, CreatedAt: now, ExpiresAt: now.Add(domain.EphemeralMessageRetention),
	}
	report := domain.NewEphemeralAbuseReport(reporter, "spam", "review this", message, now)
	store := NewEphemeralReportStore(pool)
	created, err := store.CreateEphemeralReport(ctx, report)
	if err != nil || !created {
		t.Fatalf("create=%v err=%v", created, err)
	}
	t.Cleanup(func() {
		_, _ = pool.Exec(ctx, "DELETE FROM ephemeral_abuse_reports WHERE reporter_user_id = $1", reporter)
	})
	if created, err := store.CreateEphemeralReport(ctx, report); err != nil || created {
		t.Fatalf("retry create=%v err=%v", created, err)
	}
	var evidenceRaw []byte
	var count int
	if err := pool.QueryRow(ctx, `
SELECT evidence, count(*) OVER ()
FROM ephemeral_abuse_reports
WHERE reporter_user_id = $1 AND channel_id = $2 AND ephemeral_message_id = $3
`, reporter, message.Peer.ID, message.ID).Scan(&evidenceRaw, &count); err != nil {
		t.Fatal(err)
	}
	if count != 1 {
		t.Fatalf("rows=%d", count)
	}
	var evidence map[string]any
	if err := json.Unmarshal(evidenceRaw, &evidence); err != nil {
		t.Fatal(err)
	}
	if evidence["MessageID"] != float64(message.ID) || evidence["Content"] == nil {
		t.Fatalf("evidence=%s", evidenceRaw)
	}
	if _, leaked := evidence["OriginDevice"]; leaked {
		t.Fatalf("device identity leaked into report evidence: %s", evidenceRaw)
	}
}