diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/Event.java b/src/main/java/io/github/hikingc/matrixsdk/api/Event.java index cec5af7..2231d80 100644 --- a/src/main/java/io/github/hikingc/matrixsdk/api/Event.java +++ b/src/main/java/io/github/hikingc/matrixsdk/api/Event.java @@ -3,7 +3,6 @@ import io.github.hikingc.matrixsdk.api.events.*; import io.github.hikingc.matrixsdk.api.events.content.MessageEventContent; import io.github.hikingc.matrixsdk.api.events.content.StateEventContent; -import io.github.hikingc.matrixsdk.api.events.model.RoomMemberEvent; import io.github.hikingc.matrixsdk.api.events.queries.ChronologicalDirection; import io.github.hikingc.matrixsdk.api.events.queries.Membership; import io.github.hikingc.matrixsdk.api.events.queries.QueryParametersMessages; @@ -12,6 +11,7 @@ import io.github.hikingc.matrixsdk.api.identifiers.RoomID; import io.github.hikingc.matrixsdk.exceptions.MatrixIOException; import io.github.hikingc.matrixsdk.exceptions.MatrixNetworkException; +import io.github.hikingc.matrixsdk.api.events.model.RoomMemberEvent; import java.nio.file.Path; import java.util.List; @@ -33,9 +33,8 @@ public interface Event { /// @param roomId the room ID where the event is. /// @param eventId the event ID to retrieve. /// @return the full event. - /// @throws MatrixIOException when the payload cannot be processed. - /// @throws MatrixNetworkException when the response status is not successful. - ClientEvent getEvent(RoomID roomId, String eventId); + @SuppressWarnings("java:S1452") + ClientEvent getEvent(RoomID roomId, String eventId); /// Returns currently-joined members /// @@ -79,9 +78,7 @@ List getMembers( /// @throws MatrixIOException when the payload cannot be processed. /// @throws MatrixNetworkException when the response status is not successful. @SuppressWarnings("java:S1452") - // Caller doesn't know content type ahead of time; polymorphic dispatch via @JsonTypeInfo resolves - // it - ClientEvent getStateEvent(RoomID roomId, String eventType, String stateKey); + StateEvent getStateEvent(RoomID roomId, String eventType, String stateKey); /// Returns a list of message and state events for a room. It uses pagination query parameters to /// paginate history in the room. The content is not parsed or escaped which means newlines (`\n`) diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/EventID.java b/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/EventID.java new file mode 100644 index 0000000..f2d62cc --- /dev/null +++ b/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/EventID.java @@ -0,0 +1,67 @@ +package io.github.hikingc.matrixsdk.api.identifiers; + +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +/// This class allows for the representation and validation of an Event ID in Matrix. +/// +/// Their form is as follows: `$opaque_id`, some room versions include a `domain` component, whereas +/// more recent room versions omit the domain and use a base64-encoded hash instead. +/// +/// The length of a [EventID], including the `$` sigil, **MUST NOT** exceed 255 bytes. +/// +/// @see Event Identifiers as defined +/// in the specification +public final class EventID implements Validator { + private final String opaqueId; + + private EventID(String opaqueId) { + this.opaqueId = opaqueId; + } + + /// Builds and validates a [RoomID] + /// + /// @param rawRoomId the [String] to validate. + /// @return a [RoomID]. + /// @throws IllegalArgumentException if the [String] has broken a rule from the spec. + /// @throws NullPointerException if the [String] is null. + public static EventID parse(String rawRoomId) { + Objects.requireNonNull(rawRoomId, "Room ID" + " must not be null"); + + if (rawRoomId.getBytes(StandardCharsets.UTF_8).length > MAX_BYTES) { + throw new IllegalArgumentException("Event ID exceeds " + MAX_BYTES + " bytes"); + } + + if (rawRoomId.isEmpty()) { + throw new IllegalArgumentException("Event ID must not be empty"); + } + + if (rawRoomId.charAt(0) != '$') { + throw new IllegalArgumentException("Event ID must start with '$'"); + } + + if (rawRoomId.contentEquals("$")) { + throw new IllegalArgumentException("Event ID must not only contain '$'"); + } + + return new EventID(rawRoomId); + } + + @Override + public int hashCode() { + return Objects.hash(opaqueId); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (EventID) obj; + return Objects.equals(this.opaqueId, that.opaqueId); + } + + @Override + public String toString() { + return "$" + opaqueId; + } +} diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/RoomAlias.java b/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/RoomAlias.java index abccee4..4180e73 100644 --- a/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/RoomAlias.java +++ b/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/RoomAlias.java @@ -1,5 +1,7 @@ package io.github.hikingc.matrixsdk.api.identifiers; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import java.util.Objects; /// This class allows for the representation and validation of a Room Alias in Matrix. @@ -32,6 +34,7 @@ private RoomAlias(String opaqueId, String domain) { /// @return a [RoomAlias]. /// @throws IllegalArgumentException if the [String] has broken a rule from the spec. /// @throws NullPointerException if the [String] is null. + @JsonCreator public static RoomAlias parse(String rawAliasId) { Objects.requireNonNull(rawAliasId, "Alias ID" + " must not be null"); @@ -58,6 +61,7 @@ public boolean equals(Object obj) { } @Override + @JsonValue public String toString() { return "#" + opaqueId + ":" + domain; } diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/RoomID.java b/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/RoomID.java index c623a01..015031f 100644 --- a/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/RoomID.java +++ b/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/RoomID.java @@ -1,5 +1,7 @@ package io.github.hikingc.matrixsdk.api.identifiers; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import java.util.Objects; /// This class allows for the representation and validation of a Room Identifier in Matrix. @@ -32,6 +34,7 @@ private RoomID(String opaqueId, String domain) { /// @return a [RoomID]. /// @throws IllegalArgumentException if the [String] has broken a rule from the spec. /// @throws NullPointerException if the [String] is null. + @JsonCreator public static RoomID parse(String rawRoomId) { Objects.requireNonNull(rawRoomId, "Room ID" + " must not be null"); @@ -58,6 +61,7 @@ public boolean equals(Object obj) { } @Override + @JsonValue public String toString() { return "!" + opaqueId + ":" + domain; } diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/UserID.java b/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/UserID.java index 8616393..2a3c2d2 100644 --- a/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/UserID.java +++ b/src/main/java/io/github/hikingc/matrixsdk/api/identifiers/UserID.java @@ -1,5 +1,7 @@ package io.github.hikingc.matrixsdk.api.identifiers; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import java.util.Objects; /// This class allows for the representation and validation of a User Identifier in Matrix. @@ -30,6 +32,7 @@ private UserID(String opaqueId, String domain) { /// @return a [UserID]. /// @throws IllegalArgumentException if the [String] has broken a rule from the spec. /// @throws NullPointerException if the [String] is null. + @JsonCreator public static UserID parse(String rawUserId) { Objects.requireNonNull(rawUserId, "User ID" + " must not be null"); @@ -61,7 +64,8 @@ public boolean equals(Object obj) { } @Override + @JsonValue public String toString() { - return "!" + localpart + ":" + domain; + return "@" + localpart + ":" + domain; } } diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/rooms/RoomMembershipRequest.java b/src/main/java/io/github/hikingc/matrixsdk/api/rooms/RoomMembershipRequest.java index 03c76d8..ab83de0 100644 --- a/src/main/java/io/github/hikingc/matrixsdk/api/rooms/RoomMembershipRequest.java +++ b/src/main/java/io/github/hikingc/matrixsdk/api/rooms/RoomMembershipRequest.java @@ -1,12 +1,14 @@ package io.github.hikingc.matrixsdk.api.rooms; +import io.github.hikingc.matrixsdk.api.identifiers.UserID; + import java.util.Objects; /// This record represents the required values to be supplied to actions like banning or kicking. /// /// @param reason The reason of the expulsion, the target will receive this message. /// @param userId The id of the target to expel. -public record RoomMembershipRequest(String reason, String userId) { +public record RoomMembershipRequest(String reason, UserID userId) { /// Compact constructor designed to validate nullity. /// diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/rooms/ThirdPartySigned.java b/src/main/java/io/github/hikingc/matrixsdk/api/rooms/ThirdPartySigned.java index 84f1d43..cf9e7c8 100644 --- a/src/main/java/io/github/hikingc/matrixsdk/api/rooms/ThirdPartySigned.java +++ b/src/main/java/io/github/hikingc/matrixsdk/api/rooms/ThirdPartySigned.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Map; + +import io.github.hikingc.matrixsdk.api.identifiers.UserID; import org.jspecify.annotations.NullMarked; /// Holds information to supply the server and verify a `m.room.third_party_invite` event. @@ -12,7 +14,7 @@ /// @param token the state key of the `m.third_party_invite` event. @NullMarked public record ThirdPartySigned( - @JsonProperty(required = true) String mxid, - @JsonProperty(required = true) String sender, + @JsonProperty(required = true) UserID mxid, + @JsonProperty(required = true) UserID sender, @JsonProperty(required = true) Map> signatures, @JsonProperty(required = true) String token) {} diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/rooms/models/PublishedRoomsChunk.java b/src/main/java/io/github/hikingc/matrixsdk/api/rooms/models/PublishedRoomsChunk.java index 210e900..696bbd3 100644 --- a/src/main/java/io/github/hikingc/matrixsdk/api/rooms/models/PublishedRoomsChunk.java +++ b/src/main/java/io/github/hikingc/matrixsdk/api/rooms/models/PublishedRoomsChunk.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.github.hikingc.matrixsdk.api.Room; +import io.github.hikingc.matrixsdk.api.identifiers.RoomAlias; +import io.github.hikingc.matrixsdk.api.identifiers.RoomID; import io.github.hikingc.matrixsdk.api.identifiers.Validator; import java.net.URI; import java.util.List; @@ -25,12 +27,12 @@ /// additional values for a determinate room public record PublishedRoomsChunk( URI avatarUrl, - String canonicalAlias, + RoomAlias canonicalAlias, @JsonProperty(required = true) boolean guestCanJoin, String joinRule, String name, @JsonProperty(required = true) int numJoinedMembers, - @NonNull @JsonProperty(required = true) String roomId, + @NonNull @JsonProperty(required = true) RoomID roomId, String roomType, String topic, @JsonProperty(required = true) boolean worldReadable) {} diff --git a/src/main/java/io/github/hikingc/matrixsdk/api/rooms/models/ResolvedAlias.java b/src/main/java/io/github/hikingc/matrixsdk/api/rooms/models/ResolvedAlias.java index fc3d31e..fdc5610 100644 --- a/src/main/java/io/github/hikingc/matrixsdk/api/rooms/models/ResolvedAlias.java +++ b/src/main/java/io/github/hikingc/matrixsdk/api/rooms/models/ResolvedAlias.java @@ -1,9 +1,10 @@ package io.github.hikingc.matrixsdk.api.rooms.models; +import io.github.hikingc.matrixsdk.api.identifiers.RoomID; import java.util.List; /// This record contains data when resolving a room alias. /// /// @param roomId the room id for the room alias. /// @param servers a list of servers aware of said alias. -public record ResolvedAlias(String roomId, List servers) {} +public record ResolvedAlias(RoomID roomId, List servers) {} diff --git a/src/test/java/io/github/hikingc/matrixsdk/api/identifiers/EventIDTest.java b/src/test/java/io/github/hikingc/matrixsdk/api/identifiers/EventIDTest.java new file mode 100644 index 0000000..8f54e25 --- /dev/null +++ b/src/test/java/io/github/hikingc/matrixsdk/api/identifiers/EventIDTest.java @@ -0,0 +1,67 @@ +package io.github.hikingc.matrixsdk.api.identifiers; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EmptySource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; + +class EventIDTest { + + @ParameterizedTest(name = "[{index}] \"{0}\"") + @ValueSource( + strings = { + // v3+ reference-hash shape + "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "$Rqnc-F-dvnEYJTyHq_iKxU2bZ1CI9dSaz3jRoiQ-fXE", + "$acR1l0raRc2h8DzKlR4E9RAxwbrIY8v_4V-1kfBGCiA", + "$LWXstUyAjMr8vBiVjTMH_hEcnKMhc0zVi52gxHYzc-4", + "$1c-AYXvOG3AH0z9OTfHktZ4b6l3f1uK1Wv4h5CkQY9U", + // legacy v1/v2 shape + "$acR1l0raRc2h8DzKlR4E9RAxwbrIY8v_4V-1kfBGCiA:matrix.org", + "$event1:example.com", + "$143273582443PhrSn:example.org", + // opaque content is allowed to contain "unusual" characters per spec — + // clients must not impose structure beyond the sigil + "$acR1l0raRc2h8DzKlR4E9RAxwbrIY8v/4V+1kfBGCiA", // non-base64url chars, still opaque + "$has spaces in it", + "$has\nnewline", + "$emoji🎉event", + "$has\"quote", + "$ " // single space after sigil is still non-empty content + }) + void withValidStrings_ReturnEventID(String id) { + assertDoesNotThrow(() -> EventID.parse(id), "Exception not expected for input: " + id); + } + + @ParameterizedTest(name = "[{index}] \"{0}\"") + @ValueSource( + strings = { + "acR1l0raRc2h8DzKlR4E9RAxwbrIY8v_4V-1kfBGCiA", // missing sigil + "@acR1l0raRc2h8DzKlR4E9RAxwbrIY8v_4V-1kfBGCiA", // wrong sigil (User ID) + "!acR1l0raRc2h8DzKlR4E9RAxwbrIY8v_4V-1kfBGCiA", // wrong sigil (Room ID) + "#acR1l0raRc2h8DzKlR4E9RAxwbrIY8v_4V-1kfBGCiA", // wrong sigil (Room Alias) + " ", // no sigil at all, just whitespace + "$" // sigil present but zero content after it + }) + void withInvalidStrings_ThrowsException(String id) { + assertThrows( + IllegalArgumentException.class, + () -> EventID.parse(id), + "Exception expected for input: " + id); + } + + @ParameterizedTest + @NullSource + void withNull_ThrowsException(String id) { + assertThrows(NullPointerException.class, () -> EventID.parse(id)); + } + + @ParameterizedTest + @EmptySource + void withEmpty_ThrowsException(String id) { + assertThrows(IllegalArgumentException.class, () -> EventID.parse(id)); + } +} diff --git a/src/test/java/io/github/hikingc/matrixsdk/services/events/EventServiceTest.java b/src/test/java/io/github/hikingc/matrixsdk/services/events/EventServiceTest.java index 970219b..7d59e23 100644 --- a/src/test/java/io/github/hikingc/matrixsdk/services/events/EventServiceTest.java +++ b/src/test/java/io/github/hikingc/matrixsdk/services/events/EventServiceTest.java @@ -9,7 +9,9 @@ import com.github.tomakehurst.wiremock.junit5.WireMockTest; import io.github.hikingc.matrixsdk.api.MatrixClient; import io.github.hikingc.matrixsdk.api.events.*; +import io.github.hikingc.matrixsdk.api.events.content.RoomJoinRules; import io.github.hikingc.matrixsdk.api.events.content.RoomMessage; +import io.github.hikingc.matrixsdk.api.events.content.StateEventContent; import io.github.hikingc.matrixsdk.api.events.content.roommessages.FileContent; import io.github.hikingc.matrixsdk.api.events.content.roommessages.TextContent; import io.github.hikingc.matrixsdk.api.events.queries.ChronologicalDirection; @@ -538,7 +540,9 @@ void getInitialSync_WithACorrectPayload_ThenReturnRoomInfo() { @Test void sendStateEvent_WithACorrectPayload_ThenReturnAString() { - // TODO pending interface to confirm fields to assert + StateEventContent content = new RoomJoinRules(new RoomJoinRules.AllowCondition("EXAMPLE","TYPE"),"JOINRULE"); + var response = client.events().sendStateEvent(ROOM_ID,"",content); + assertThat(response).isNotNull(); } @Test diff --git a/src/test/java/io/github/hikingc/matrixsdk/services/rooms/RoomServiceTest.java b/src/test/java/io/github/hikingc/matrixsdk/services/rooms/RoomServiceTest.java index d0a4762..e303c83 100644 --- a/src/test/java/io/github/hikingc/matrixsdk/services/rooms/RoomServiceTest.java +++ b/src/test/java/io/github/hikingc/matrixsdk/services/rooms/RoomServiceTest.java @@ -9,6 +9,7 @@ import io.github.hikingc.matrixsdk.api.events.content.RoomPowerLevels; import io.github.hikingc.matrixsdk.api.identifiers.RoomAlias; import io.github.hikingc.matrixsdk.api.identifiers.RoomID; +import io.github.hikingc.matrixsdk.api.identifiers.UserID; import io.github.hikingc.matrixsdk.api.identifiers.Validator; import io.github.hikingc.matrixsdk.api.rooms.*; import io.github.hikingc.matrixsdk.api.rooms.queries.CreationRoomType; @@ -17,7 +18,6 @@ import io.github.hikingc.matrixsdk.context.DiscoveryResponse; import java.util.List; import java.util.Map; - import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -26,6 +26,7 @@ class RoomServiceTest { private static final RoomID ROOM_ID = RoomID.parse("!ekkTuJPNWnbuCJHvYB:kde.org"); + private static final UserID USER_ID = UserID.parse("@example:example.com"); private static final String AUTH_TOKEN = "1234"; private static MatrixClient client; private static DiscoveryResponse DISCOVERY_RESPONSE; @@ -116,51 +117,40 @@ void sendCreateRequest_WithACorrectPayload_thenReturnARoomId() { { "room_id": "%s" } """ .formatted(expectedRoomId)))); - InitialRoomConfiguration config = new InitialRoomConfiguration( + InitialRoomConfiguration config = + new InitialRoomConfiguration( new InitialRoomConfiguration.CreationContent(false), // m.federate: false List.of( - new InitialRoomConfiguration.StateEvent( - Map.of("join_rule", "public"), - "", - "m.room.join_rules"), - new InitialRoomConfiguration.StateEvent( - Map.of("history_visibility", "shared"), - "", - "m.room.history_visibility") - ), + new InitialRoomConfiguration.StateEvent( + Map.of("join_rule", "public"), "", "m.room.join_rules"), + new InitialRoomConfiguration.StateEvent( + Map.of("history_visibility", "shared"), "", "m.room.history_visibility")), List.of("@alice:example.com", "@bob:example.com"), List.of( - new InitialRoomConfiguration.Invite3pid( - "alice@example.com", - "abc123_OpaqueString", - "identity.example.com", - "email") - ), + new InitialRoomConfiguration.Invite3pid( + "alice@example.com", "abc123_OpaqueString", "identity.example.com", "email")), false, // is_direct "The Grand Duke Pub", new RoomPowerLevels( - 50, // ban - Map.of( - "m.room.name", 50, - "m.room.power_levels", 100 - ), // events - 0, // eventsDefault - 0, // invite - 50, // kick - null, // notifications — not present in source JSON - 50, // redact - 50, // stateDefault - Map.of("@alice:example.com", 100), // users - 0 // users_default - ), + 50, // ban + Map.of( + "m.room.name", 50, + "m.room.power_levels", 100), // events + 0, // eventsDefault + 0, // invite + 50, // kick + null, // notifications — not present in source JSON + 50, // redact + 50, // stateDefault + Map.of("@alice:example.com", 100), // users + 0 // users_default + ), CreationRoomType.PRIVATE_CHAT, "thepub", "11", "All about happy hour", - VisibilityRoomType.PRIVATE - ); - var response = - client.room().create(config); + VisibilityRoomType.PRIVATE); + var response = client.room().create(config); assertEquals(expectedRoomId, response); } @@ -209,7 +199,7 @@ void sendResolveAliasRequest_WithCorrectPayload_thenReturnResolvedAlias() { var response = client.room().resolveAlias(alias); assertNotNull(response); - assertEquals(ROOM_ID.toString(), response.roomId()); + assertEquals(ROOM_ID, response.roomId()); assertFalse(response.servers().isEmpty()); } @@ -286,7 +276,8 @@ void sendInviteRequest_WithCorrectPayload_thenHitCorrectEndpoint() { true)) .willReturn(okJson("{}"))); - client.room().inviteUser(ROOM_ID, new RoomMembershipRequest("Welcome!", "@alice:example.com")); + client.room().inviteUser( + ROOM_ID, new RoomMembershipRequest("Welcome!", UserID.parse("@alice:example.com"))); verify(postRequestedFor(urlEqualTo("/_matrix/client/v3/rooms/" + ROOM_ID + "/invite"))); } @@ -373,14 +364,14 @@ void sendKickRequest_WithCorrectPayload_thenHitCorrectEndpoint() { """ { "reason": "Test reason", - "user_id": "user" + "user_id": "@example:example.com" } """, true, true)) .willReturn(okJson("{}"))); - client.room().kick(ROOM_ID, new RoomMembershipRequest("Test reason", "user")); + client.room().kick(ROOM_ID, new RoomMembershipRequest("Test reason", USER_ID)); verify(postRequestedFor(urlEqualTo("/_matrix/client/v3/rooms/" + ROOM_ID + "/kick"))); } @@ -394,14 +385,14 @@ void sendBanRequest_WithCorrectPayload_thenHitCorrectEndpoint() { """ { "reason": "Test reason", - "user_id": "user" + "user_id": "@example:example.com" } """, true, true)) .willReturn(okJson("{}"))); - client.room().ban(ROOM_ID, new RoomMembershipRequest("Test reason", "user")); + client.room().ban(ROOM_ID, new RoomMembershipRequest("Test reason", USER_ID)); verify(postRequestedFor(urlEqualTo("/_matrix/client/v3/rooms/" + ROOM_ID + "/ban"))); } @@ -415,14 +406,14 @@ void sendUnbanRequest_WithCorrectPayload_thenHitCorrectEndpoint() { """ { "reason": "Test reason", - "user_id": "user" + "user_id": "@example:example.com" } """, true, true)) .willReturn(okJson("{}"))); - client.room().unban(ROOM_ID, new RoomMembershipRequest("Test reason", "user")); + client.room().unban(ROOM_ID, new RoomMembershipRequest("Test reason", USER_ID)); verify(postRequestedFor(urlEqualTo("/_matrix/client/v3/rooms/" + ROOM_ID + "/unban"))); } @@ -488,7 +479,7 @@ void sendGetPublicRoomDirRequest_WithQueryParams_thenReturnDirectory() { assertNotNull(response); assertNotNull(response.chunk()); - assertEquals("!abc123:example.com", response.chunk().getFirst().roomId()); + assertEquals(RoomID.parse("!abc123:example.com"), response.chunk().getFirst().roomId()); assertEquals("General", response.chunk().getFirst().name()); assertEquals(1, response.totalRoomCountEstimate()); } @@ -520,7 +511,7 @@ void sendGetPublicRoomDirPostRequest_WithBody_thenReturnDirectory() { assertNotNull(response); assertFalse(response.chunk().isEmpty()); - assertEquals("!abc123:example.com", response.chunk().getFirst().roomId()); + assertEquals(RoomID.parse("!abc123:example.com"), response.chunk().getFirst().roomId()); } @Test diff --git a/src/test/java/io/github/hikingc/matrixsdk/services/userdata/UserDataServiceTest.java b/src/test/java/io/github/hikingc/matrixsdk/services/userdata/UserDataServiceTest.java index bf0e8d2..bafe5ce 100644 --- a/src/test/java/io/github/hikingc/matrixsdk/services/userdata/UserDataServiceTest.java +++ b/src/test/java/io/github/hikingc/matrixsdk/services/userdata/UserDataServiceTest.java @@ -40,18 +40,21 @@ void searchUsersByTerm() { .willReturn( okJson( """ - { - "results": [ - {"user_id": "@searchterm:matrix.org", "display_name": "Search Term"} - ], - "limited": false - } - """))); + { + "results": [ + {"user_id": "@user:example.com", "display_name": "Search Term"} + ], + "limited": false + } + """))); var results = client.userData().searchUsersByTerm(10, "searchterm"); assertThat(results).isNotNull(); assertThat(results.results()).hasSize(1); + assertThat(results.results().getFirst().userId()).isEqualTo(USER_ID); + assertThat(results.results().getFirst().displayName()).isEqualTo("Search Term"); + assertThat(results.limited()).isFalse(); } @Test