feat: sync ephemeral transient messages
Sync telesrv 570ccf8 (feat(ephemeral): implement Layer 228 transient messages). Skipped telesrv docs changes per public sync rules; normalized the public appearance seed label.
This commit is contained in:
parent
3f78eaa2c6
commit
f49c817def
53 changed files with 5793 additions and 112 deletions
60
internal/store/postgres/ephemeral_report_integration_test.go
Normal file
60
internal/store/postgres/ephemeral_report_integration_test.go
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
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)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue