From 1fd1ee3030276449722c4c515796dfaedd274d84 Mon Sep 17 00:00:00 2001 From: nick avlo Date: Mon, 24 Feb 2025 16:40:55 -0800 Subject: [PATCH 1/3] hashtag tag filter --- .../nostr/event/filter/HashtagTagFilter.java | 32 ++++++++++++ .../event/json/codec/FilterableProvider.java | 3 ++ .../java/nostr/test/event/ApiEventTest.java | 26 ++++++++++ .../test/filters/FiltersDecoderTest.java | 32 ++++++++++++ .../test/filters/FiltersEncoderTest.java | 38 ++++++++++++-- .../java/nostr/test/json/JsonParseTest.java | 51 +++++++++++++++++-- 6 files changed, 174 insertions(+), 8 deletions(-) create mode 100644 nostr-java-event/src/main/java/nostr/event/filter/HashtagTagFilter.java diff --git a/nostr-java-event/src/main/java/nostr/event/filter/HashtagTagFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/HashtagTagFilter.java new file mode 100644 index 000000000..87c2d38ae --- /dev/null +++ b/nostr-java-event/src/main/java/nostr/event/filter/HashtagTagFilter.java @@ -0,0 +1,32 @@ +package nostr.event.filter; + +import lombok.EqualsAndHashCode; +import nostr.event.impl.GenericEvent; +import nostr.event.tag.HashtagTag; + +import java.util.function.Predicate; + +@EqualsAndHashCode(callSuper = true) +public class HashtagTagFilter extends AbstractFilterable { + public final static String FILTER_KEY = "#t"; + + public HashtagTagFilter(T hashtagTag) { + super(hashtagTag, FILTER_KEY); + } + + @Override + public Predicate getPredicate() { + return (genericEvent) -> + getTypeSpecificTags(HashtagTag.class, genericEvent).stream().anyMatch(hashtagTag -> + hashtagTag.getHashTag().equals(getFilterableValue())); + } + + @Override + public String getFilterableValue() { + return getHashtagTag().getHashTag(); + } + + private T getHashtagTag() { + return super.getFilterable(); + } +} diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java index b3792eabf..322d4e953 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java @@ -10,6 +10,7 @@ import nostr.event.filter.Filterable; import nostr.event.filter.GenericTagQueryFilter; import nostr.event.filter.GeohashTagFilter; +import nostr.event.filter.HashtagTagFilter; import nostr.event.filter.IdentifierTagFilter; import nostr.event.filter.KindFilter; import nostr.event.filter.ReferencedEventFilter; @@ -19,6 +20,7 @@ import nostr.event.impl.GenericEvent; import nostr.event.tag.EventTag; import nostr.event.tag.GeohashTag; +import nostr.event.tag.HashtagTag; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PubKeyTag; @@ -34,6 +36,7 @@ protected static List getFilterable(String type, JsonNode node) { case AddressableTagFilter.FILTER_KEY -> getFilterable(node, addressableTag -> new AddressableTagFilter<>(AddressableTagFilter.createAddressTag(addressableTag))); case IdentifierTagFilter.FILTER_KEY -> getFilterable(node, identifierTag -> new IdentifierTagFilter<>(new IdentifierTag(identifierTag.asText()))); case GeohashTagFilter.FILTER_KEY -> getFilterable(node, geohashTag -> new GeohashTagFilter<>(new GeohashTag(geohashTag.asText()))); + case HashtagTagFilter.FILTER_KEY -> getFilterable(node, hashtagTag -> new HashtagTagFilter<>(new HashtagTag(hashtagTag.asText()))); case AuthorFilter.FILTER_KEY -> getFilterable(node, author -> new AuthorFilter<>(new PublicKey(author.asText()))); case EventFilter.FILTER_KEY -> getFilterable(node, event -> new EventFilter<>(new GenericEvent(event.asText()))); case KindFilter.FILTER_KEY -> getFilterable(node, kindNode -> new KindFilter<>(Kind.valueOf(kindNode.asInt()))); diff --git a/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java b/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java index 988b14eef..a5c2fae55 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java @@ -21,6 +21,7 @@ import nostr.event.filter.Filters; import nostr.event.filter.GenericTagQueryFilter; import nostr.event.filter.GeohashTagFilter; +import nostr.event.filter.HashtagTagFilter; import nostr.event.impl.CalendarContent; import nostr.event.impl.CreateOrUpdateStallEvent; import nostr.event.impl.CreateOrUpdateStallEvent.Stall; @@ -34,6 +35,7 @@ import nostr.event.impl.ZapRequestEvent; import nostr.event.message.OkMessage; import nostr.event.tag.GeohashTag; +import nostr.event.tag.HashtagTag; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PubKeyTag; import nostr.id.Identity; @@ -164,6 +166,30 @@ public void testNIP01SendTextNoteEventGeoHashTag() throws IOException { nip01.close(); } + @Test + public void testNIP01SendTextNoteEventHashtagTag() throws IOException { + System.out.println("testNIP01SendTextNoteEventHashtagTag"); + + Identity identity = Identity.generateRandomIdentity(); + + String targetString = "hashtag-tag-value"; + HashtagTag hashtagTag = new HashtagTag(targetString); + NIP01 nip01 = new NIP01<>(identity); + + nip01.createTextNoteEvent(List.of(hashtagTag), "Hashtag Tag Test value").signAndSend(Map.of("local", "ws://localhost:5555")); + + Filters filters = new Filters( + new HashtagTagFilter<>(new HashtagTag(targetString))); + + List result = nip01.sendRequest(filters, UUID.randomUUID().toString()); + + assertFalse(result.isEmpty()); + assertEquals(2, result.size()); + assertTrue(result.stream().anyMatch(s -> s.contains(targetString))); + + nip01.close(); + } + @Test public void testNIP01SendTextNoteEventCustomGenericTag() throws IOException { System.out.println("testNIP01SendTextNoteEventCustomGenericTag"); diff --git a/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java b/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java index caa589845..d6e004715 100644 --- a/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java +++ b/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java @@ -9,6 +9,7 @@ import nostr.event.filter.Filters; import nostr.event.filter.GenericTagQueryFilter; import nostr.event.filter.GeohashTagFilter; +import nostr.event.filter.HashtagTagFilter; import nostr.event.filter.IdentifierTagFilter; import nostr.event.filter.KindFilter; import nostr.event.filter.ReferencedEventFilter; @@ -20,6 +21,7 @@ import nostr.event.tag.AddressTag; import nostr.event.tag.EventTag; import nostr.event.tag.GeohashTag; +import nostr.event.tag.HashtagTag; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PubKeyTag; import org.junit.jupiter.api.Test; @@ -288,6 +290,36 @@ public void testMultipleGeohashTagFiltersDecoder() { decodedFilters); } + @Test + public void testHashtagTagFiltersDecoder() { + log.info("testHashtagTagFiltersDecoder"); + + String hashtagKey = "#t"; + String hashtagValue = "2vghde"; + String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + hashtagKey + "\":[\"" + hashtagValue + "\"]}"; + + Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + + assertEquals(new Filters(new HashtagTagFilter<>(new HashtagTag(hashtagValue))), decodedFilters); + } + + @Test + public void testMultipleHashtagTagFiltersDecoder() { + log.info("testMultipleHashtagTagFiltersDecoder"); + + String hashtagKey = "#t"; + String hashtagValue1 = "2vghde"; + String hashtagValue2 = "3abcde"; + String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + hashtagKey + "\":[\"" + hashtagValue1 + "\",\"" + hashtagValue2 + "\"]}"; + + Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + + assertEquals(new Filters( + new HashtagTagFilter<>(new HashtagTag(hashtagValue1)), + new HashtagTagFilter<>(new HashtagTag(hashtagValue2))), + decodedFilters); + } + @Test public void testGenericTagFiltersDecoder() { log.info("testGenericTagFiltersDecoder"); diff --git a/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java b/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java index 6cafac92f..1fe7fe844 100644 --- a/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java +++ b/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java @@ -11,6 +11,7 @@ import nostr.event.filter.Filters; import nostr.event.filter.GenericTagQueryFilter; import nostr.event.filter.GeohashTagFilter; +import nostr.event.filter.HashtagTagFilter; import nostr.event.filter.IdentifierTagFilter; import nostr.event.filter.KindFilter; import nostr.event.filter.ReferencedEventFilter; @@ -23,6 +24,7 @@ import nostr.event.tag.AddressTag; import nostr.event.tag.EventTag; import nostr.event.tag.GeohashTag; +import nostr.event.tag.HashtagTag; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PubKeyTag; import org.junit.jupiter.api.Test; @@ -237,8 +239,8 @@ public void testMultipleReferencedPublicKeyFilterEncoder() { } @Test - public void testSingleGeohashTagQueryFiltersEncoder() { - log.info("testSingleGeohashTagQueryFiltersEncoder"); + public void testSingleGeohashTagFiltersEncoder() { + log.info("testSingleGeohashTagFiltersEncoder"); String new_geohash = "2vghde"; @@ -250,8 +252,8 @@ public void testSingleGeohashTagQueryFiltersEncoder() { } @Test - public void testMultipleGeohashTagQueryFiltersEncoder() { - log.info("testMultipleGenericTagQueryFiltersEncoder"); + public void testMultipleGeohashTagFiltersEncoder() { + log.info("testMultipleGenericTagFiltersEncoder"); String geohashValue1 = "2vghde"; String geohashValue2 = "3abcde"; @@ -264,6 +266,34 @@ public void testMultipleGeohashTagQueryFiltersEncoder() { assertEquals("{\"#g\":[\"2vghde\",\"3abcde\"]}", encodedFilters); } + @Test + public void testSingleHashtagTagFiltersEncoder() { + log.info("testSingleHashtagTagFiltersEncoder"); + + String hashtag_target = "2vghde"; + + FiltersEncoder encoder = new FiltersEncoder( + new Filters(new HashtagTagFilter<>(new HashtagTag(hashtag_target)))); + + String encodedFilters = encoder.encode(); + assertEquals("{\"#t\":[\"2vghde\"]}", encodedFilters); + } + + @Test + public void testMultipleHashtagTagFiltersEncoder() { + log.info("testMultipleHashtagTagFiltersEncoder"); + + String hashtagValue1 = "2vghde"; + String hashtagValue2 = "3abcde"; + + FiltersEncoder encoder = new FiltersEncoder(new Filters( + new HashtagTagFilter<>(new HashtagTag(hashtagValue1)), + new HashtagTagFilter<>(new HashtagTag(hashtagValue2)))); + + String encodedFilters = encoder.encode(); + assertEquals("{\"#t\":[\"2vghde\",\"3abcde\"]}", encodedFilters); + } + @Test public void testSingleCustomGenericTagQueryFiltersEncoder() { log.info("testSingleCustomGenericTagQueryFiltersEncoder"); diff --git a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java index fe86d6ae1..19745be45 100644 --- a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java +++ b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java @@ -21,6 +21,7 @@ import nostr.event.filter.Filters; import nostr.event.filter.GenericTagQueryFilter; import nostr.event.filter.GeohashTagFilter; +import nostr.event.filter.HashtagTagFilter; import nostr.event.filter.IdentifierTagFilter; import nostr.event.filter.KindFilter; import nostr.event.filter.ReferencedEventFilter; @@ -37,6 +38,7 @@ import nostr.event.tag.AddressTag; import nostr.event.tag.EventTag; import nostr.event.tag.GeohashTag; +import nostr.event.tag.HashtagTag; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PriceTag; import nostr.event.tag.PubKeyTag; @@ -380,8 +382,8 @@ public void testReqMessageFilterListSerializer() { } @Test - public void testReqMessageDeserializer() throws JsonProcessingException { - log.info("testReqMessageDeserializer"); + public void testReqMessageGeohashTagDeserializer() throws JsonProcessingException { + log.info("testReqMessageGeohashTagDeserializer"); String subscriptionId = "npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9"; String geohashKey = "#g"; @@ -398,8 +400,8 @@ public void testReqMessageDeserializer() throws JsonProcessingException { } @Test - public void testReqMessageFilterListDecoder() { - log.info("testReqMessageFilterListDecoder"); + public void testReqMessageGeohashFilterListDecoder() { + log.info("testReqMessageGeohashFilterListDecoder"); String subscriptionId = "npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9"; String geohashKey = "#g"; @@ -420,6 +422,47 @@ public void testReqMessageFilterListDecoder() { }); } + @Test + public void testReqMessageHashtagTagDeserializer() throws JsonProcessingException { + log.info("testReqMessageHashtagTagDeserializer"); + + String subscriptionId = "npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9"; + String hashtagKey = "#t"; + String hashtagValue = "2vghde"; + String reqJsonWithCustomTagQueryFilterToDecode = "[\"REQ\",\"" + subscriptionId + "\",{\"" + hashtagKey + "\":[\"" + hashtagValue + "\"]}]"; + + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, + new Filters( + new HashtagTagFilter<>(new HashtagTag(hashtagValue)))); + + assertEquals(expectedReqMessage, decodedReqMessage); + } + + @Test + public void testReqMessageHashtagTagFilterListDecoder() { + log.info("testReqMessageHashtagTagFilterListDecoder"); + + String subscriptionId = "npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9"; + String hashtagKey = "#t"; + String hashtagValue1 = "2vghde"; + String hashtagValue2 = "3abcde"; + String reqJsonWithCustomTagQueryFiltersToDecode = "[\"REQ\",\"" + subscriptionId + "\",{\"" + hashtagKey + "\":[\"" + hashtagValue1 + "\",\"" + hashtagValue2 + "\"]}]"; + + assertDoesNotThrow(() -> { + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFiltersToDecode); + + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, + new Filters( + new HashtagTagFilter<>(new HashtagTag(hashtagValue1)), + new HashtagTagFilter<>(new HashtagTag(hashtagValue2)))); + + assertEquals(reqJsonWithCustomTagQueryFiltersToDecode, decodedReqMessage.encode()); + assertEquals(expectedReqMessage, decodedReqMessage); + }); + } + @Test public void testReqMessagePopulatedFilterDecoder() { log.info("testReqMessagePopulatedFilterDecoder"); From 51e179db5b5d2156e88db43259b88a6121489312 Mon Sep 17 00:00:00 2001 From: nick avlo Date: Mon, 24 Feb 2025 18:02:34 -0800 Subject: [PATCH 2/3] FiltersDecoder no longer needs to be typed --- .../event/json/codec/FiltersDecoder.java | 6 +-- .../java/nostr/event/message/ReqMessage.java | 2 +- .../test/filters/FiltersDecoderTest.java | 42 +++++++++---------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java index 71659c7c5..376dedf65 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java @@ -14,11 +14,11 @@ * @author eric */ @Data -public class FiltersDecoder implements FDecoder { +public class FiltersDecoder implements FDecoder { private final static ObjectMapper mapper = new ObjectMapper(); @SneakyThrows - public T decode(@NonNull String jsonFiltersList) { + public Filters decode(@NonNull String jsonFiltersList) { final List filterables = new ArrayList<>(); mapper.readTree(jsonFiltersList).fields().forEachRemaining(field -> @@ -27,6 +27,6 @@ public T decode(@NonNull String jsonFiltersList) { field.getKey(), field.getValue()))); - return (T) new Filters(filterables); + return new Filters(filterables); } } diff --git a/nostr-java-event/src/main/java/nostr/event/message/ReqMessage.java b/nostr-java-event/src/main/java/nostr/event/message/ReqMessage.java index 7e6a9c547..f3f2d1491 100644 --- a/nostr-java-event/src/main/java/nostr/event/message/ReqMessage.java +++ b/nostr-java-event/src/main/java/nostr/event/message/ReqMessage.java @@ -63,7 +63,7 @@ public static T decode(@NonNull Object subscriptionId, @ ReqMessage reqMessage = new ReqMessage( subscriptionId.toString(), jsonFiltersList.stream().map(filtersList -> - new FiltersDecoder<>().decode(filtersList)).toList()); + new FiltersDecoder().decode(filtersList)).toList()); return (T) reqMessage; } diff --git a/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java b/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java index d6e004715..6fc7ff9f5 100644 --- a/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java +++ b/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java @@ -44,7 +44,7 @@ public void testEventFiltersDecoder() { String eventId = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; String expected = "{\"" + filterKey + "\":[\"" + eventId + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals( new Filters( @@ -63,7 +63,7 @@ public void testMultipleEventFiltersDecoder() { String joined = String.join("\",\"", eventId1, eventId2); String expected = "{\"" + filterKey + "\":[\"" + joined + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals( new Filters( @@ -89,7 +89,7 @@ public void testAddressableTagFiltersDecoder() { addressTag.setIdentifierTag(new IdentifierTag(uuidValue1)); String expected = "{\"#a\":[\"" + joined + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals( new Filters( @@ -125,7 +125,7 @@ public void testMultipleAddressableTagFiltersDecoder() { String joined3 = String.join("\",\"", joined1, joined2); String expected = "{\"#a\":[\"" + joined3 + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals( new Filters( @@ -142,7 +142,7 @@ public void testKindFiltersDecoder() { Kind kind = Kind.valueOf(1); String expected = "{\"" + filterKey + "\":[" + kind.toString() + "]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals(new Filters(new KindFilter<>(kind)), decodedFilters); } @@ -158,7 +158,7 @@ public void testMultipleKindFiltersDecoder() { String join = String.join(",", kind1.toString(), kind2.toString()); String expected = "{\"" + filterKey + "\":[" + join + "]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals( new Filters( @@ -174,7 +174,7 @@ public void testIdentifierTagFilterDecoder() { String uuidValue1 = "UUID-1"; String expected = "{\"#d\":[\"" + uuidValue1 + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals(new Filters(new IdentifierTagFilter<>(new IdentifierTag(uuidValue1))), decodedFilters); @@ -190,7 +190,7 @@ public void testMultipleIdentifierTagFilterDecoder() { String joined = String.join("\",\"", uuidValue1, uuidValue2); String expected = "{\"#d\":[\"" + joined + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals( new Filters( @@ -206,7 +206,7 @@ public void testReferencedEventFilterDecoder() { String eventId = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; String expected = "{\"#e\":[\"" + eventId + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals(new Filters(new ReferencedEventFilter<>(new EventTag(eventId))), decodedFilters); } @@ -220,7 +220,7 @@ public void testMultipleReferencedEventFilterDecoder() { String joined = String.join("\",\"", eventId1, eventId2); String expected = "{\"#e\":[\"" + joined + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals( new Filters( @@ -236,7 +236,7 @@ public void testReferencedPublicKeyFilterDecofder() { String pubkeyString = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; String expected = "{\"#p\":[\"" + pubkeyString + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals(new Filters(new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(pubkeyString)))), decodedFilters); } @@ -251,7 +251,7 @@ public void testMultipleReferencedPublicKeyFilterDecoder() { String joined = String.join("\",\"", pubkeyString1, pubkeyString2); String expected = "{\"#p\":[\"" + joined + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals( new Filters( @@ -268,7 +268,7 @@ public void testGeohashTagFiltersDecoder() { String geohashValue = "2vghde"; String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + geohashKey + "\":[\"" + geohashValue + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + Filters decodedFilters = new FiltersDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); assertEquals(new Filters(new GeohashTagFilter<>(new GeohashTag(geohashValue))), decodedFilters); } @@ -282,7 +282,7 @@ public void testMultipleGeohashTagFiltersDecoder() { String geohashValue2 = "3abcde"; String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + geohashKey + "\":[\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + Filters decodedFilters = new FiltersDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); assertEquals(new Filters( new GeohashTagFilter<>(new GeohashTag(geohashValue1)), @@ -298,7 +298,7 @@ public void testHashtagTagFiltersDecoder() { String hashtagValue = "2vghde"; String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + hashtagKey + "\":[\"" + hashtagValue + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + Filters decodedFilters = new FiltersDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); assertEquals(new Filters(new HashtagTagFilter<>(new HashtagTag(hashtagValue))), decodedFilters); } @@ -312,7 +312,7 @@ public void testMultipleHashtagTagFiltersDecoder() { String hashtagValue2 = "3abcde"; String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + hashtagKey + "\":[\"" + hashtagValue1 + "\",\"" + hashtagValue2 + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + Filters decodedFilters = new FiltersDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); assertEquals(new Filters( new HashtagTagFilter<>(new HashtagTag(hashtagValue1)), @@ -328,7 +328,7 @@ public void testGenericTagFiltersDecoder() { String customTagValue = "2vghde"; String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + customTagKey + "\":[\"" + customTagValue + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + Filters decodedFilters = new FiltersDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); assertEquals(new Filters(new GenericTagQueryFilter<>(new GenericTagQuery(customTagKey, customTagValue))), decodedFilters); } @@ -343,7 +343,7 @@ public void testMultipleGenericTagFiltersDecoder() { String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + customTagKey + "\":[\"" + customTagValue1 + "\",\"" + customTagValue2 + "\"]}"; - Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + Filters decodedFilters = new FiltersDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); assertEquals( new Filters( @@ -359,7 +359,7 @@ public void testSinceFiltersDecoder() { Long since = Date.from(Instant.now()).getTime(); String expected = "{\"since\":" + since + "}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals(new Filters(new SinceFilter(since)), decodedFilters); } @@ -371,7 +371,7 @@ public void testUntilFiltersDecoder() { Long until = Date.from(Instant.now()).getTime(); String expected = "{\"until\":" + until + "}"; - Filters decodedFilters = new FiltersDecoder<>().decode(expected); + Filters decodedFilters = new FiltersDecoder().decode(expected); assertEquals(new Filters(new UntilFilter(until)), decodedFilters); } @@ -387,6 +387,6 @@ public void testFailedAddressableTagMalformedSeparator() { String malformedJoin = String.join(",", String.valueOf(kind), author, uuidValue1); String expected = "{\"#a\":[\"" + malformedJoin + "\"]}"; - assertThrows(IllegalArgumentException.class, () -> new FiltersDecoder<>().decode(expected)); + assertThrows(IllegalArgumentException.class, () -> new FiltersDecoder().decode(expected)); } } From d5c93209c444907dafa13709c7ff752b28100237 Mon Sep 17 00:00:00 2001 From: nick avlo Date: Mon, 24 Feb 2025 22:45:51 -0800 Subject: [PATCH 3/3] filters functional refactor + add hashtag tag filter --- .../event/filter/AddressableTagFilter.java | 3 ++ .../java/nostr/event/filter/AuthorFilter.java | 4 ++ .../java/nostr/event/filter/EventFilter.java | 4 ++ .../event/filter/GenericTagQueryFilter.java | 6 +++ .../nostr/event/filter/GeohashTagFilter.java | 4 ++ .../nostr/event/filter/HashtagTagFilter.java | 4 ++ .../event/filter/IdentifierTagFilter.java | 4 ++ .../java/nostr/event/filter/KindFilter.java | 4 ++ .../event/filter/ReferencedEventFilter.java | 4 ++ .../filter/ReferencedPublicKeyFilter.java | 5 +++ .../java/nostr/event/filter/SinceFilter.java | 5 +++ .../java/nostr/event/filter/UntilFilter.java | 5 +++ .../event/json/codec/FilterableProvider.java | 38 ++++++++----------- .../event/json/codec/FiltersDecoder.java | 23 +++++++++-- .../test/filters/FiltersDecoderTest.java | 1 - .../test/filters/FiltersEncoderTest.java | 16 +++++--- 16 files changed, 97 insertions(+), 33 deletions(-) diff --git a/nostr-java-event/src/main/java/nostr/event/filter/AddressableTagFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/AddressableTagFilter.java index 1a8c7eeca..50bdbbf56 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/AddressableTagFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/AddressableTagFilter.java @@ -10,6 +10,7 @@ import java.util.Arrays; import java.util.List; +import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -71,4 +72,6 @@ private boolean compare(@NonNull GenericEvent genericEvent) { private T getAddressableTag() { return super.getFilterable(); } + + public static Function fxn = node -> new AddressableTagFilter<>(AddressableTagFilter.createAddressTag(node)); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/AuthorFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/AuthorFilter.java index 8ea0a704f..869a23f08 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/AuthorFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/AuthorFilter.java @@ -1,9 +1,11 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import lombok.EqualsAndHashCode; import nostr.base.PublicKey; import nostr.event.impl.GenericEvent; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -28,4 +30,6 @@ public String getFilterableValue() { private T getAuthor() { return super.getFilterable(); } + + public static Function fxn = node -> new AuthorFilter<>(new PublicKey(node.asText())); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/EventFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/EventFilter.java index d4c3a4174..21504fb04 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/EventFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/EventFilter.java @@ -1,8 +1,10 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import lombok.EqualsAndHashCode; import nostr.event.impl.GenericEvent; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -27,4 +29,6 @@ public String getFilterableValue() { private T getEvent() { return super.getFilterable(); } + + public static Function fxn = node -> new EventFilter<>(new GenericEvent(node.asText())); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/GenericTagQueryFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/GenericTagQueryFilter.java index f0fdbda68..b624e396b 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/GenericTagQueryFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/GenericTagQueryFilter.java @@ -1,11 +1,13 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import lombok.EqualsAndHashCode; import nostr.base.ElementAttribute; import nostr.base.GenericTagQuery; import nostr.event.impl.GenericEvent; import nostr.event.impl.GenericTag; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -49,4 +51,8 @@ private String stripLeadingHashTag() { getFilterKey().substring(1) : getFilterKey(); } + + public static Function fxn(String type) { + return node -> new GenericTagQueryFilter<>(new GenericTagQuery(type, node.asText())); + } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/GeohashTagFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/GeohashTagFilter.java index 9c31bc1ef..c565ff58d 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/GeohashTagFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/GeohashTagFilter.java @@ -1,9 +1,11 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import lombok.EqualsAndHashCode; import nostr.event.impl.GenericEvent; import nostr.event.tag.GeohashTag; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -29,4 +31,6 @@ public String getFilterableValue() { private T getGeoHashTag() { return super.getFilterable(); } + + public static Function fxn = node -> new GeohashTagFilter<>(new GeohashTag(node.asText())); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/HashtagTagFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/HashtagTagFilter.java index 87c2d38ae..926359f1e 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/HashtagTagFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/HashtagTagFilter.java @@ -1,9 +1,11 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import lombok.EqualsAndHashCode; import nostr.event.impl.GenericEvent; import nostr.event.tag.HashtagTag; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -29,4 +31,6 @@ public String getFilterableValue() { private T getHashtagTag() { return super.getFilterable(); } + + public static Function fxn = node -> new HashtagTagFilter<>(new HashtagTag(node.asText())); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/IdentifierTagFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/IdentifierTagFilter.java index b746e7269..9e0253689 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/IdentifierTagFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/IdentifierTagFilter.java @@ -1,9 +1,11 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import lombok.EqualsAndHashCode; import nostr.event.impl.GenericEvent; import nostr.event.tag.IdentifierTag; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -29,4 +31,6 @@ public String getFilterableValue() { private T getIdentifierTag() { return super.getFilterable(); } + + public static Function fxn = node -> new IdentifierTagFilter<>(new IdentifierTag(node.asText())); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/KindFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/KindFilter.java index 5c2765e8a..4d5b10f63 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/KindFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/KindFilter.java @@ -1,10 +1,12 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import lombok.EqualsAndHashCode; import nostr.event.Kind; import nostr.event.impl.GenericEvent; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -36,4 +38,6 @@ public Integer getFilterableValue() { private T getKind() { return super.getFilterable(); } + + public static Function fxn = node -> new KindFilter<>(Kind.valueOf(node.asInt())); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/ReferencedEventFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/ReferencedEventFilter.java index 352d638eb..7db2c97f1 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/ReferencedEventFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/ReferencedEventFilter.java @@ -1,9 +1,11 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import lombok.EqualsAndHashCode; import nostr.event.impl.GenericEvent; import nostr.event.tag.EventTag; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -30,4 +32,6 @@ public String getFilterableValue() { private T getReferencedEventTag() { return super.getFilterable(); } + + public static Function fxn = node -> new ReferencedEventFilter<>(new EventTag(node.asText())); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/ReferencedPublicKeyFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/ReferencedPublicKeyFilter.java index 2eee8214d..11b54a4c9 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/ReferencedPublicKeyFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/ReferencedPublicKeyFilter.java @@ -1,9 +1,12 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import lombok.EqualsAndHashCode; +import nostr.base.PublicKey; import nostr.event.impl.GenericEvent; import nostr.event.tag.PubKeyTag; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -30,4 +33,6 @@ public String getFilterableValue() { private T getReferencedPublicKey() { return super.getFilterable(); } + + public static Function fxn = node -> new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(node.asText()))); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/SinceFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/SinceFilter.java index d6dc288c7..8c7f6ebcd 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/SinceFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/SinceFilter.java @@ -1,9 +1,12 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.EqualsAndHashCode; import nostr.event.impl.GenericEvent; +import java.util.List; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -33,4 +36,6 @@ public String getFilterableValue() { private Long getSince() { return super.getFilterable(); } + + public static Function> fxn = node -> List.of(new SinceFilter(node.asLong())); } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/UntilFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/UntilFilter.java index 54ac32872..5876724fe 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/UntilFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/UntilFilter.java @@ -1,9 +1,12 @@ package nostr.event.filter; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.EqualsAndHashCode; import nostr.event.impl.GenericEvent; +import java.util.List; +import java.util.function.Function; import java.util.function.Predicate; @EqualsAndHashCode(callSuper = true) @@ -33,4 +36,6 @@ public String getFilterableValue() { private Long getUntil() { return super.getFilterable(); } + + public static Function> fxn = node -> List.of(new UntilFilter(node.asLong())); } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java index 322d4e953..c614f8d02 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java @@ -1,9 +1,7 @@ package nostr.event.json.codec; import com.fasterxml.jackson.databind.JsonNode; -import nostr.base.GenericTagQuery; -import nostr.base.PublicKey; -import nostr.event.Kind; +import lombok.NonNull; import nostr.event.filter.AddressableTagFilter; import nostr.event.filter.AuthorFilter; import nostr.event.filter.EventFilter; @@ -17,32 +15,26 @@ import nostr.event.filter.ReferencedPublicKeyFilter; import nostr.event.filter.SinceFilter; import nostr.event.filter.UntilFilter; -import nostr.event.impl.GenericEvent; -import nostr.event.tag.EventTag; -import nostr.event.tag.GeohashTag; -import nostr.event.tag.HashtagTag; -import nostr.event.tag.IdentifierTag; -import nostr.event.tag.PubKeyTag; import java.util.List; import java.util.function.Function; import java.util.stream.StreamSupport; -class FilterableProvider { - protected static List getFilterable(String type, JsonNode node) { +public class FilterableProvider { + protected static List getFilterFunction(@NonNull JsonNode node, @NonNull String type) { return switch (type) { - case ReferencedPublicKeyFilter.FILTER_KEY -> getFilterable(node, referencedPubKey -> new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(referencedPubKey.asText())))); - case ReferencedEventFilter.FILTER_KEY -> getFilterable(node, referencedEvent -> new ReferencedEventFilter<>(new EventTag(referencedEvent.asText()))); - case AddressableTagFilter.FILTER_KEY -> getFilterable(node, addressableTag -> new AddressableTagFilter<>(AddressableTagFilter.createAddressTag(addressableTag))); - case IdentifierTagFilter.FILTER_KEY -> getFilterable(node, identifierTag -> new IdentifierTagFilter<>(new IdentifierTag(identifierTag.asText()))); - case GeohashTagFilter.FILTER_KEY -> getFilterable(node, geohashTag -> new GeohashTagFilter<>(new GeohashTag(geohashTag.asText()))); - case HashtagTagFilter.FILTER_KEY -> getFilterable(node, hashtagTag -> new HashtagTagFilter<>(new HashtagTag(hashtagTag.asText()))); - case AuthorFilter.FILTER_KEY -> getFilterable(node, author -> new AuthorFilter<>(new PublicKey(author.asText()))); - case EventFilter.FILTER_KEY -> getFilterable(node, event -> new EventFilter<>(new GenericEvent(event.asText()))); - case KindFilter.FILTER_KEY -> getFilterable(node, kindNode -> new KindFilter<>(Kind.valueOf(kindNode.asInt()))); - case SinceFilter.FILTER_KEY -> List.of(new SinceFilter(node.asLong())); - case UntilFilter.FILTER_KEY -> List.of(new UntilFilter(node.asLong())); - default -> getFilterable(node, genericNode -> new GenericTagQueryFilter<>(new GenericTagQuery(type, genericNode.asText()))); + case ReferencedPublicKeyFilter.FILTER_KEY -> getFilterable(node, ReferencedPublicKeyFilter.fxn); + case ReferencedEventFilter.FILTER_KEY -> getFilterable(node, ReferencedEventFilter.fxn); + case AddressableTagFilter.FILTER_KEY -> getFilterable(node, AddressableTagFilter.fxn); + case IdentifierTagFilter.FILTER_KEY -> getFilterable(node, IdentifierTagFilter.fxn); + case GeohashTagFilter.FILTER_KEY -> getFilterable(node, GeohashTagFilter.fxn); + case HashtagTagFilter.FILTER_KEY -> getFilterable(node, HashtagTagFilter.fxn); + case AuthorFilter.FILTER_KEY -> getFilterable(node, AuthorFilter.fxn); + case EventFilter.FILTER_KEY -> getFilterable(node, EventFilter.fxn); + case KindFilter.FILTER_KEY -> getFilterable(node, KindFilter.fxn); + case SinceFilter.FILTER_KEY -> SinceFilter.fxn.apply(node); + case UntilFilter.FILTER_KEY -> UntilFilter.fxn.apply(node); + default -> getFilterable(node, GenericTagQueryFilter.fxn(type)); }; } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java index 376dedf65..abde5f764 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java @@ -1,14 +1,29 @@ package nostr.event.json.codec; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import lombok.NonNull; import lombok.SneakyThrows; +import nostr.event.filter.AddressableTagFilter; +import nostr.event.filter.AuthorFilter; +import nostr.event.filter.EventFilter; import nostr.event.filter.Filterable; import nostr.event.filter.Filters; +import nostr.event.filter.GenericTagQueryFilter; +import nostr.event.filter.GeohashTagFilter; +import nostr.event.filter.HashtagTagFilter; +import nostr.event.filter.IdentifierTagFilter; +import nostr.event.filter.KindFilter; +import nostr.event.filter.ReferencedEventFilter; +import nostr.event.filter.ReferencedPublicKeyFilter; +import nostr.event.filter.SinceFilter; +import nostr.event.filter.UntilFilter; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; +import java.util.stream.StreamSupport; /** * @author eric @@ -21,11 +36,11 @@ public class FiltersDecoder implements FDecoder { public Filters decode(@NonNull String jsonFiltersList) { final List filterables = new ArrayList<>(); - mapper.readTree(jsonFiltersList).fields().forEachRemaining(field -> + mapper.readTree(jsonFiltersList).fields().forEachRemaining(node -> filterables.addAll( - FilterableProvider.getFilterable( - field.getKey(), - field.getValue()))); + FilterableProvider.getFilterFunction( + node.getValue(), + node.getKey()))); return new Filters(filterables); } diff --git a/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java b/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java index 6fc7ff9f5..6eaec461c 100644 --- a/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java +++ b/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java @@ -31,7 +31,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.fail; @Log public class FiltersDecoderTest { diff --git a/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java b/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java index 1fe7fe844..7870c2004 100644 --- a/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java +++ b/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java @@ -68,14 +68,20 @@ public void testEventFilterEncoderUsingList() { } @Test - public void testEventFilterEncoderByMap() { - log.info("testEventFilterEncoderByMap"); + public void testMultipleEventFilterEncoder() { + log.info("testMultipleEventFilterEncoder"); - String eventId = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; + String eventId1 = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; + String eventId2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; - FiltersEncoder encoder = new FiltersEncoder(new Filters(new EventFilter<>(new GenericEvent(eventId)))); + FiltersEncoder encoder = new FiltersEncoder( + new Filters( + new EventFilter<>(new GenericEvent(eventId1)), + new EventFilter<>(new GenericEvent(eventId2)))); String encodedFilters = encoder.encode(); - assertEquals("{\"ids\":[\"" + eventId + "\"]}", encodedFilters); + + String events = String.join("\",\"", eventId1, eventId2); + assertEquals("{\"ids\":[\"" + events + "\"]}", encodedFilters); } @Test