From 429bd73877dc9fe8c2e10531a8f63b8e1cd10333 Mon Sep 17 00:00:00 2001 From: Marius Kleidl Date: Wed, 5 Nov 2025 09:03:53 +0100 Subject: [PATCH 1/6] feat: add hide_history_before option when adding members --- src/main/java/io/getstream/chat/java/models/Channel.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/io/getstream/chat/java/models/Channel.java b/src/main/java/io/getstream/chat/java/models/Channel.java index ea31bc30b..78cb4344d 100644 --- a/src/main/java/io/getstream/chat/java/models/Channel.java +++ b/src/main/java/io/getstream/chat/java/models/Channel.java @@ -601,6 +601,10 @@ public static class ChannelUpdateRequestData { @JsonProperty("hide_history") private Boolean hideHistory; + @Nullable + @JsonProperty("hide_history_before") + private Date hideHistoryBefore; + @Nullable @JsonProperty("data") private ChannelRequestObject data; From 27e2ee68d2700b22c1fa99635a5b0663fa9f64a7 Mon Sep 17 00:00:00 2001 From: Marius Kleidl Date: Wed, 5 Nov 2025 18:58:28 +0100 Subject: [PATCH 2/6] Test serialization of hideHistoryBefore --- .../io/getstream/chat/java/ChannelTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/test/java/io/getstream/chat/java/ChannelTest.java b/src/test/java/io/getstream/chat/java/ChannelTest.java index 373c4dc5a..196fc06f0 100644 --- a/src/test/java/io/getstream/chat/java/ChannelTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelTest.java @@ -1,5 +1,9 @@ package io.getstream.chat.java; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.util.StdDateFormat; import io.getstream.chat.java.models.Channel; import io.getstream.chat.java.models.Channel.*; import io.getstream.chat.java.models.DeleteStrategy; @@ -9,9 +13,13 @@ import io.getstream.chat.java.models.User; import io.getstream.chat.java.models.User.ChannelMute; import java.util.Arrays; +import java.util.Calendar; import java.util.Date; +import java.util.GregorianCalendar; import java.util.List; +import java.util.TimeZone; import java.util.stream.Collectors; + import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -640,4 +648,30 @@ void whenMarkingDeliveredWithLastDeliveredMessages_thenNoException() { .latestDeliveredMessages(latestDeliveredMessages) .request()); } + + @DisplayName("ChannelUpdateRequestData should serialize hide_history_before field correctly") + @Test + void whenSerializingChannelUpdateRequestWithHideHistoryBefore_thenFieldIsIncluded() { + // Same object mapper as in DefaultClient + final ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); + mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + mapper.setDateFormat( + new StdDateFormat().withColonInTimeZone(true).withTimeZone(TimeZone.getTimeZone("UTC"))); + + Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + calendar.set(2025, Calendar.DECEMBER, 31, 15, 30, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date testDate = calendar.getTime(); + var updateRequest = + Channel.update("messaging", "test-channel") + .hideHistoryBefore(testDate) + .internalBuild(); + + String json = Assertions.assertDoesNotThrow(() -> mapper.writeValueAsString(updateRequest)); + + Assertions.assertTrue( + json.contains("\"hide_history_before\":\"2025-12-31T15:30:00.000+00:00\""), + "JSON should contain hide_history_before field with RFC3339-formatted value"); + } } From 1539a98d7021dc78a6d9447532d3415459c2366d Mon Sep 17 00:00:00 2001 From: Marius Kleidl Date: Thu, 6 Nov 2025 12:14:16 +0100 Subject: [PATCH 3/6] Add proper test --- .../io/getstream/chat/java/ChannelTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/test/java/io/getstream/chat/java/ChannelTest.java b/src/test/java/io/getstream/chat/java/ChannelTest.java index 196fc06f0..92fb1daab 100644 --- a/src/test/java/io/getstream/chat/java/ChannelTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelTest.java @@ -12,6 +12,7 @@ import io.getstream.chat.java.models.Sort.Direction; import io.getstream.chat.java.models.User; import io.getstream.chat.java.models.User.ChannelMute; +import io.getstream.chat.java.models.User.UserRequestObject; import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -674,4 +675,45 @@ void whenSerializingChannelUpdateRequestWithHideHistoryBefore_thenFieldIsInclude json.contains("\"hide_history_before\":\"2025-12-31T15:30:00.000+00:00\""), "JSON should contain hide_history_before field with RFC3339-formatted value"); } + + @DisplayName("hide_messages_before is set when adding member with hide_history_before") + @Test + void whenAddingMemberWithHideHistoryBefore_thenHideMessagesBeforeIsSet() { + // Create new test user + UserRequestObject newMember = + UserRequestObject.builder() + .id(RandomStringUtils.randomAlphabetic(10)) + .name("New Member 1") + .build(); + + Assertions.assertDoesNotThrow( + () -> User.upsert().user(newMember).request()); + + // Create a static timestamp for hide_history_before + Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + calendar.set(2025, Calendar.JANUARY, 15, 10, 30, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date hideBeforeTimestamp = calendar.getTime(); + + // Add ember with hide_history_before + Assertions.assertDoesNotThrow( + () -> + Channel.update(testChannel.getType(), testChannel.getId()) + .addMember(newMember.getId()) + .hideHistoryBefore(hideBeforeTimestamp) + .request()); + + // Query channel with state for newMember - should have hide_messages_before set + String userToken = User.createToken(newMember.getId(), null, null); + ChannelGetResponse channelResponse = + Assertions.assertDoesNotThrow( + () -> + Channel.getOrCreate(testChannel.getType(), testChannel.getId()) + .state(true) + .withUserToken(userToken) + .request()); + + Assertions.assertNotNull(channelResponse.getHideMessagesBefore()); + Assertions.assertEquals(hideBeforeTimestamp, channelResponse.getHideMessagesBefore()); + } } From ec2189cedb2d73b35de8de13521b8a0e6dfd20ae Mon Sep 17 00:00:00 2001 From: Marius Kleidl Date: Thu, 6 Nov 2025 12:15:42 +0100 Subject: [PATCH 4/6] Remove serialization test --- .../io/getstream/chat/java/ChannelTest.java | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/test/java/io/getstream/chat/java/ChannelTest.java b/src/test/java/io/getstream/chat/java/ChannelTest.java index 92fb1daab..dc3f76143 100644 --- a/src/test/java/io/getstream/chat/java/ChannelTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelTest.java @@ -1,9 +1,5 @@ package io.getstream.chat.java; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.util.StdDateFormat; import io.getstream.chat.java.models.Channel; import io.getstream.chat.java.models.Channel.*; import io.getstream.chat.java.models.DeleteStrategy; @@ -650,32 +646,6 @@ void whenMarkingDeliveredWithLastDeliveredMessages_thenNoException() { .request()); } - @DisplayName("ChannelUpdateRequestData should serialize hide_history_before field correctly") - @Test - void whenSerializingChannelUpdateRequestWithHideHistoryBefore_thenFieldIsIncluded() { - // Same object mapper as in DefaultClient - final ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); - mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); - mapper.setDateFormat( - new StdDateFormat().withColonInTimeZone(true).withTimeZone(TimeZone.getTimeZone("UTC"))); - - Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC")); - calendar.set(2025, Calendar.DECEMBER, 31, 15, 30, 0); - calendar.set(Calendar.MILLISECOND, 0); - Date testDate = calendar.getTime(); - var updateRequest = - Channel.update("messaging", "test-channel") - .hideHistoryBefore(testDate) - .internalBuild(); - - String json = Assertions.assertDoesNotThrow(() -> mapper.writeValueAsString(updateRequest)); - - Assertions.assertTrue( - json.contains("\"hide_history_before\":\"2025-12-31T15:30:00.000+00:00\""), - "JSON should contain hide_history_before field with RFC3339-formatted value"); - } - @DisplayName("hide_messages_before is set when adding member with hide_history_before") @Test void whenAddingMemberWithHideHistoryBefore_thenHideMessagesBeforeIsSet() { From fe9648fa7f87a2ee050365f2f83dabb4a4e175be Mon Sep 17 00:00:00 2001 From: Marius Kleidl Date: Thu, 6 Nov 2025 12:18:51 +0100 Subject: [PATCH 5/6] Create separate channel for test --- src/test/java/io/getstream/chat/java/ChannelTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/io/getstream/chat/java/ChannelTest.java b/src/test/java/io/getstream/chat/java/ChannelTest.java index dc3f76143..8d5d0e90c 100644 --- a/src/test/java/io/getstream/chat/java/ChannelTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelTest.java @@ -656,8 +656,10 @@ void whenAddingMemberWithHideHistoryBefore_thenHideMessagesBeforeIsSet() { .name("New Member 1") .build(); - Assertions.assertDoesNotThrow( - () -> User.upsert().user(newMember).request()); + Assertions.assertDoesNotThrow(() -> User.upsert().user(newMember).request()); + + // Create test channel + Channel channel = Assertions.assertDoesNotThrow(() -> createRandomChannel()).getChannel(); // Create a static timestamp for hide_history_before Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC")); @@ -668,7 +670,7 @@ void whenAddingMemberWithHideHistoryBefore_thenHideMessagesBeforeIsSet() { // Add ember with hide_history_before Assertions.assertDoesNotThrow( () -> - Channel.update(testChannel.getType(), testChannel.getId()) + Channel.update(channel.getType(), channel.getId()) .addMember(newMember.getId()) .hideHistoryBefore(hideBeforeTimestamp) .request()); @@ -678,7 +680,7 @@ void whenAddingMemberWithHideHistoryBefore_thenHideMessagesBeforeIsSet() { ChannelGetResponse channelResponse = Assertions.assertDoesNotThrow( () -> - Channel.getOrCreate(testChannel.getType(), testChannel.getId()) + Channel.getOrCreate(channel.getType(), channel.getId()) .state(true) .withUserToken(userToken) .request()); From 49658e13203f38a821dabe640c34863e0fd5b482 Mon Sep 17 00:00:00 2001 From: Marius Kleidl Date: Thu, 6 Nov 2025 12:20:31 +0100 Subject: [PATCH 6/6] Fix lint --- src/test/java/io/getstream/chat/java/ChannelTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/io/getstream/chat/java/ChannelTest.java b/src/test/java/io/getstream/chat/java/ChannelTest.java index 8d5d0e90c..8cff6063b 100644 --- a/src/test/java/io/getstream/chat/java/ChannelTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelTest.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.TimeZone; import java.util.stream.Collectors; - import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName;