From fb7a42dbbbde50e0be8ac9fed037ddef14d3e578 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Thu, 5 Mar 2026 17:14:05 -0600 Subject: [PATCH] Add redcation test --- client/client.go | 19 ++++++++++-- tests/csapi/redact_test.go | 60 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 tests/csapi/redact_test.go diff --git a/client/client.go b/client/client.go index 0a1eb5ea..16d69e32 100644 --- a/client/client.go +++ b/client/client.go @@ -459,7 +459,7 @@ func (c *CSAPI) SendRedaction(t ct.TestLike, roomID string, content map[string]i return c.Do(t, "PUT", paths, WithJSONBody(t, content)) } -// MustGetStateEvent returns the event content for the given state event. Fails the test if the state event does not exist. +// MustGetStateEventContent returns the event content for the given state event. Fails the test if the state event does not exist. func (c *CSAPI) MustGetStateEventContent(t ct.TestLike, roomID, eventType, stateKey string) (content gjson.Result) { t.Helper() res := c.GetStateEventContent(t, roomID, eventType, stateKey) @@ -468,12 +468,27 @@ func (c *CSAPI) MustGetStateEventContent(t ct.TestLike, roomID, eventType, state return gjson.ParseBytes(body) } -// GetStateEvent returns the event content for the given state event. Use this form to detect absence via 404. +// GetStateEventContent returns the event content for the given state event. Use this form to detect absence via 404. func (c *CSAPI) GetStateEventContent(t ct.TestLike, roomID, eventType, stateKey string) *http.Response { t.Helper() return c.Do(t, "GET", []string{"_matrix", "client", "v3", "rooms", roomID, "state", eventType, stateKey}) } +// MustGetEvent returns the event content for the given state event. Fails the test if the state event does not exist. +func (c *CSAPI) MustGetEvent(t ct.TestLike, roomID, eventID string) (eventJson gjson.Result) { + t.Helper() + res := c.GetEvent(t, roomID, eventID) + mustRespond2xx(t, res) + body := ParseJSON(t, res) + return gjson.ParseBytes(body) +} + +// GetEvent returns the event JSON. Use this form to detect absence via 404. +func (c *CSAPI) GetEvent(t ct.TestLike, roomID, eventID string) *http.Response { + t.Helper() + return c.Do(t, "GET", []string{"_matrix", "client", "v3", "rooms", roomID, "event", eventID}) +} + // MustSendTyping marks this user as typing until the timeout is reached. If isTyping is false, timeout is ignored. func (c *CSAPI) MustSendTyping(t ct.TestLike, roomID string, isTyping bool, timeoutMillis int) { res := c.SendTyping(t, roomID, isTyping, timeoutMillis) diff --git a/tests/csapi/redact_test.go b/tests/csapi/redact_test.go new file mode 100644 index 00000000..184da0fb --- /dev/null +++ b/tests/csapi/redact_test.go @@ -0,0 +1,60 @@ +package csapi_tests + +import ( + "testing" + + "github.com/matrix-org/complement" + "github.com/matrix-org/complement/b" + "github.com/matrix-org/complement/helpers" + "github.com/matrix-org/complement/match" + "github.com/matrix-org/complement/must" +) + +// Test `PUT /_matrix/client/v3/rooms/{roomId}/redact/{eventId}/{txnId} ` (redactions) +func TestRedact(t *testing.T) { + deployment := complement.Deploy(t, 1) + defer deployment.Destroy(t) + + alice := deployment.Register(t, "hs1", helpers.RegistrationOpts{ + LocalpartSuffix: "alice", + }) + bob := deployment.Register(t, "hs1", helpers.RegistrationOpts{ + LocalpartSuffix: "bob", + }) + + // Alice creates the room + roomID := alice.MustCreateRoom(t, map[string]interface{}{ + // Just making it easier for everyone to join + "preset": "public_chat", + }) + // Bob joins the room + bob.MustJoinRoom(t, roomID, nil) + + t.Run("Event content is redacted", func(t *testing.T) { + // Alice creates an event + expectedEventContent := map[string]interface{}{ + "msgtype": "m.text", + "body": "expected message body", + } + eventIDToRedact := alice.SendEventSynced(t, roomID, b.Event{ + Type: "m.room.message", + Content:expectedEventContent, + }) + + // Bob can see the event content + eventJsonBefore := bob.MustGetEvent(t, roomID, eventIDToRedact) + must.MatchGJSON(t, eventJsonBefore, match.JSONKeyEqual("content", expectedEventContent)) + + // Alice redacts the event + alice.MustSendRedaction(t, roomID, map[string]interface{}{ + "reason": "reasons...", + }, eventIDToRedact) + + // Bob can no longer see the event content + eventJsonAfter := bob.MustGetEvent(t, roomID, eventIDToRedact) + must.MatchGJSON(t, eventJsonAfter, match.JSONKeyEqual("content", map[string]interface{}{ + // no content + })) + }) + +}