import { RelationType } from "../../src"; import { FilterComponent } from "../../src/filter-component"; import { mkEvent } from "../test-utils/test-utils"; describe("Filter Component", function () { describe("types", function () { it("should filter out events with other types", function () { const filter = new FilterComponent({ types: ["m.room.message"] }); const event = mkEvent({ type: "m.room.member", content: {}, room: "roomId", event: true, }); const checkResult = filter.check(event); expect(checkResult).toBe(false); }); it("should validate events with the same type", function () { const filter = new FilterComponent({ types: ["m.room.message"] }); const event = mkEvent({ type: "m.room.message", content: {}, room: "roomId", event: true, }); const checkResult = filter.check(event); expect(checkResult).toBe(true); }); it("should filter out events by relation participation", function () { const currentUserId = "@me:server.org"; const filter = new FilterComponent( { related_by_senders: [currentUserId], }, currentUserId, ); const threadRootNotParticipated = mkEvent({ type: "m.room.message", content: {}, room: "roomId", user: "@someone-else:server.org", event: true, unsigned: { "m.relations": { "m.thread": { count: 2, current_user_participated: false, }, }, }, }); expect(filter.check(threadRootNotParticipated)).toBe(false); }); it("should keep events by relation participation", function () { const currentUserId = "@me:server.org"; const filter = new FilterComponent( { related_by_senders: [currentUserId], }, currentUserId, ); const threadRootParticipated = mkEvent({ type: "m.room.message", content: {}, unsigned: { "m.relations": { "m.thread": { count: 2, current_user_participated: true, }, }, }, user: "@someone-else:server.org", room: "roomId", event: true, }); expect(filter.check(threadRootParticipated)).toBe(true); }); it("should filter out events by relation type", function () { const filter = new FilterComponent({ related_by_rel_types: ["m.thread"], }); const referenceRelationEvent = mkEvent({ type: "m.room.message", content: {}, room: "roomId", event: true, unsigned: { "m.relations": { [RelationType.Reference]: {}, }, }, }); expect(filter.check(referenceRelationEvent)).toBe(false); }); it("should keep events by relation type", function () { const filter = new FilterComponent({ related_by_rel_types: ["m.thread"], }); const threadRootEvent = mkEvent({ type: "m.room.message", content: {}, unsigned: { "m.relations": { "m.thread": { count: 2, current_user_participated: true, }, }, }, room: "roomId", event: true, }); const eventWithMultipleRelations = mkEvent({ type: "m.room.message", content: {}, unsigned: { "m.relations": { "testtesttest": {}, "m.annotation": { chunk: [ { type: "m.reaction", key: "🤫", count: 1, }, ], }, "m.thread": { count: 2, current_user_participated: true, }, }, }, room: "roomId", event: true, }); const noMatchEvent = mkEvent({ type: "m.room.message", content: {}, unsigned: { "m.relations": { testtesttest: {}, }, }, room: "roomId", event: true, }); expect(filter.check(threadRootEvent)).toBe(true); expect(filter.check(eventWithMultipleRelations)).toBe(true); expect(filter.check(noMatchEvent)).toBe(false); }); }); });