diff --git a/nostr-java-test/pom.xml b/nostr-java-test/pom.xml index a8c007b11..42c3f6dff 100644 --- a/nostr-java-test/pom.xml +++ b/nostr-java-test/pom.xml @@ -67,6 +67,32 @@ + + + src/main/java + + **/*.java + + + + + src/main/resources + + + + + + src/test/java + + **/*.java + + + + + src/test/resources + + + org.apache.maven.plugins diff --git a/nostr-java-test/src/test/java/nostr/test/base/NostrUtilTest.java b/nostr-java-test/src/test/java/nostr/test/base/NostrUtilTest.java index be5d76b8c..d20bf1631 100644 --- a/nostr-java-test/src/test/java/nostr/test/base/NostrUtilTest.java +++ b/nostr-java-test/src/test/java/nostr/test/base/NostrUtilTest.java @@ -1,9 +1,9 @@ -package nostr.test.base; - -/** - * - * @author squirrel - */ -public class NostrUtilTest { - +package nostr.test.base; + +/** + * + * @author squirrel + */ +public class NostrUtilTest { + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/client/ClientTest.java b/nostr-java-test/src/test/java/nostr/test/client/ClientTest.java index d34216e64..c7bf3ccb3 100644 --- a/nostr-java-test/src/test/java/nostr/test/client/ClientTest.java +++ b/nostr-java-test/src/test/java/nostr/test/client/ClientTest.java @@ -1,114 +1,145 @@ -package nostr.test.client; - -import nostr.base.PrivateKey; -import nostr.client.Client; -import nostr.context.impl.DefaultRequestContext; -import nostr.event.BaseMessage; -import nostr.event.message.EventMessage; -import nostr.id.Identity; -import nostr.test.EntityFactory; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.TimeoutException; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * @author squirrel - */ -class ClientTest { - /* - - private Client client; - private Identity identity; - - public ClientTest() { - } - - @BeforeEach - public void init() { - System.out.println("init"); - identity = Identity.create(PrivateKey.generateRandomPrivKey()); - - var requestContext = new DefaultRequestContext(); - requestContext.setPrivateKey(identity.getPrivateKey().getRawData()); - requestContext.setRelays(Map.of("My local test relay", "ws://localhost:5555")); - try { - client = Client.getInstance().connect(requestContext); - } catch (TimeoutException e) { - throw new RuntimeException(e); - } - } - - //@AfterEach - public void dispose() { - System.out.println("dispose"); - try { - this.client.disconnect(); - } catch (TimeoutException e) { - throw new RuntimeException(e); - } - this.client = null; - this.identity = null; - } - - @Test - public void testSend() throws TimeoutException { - System.out.println("testSend"); - var event = EntityFactory.Events.createTextNoteEvent(identity.getPublicKey()); - identity.sign(event); - BaseMessage msg = new EventMessage(event); - - client.send(msg); - - assertTrue(true); - } - - @Test - public void disconnect() throws TimeoutException { - System.out.println("disconnect"); - - var relayCount = getRelayCount(); - Assertions.assertEquals(relayCount, client.getOpenConnectionsCount()); - client.disconnect(); - - Assertions.assertEquals(0, client.getOpenConnectionsCount()); - } - - @Test - public void testNip42() throws TimeoutException { - System.out.println("testNip42"); - - var rcpt = Identity.generateRandomIdentity().getPublicKey(); - var sender = identity.getPublicKey(); - var event = EntityFactory.Events.createDirectMessageEvent(sender, rcpt, "Hello, World!"); - identity.sign(event); - BaseMessage msg = new EventMessage(event); - client.send(msg); - - var filters = Filters.builder().kinds(new KindList(4)).authors(new PublicKeyList(sender)).build(); - msg = new ReqMessage("testNip42_" + sender.toString(), filters); - client.send(msg); - } - - private int getRelayCount() { - Properties properties = new Properties(); - try (InputStream is = getClass().getClassLoader().getResourceAsStream("relays.properties")) { - if (is != null) { - properties.load(is); - } else { - throw new IOException("Cannot find relays.properties on the classpath"); - } - } catch (IOException e) { - e.printStackTrace(); - } - return properties.size(); - } - */ -} +package nostr.test.client; + +import lombok.extern.java.Log; +import nostr.base.PrivateKey; +import nostr.client.Client; +import nostr.context.impl.DefaultRequestContext; +import nostr.event.BaseMessage; +import nostr.event.message.EventMessage; +import nostr.id.Identity; +import nostr.test.EntityFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.concurrent.TimeoutException; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author squirrel + */ +@Log +class ClientTest { + + private Client client; + private Identity identity; + + public ClientTest() { + } + + @BeforeEach + public void init() { + log.info("init"); + identity = Identity.create(PrivateKey.generateRandomPrivKey()); + + DefaultRequestContext requestContext = new DefaultRequestContext(); + requestContext.setPrivateKey(identity.getPrivateKey().getRawData()); + //requestContext.setRelays(Map.of("My local test relay", "ws://localhost:5555")); + Properties loadedProperties = getRelayProperties(); + requestContext.setRelays(convertPropertiesToMap(loadedProperties)); + try { + client = Client.getInstance().connect(requestContext); + } catch (TimeoutException e) { + throw new RuntimeException(e); + } + } + + //@AfterEach + public void dispose() { + log.info("dispose"); + try { + this.client.disconnect(); + } catch (TimeoutException e) { + throw new RuntimeException(e); + } + this.client = null; + this.identity = null; + } + + @Test + public void testSend() { + log.info("testSend"); + var event = EntityFactory.Events.createTextNoteEvent(identity.getPublicKey()); + identity.sign(event); + BaseMessage msg = new EventMessage(event); + assertDoesNotThrow(() -> { + client.send(msg); + }); + assertTrue(true); + } + + @Test + public void disconnect() { + log.info("disconnect"); + + int relayCount = getRelayCount(); + assertEquals(relayCount, client.getOpenConnectionsCount()); + assertDoesNotThrow(() -> { + client.disconnect(); + }); + assertEquals(0, client.getOpenConnectionsCount()); + + assertDoesNotThrow(() -> { + client.disconnect(); // if all connections are closed, trying to disconnect again wont throw error + }); + } + +/* + @Test + public void testNip42() { + System.out.println("testNip42"); + + var rcpt = Identity.generateRandomIdentity().getPublicKey(); + var sender = identity.getPublicKey(); + var event = EntityFactory.Events.createDirectMessageEvent(sender, rcpt, "Hello, World!"); + identity.sign(event); + BaseMessage msg = new EventMessage(event); + assertDoesNotThrow(() -> { + client.send(msg); + + var filters = Filters.builder().kinds(new KindList(4)).authors(new PublicKeyList(sender)).build(); + msg = new ReqMessage("testNip42_" + sender.toString(), filters); + client.send(msg); + }); + } +*/ + + private Properties getRelayProperties() { + Properties properties = new Properties(); + try (InputStream is = getClass().getClassLoader().getResourceAsStream("relays.properties")) { + if (is != null) { + properties.load(is); + } else { + throw new IOException("Cannot find relays.properties on the classpath."); + } + } catch (IOException e) { + log.severe(e.getMessage()); + } + return properties; + } + + private int getRelayCount() { + return getRelayProperties().size(); + } + + public static Map convertPropertiesToMap(Properties properties) { + Map map = new HashMap<>(); + + // Iterate over the properties and put each entry into the map + Set propertyNames = properties.stringPropertyNames(); + for (String name : propertyNames) { + map.put(name, properties.getProperty(name)); + } + + return map; + } + +} diff --git a/nostr-java-test/src/test/java/nostr/test/crypto/CryptoTest.java b/nostr-java-test/src/test/java/nostr/test/crypto/CryptoTest.java index a8beda29b..58c193211 100644 --- a/nostr-java-test/src/test/java/nostr/test/crypto/CryptoTest.java +++ b/nostr-java-test/src/test/java/nostr/test/crypto/CryptoTest.java @@ -1,58 +1,63 @@ -package nostr.test.crypto; - -import nostr.crypto.bech32.Bech32; -import nostr.crypto.bech32.Bech32Prefix; -import nostr.crypto.schnorr.Schnorr; -import nostr.event.impl.GenericEvent; -import nostr.id.Identity; -import nostr.util.NostrException; -import nostr.util.NostrUtil; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import static nostr.test.EntityFactory.Events.createTextNoteEvent; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * - * @author squirrel - */ -public class CryptoTest { - - @Test - public void testBech32() { - try { - System.out.println("testBech32"); - - final String hexPub = "56adf01ca1aa9d6f1c35953833bbe6d99a0c85b73af222e6bd305b51f2749f6f"; - final String npub = "npub126klq89p42wk78p4j5ur8wlxmxdqepdh8tez9e4axpd4run5nahsmff27j"; - - Assertions.assertEquals(npub, Bech32.toBech32(Bech32Prefix.NPUB, hexPub)); - Assertions.assertEquals("56adf01ca1aa9d6f1c35953833bbe6d99a0c85b73af222e6bd305b51f2749f6f", Bech32.fromBech32(npub)); - } catch (NostrException ex) { - Assertions.fail(ex); - } - } - - @Test - public void testVerifySignature() throws Exception { - System.out.println("testVerifySignature"); - - Identity identity = Identity.generateRandomIdentity(); - GenericEvent event = createTextNoteEvent(identity.getPublicKey(), "Hello World"); - event.update(); - var message = NostrUtil.sha256(event.get_serializedEvent()); - var signature = identity.sign(event); - var verification = Schnorr.verify(message, identity.getPublicKey().getRawData(), signature.getRawData()); - assertTrue(verification); - - event = createTextNoteEvent(identity.getPublicKey(), "Guten Tag"); - event.update(); - message = NostrUtil.sha256(event.get_serializedEvent()); - verification = Schnorr.verify(message, identity.getPublicKey().getRawData(), signature.getRawData()); - - assertFalse(verification); - } - -} +package nostr.test.crypto; + +import nostr.base.Signature; +import nostr.crypto.bech32.Bech32; +import nostr.crypto.bech32.Bech32Prefix; +import nostr.crypto.schnorr.Schnorr; +import nostr.event.impl.GenericEvent; +import nostr.id.Identity; +import nostr.util.NostrException; +import nostr.util.NostrUtil; +import org.junit.jupiter.api.Test; + +import static nostr.test.EntityFactory.Events.createTextNoteEvent; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * + * @author squirrel + */ +public class CryptoTest { + + @Test + public void testBech32() { + try { + System.out.println("testBech32"); + + final String hexPub = "56adf01ca1aa9d6f1c35953833bbe6d99a0c85b73af222e6bd305b51f2749f6f"; + final String npub = "npub126klq89p42wk78p4j5ur8wlxmxdqepdh8tez9e4axpd4run5nahsmff27j"; + + assertEquals(npub, Bech32.toBech32(Bech32Prefix.NPUB, hexPub)); + assertEquals("56adf01ca1aa9d6f1c35953833bbe6d99a0c85b73af222e6bd305b51f2749f6f", Bech32.fromBech32(npub)); + } catch (NostrException ex) { + fail(ex); + } + } + + @Test + public void testVerifySignature() { + System.out.println("testVerifySignature"); + + Identity identity = Identity.generateRandomIdentity(); + final GenericEvent[] event = {createTextNoteEvent(identity.getPublicKey(), "Hello World")}; + event[0].update(); + assertDoesNotThrow(() -> { + byte[] message = NostrUtil.sha256(event[0].get_serializedEvent()); + Signature signature = identity.sign(event[0]); + boolean verification = Schnorr.verify(message, identity.getPublicKey().getRawData(), signature.getRawData()); + assertTrue(verification, "Schnorr must have a true verify result."); + + event[0] = createTextNoteEvent(identity.getPublicKey(), "Guten Tag"); + event[0].update(); + message = NostrUtil.sha256(event[0].get_serializedEvent()); + verification = Schnorr.verify(message, identity.getPublicKey().getRawData(), signature.getRawData()); + + assertFalse(verification); + }); + } + +} 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 779570e80..e98951e37 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 @@ -1,406 +1,419 @@ -package nostr.test.event; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import nostr.api.NIP01; -import nostr.api.NIP04; -import nostr.api.NIP15; -import nostr.api.NIP32; -import nostr.api.NIP44; -import nostr.api.NIP57; -import nostr.base.ElementAttribute; -import nostr.base.PrivateKey; -import nostr.base.PublicKey; -import nostr.crypto.bech32.Bech32; -import nostr.crypto.bech32.Bech32Prefix; -import nostr.event.BaseTag; -import nostr.event.impl.CreateOrUpdateStallEvent; -import nostr.event.impl.CreateOrUpdateStallEvent.Stall; -import nostr.event.impl.DirectMessageEvent; -import nostr.event.impl.EncryptedPayloadEvent; -import nostr.event.impl.NostrMarketplaceEvent; -import nostr.event.impl.NostrMarketplaceEvent.Product.Spec; -import nostr.event.impl.TextNoteEvent; -import nostr.event.impl.ZapReceiptEvent; -import nostr.event.impl.ZapRequestEvent; -import nostr.id.Identity; -import nostr.util.NostrException; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -/** - * - * @author eric - */ -public class ApiEventTest { - - public static final String NOSTR_JAVA_PUBKEY = "56adf01ca1aa9d6f1c35953833bbe6d99a0c85b73af222e6bd305b51f2749f6f"; - - private static final Map RELAYS = getRelays(); - - @Test - public void testNIP01CreateTextNoteEvent() throws NostrException { - System.out.println("testNIP01CreateTextNoteEvent"); - - PublicKey publicKey = new PublicKey(""); - var recipient = NIP01.createPubKeyTag(publicKey); - List tags = new ArrayList<>(); - tags.add(recipient); - Identity identity = Identity.generateRandomIdentity(); - var nip01 = new NIP01(identity); - var instance = nip01.createTextNoteEvent(tags, "Hello simplified nostr-java!") - .getEvent(); - instance.update(); - - Assertions.assertNotNull(instance.getId()); - Assertions.assertNotNull(instance.getCreatedAt()); - Assertions.assertNull(instance.getSignature()); - - final String bech32 = instance.toBech32(); - Assertions.assertNotNull(bech32); - Assertions.assertEquals(Bech32Prefix.NOTE.getCode(), Bech32.decode(bech32).hrp); - } - - @Test - public void testNIP01SendTextNoteEvent() { - System.out.println("testNIP01SendTextNoteEvent"); - - Identity identity = Identity.generateRandomIdentity(); - var nip01 = new NIP01(identity); - var instance = nip01.createTextNoteEvent("Hello simplified nostr-java!") - .sign(); - - var signature = instance.getEvent().getSignature(); - Assertions.assertNotNull(signature); - instance.setRelays(RELAYS).send(); - - //Assertions.assertNotNull(instance.responses()); - //Assertions.assertFalse(instance.responses().isEmpty()); - //instance.responses().forEach(System.out::println); - } - - @Test - public void testNIP04SendDirectMessage() { - System.out.println("testNIP04SendDirectMessage"); - - PublicKey nostr_java = new PublicKey(NOSTR_JAVA_PUBKEY); - Identity identity = Identity.generateRandomIdentity(); - var nip04 = new NIP04(identity, nostr_java); - var instance = nip04.createDirectMessageEvent("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...") - .sign(); - - var signature = instance.getEvent().getSignature(); - Assertions.assertNotNull(signature); - instance.setRelays(RELAYS).send(); - } - - @Test - public void testNIP44SendDirectMessage() { - System.out.println("testNIP44SendDirectMessage"); - - PublicKey nostr_java = new PublicKey(NOSTR_JAVA_PUBKEY); - - Identity identity = Identity.generateRandomIdentity(); - var nip44 = new NIP44(identity, nostr_java); - - var instance = nip44.createDirectMessageEvent("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...").sign(); - Assertions.assertNotNull(instance.getEvent().getSignature()); - instance.setRelays(RELAYS).send(); - } - - @Test - public void testNIP04EncryptDecrypt() { - System.out.println("testNIP04EncryptDecrypt"); - - var nostr_java = new PublicKey(NOSTR_JAVA_PUBKEY); - Identity identity = Identity.generateRandomIdentity(); - var nip04 = new NIP04(identity, nostr_java); - var instance = nip04.createDirectMessageEvent("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...") - .sign(); - - var message = NIP04.decrypt(identity, instance.getEvent()); - - Assertions.assertEquals("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...", message); - } - - @Test - public void testNIP44EncryptDecrypt() { - System.out.println("testNIP44EncryptDecrypt"); - - var nostr_java = new PublicKey(NOSTR_JAVA_PUBKEY); - - Identity identity = Identity.generateRandomIdentity(); - var nip44 = new NIP44(identity, nostr_java); - - var instance = nip44.createDirectMessageEvent("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...").sign(); - var message = NIP44.decrypt(identity, instance.getEvent()); - - Assertions.assertEquals("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...", message); - } - - @Test - public void testNIP15CreateStallEvent() throws JsonProcessingException { - System.out.println("testNIP15CreateStallEvent"); - - Stall stall = createStall(); - var nip15 = new NIP15<>(Identity.create(PrivateKey.generateRandomPrivKey())); - - // Create and send the nostr event - var instance = nip15.createCreateOrUpdateStallEvent(stall).sign(); - var signature = instance.getEvent().getSignature(); - Assertions.assertNotNull(signature); - - // Fetch the content and compare with the above original - var content = instance.getEvent().getContent(); - ObjectMapper mapper = new ObjectMapper(); - var expected = mapper.readValue(content, Stall.class); - - Assertions.assertEquals(expected, stall); - } - - @Test - public void testNIP15UpdateStallEvent() { - System.out.println("testNIP15UpdateStallEvent"); - - var stall = createStall(); - var nip15 = new NIP15<>(Identity.create(PrivateKey.generateRandomPrivKey())); - - // Create and send the nostr event - var instance = nip15.createCreateOrUpdateStallEvent(stall).sign(); - var signature = instance.getEvent().getSignature(); - Assertions.assertNotNull(signature); - nip15.setRelays(RELAYS).send(); - - // Update the shipping - var shipping = stall.getShipping(); - shipping.setCost(20.00f); - nip15.createCreateOrUpdateStallEvent(stall).sign().setRelays(RELAYS).send(); - } - - @Test - public void testNIP15CreateProductEvent() { - - System.out.println("testNIP15CreateProductEvent"); - - // Create the stall object - var stall = createStall(); - var nip15 = new NIP15<>(Identity.create(PrivateKey.generateRandomPrivKey())); - - // Create the product - var product = createProduct(stall); - - List categories = new ArrayList<>(); - categories.add("bijoux"); - categories.add("Hommes"); - - nip15.createCreateOrUpdateProductEvent(product, categories).sign().setRelays(RELAYS).send(); - } - - @Test - public void testNIP15UpdateProductEvent() { - - System.out.println("testNIP15UpdateProductEvent"); - - // Create the stall object - var stall = createStall(); - var nip15 = new NIP15<>(Identity.create(PrivateKey.generateRandomPrivKey())); - - // Create the product - var product = createProduct(stall); - - List categories = new ArrayList<>(); - categories.add("bijoux"); - categories.add("Hommes"); - - nip15.createCreateOrUpdateProductEvent(product, categories).sign().setRelays(RELAYS).send(); - - product.setDescription("Un nouveau bijou en or"); - categories.add("bagues"); - - nip15.sign().setRelays(RELAYS).send(); - } - - @Test - public void testNIP32CreateNameSpace() { - - System.out.println("testNIP32CreateNameSpace"); - - var langNS = NIP32.createNameSpaceTag("Languages"); - - Assertions.assertEquals("L", langNS.getCode()); - Assertions.assertEquals(1, langNS.getAttributes().size()); - Assertions.assertEquals("Languages", langNS.getAttributes().iterator().next().getValue()); - } - - @Test - public void testNIP32CreateLabel1() { - - System.out.println("testNIP32CreateLabel1"); - - var label = NIP32.createLabelTag("Languages", "english"); - - Assertions.assertEquals("l", label.getCode()); - Assertions.assertEquals(2, label.getAttributes().size()); - Assertions.assertTrue(label.getAttributes().contains(new ElementAttribute("param0", "english", 32))); - Assertions.assertTrue(label.getAttributes().contains(new ElementAttribute("param1", "Languages", 32))); - } - - @Test - public void testNIP32CreateLabel2() { - - System.out.println("testNIP32CreateLabel2"); - - var metadata = new HashMap(); - metadata.put("article", "the"); - var label = NIP32.createLabelTag("Languages", "english", metadata); - - Assertions.assertEquals("l", label.getCode()); - Assertions.assertEquals(3, label.getAttributes().size()); - Assertions.assertTrue(label.getAttributes().contains(new ElementAttribute("param0", "english", 32))); - Assertions.assertTrue(label.getAttributes().contains(new ElementAttribute("param1", "Languages", 32))); - Assertions.assertTrue(label.getAttributes().contains(new ElementAttribute("param2", "{\\\"article\\\":\\\"the\\\"}", 32)), "{\\\"article\\\":\\\"the\\\"}"); - } - - @Test - void testNIP57CreateZapRequestEvent() throws NostrException { - System.out.println("testNIP57CreateZapRequestEvent"); - - Identity sender = Identity.generateRandomIdentity(); - List baseTags = new ArrayList(); - PublicKey recipient = Identity.generateRandomIdentity().getPublicKey(); - var nip57 = new NIP57(sender); - final String ZAP_REQUEST_CONTENT = "zap request content"; - final Long AMOUNT = 1232456L; - final String LNURL = "lnUrl"; - final String RELAYS_TAG = "ws://localhost:5555"; - ZapRequestEvent instance = nip57.createZapRequestEvent(recipient, baseTags, ZAP_REQUEST_CONTENT, AMOUNT, LNURL, RELAYS_TAG).getEvent(); - instance.update(); - - Assertions.assertNotNull(instance.getId()); - Assertions.assertNotNull(instance.getCreatedAt()); - Assertions.assertNotNull(instance.getContent()); - Assertions.assertNull(instance.getSignature()); - - Assertions.assertNotNull(instance.getZapRequest()); - Assertions.assertNotNull(instance.getZapRequest().getRelaysTag()); - Assertions.assertNotNull(instance.getZapRequest().getAmount()); - Assertions.assertNotNull(instance.getZapRequest().getLnUrl()); - - Assertions.assertEquals(ZAP_REQUEST_CONTENT, instance.getContent()); - Assertions.assertTrue(instance.getZapRequest().getRelaysTag().getRelays().stream().anyMatch(relay -> relay.getUri().equals(RELAYS_TAG))); - Assertions.assertEquals(AMOUNT, instance.getZapRequest().getAmount()); - Assertions.assertEquals(LNURL, instance.getZapRequest().getLnUrl()); - - final String bech32 = instance.toBech32(); - Assertions.assertNotNull(bech32); - Assertions.assertEquals(Bech32Prefix.NOTE.getCode(), Bech32.decode(bech32).hrp); - } - - @Test - void testNIP57CreateZapReceiptEvent() throws NostrException { - System.out.println("testNIP57CreateZapReceiptEvent"); - - Identity sender = Identity.generateRandomIdentity(); - List baseTags = new ArrayList(); - String zapRequestPubKeyTag = Identity.generateRandomIdentity().getPublicKey().toString(); - String zapRequestEventTag = Identity.generateRandomIdentity().getPublicKey().toString(); - String zapRequestAddressTag = Identity.generateRandomIdentity().getPublicKey().toString(); - final String ZAP_RECEIPT_IDENTIFIER = "ipsum"; - final String ZAP_RECEIPT_RELAY_URI = "ws://localhost:5555"; - final String BOLT_11 = "bolt11"; - final String DESCRIPTION_SHA256 = "descriptionSha256"; - final String PRE_IMAGE = "preimage"; - var nip57 = new NIP57(sender); - - ZapReceiptEvent instance = nip57.createZapReceiptEvent(zapRequestPubKeyTag, baseTags, zapRequestEventTag, zapRequestAddressTag, ZAP_RECEIPT_IDENTIFIER, ZAP_RECEIPT_RELAY_URI, BOLT_11, DESCRIPTION_SHA256, PRE_IMAGE).getEvent(); - instance.update(); - - Assertions.assertNotNull(instance.getId()); - Assertions.assertNotNull(instance.getCreatedAt()); - Assertions.assertNull(instance.getSignature()); - - - Assertions.assertNotNull(instance.getZapReceipt()); - Assertions.assertNotNull(instance.getZapReceipt().getBolt11()); - Assertions.assertNotNull(instance.getZapReceipt().getDescriptionSha256()); - Assertions.assertNotNull(instance.getZapReceipt().getPreimage()); - - Assertions.assertEquals(BOLT_11, instance.getZapReceipt().getBolt11()); - Assertions.assertEquals(DESCRIPTION_SHA256, instance.getZapReceipt().getDescriptionSha256()); - Assertions.assertEquals(PRE_IMAGE, instance.getZapReceipt().getPreimage()); - - final String bech32 = instance.toBech32(); - Assertions.assertNotNull(bech32); - Assertions.assertEquals(Bech32Prefix.NOTE.getCode(), Bech32.decode(bech32).hrp); - } - - private Stall createStall() { - - // Create the county list - List countries = new ArrayList<>(); - countries.add("France"); - countries.add("Canada"); - countries.add("Cameroun"); - - // Create the shipping object - var shipping = new CreateOrUpdateStallEvent.Stall.Shipping(); - shipping.setCost(12.00f); - shipping.setCountries(countries); - shipping.setName("French Countries"); - - // Create the stall object - var stall = new CreateOrUpdateStallEvent.Stall(); - stall.setCurrency("USD"); - stall.setDescription("This is a test stall"); - stall.setName("Maximus Primus"); - stall.setShipping(shipping); - - return stall; - } - - private NostrMarketplaceEvent.Product createProduct(Stall stall) { - - // Create the product - var product = new NostrMarketplaceEvent.Product(); - product.setCurrency("USD"); - product.setDescription("Un bijou en or"); - product.setImages(new ArrayList<>()); - product.setName("Bague"); - product.setPrice(450.00f); - product.setQuantity(4); - List specs = new ArrayList<>(); - specs.add(new Spec("couleur", "or")); - specs.add(new Spec("poids", "150g")); - product.setSpecs(specs); - product.setStall(stall); - - return product; - } - - private static Map getRelays() { - Map relays = new HashMap<>(); - Properties properties = new Properties(); - try { - InputStream is = ApiEventTest.class.getClassLoader().getResourceAsStream("relays.properties"); - if (is != null) { - properties.load(is); - for (String key : properties.stringPropertyNames()) { - relays.put(key, properties.getProperty(key)); - } - } else { - throw new RuntimeException("Unable to find 'relays.properties' in the classpath"); - } - } catch (IOException e) { - e.printStackTrace(); - } - return relays; - } -} +package nostr.test.event; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.java.Log; +import nostr.api.NIP01; +import nostr.api.NIP04; +import nostr.api.NIP15; +import nostr.api.NIP32; +import nostr.api.NIP44; +import nostr.api.NIP57; +import nostr.base.ElementAttribute; +import nostr.base.PrivateKey; +import nostr.base.PublicKey; +import nostr.crypto.bech32.Bech32; +import nostr.crypto.bech32.Bech32Prefix; +import nostr.event.BaseTag; +import nostr.event.impl.CreateOrUpdateStallEvent; +import nostr.event.impl.CreateOrUpdateStallEvent.Stall; +import nostr.event.impl.DirectMessageEvent; +import nostr.event.impl.EncryptedPayloadEvent; +import nostr.event.impl.NostrMarketplaceEvent; +import nostr.event.impl.NostrMarketplaceEvent.Product.Spec; +import nostr.event.impl.TextNoteEvent; +import nostr.event.impl.ZapReceiptEvent; +import nostr.event.impl.ZapRequestEvent; +import nostr.id.Identity; +import nostr.util.NostrException; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * + * @author eric + */ +@Log +public class ApiEventTest { + + public static final String NOSTR_JAVA_PUBKEY = "56adf01ca1aa9d6f1c35953833bbe6d99a0c85b73af222e6bd305b51f2749f6f"; + + private static final Map RELAYS = getRelays(); + + @Test + public void testNIP01CreateTextNoteEvent() { + log.info("testNIP01CreateTextNoteEvent"); + + PublicKey publicKey = new PublicKey(""); + var recipient = NIP01.createPubKeyTag(publicKey); + List tags = new ArrayList<>(); + tags.add(recipient); + Identity identity = Identity.generateRandomIdentity(); + var nip01 = new NIP01(identity); + var instance = nip01.createTextNoteEvent(tags, "Hello simplified nostr-java!") + .getEvent(); + instance.update(); + + assertNotNull(instance.getId()); + assertNotNull(instance.getCreatedAt()); + assertNull(instance.getSignature()); + + final String bech32 = instance.toBech32(); + assertNotNull(bech32); + assertDoesNotThrow(() -> { + assertEquals(Bech32Prefix.NOTE.getCode(), Bech32.decode(bech32).hrp); + }); + } + + @Test + public void testNIP01SendTextNoteEvent() { + System.out.println("testNIP01SendTextNoteEvent"); + + Identity identity = Identity.generateRandomIdentity(); + var nip01 = new NIP01(identity); + var instance = nip01.createTextNoteEvent("Hello simplified nostr-java!") + .sign(); + + var signature = instance.getEvent().getSignature(); + assertNotNull(signature); + instance.setRelays(RELAYS).send(); + + //Assertions.assertNotNull(instance.responses()); + //Assertions.assertFalse(instance.responses().isEmpty()); + //instance.responses().forEach(System.out::println); + } + + @Test + public void testNIP04SendDirectMessage() { + System.out.println("testNIP04SendDirectMessage"); + + PublicKey nostr_java = new PublicKey(NOSTR_JAVA_PUBKEY); + Identity identity = Identity.generateRandomIdentity(); + var nip04 = new NIP04(identity, nostr_java); + var instance = nip04.createDirectMessageEvent("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...") + .sign(); + + var signature = instance.getEvent().getSignature(); + assertNotNull(signature); + instance.setRelays(RELAYS).send(); + } + + @Test + public void testNIP44SendDirectMessage() { + System.out.println("testNIP44SendDirectMessage"); + + PublicKey nostr_java = new PublicKey(NOSTR_JAVA_PUBKEY); + + Identity identity = Identity.generateRandomIdentity(); + var nip44 = new NIP44(identity, nostr_java); + + var instance = nip44.createDirectMessageEvent("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...").sign(); + assertNotNull(instance.getEvent().getSignature()); + instance.setRelays(RELAYS).send(); + } + + @Test + public void testNIP04EncryptDecrypt() { + System.out.println("testNIP04EncryptDecrypt"); + + var nostr_java = new PublicKey(NOSTR_JAVA_PUBKEY); + Identity identity = Identity.generateRandomIdentity(); + var nip04 = new NIP04(identity, nostr_java); + var instance = nip04.createDirectMessageEvent("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...") + .sign(); + + var message = NIP04.decrypt(identity, instance.getEvent()); + + assertEquals("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...", message); + } + + @Test + public void testNIP44EncryptDecrypt() { + System.out.println("testNIP44EncryptDecrypt"); + + var nostr_java = new PublicKey(NOSTR_JAVA_PUBKEY); + + Identity identity = Identity.generateRandomIdentity(); + var nip44 = new NIP44(identity, nostr_java); + + var instance = nip44.createDirectMessageEvent("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...").sign(); + var message = NIP44.decrypt(identity, instance.getEvent()); + + assertEquals("Quand on n'a que l'amour pour tracer un chemin et forcer le destin...", message); + } + + @Test + public void testNIP15CreateStallEvent() { + System.out.println("testNIP15CreateStallEvent"); + + Stall stall = createStall(); + var nip15 = new NIP15<>(Identity.create(PrivateKey.generateRandomPrivKey())); + + // Create and send the nostr event + var instance = nip15.createCreateOrUpdateStallEvent(stall).sign(); + var signature = instance.getEvent().getSignature(); + assertNotNull(signature); + + // Fetch the content and compare with the above original + var content = instance.getEvent().getContent(); + ObjectMapper mapper = new ObjectMapper(); + assertDoesNotThrow(() -> { + Stall expected = mapper.readValue(content, Stall.class); + assertEquals(expected, stall); + }); + + + + } + + @Test + public void testNIP15UpdateStallEvent() { + System.out.println("testNIP15UpdateStallEvent"); + + var stall = createStall(); + var nip15 = new NIP15<>(Identity.create(PrivateKey.generateRandomPrivKey())); + + // Create and send the nostr event + var instance = nip15.createCreateOrUpdateStallEvent(stall).sign(); + var signature = instance.getEvent().getSignature(); + assertNotNull(signature); + nip15.setRelays(RELAYS).send(); + + // Update the shipping + var shipping = stall.getShipping(); + shipping.setCost(20.00f); + nip15.createCreateOrUpdateStallEvent(stall).sign().setRelays(RELAYS).send(); + } + + @Test + public void testNIP15CreateProductEvent() { + + System.out.println("testNIP15CreateProductEvent"); + + // Create the stall object + var stall = createStall(); + var nip15 = new NIP15<>(Identity.create(PrivateKey.generateRandomPrivKey())); + + // Create the product + var product = createProduct(stall); + + List categories = new ArrayList<>(); + categories.add("bijoux"); + categories.add("Hommes"); + + nip15.createCreateOrUpdateProductEvent(product, categories).sign().setRelays(RELAYS).send(); + } + + @Test + public void testNIP15UpdateProductEvent() { + + System.out.println("testNIP15UpdateProductEvent"); + + // Create the stall object + var stall = createStall(); + var nip15 = new NIP15<>(Identity.create(PrivateKey.generateRandomPrivKey())); + + // Create the product + var product = createProduct(stall); + + List categories = new ArrayList<>(); + categories.add("bijoux"); + categories.add("Hommes"); + + nip15.createCreateOrUpdateProductEvent(product, categories).sign().setRelays(RELAYS).send(); + + product.setDescription("Un nouveau bijou en or"); + categories.add("bagues"); + + nip15.sign().setRelays(RELAYS).send(); + } + + @Test + public void testNIP32CreateNameSpace() { + + System.out.println("testNIP32CreateNameSpace"); + + var langNS = NIP32.createNameSpaceTag("Languages"); + + assertEquals("L", langNS.getCode()); + assertEquals(1, langNS.getAttributes().size()); + assertEquals("Languages", langNS.getAttributes().iterator().next().getValue()); + } + + @Test + public void testNIP32CreateLabel1() { + + System.out.println("testNIP32CreateLabel1"); + + var label = NIP32.createLabelTag("Languages", "english"); + + assertEquals("l", label.getCode()); + assertEquals(2, label.getAttributes().size()); + assertTrue(label.getAttributes().contains(new ElementAttribute("param0", "english", 32))); + assertTrue(label.getAttributes().contains(new ElementAttribute("param1", "Languages", 32))); + } + + @Test + public void testNIP32CreateLabel2() { + + System.out.println("testNIP32CreateLabel2"); + + var metadata = new HashMap(); + metadata.put("article", "the"); + var label = NIP32.createLabelTag("Languages", "english", metadata); + + assertEquals("l", label.getCode()); + assertEquals(3, label.getAttributes().size()); + assertTrue(label.getAttributes().contains(new ElementAttribute("param0", "english", 32))); + assertTrue(label.getAttributes().contains(new ElementAttribute("param1", "Languages", 32))); + assertTrue(label.getAttributes().contains(new ElementAttribute("param2", "{\\\"article\\\":\\\"the\\\"}", 32)), "{\\\"article\\\":\\\"the\\\"}"); + } + + @Test + void testNIP57CreateZapRequestEvent() { + System.out.println("testNIP57CreateZapRequestEvent"); + + Identity sender = Identity.generateRandomIdentity(); + List baseTags = new ArrayList(); + PublicKey recipient = Identity.generateRandomIdentity().getPublicKey(); + var nip57 = new NIP57(sender); + final String ZAP_REQUEST_CONTENT = "zap request content"; + final Long AMOUNT = 1232456L; + final String LNURL = "lnUrl"; + final String RELAYS_TAG = "ws://localhost:5555"; + ZapRequestEvent instance = nip57.createZapRequestEvent(recipient, baseTags, ZAP_REQUEST_CONTENT, AMOUNT, LNURL, RELAYS_TAG).getEvent(); + instance.update(); + + assertNotNull(instance.getId()); + assertNotNull(instance.getCreatedAt()); + assertNotNull(instance.getContent()); + assertNull(instance.getSignature()); + + assertNotNull(instance.getZapRequest()); + assertNotNull(instance.getZapRequest().getRelaysTag()); + assertNotNull(instance.getZapRequest().getAmount()); + assertNotNull(instance.getZapRequest().getLnUrl()); + + assertEquals(ZAP_REQUEST_CONTENT, instance.getContent()); + assertTrue(instance.getZapRequest().getRelaysTag().getRelays().stream().anyMatch(relay -> relay.getUri().equals(RELAYS_TAG))); + assertEquals(AMOUNT, instance.getZapRequest().getAmount()); + assertEquals(LNURL, instance.getZapRequest().getLnUrl()); + + final String bech32 = instance.toBech32(); + assertNotNull(bech32); + assertDoesNotThrow(() -> { + assertEquals(Bech32Prefix.NOTE.getCode(), Bech32.decode(bech32).hrp); + }); + } + + @Test + void testNIP57CreateZapReceiptEvent() { + System.out.println("testNIP57CreateZapReceiptEvent"); + + Identity sender = Identity.generateRandomIdentity(); + List baseTags = new ArrayList(); + String zapRequestPubKeyTag = Identity.generateRandomIdentity().getPublicKey().toString(); + String zapRequestEventTag = Identity.generateRandomIdentity().getPublicKey().toString(); + String zapRequestAddressTag = Identity.generateRandomIdentity().getPublicKey().toString(); + final String ZAP_RECEIPT_IDENTIFIER = "ipsum"; + final String ZAP_RECEIPT_RELAY_URI = "ws://localhost:5555"; + final String BOLT_11 = "bolt11"; + final String DESCRIPTION_SHA256 = "descriptionSha256"; + final String PRE_IMAGE = "preimage"; + var nip57 = new NIP57(sender); + + ZapReceiptEvent instance = nip57.createZapReceiptEvent(zapRequestPubKeyTag, baseTags, zapRequestEventTag, zapRequestAddressTag, ZAP_RECEIPT_IDENTIFIER, ZAP_RECEIPT_RELAY_URI, BOLT_11, DESCRIPTION_SHA256, PRE_IMAGE).getEvent(); + instance.update(); + + assertNotNull(instance.getId()); + assertNotNull(instance.getCreatedAt()); + assertNull(instance.getSignature()); + + + assertNotNull(instance.getZapReceipt()); + assertNotNull(instance.getZapReceipt().getBolt11()); + assertNotNull(instance.getZapReceipt().getDescriptionSha256()); + assertNotNull(instance.getZapReceipt().getPreimage()); + + assertEquals(BOLT_11, instance.getZapReceipt().getBolt11()); + assertEquals(DESCRIPTION_SHA256, instance.getZapReceipt().getDescriptionSha256()); + assertEquals(PRE_IMAGE, instance.getZapReceipt().getPreimage()); + + final String bech32 = instance.toBech32(); + assertNotNull(bech32); + assertDoesNotThrow(() -> { + assertEquals(Bech32Prefix.NOTE.getCode(), Bech32.decode(bech32).hrp); + }); + } + + private Stall createStall() { + + // Create the county list + List countries = new ArrayList<>(); + countries.add("France"); + countries.add("Canada"); + countries.add("Cameroun"); + + // Create the shipping object + var shipping = new CreateOrUpdateStallEvent.Stall.Shipping(); + shipping.setCost(12.00f); + shipping.setCountries(countries); + shipping.setName("French Countries"); + + // Create the stall object + var stall = new CreateOrUpdateStallEvent.Stall(); + stall.setCurrency("USD"); + stall.setDescription("This is a test stall"); + stall.setName("Maximus Primus"); + stall.setShipping(shipping); + + return stall; + } + + private NostrMarketplaceEvent.Product createProduct(Stall stall) { + + // Create the product + var product = new NostrMarketplaceEvent.Product(); + product.setCurrency("USD"); + product.setDescription("Un bijou en or"); + product.setImages(new ArrayList<>()); + product.setName("Bague"); + product.setPrice(450.00f); + product.setQuantity(4); + List specs = new ArrayList<>(); + specs.add(new Spec("couleur", "or")); + specs.add(new Spec("poids", "150g")); + product.setSpecs(specs); + product.setStall(stall); + + return product; + } + + private static Map getRelays() { + Map relays = new HashMap<>(); + Properties properties = new Properties(); + try { + InputStream is = ApiEventTest.class.getClassLoader().getResourceAsStream("relays.properties"); + if (is != null) { + properties.load(is); + for (String key : properties.stringPropertyNames()) { + relays.put(key, properties.getProperty(key)); + } + } else { + throw new RuntimeException("Unable to find 'relays.properties' in the classpath"); + } + } catch (IOException e) { + e.printStackTrace(); + } + return relays; + } +} diff --git a/nostr-java-test/src/test/java/nostr/test/event/BaseTagTest.java b/nostr-java-test/src/test/java/nostr/test/event/BaseTagTest.java index 4a03830c8..06c1d9fc2 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/BaseTagTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/BaseTagTest.java @@ -1,27 +1,29 @@ -package nostr.test.event; - -import nostr.event.BaseTag; -import nostr.event.impl.GenericTag; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class BaseTagTest { - BaseTag genericTag = GenericTag.create("id", 1, "value"); - - @Test - void getNip() { - assertEquals(1, genericTag.getNip()); - } - - @Test - void testHashCode() { - assertEquals(112174237, genericTag.hashCode()); - } - - @Test - void testToString() { - String result = "GenericTag(code=id, nip=1, attributes=[ElementAttribute(name=param0, value=value, nip=null)])"; - assertEquals(result, genericTag.toString()); - } +package nostr.test.event; + +import nostr.event.BaseTag; +import nostr.event.impl.GenericTag; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BaseTagTest { + + BaseTag genericTag = GenericTag.create("id", 1, "value"); + + @Test + void getNip() { + assertEquals(1, genericTag.getNip()); + } + + @Test + void testHashCode() { + assertEquals(112174237, genericTag.hashCode()); + } + + @Test + void testToString() { + String result = "GenericTag(code=id, nip=1, attributes=[ElementAttribute(name=param0, value=value, nip=null)])"; + assertEquals(result, genericTag.toString()); + } + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/event/DecodeTest.java b/nostr-java-test/src/test/java/nostr/test/event/DecodeTest.java index e1272cd28..b75ecdd49 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/DecodeTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/DecodeTest.java @@ -1,84 +1,84 @@ -package nostr.test.event; - -import nostr.base.PublicKey; -import nostr.event.BaseMessage; -import nostr.event.BaseTag; -import nostr.event.Marker; -import nostr.event.impl.GenericEvent; -import nostr.event.json.codec.BaseMessageDecoder; -import nostr.event.message.EventMessage; -import nostr.event.tag.EventTag; -import nostr.event.tag.PubKeyTag; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -public class DecodeTest { - - @Test - public void decodeTest() { - - String json = "[" - + "\"EVENT\"," - + "\"temp20230627\"," - + "{" - + "\"id\":\"28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a\"," - + "\"kind\":1," - + "\"pubkey\":\"2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984\"," - + "\"created_at\":1687765220," - + "\"content\":\"手順書が間違ってたら作業者は無理だな\"," - + "\"tags\":[" - + "[\"e\",\"494001ac0c8af2a10f60f23538e5b35d3cdacb8e1cc956fe7a16dfa5cbfc4346\",\"\",\"root\"]," - + "[\"p\",\"2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984\"]" - + "]," - + "\"sig\":\"86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546\"" - + "}]"; - - BaseMessage message = new BaseMessageDecoder<>().decode(json); - - Assertions.assertEquals("EVENT", message.getCommand()); - EventMessage eventMessage = (EventMessage) message; - - Assertions.assertEquals("temp20230627", eventMessage.getSubscriptionId()); - GenericEvent eventImpl = (GenericEvent) eventMessage.getEvent(); - - Assertions.assertEquals("28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a", eventImpl.getId()); - Assertions.assertEquals(1, eventImpl.getKind()); - Assertions.assertEquals("2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984", eventImpl.getPubKey().toString()); - Assertions.assertEquals(1687765220, eventImpl.getCreatedAt()); - Assertions.assertEquals("手順書が間違ってたら作業者は無理だな", eventImpl.getContent()); - Assertions.assertEquals("86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546", - eventImpl.getSignature().toString()); - - List expectedTags = new ArrayList<>(); - EventTag eventTag = new EventTag("494001ac0c8af2a10f60f23538e5b35d3cdacb8e1cc956fe7a16dfa5cbfc4346"); - eventTag.setRecommendedRelayUrl(""); - eventTag.setMarker(Marker.ROOT); - expectedTags.add(eventTag); - PubKeyTag pubKeyTag = new PubKeyTag(); - pubKeyTag.setPublicKey(new PublicKey("2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984")); - expectedTags.add(pubKeyTag); - - List actualTags = eventImpl.getTags(); - - for (int i = 0; i < expectedTags.size(); i++) { - BaseTag expected = expectedTags.get(i); - if (expected instanceof EventTag expetedEventTag) { - EventTag actualEventTag = (EventTag) actualTags.get(i); - Assertions.assertEquals(expetedEventTag.getIdEvent(), actualEventTag.getIdEvent()); - Assertions.assertEquals(expetedEventTag.getRecommendedRelayUrl(), actualEventTag.getRecommendedRelayUrl()); - Assertions.assertEquals(expetedEventTag.getMarker(), actualEventTag.getMarker()); - } else if (expected instanceof PubKeyTag expectedPublicKeyTag) { - PubKeyTag actualPublicKeyTag = (PubKeyTag) actualTags.get(i); - Assertions.assertEquals(expectedPublicKeyTag.getPublicKey().toString(), actualPublicKeyTag.getPublicKey().toString()); - } else { - Assertions.fail(); - } - - } - - } - -} +package nostr.test.event; + +import nostr.base.PublicKey; +import nostr.event.BaseMessage; +import nostr.event.BaseTag; +import nostr.event.Marker; +import nostr.event.impl.GenericEvent; +import nostr.event.json.codec.BaseMessageDecoder; +import nostr.event.message.EventMessage; +import nostr.event.tag.EventTag; +import nostr.event.tag.PubKeyTag; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class DecodeTest { + + @Test + public void decodeTest() { + + String json = "[" + + "\"EVENT\"," + + "\"temp20230627\"," + + "{" + + "\"id\":\"28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a\"," + + "\"kind\":1," + + "\"pubkey\":\"2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984\"," + + "\"created_at\":1687765220," + + "\"content\":\"手順書が間違ってたら作業者は無理だな\"," + + "\"tags\":[" + + "[\"e\",\"494001ac0c8af2a10f60f23538e5b35d3cdacb8e1cc956fe7a16dfa5cbfc4346\",\"\",\"root\"]," + + "[\"p\",\"2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984\"]" + + "]," + + "\"sig\":\"86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546\"" + + "}]"; + + BaseMessage message = new BaseMessageDecoder<>().decode(json); + + Assertions.assertEquals("EVENT", message.getCommand()); + EventMessage eventMessage = (EventMessage) message; + + Assertions.assertEquals("temp20230627", eventMessage.getSubscriptionId()); + GenericEvent eventImpl = (GenericEvent) eventMessage.getEvent(); + + Assertions.assertEquals("28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a", eventImpl.getId()); + Assertions.assertEquals(1, eventImpl.getKind()); + Assertions.assertEquals("2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984", eventImpl.getPubKey().toString()); + Assertions.assertEquals(1687765220, eventImpl.getCreatedAt()); + Assertions.assertEquals("手順書が間違ってたら作業者は無理だな", eventImpl.getContent()); + Assertions.assertEquals("86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546", + eventImpl.getSignature().toString()); + + List expectedTags = new ArrayList<>(); + EventTag eventTag = new EventTag("494001ac0c8af2a10f60f23538e5b35d3cdacb8e1cc956fe7a16dfa5cbfc4346"); + eventTag.setRecommendedRelayUrl(""); + eventTag.setMarker(Marker.ROOT); + expectedTags.add(eventTag); + PubKeyTag pubKeyTag = new PubKeyTag(); + pubKeyTag.setPublicKey(new PublicKey("2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984")); + expectedTags.add(pubKeyTag); + + List actualTags = eventImpl.getTags(); + + for (int i = 0; i < expectedTags.size(); i++) { + BaseTag expected = expectedTags.get(i); + if (expected instanceof EventTag expetedEventTag) { + EventTag actualEventTag = (EventTag) actualTags.get(i); + Assertions.assertEquals(expetedEventTag.getIdEvent(), actualEventTag.getIdEvent()); + Assertions.assertEquals(expetedEventTag.getRecommendedRelayUrl(), actualEventTag.getRecommendedRelayUrl()); + Assertions.assertEquals(expetedEventTag.getMarker(), actualEventTag.getMarker()); + } else if (expected instanceof PubKeyTag expectedPublicKeyTag) { + PubKeyTag actualPublicKeyTag = (PubKeyTag) actualTags.get(i); + Assertions.assertEquals(expectedPublicKeyTag.getPublicKey().toString(), actualPublicKeyTag.getPublicKey().toString()); + } else { + Assertions.fail(); + } + + } + + } + +} diff --git a/nostr-java-test/src/test/java/nostr/test/event/EventTagTest.java b/nostr-java-test/src/test/java/nostr/test/event/EventTagTest.java index 3774f529f..a9bdef8e9 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/EventTagTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/EventTagTest.java @@ -1,46 +1,48 @@ -package nostr.test.event; - -import nostr.event.Marker; -import nostr.event.tag.EventTag; -import org.junit.jupiter.api.Test; - -import java.lang.reflect.Field; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class EventTagTest { - @Test - void getSupportedFields() { - String eventId = "fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712"; - String recommendedRelayUrl = "ws://localhost:5555"; - - EventTag eventTag = new EventTag(eventId); - eventTag.setMarker(Marker.REPLY); - eventTag.setRecommendedRelayUrl(recommendedRelayUrl); - - assertDoesNotThrow(() -> { - List fields = eventTag.getSupportedFields(); - assertTrue(fields.stream().anyMatch(field -> field.getName().equals("idEvent"))); - assertTrue(fields.stream().anyMatch(field -> field.getName().equals("recommendedRelayUrl"))); - assertTrue(fields.stream().anyMatch(field -> field.getName().equals("marker"))); - - assertTrue(fields.stream().map(field -> getFieldValue(field, eventTag)).anyMatch(fieldValue -> fieldValue.equals(eventId))); - assertTrue(fields.stream().map(field -> getFieldValue(field, eventTag)).anyMatch(fieldValue -> fieldValue.equalsIgnoreCase(Marker.REPLY.getValue()))); - assertTrue(fields.stream().map(field -> getFieldValue(field, eventTag)).anyMatch(fieldValue -> fieldValue.equals(recommendedRelayUrl))); - - assertFalse(fields.stream().anyMatch(field -> field.getName().equals("idEventXXX"))); - assertFalse(fields.stream().map(field -> getFieldValue(field, eventTag)).anyMatch(fieldValue -> fieldValue.equals(eventId + "x"))); - }); - } - - private String getFieldValue(Field field, EventTag eventTag) { - final String[] returnVal = new String[1]; - assertDoesNotThrow(() -> { - returnVal[0] = eventTag.getFieldValue(field); - }); - return returnVal[0]; - } +package nostr.test.event; + +import nostr.event.Marker; +import nostr.event.tag.EventTag; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class EventTagTest { + + @Test + void getSupportedFields() { + String eventId = "fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712"; + String recommendedRelayUrl = "ws://localhost:5555"; + + EventTag eventTag = new EventTag(eventId); + eventTag.setMarker(Marker.REPLY); + eventTag.setRecommendedRelayUrl(recommendedRelayUrl); + + assertDoesNotThrow(() -> { + List fields = eventTag.getSupportedFields(); + assertTrue(fields.stream().anyMatch(field -> field.getName().equals("idEvent"))); + assertTrue(fields.stream().anyMatch(field -> field.getName().equals("recommendedRelayUrl"))); + assertTrue(fields.stream().anyMatch(field -> field.getName().equals("marker"))); + + assertTrue(fields.stream().map(field -> getFieldValue(field, eventTag)).anyMatch(fieldValue -> fieldValue.equals(eventId))); + assertTrue(fields.stream().map(field -> getFieldValue(field, eventTag)).anyMatch(fieldValue -> fieldValue.equalsIgnoreCase(Marker.REPLY.getValue()))); + assertTrue(fields.stream().map(field -> getFieldValue(field, eventTag)).anyMatch(fieldValue -> fieldValue.equals(recommendedRelayUrl))); + + assertFalse(fields.stream().anyMatch(field -> field.getName().equals("idEventXXX"))); + assertFalse(fields.stream().map(field -> getFieldValue(field, eventTag)).anyMatch(fieldValue -> fieldValue.equals(eventId + "x"))); + }); + } + + private String getFieldValue(Field field, EventTag eventTag) { + final String[] returnVal = new String[1]; + assertDoesNotThrow(() -> { + returnVal[0] = eventTag.getFieldValue(field); + }); + return returnVal[0]; + } + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/event/EventTest.java b/nostr-java-test/src/test/java/nostr/test/event/EventTest.java index 7fa5b3284..a86c268c7 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/EventTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/EventTest.java @@ -1,159 +1,166 @@ -package nostr.test.event; - -import com.fasterxml.jackson.core.JsonProcessingException; -import nostr.base.ElementAttribute; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import nostr.base.IEncoder; -import nostr.base.PublicKey; -import nostr.base.Relay; -import nostr.crypto.bech32.Bech32; -import nostr.crypto.bech32.Bech32Prefix; -import nostr.event.BaseTag; -import nostr.event.impl.GenericEvent; -import nostr.event.impl.GenericMessage; -import nostr.event.impl.GenericTag; -import nostr.event.json.codec.BaseTagEncoder; -import nostr.event.util.Nip05Validator; -import nostr.id.Identity; -import nostr.test.EntityFactory; -import nostr.util.NostrException; -import nostr.util.NostrUtil; - -/** - * - * @author squirrel - */ -public class EventTest { - - public EventTest() { - } - - @Test - public void testCreateTextNoteEvent() throws NostrException { - System.out.println("testCreateTextNoteEvent"); - PublicKey publicKey = Identity.generateRandomIdentity().getPublicKey(); - GenericEvent instance = EntityFactory.Events.createTextNoteEvent(publicKey); - instance.update(); - Assertions.assertNotNull(instance.getId()); - Assertions.assertNotNull(instance.getCreatedAt()); - Assertions.assertNull(instance.getSignature()); - final String bech32 = instance.toBech32(); - Assertions.assertNotNull(bech32); - Assertions.assertEquals(Bech32Prefix.NOTE.getCode(), Bech32.decode(bech32).hrp); - } - - @Test - public void testCreateGenericTag() throws JsonProcessingException { - System.out.println("testCreateGenericTag"); - PublicKey publicKey = Identity.generateRandomIdentity().getPublicKey(); - GenericTag genericTag = EntityFactory.Events.createGenericTag(publicKey); - - Relay relay = new Relay("wss://secret.relay.com"); - relay.addNipSupport(1); - relay.addNipSupport(genericTag.getNip()); - var attrs = genericTag.getAttributes(); - for (var a : attrs) { - relay.addNipSupport(a.getNip()); - } - - var encoder = new BaseTagEncoder(genericTag, relay); - var strJsonEvent = encoder.encode(); - - var tag = IEncoder.MAPPER.readValue(strJsonEvent, BaseTag.class); - Assertions.assertEquals(genericTag, tag); - - } - - @Test - public void testCreateUnsupportedGenericTagAttribute() { -// try { -// System.out.println("testCreateUnsupportedGenericTagAttribute"); -// PublicKey publicKey = this.identity.getPublicKey(); -// GenericTag genericTag = EntityFactory.Events.createGenericTag(publicKey); -// -// Relay relay = Relay.builder().uri("wss://secret.relay.com").build(); -// relay.addNipSupport(1); -// relay.addNipSupport(genericTag.getNip()); -// -// BaseEventEncoder marshaller = new BaseEventEncoder(genericTag.getParent(), relay); -// var strJsonEvent = marshaller.marshall(); -// -// var jsonValue = new JsonObjectUnmarshaller(strJsonEvent).unmarshall(); -// -// IValue tags = ((ObjectValue) jsonValue).get("tags").get(); -// -// Assertions.assertEquals(2, ((ArrayValue) tags).length()); -// -// IValue tag = ((ArrayValue) tags).get(1).get(); -// -// Assertions.assertTrue(tag instanceof ArrayValue); -// -// IValue code = ((ArrayValue) tag).get(0).get(); -// -// Assertions.assertTrue(code instanceof StringValue); -// -// Assertions.assertEquals("devil", code.getValue()); -// Assertions.assertEquals(1, ((ArrayValue) tag).length()); -// -// } catch (NostrException ex) { -// Assertions.fail(ex); -// } - } - - // TODO - Rewrite the test class after implementing the configuration -/* - @Test - public void testCreateUnsupportedGenericTag() throws IOException, NostrException { - System.out.println("testCreateUnsupportedGenericTag"); - //PublicKey publicKey = this.identity.getPublicKey(); - PublicKey publicKey = Identity.getInstance().getPublicKey(); - IEvent event = EntityFactory.Events.createOtsEvent(publicKey); - GenericTag genericTag = EntityFactory.Events.createGenericTag(publicKey, event, 7); - - Relay relay = new Relay("wss://secret.relay.com"); - relay.addNipSupport(0); - - var encoder = new BaseEventEncoder((BaseEvent) genericTag.getParent(), relay); - - RuntimeException thrown = Assertions.assertThrows(RuntimeException.class, - () -> { - encoder.encode(); - }, - "This event is not supported. List of relay supported NIP(s): " + relay.printSupportedNips() - ); - - Assertions.assertNotNull(thrown); - } -*/ - - @Test - public void testNip05Validator() { - System.out.println("testNip05Validator"); - try { - var nip05 = "nostr-java@nostr.band"; - var publicKey = new PublicKey(NostrUtil.hexToBytes(Bech32.fromBech32("npub126klq89p42wk78p4j5ur8wlxmxdqepdh8tez9e4axpd4run5nahsmff27j"))); - - var nip05Validator = Nip05Validator.builder().nip05(nip05).publicKey(publicKey).build(); - - nip05Validator.validate(); - } catch (NostrException ex) { - Assertions.fail(ex); - } - Assertions.assertTrue(true); - } - - @Test - public void testAuthMessage() { - System.out.println("testAuthMessage"); - - GenericMessage msg = new GenericMessage("AUTH", 42); - String attr = "challenge-string"; - msg.addAttribute(ElementAttribute.builder().name("challenge").value(attr).build()); - - var muattr = (msg.getAttributes().iterator().next().getValue()).toString(); - Assertions.assertEquals(attr, muattr); - } -} +package nostr.test.event; + +import com.fasterxml.jackson.core.JsonProcessingException; +import lombok.extern.java.Log; +import nostr.base.ElementAttribute; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import nostr.base.IEncoder; +import nostr.base.PublicKey; +import nostr.base.Relay; +import nostr.crypto.bech32.Bech32; +import nostr.crypto.bech32.Bech32Prefix; +import nostr.event.BaseTag; +import nostr.event.impl.GenericEvent; +import nostr.event.impl.GenericMessage; +import nostr.event.impl.GenericTag; +import nostr.event.json.codec.BaseTagEncoder; +import nostr.event.util.Nip05Validator; +import nostr.id.Identity; +import nostr.test.EntityFactory; +import nostr.util.NostrException; +import nostr.util.NostrUtil; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * + * @author squirrel + */ +@Log +public class EventTest { + + public EventTest() { + } + + @Test + public void testCreateTextNoteEvent(){ + log.info("testCreateTextNoteEvent"); + PublicKey publicKey = Identity.generateRandomIdentity().getPublicKey(); + GenericEvent instance = EntityFactory.Events.createTextNoteEvent(publicKey); + instance.update(); + assertNotNull(instance.getId()); + assertNotNull(instance.getCreatedAt()); + assertNull(instance.getSignature()); + final String bech32 = instance.toBech32(); + assertNotNull(bech32); + assertDoesNotThrow(() -> { + assertEquals(Bech32Prefix.NOTE.getCode(), Bech32.decode(bech32).hrp); + }); + } + + @Test + public void testCreateGenericTag() { + log.info("testCreateGenericTag"); + PublicKey publicKey = Identity.generateRandomIdentity().getPublicKey(); + GenericTag genericTag = EntityFactory.Events.createGenericTag(publicKey); + + Relay relay = new Relay("wss://secret.relay.com"); + relay.addNipSupport(1); + relay.addNipSupport(genericTag.getNip()); + var attrs = genericTag.getAttributes(); + for (var a : attrs) { + relay.addNipSupport(a.getNip()); + } + + var encoder = new BaseTagEncoder(genericTag, relay); + var strJsonEvent = encoder.encode(); + + assertDoesNotThrow(() -> { + BaseTag tag = IEncoder.MAPPER.readValue(strJsonEvent, BaseTag.class); + assertEquals(genericTag, tag); + }); + } + + @Test + public void testCreateUnsupportedGenericTagAttribute() { +// try { +// System.out.println("testCreateUnsupportedGenericTagAttribute"); +// PublicKey publicKey = this.identity.getPublicKey(); +// GenericTag genericTag = EntityFactory.Events.createGenericTag(publicKey); +// +// Relay relay = Relay.builder().uri("wss://secret.relay.com").build(); +// relay.addNipSupport(1); +// relay.addNipSupport(genericTag.getNip()); +// +// BaseEventEncoder marshaller = new BaseEventEncoder(genericTag.getParent(), relay); +// var strJsonEvent = marshaller.marshall(); +// +// var jsonValue = new JsonObjectUnmarshaller(strJsonEvent).unmarshall(); +// +// IValue tags = ((ObjectValue) jsonValue).get("tags").get(); +// +// Assertions.assertEquals(2, ((ArrayValue) tags).length()); +// +// IValue tag = ((ArrayValue) tags).get(1).get(); +// +// Assertions.assertTrue(tag instanceof ArrayValue); +// +// IValue code = ((ArrayValue) tag).get(0).get(); +// +// Assertions.assertTrue(code instanceof StringValue); +// +// Assertions.assertEquals("devil", code.getValue()); +// Assertions.assertEquals(1, ((ArrayValue) tag).length()); +// +// } catch (NostrException ex) { +// Assertions.fail(ex); +// } + } + + // TODO - Rewrite the test class after implementing the configuration +/* + @Test + public void testCreateUnsupportedGenericTag() { + System.out.println("testCreateUnsupportedGenericTag"); + //PublicKey publicKey = this.identity.getPublicKey(); + PublicKey publicKey = Identity.getInstance().getPublicKey(); + IEvent event = EntityFactory.Events.createOtsEvent(publicKey); + GenericTag genericTag = EntityFactory.Events.createGenericTag(publicKey, event, 7); + + Relay relay = new Relay("wss://secret.relay.com"); + relay.addNipSupport(0); + + var encoder = new BaseEventEncoder((BaseEvent) genericTag.getParent(), relay); + + RuntimeException thrown = Assertions.assertThrows(RuntimeException.class, + () -> { + encoder.encode(); + }, + "This event is not supported. List of relay supported NIP(s): " + relay.printSupportedNips() + ); + + Assertions.assertNotNull(thrown); + } +*/ + + @Test + public void testNip05Validator() { + System.out.println("testNip05Validator"); + try { + var nip05 = "nostr-java@nostr.band"; + var publicKey = new PublicKey(NostrUtil.hexToBytes(Bech32.fromBech32("npub126klq89p42wk78p4j5ur8wlxmxdqepdh8tez9e4axpd4run5nahsmff27j"))); + + var nip05Validator = Nip05Validator.builder().nip05(nip05).publicKey(publicKey).build(); + + nip05Validator.validate(); + } catch (NostrException ex) { + fail(ex); + } + assertTrue(true); + } + + @Test + public void testAuthMessage() { + System.out.println("testAuthMessage"); + + GenericMessage msg = new GenericMessage("AUTH", 42); + String attr = "challenge-string"; + msg.addAttribute(ElementAttribute.builder().name("challenge").value(attr).build()); + + var muattr = (msg.getAttributes().iterator().next().getValue()).toString(); + assertEquals(attr, muattr); + } +} diff --git a/nostr-java-test/src/test/java/nostr/test/event/KindMappingTest.java b/nostr-java-test/src/test/java/nostr/test/event/KindMappingTest.java index 3467bb16d..014dfec92 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/KindMappingTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/KindMappingTest.java @@ -1,28 +1,28 @@ -package nostr.test.event; - -import nostr.event.Kind; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class KindMappingTest { - @Test - void testKindValueOf() { - assertEquals("1", Kind.valueOf(1).toString()); - } - - @Test - void testKindName() { - assertEquals("text_note", Kind.valueOf(1).getName()); - } - - @Test - void testKindValueOfUndefined() { - assertEquals("-1", Kind.valueOf(9999999).toString()); - } - - @Test - void testKindUndefinedName() { - assertEquals("undefined", Kind.valueOf(9999999).getName()); - } +package nostr.test.event; + +import nostr.event.Kind; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class KindMappingTest { + @Test + void testKindValueOf() { + assertEquals("1", Kind.valueOf(1).toString()); + } + + @Test + void testKindName() { + assertEquals("text_note", Kind.valueOf(1).getName()); + } + + @Test + void testKindValueOfUndefined() { + assertEquals("-1", Kind.valueOf(9999999).toString()); + } + + @Test + void testKindUndefinedName() { + assertEquals("undefined", Kind.valueOf(9999999).getName()); + } } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/event/NIP57ImplTest.java b/nostr-java-test/src/test/java/nostr/test/event/NIP57ImplTest.java index e91032934..a69874a69 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/NIP57ImplTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/NIP57ImplTest.java @@ -1,39 +1,46 @@ -package nostr.test.event; - -import nostr.api.factory.impl.NIP57Impl.ZapRequestEventFactory; -import nostr.base.PublicKey; -import nostr.event.BaseTag; -import nostr.id.Identity; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -public class NIP57ImplTest { - @Test - void testNIP57CreateZapRequestEventFactory() { - System.out.println("testNIP57CreateZapRequestEventFactories"); - - Identity sender = Identity.generateRandomIdentity(); - List baseTags = new ArrayList(); - PublicKey recipient = Identity.generateRandomIdentity().getPublicKey(); - final String ZAP_REQUEST_CONTENT = "zap request content"; - final Long AMOUNT = 1232456L; - final String LNURL = "lnUrl"; - final String RELAYS_TAG = "ws://localhost:5555"; - - ZapRequestEventFactory instance = new ZapRequestEventFactory(sender, recipient, baseTags, ZAP_REQUEST_CONTENT, AMOUNT, LNURL, RELAYS_TAG); - - Assertions.assertNotNull(instance.getIdentity()); - Assertions.assertNotNull(instance.getTags()); - Assertions.assertNotNull(instance.getContent()); - Assertions.assertNotNull(instance.getZapRequest()); - Assertions.assertNotNull(instance.getRecipientKey()); - - Assertions.assertTrue(instance.getZapRequest().getRelaysTag().getRelays().stream().anyMatch(relay -> relay.getUri().equals(RELAYS_TAG))); - Assertions.assertEquals(ZAP_REQUEST_CONTENT, instance.getContent()); - Assertions.assertEquals(LNURL, instance.getZapRequest().getLnUrl()); - Assertions.assertEquals(AMOUNT, instance.getZapRequest().getAmount()); - } +package nostr.test.event; + +import lombok.extern.java.Log; +import nostr.api.factory.impl.NIP57Impl.ZapRequestEventFactory; +import nostr.base.PublicKey; +import nostr.event.BaseTag; +import nostr.id.Identity; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Log +public class NIP57ImplTest { + + @Test + void testNIP57CreateZapRequestEventFactory() { + log.info("testNIP57CreateZapRequestEventFactories"); + + Identity sender = Identity.generateRandomIdentity(); + List baseTags = new ArrayList(); + PublicKey recipient = Identity.generateRandomIdentity().getPublicKey(); + final String ZAP_REQUEST_CONTENT = "zap request content"; + final Long AMOUNT = 1232456L; + final String LNURL = "lnUrl"; + final String RELAYS_TAG = "ws://localhost:5555"; + + ZapRequestEventFactory instance = new ZapRequestEventFactory(sender, recipient, baseTags, ZAP_REQUEST_CONTENT, AMOUNT, LNURL, RELAYS_TAG); + + assertNotNull(instance.getIdentity()); + assertNotNull(instance.getTags()); + assertNotNull(instance.getContent()); + assertNotNull(instance.getZapRequest()); + assertNotNull(instance.getRecipientKey()); + + assertTrue(instance.getZapRequest().getRelaysTag().getRelays().stream().anyMatch(relay -> relay.getUri().equals(RELAYS_TAG))); + assertEquals(ZAP_REQUEST_CONTENT, instance.getContent()); + assertEquals(LNURL, instance.getZapRequest().getLnUrl()); + assertEquals(AMOUNT, instance.getZapRequest().getAmount()); + } + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/event/NIP99ImplTest.java b/nostr-java-test/src/test/java/nostr/test/event/NIP99ImplTest.java index 7c14f0ca7..918d96879 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/NIP99ImplTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/NIP99ImplTest.java @@ -1,119 +1,119 @@ -package nostr.test.event; - -import nostr.api.NIP99; -import nostr.event.BaseTag; -import nostr.event.impl.ClassifiedListing; -import nostr.event.impl.ClassifiedListingEvent; -import nostr.event.impl.GenericTag; -import nostr.event.tag.PriceTag; -import nostr.id.Identity; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class NIP99ImplTest { - public final static String CONTENT = "ClassifiedListingEvent unit test content"; - public final static String UNIT_TEST_TITLE = "unit test title"; - public final static String UNIT_TEST_SUMMARY = "unit test summary"; - public final static String CURRENCY = "BTC"; - public final static String MONTH = "MONTH"; - public final static String LOCATION = "pangea"; - public final static PriceTag PRICE_TAG = new PriceTag(BigDecimal.valueOf(11111), CURRENCY, MONTH); - public final static Long PUBLISHED_AT = 1716513986268L; - static ClassifiedListing classifiedListing; - static Identity sender; - static NIP99 nip99; - - @BeforeAll - static void setup() { - classifiedListing = new ClassifiedListing( - UNIT_TEST_TITLE, - UNIT_TEST_SUMMARY, - PRICE_TAG - ); - classifiedListing.setLocation(LOCATION); - classifiedListing.setPublishedAt(PUBLISHED_AT); - sender = Identity.generateRandomIdentity(); - nip99 = new NIP99<>(sender); - } - - @Test - void testNIP99CreateClassifiedListingEventWithAllOptionalParameters() { - System.out.println("testNIP99CreateClassifiedListingEventWithAllOptionalParameters"); - - List baseTags = new ArrayList(); - ClassifiedListingEvent instance = nip99.createClassifiedListingEvent(baseTags, CONTENT, classifiedListing).getEvent(); - instance.update(); - - assertNotNull(instance.getId()); - assertNull(instance.getClassifiedListing().getId()); - assertEquals(UNIT_TEST_TITLE, instance.getClassifiedListing().getTitle()); - assertEquals(UNIT_TEST_SUMMARY, instance.getClassifiedListing().getSummary()); - assertEquals(PUBLISHED_AT, instance.getClassifiedListing().getPublishedAt()); - assertEquals(LOCATION, instance.getClassifiedListing().getLocation()); - assertEquals(PRICE_TAG, instance.getClassifiedListing().getPriceTag()); - - ClassifiedListing classifiedListing2 = new ClassifiedListing( - UNIT_TEST_TITLE, - UNIT_TEST_SUMMARY, - PRICE_TAG - ); - classifiedListing2.setLocation(LOCATION); - classifiedListing2.setPublishedAt(PUBLISHED_AT); - ClassifiedListingEvent instance2 = nip99.createClassifiedListingEvent(baseTags, CONTENT, classifiedListing).getEvent(); - instance.update(); - - assertEquals(instance, instance2); - assertEquals(instance.getClassifiedListing(), instance2.getClassifiedListing()); - } - - @Test - void testNIP99CreateClassifiedListingEventWithoutOptionalParameters() { - System.out.println("testNIP99CreateClassifiedListingEventWithoutOptionalParameters"); - - List baseTags = new ArrayList(); - - ClassifiedListingEvent instance = nip99.createClassifiedListingEvent(baseTags, CONTENT, classifiedListing).getEvent(); - instance.update(); - - assertNotNull(instance.getId()); - } - - @Test - void testNIP99CreateClassifiedListingEventWithDuplicateParameters() { - System.out.println("testNIP99CreateClassifiedListingEventWithDuplicateParameters"); - - List baseTags = new ArrayList(); - - var nip99 = new NIP99(sender); - - classifiedListing.setLocation(LOCATION); - classifiedListing.setPublishedAt(PUBLISHED_AT); - - baseTags.add(GenericTag.create("published_at", 99, String.valueOf(PUBLISHED_AT))); - ClassifiedListingEvent instance = nip99.createClassifiedListingEvent(baseTags, CONTENT, classifiedListing).getEvent(); - instance.update(); - - assertNotNull(instance.getId()); - assertEquals(LOCATION, instance.getClassifiedListing().getLocation()); - assertEquals(PUBLISHED_AT, instance.getClassifiedListing().getPublishedAt()); - } - - @Test - void testNIP99CreateClassifiedListingEventNullParameters() { - System.out.println("testNIP99CreateClassifiedListingEventNullParameters"); - assertThrows(NullPointerException.class, () -> new ClassifiedListing(null, UNIT_TEST_SUMMARY, PRICE_TAG)); - assertThrows(NullPointerException.class, () -> new ClassifiedListing(UNIT_TEST_TITLE, null, PRICE_TAG)); - assertThrows(NullPointerException.class, () -> new ClassifiedListing(UNIT_TEST_TITLE, UNIT_TEST_SUMMARY, null)); - } -} +package nostr.test.event; + +import nostr.api.NIP99; +import nostr.event.BaseTag; +import nostr.event.impl.ClassifiedListing; +import nostr.event.impl.ClassifiedListingEvent; +import nostr.event.impl.GenericTag; +import nostr.event.tag.PriceTag; +import nostr.id.Identity; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class NIP99ImplTest { + + public final static String CONTENT = "ClassifiedListingEvent unit test content"; + public final static String UNIT_TEST_TITLE = "unit test title"; + public final static String UNIT_TEST_SUMMARY = "unit test summary"; + public final static String CURRENCY = "BTC"; + public final static String MONTH = "MONTH"; + public final static String LOCATION = "pangea"; + public final static PriceTag PRICE_TAG = new PriceTag(BigDecimal.valueOf(11111), CURRENCY, MONTH); + public final static Long PUBLISHED_AT = 1716513986268L; + static ClassifiedListing classifiedListing; + static Identity sender; + static NIP99 nip99; + + @BeforeAll + static void setup() { + classifiedListing = new ClassifiedListing( + UNIT_TEST_TITLE, + UNIT_TEST_SUMMARY, + PRICE_TAG + ); + classifiedListing.setLocation(LOCATION); + classifiedListing.setPublishedAt(PUBLISHED_AT); + sender = Identity.generateRandomIdentity(); + nip99 = new NIP99<>(sender); + } + + @Test + void testNIP99CreateClassifiedListingEventWithAllOptionalParameters() { + System.out.println("testNIP99CreateClassifiedListingEventWithAllOptionalParameters"); + + List baseTags = new ArrayList(); + ClassifiedListingEvent instance = nip99.createClassifiedListingEvent(baseTags, CONTENT, classifiedListing).getEvent(); + instance.update(); + + assertNotNull(instance.getId()); + assertNull(instance.getClassifiedListing().getId()); + assertEquals(UNIT_TEST_TITLE, instance.getClassifiedListing().getTitle()); + assertEquals(UNIT_TEST_SUMMARY, instance.getClassifiedListing().getSummary()); + assertEquals(PUBLISHED_AT, instance.getClassifiedListing().getPublishedAt()); + assertEquals(LOCATION, instance.getClassifiedListing().getLocation()); + assertEquals(PRICE_TAG, instance.getClassifiedListing().getPriceTag()); + + ClassifiedListing classifiedListing2 = new ClassifiedListing( + UNIT_TEST_TITLE, + UNIT_TEST_SUMMARY, + PRICE_TAG + ); + classifiedListing2.setLocation(LOCATION); + classifiedListing2.setPublishedAt(PUBLISHED_AT); + ClassifiedListingEvent instance2 = nip99.createClassifiedListingEvent(baseTags, CONTENT, classifiedListing).getEvent(); + instance.update(); + + assertEquals(instance, instance2); + assertEquals(instance.getClassifiedListing(), instance2.getClassifiedListing()); + } + + @Test + void testNIP99CreateClassifiedListingEventWithoutOptionalParameters() { + System.out.println("testNIP99CreateClassifiedListingEventWithoutOptionalParameters"); + + List baseTags = new ArrayList(); + + ClassifiedListingEvent instance = nip99.createClassifiedListingEvent(baseTags, CONTENT, classifiedListing).getEvent(); + instance.update(); + + assertNotNull(instance.getId()); + } + + @Test + void testNIP99CreateClassifiedListingEventWithDuplicateParameters() { + System.out.println("testNIP99CreateClassifiedListingEventWithDuplicateParameters"); + + List baseTags = new ArrayList(); + + var nip99 = new NIP99(sender); + + classifiedListing.setLocation(LOCATION); + classifiedListing.setPublishedAt(PUBLISHED_AT); + + baseTags.add(GenericTag.create("published_at", 99, String.valueOf(PUBLISHED_AT))); + ClassifiedListingEvent instance = nip99.createClassifiedListingEvent(baseTags, CONTENT, classifiedListing).getEvent(); + instance.update(); + + assertNotNull(instance.getId()); + assertEquals(LOCATION, instance.getClassifiedListing().getLocation()); + assertEquals(PUBLISHED_AT, instance.getClassifiedListing().getPublishedAt()); + } + + @Test + void testNIP99CreateClassifiedListingEventNullParameters() { + System.out.println("testNIP99CreateClassifiedListingEventNullParameters"); + assertThrows(NullPointerException.class, () -> new ClassifiedListing(null, UNIT_TEST_SUMMARY, PRICE_TAG)); + assertThrows(NullPointerException.class, () -> new ClassifiedListing(UNIT_TEST_TITLE, null, PRICE_TAG)); + assertThrows(NullPointerException.class, () -> new ClassifiedListing(UNIT_TEST_TITLE, UNIT_TEST_SUMMARY, null)); + } + +} diff --git a/nostr-java-test/src/test/java/nostr/test/event/PriceTagTest.java b/nostr-java-test/src/test/java/nostr/test/event/PriceTagTest.java index fa8959e41..d242d60f7 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/PriceTagTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/PriceTagTest.java @@ -1,23 +1,25 @@ -package nostr.test.event; - -import nostr.event.tag.PriceTag; -import org.junit.jupiter.api.Test; - -import java.lang.reflect.Field; -import java.math.BigDecimal; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class PriceTagTest { - @Test - void getSupportedFields() { - PriceTag priceTag = new PriceTag(new BigDecimal(11111), "BTC", "NANOSECONDS"); - assertDoesNotThrow(() -> { - List list = priceTag.getSupportedFields().stream().toList(); - assertTrue(List.of("number", "currency", "frequency").containsAll(list.stream().map(Field::getName).toList())); - assertTrue(List.of("java.math.BigDecimal", "java.lang.String").containsAll(list.stream().map(field -> field.getAnnotatedType().toString()).toList())); - }); - } +package nostr.test.event; + +import nostr.event.tag.PriceTag; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PriceTagTest { + + @Test + void getSupportedFields() { + PriceTag priceTag = new PriceTag(new BigDecimal(11111), "BTC", "NANOSECONDS"); + assertDoesNotThrow(() -> { + List list = priceTag.getSupportedFields().stream().toList(); + assertTrue(List.of("number", "currency", "frequency").containsAll(list.stream().map(Field::getName).toList())); + assertTrue(List.of("java.math.BigDecimal", "java.lang.String").containsAll(list.stream().map(field -> field.getAnnotatedType().toString()).toList())); + }); + } + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/event/PubkeyTagTest.java b/nostr-java-test/src/test/java/nostr/test/event/PubkeyTagTest.java index c7955ddc6..986d5e93c 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/PubkeyTagTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/PubkeyTagTest.java @@ -1,24 +1,26 @@ -package nostr.test.event; - -import nostr.base.PublicKey; -import nostr.event.tag.PubKeyTag; -import org.junit.jupiter.api.Test; - -import java.lang.reflect.Field; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; - -class PubkeyTagTest { - @Test - void getSupportedFields() { - String sha256 = "56adf01ca1aa9d6f1c35953833bbe6d99a0c85b73af222e6bd305b51f2749f6f"; - PubKeyTag pubKeyTag = new PubKeyTag(new PublicKey(sha256)); - assertDoesNotThrow(() -> { - Field field = pubKeyTag.getSupportedFields().stream().findFirst().orElseThrow(); - assertEquals("nostr.base.PublicKey", field.getAnnotatedType().toString()); - assertEquals("publicKey", field.getName()); - assertEquals(sha256, pubKeyTag.getFieldValue(field)); - }); - } +package nostr.test.event; + +import nostr.base.PublicKey; +import nostr.event.tag.PubKeyTag; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class PubkeyTagTest { + + @Test + void getSupportedFields() { + String sha256 = "56adf01ca1aa9d6f1c35953833bbe6d99a0c85b73af222e6bd305b51f2749f6f"; + PubKeyTag pubKeyTag = new PubKeyTag(new PublicKey(sha256)); + assertDoesNotThrow(() -> { + Field field = pubKeyTag.getSupportedFields().stream().findFirst().orElseThrow(); + assertEquals("nostr.base.PublicKey", field.getAnnotatedType().toString()); + assertEquals("publicKey", field.getName()); + assertEquals(sha256, pubKeyTag.getFieldValue(field)); + }); + } + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/event/RelaysTagTest.java b/nostr-java-test/src/test/java/nostr/test/event/RelaysTagTest.java index f9ec57d7e..11878d524 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/RelaysTagTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/RelaysTagTest.java @@ -1,44 +1,43 @@ -package nostr.test.event; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import nostr.base.Relay; -import nostr.event.BaseTag; -import nostr.event.json.codec.BaseTagEncoder; -import nostr.event.tag.RelaysTag; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; - -class RelaysTagTest { - public final static String RELAYS_KEY = "relays"; - public final static String HOST_VALUE = "ws://localhost:5555"; - public final static String HOST_VALUE2 = "ws://anotherlocalhost:5432"; - ObjectMapper mapper = new ObjectMapper(); - - @Test - void testSerialize() { - final String expected = "[\"relays\",\"ws://localhost:5555\",\"ws://anotherlocalhost:5432\"]"; - RelaysTag relaysTag = new RelaysTag(List.of(new Relay(HOST_VALUE), new Relay(HOST_VALUE2))); - BaseTagEncoder baseTagEncoder = new BaseTagEncoder(relaysTag); - assertDoesNotThrow(() -> { - assertEquals(expected, baseTagEncoder.encode()); - }); - } - - @Test - void testDeserialize() throws JsonProcessingException { - final String EXPECTED = "[\"relays\",\"ws://localhost:5555\"]"; - JsonNode node = new ObjectMapper().readTree(EXPECTED); - - assertDoesNotThrow(() -> { - BaseTag deserialize = RelaysTag.deserialize(node); - assertEquals(RELAYS_KEY, deserialize.getCode()); - assertEquals(HOST_VALUE, ((RelaysTag) deserialize).getRelays().get(0).getUri()); - }); - } +package nostr.test.event; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import nostr.base.Relay; +import nostr.event.BaseTag; +import nostr.event.json.codec.BaseTagEncoder; +import nostr.event.tag.RelaysTag; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class RelaysTagTest { + + public final static String RELAYS_KEY = "relays"; + public final static String HOST_VALUE = "ws://localhost:5555"; + public final static String HOST_VALUE2 = "ws://anotherlocalhost:5432"; + + @Test + void testSerialize() { + final String expected = "[\"relays\",\"ws://localhost:5555\",\"ws://anotherlocalhost:5432\"]"; + RelaysTag relaysTag = new RelaysTag(List.of(new Relay(HOST_VALUE), new Relay(HOST_VALUE2))); + BaseTagEncoder baseTagEncoder = new BaseTagEncoder(relaysTag); + assertDoesNotThrow(() -> { + assertEquals(expected, baseTagEncoder.encode()); + }); + } + + @Test + void testDeserialize() { + final String EXPECTED = "[\"relays\",\"ws://localhost:5555\"]"; + assertDoesNotThrow(() -> { + JsonNode node = new ObjectMapper().readTree(EXPECTED); + BaseTag deserialize = RelaysTag.deserialize(node); + assertEquals(RELAYS_KEY, deserialize.getCode()); + assertEquals(HOST_VALUE, ((RelaysTag) deserialize).getRelays().get(0).getUri()); + }); + } + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/event/ZapReceiptEventTest.java b/nostr-java-test/src/test/java/nostr/test/event/ZapReceiptEventTest.java index 212373329..f0e5117b1 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/ZapReceiptEventTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/ZapReceiptEventTest.java @@ -1,47 +1,50 @@ -package nostr.test.event; - -import nostr.base.PublicKey; -import nostr.event.BaseTag; -import nostr.event.impl.GenericTag; -import nostr.event.impl.ZapReceiptEvent; -import nostr.event.tag.AddressTag; -import nostr.event.tag.IdentifierTag; -import nostr.id.Identity; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.Optional; - -class ZapReceiptEventTest { - @Test - void testConstructZapReceiptEvent() { - System.out.println("testConstructZapReceiptEvent"); - - PublicKey sender = Identity.generateRandomIdentity().getPublicKey(); - String zapRequestPubKeyTag = Identity.generateRandomIdentity().getPublicKey().toString(); - String zapRequestEventTag = Identity.generateRandomIdentity().getPublicKey().toString(); - String zapRequestAddressTag = Identity.generateRandomIdentity().getPublicKey().toString(); - final String ZAP_RECEIPT_IDENTIFIER = "ipsum"; - final String ZAP_RECEIPT_RELAY_URI = "ws://localhost:5555"; - final String BOLT_11 = "bolt11"; - final String DESCRIPTION_SHA256 = "descriptionSha256"; - final String PRE_IMAGE = "preimage"; - - ZapReceiptEvent instance = new ZapReceiptEvent(sender, zapRequestPubKeyTag, zapRequestEventTag, zapRequestAddressTag, ZAP_RECEIPT_IDENTIFIER, ZAP_RECEIPT_RELAY_URI, BOLT_11, DESCRIPTION_SHA256, PRE_IMAGE); - - Assertions.assertNotNull(instance.getZapReceipt()); - Assertions.assertNotNull(instance.getZapReceipt().getBolt11()); - Assertions.assertNotNull(instance.getZapReceipt().getDescriptionSha256()); - Assertions.assertNotNull(instance.getZapReceipt().getPreimage()); - - Assertions.assertTrue(instance.getTags().stream().filter(AddressTag.class::isInstance).map(AddressTag.class::cast).map(addressTag -> addressTag.getPublicKey().toString()).anyMatch(zapRequestAddressTag::equals)); - - Assertions.assertTrue(instance.getTags().stream().filter(AddressTag.class::isInstance).map(AddressTag.class::cast).map(addressTag -> addressTag.getRelay().getUri()).anyMatch(ZAP_RECEIPT_RELAY_URI::equals)); - - Assertions.assertTrue(instance.getTags().stream().filter(AddressTag.class::isInstance).map(AddressTag.class::cast).map(addressTag -> addressTag.getIdentifierTag().getId()).anyMatch(ZAP_RECEIPT_IDENTIFIER::equals)); - - Assertions.assertEquals(BOLT_11, instance.getZapReceipt().getBolt11()); - Assertions.assertEquals(DESCRIPTION_SHA256, instance.getZapReceipt().getDescriptionSha256()); - Assertions.assertEquals(PRE_IMAGE, instance.getZapReceipt().getPreimage()); - } +package nostr.test.event; + +import lombok.extern.java.Log; +import nostr.base.PublicKey; +import nostr.event.impl.ZapReceiptEvent; +import nostr.event.tag.AddressTag; +import nostr.id.Identity; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Log +class ZapReceiptEventTest { + + @Test + void testConstructZapReceiptEvent() { + + log.info("testConstructZapReceiptEvent"); + + PublicKey sender = Identity.generateRandomIdentity().getPublicKey(); + String zapRequestPubKeyTag = Identity.generateRandomIdentity().getPublicKey().toString(); + String zapRequestEventTag = Identity.generateRandomIdentity().getPublicKey().toString(); + String zapRequestAddressTag = Identity.generateRandomIdentity().getPublicKey().toString(); + final String ZAP_RECEIPT_IDENTIFIER = "ipsum"; + final String ZAP_RECEIPT_RELAY_URI = "ws://localhost:5555"; + final String BOLT_11 = "bolt11"; + final String DESCRIPTION_SHA256 = "descriptionSha256"; + final String PRE_IMAGE = "preimage"; + + ZapReceiptEvent instance = new ZapReceiptEvent(sender, zapRequestPubKeyTag, zapRequestEventTag, zapRequestAddressTag, ZAP_RECEIPT_IDENTIFIER, ZAP_RECEIPT_RELAY_URI, BOLT_11, DESCRIPTION_SHA256, PRE_IMAGE); + + assertNotNull(instance.getZapReceipt()); + assertNotNull(instance.getZapReceipt().getBolt11()); + assertNotNull(instance.getZapReceipt().getDescriptionSha256()); + assertNotNull(instance.getZapReceipt().getPreimage()); + + assertTrue(instance.getTags().stream().filter(AddressTag.class::isInstance).map(AddressTag.class::cast).map(addressTag -> addressTag.getPublicKey().toString()).anyMatch(zapRequestAddressTag::equals)); + + assertTrue(instance.getTags().stream().filter(AddressTag.class::isInstance).map(AddressTag.class::cast).map(addressTag -> addressTag.getRelay().getUri()).anyMatch(ZAP_RECEIPT_RELAY_URI::equals)); + + assertTrue(instance.getTags().stream().filter(AddressTag.class::isInstance).map(AddressTag.class::cast).map(addressTag -> addressTag.getIdentifierTag().getId()).anyMatch(ZAP_RECEIPT_IDENTIFIER::equals)); + + assertEquals(BOLT_11, instance.getZapReceipt().getBolt11()); + assertEquals(DESCRIPTION_SHA256, instance.getZapReceipt().getDescriptionSha256()); + assertEquals(PRE_IMAGE, instance.getZapReceipt().getPreimage()); + } + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/event/ZapRequestEventTest.java b/nostr-java-test/src/test/java/nostr/test/event/ZapRequestEventTest.java index f73dce58a..4812c2be9 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/ZapRequestEventTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/ZapRequestEventTest.java @@ -1,34 +1,39 @@ -package nostr.test.event; - -import nostr.event.BaseTag; -import nostr.event.impl.ZapRequestEvent; -import nostr.id.Identity; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -class ZapRequestEventTest { - @Test - void testConstructZapRequestEvent() { - System.out.println("testConstructZapRequestEvent"); - String sender = Identity.generateRandomIdentity().getPublicKey().toString(); - String recipient = Identity.generateRandomIdentity().getPublicKey().toString(); - List baseTags = new ArrayList(); - final String ZAP_REQUEST_CONTENT = "zap request content"; - final Long AMOUNT = 1232456L; - final String LNURL = "lnUrl"; - final String RELAYS_TAG = "ws://localhost:5555"; - ZapRequestEvent instance = new ZapRequestEvent(sender, recipient, baseTags, ZAP_REQUEST_CONTENT, AMOUNT, LNURL, RELAYS_TAG); - - Assertions.assertNotNull(instance.getTags()); - Assertions.assertNotNull(instance.getContent()); - Assertions.assertNotNull(instance.getZapRequest()); - - Assertions.assertTrue(instance.getZapRequest().getRelaysTag().getRelays().stream().anyMatch(relay -> relay.getUri().equals(RELAYS_TAG))); - Assertions.assertEquals(ZAP_REQUEST_CONTENT, instance.getContent()); - Assertions.assertEquals(LNURL, instance.getZapRequest().getLnUrl()); - Assertions.assertEquals(AMOUNT, instance.getZapRequest().getAmount()); - } +package nostr.test.event; + +import nostr.event.BaseTag; +import nostr.event.impl.ZapRequestEvent; +import nostr.id.Identity; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ZapRequestEventTest { + + @Test + void testConstructZapRequestEvent() { + System.out.println("testConstructZapRequestEvent"); + String sender = Identity.generateRandomIdentity().getPublicKey().toString(); + String recipient = Identity.generateRandomIdentity().getPublicKey().toString(); + List baseTags = new ArrayList(); + final String ZAP_REQUEST_CONTENT = "zap request content"; + final Long AMOUNT = 1232456L; + final String LNURL = "lnUrl"; + final String RELAYS_TAG = "ws://localhost:5555"; + ZapRequestEvent instance = new ZapRequestEvent(sender, recipient, baseTags, ZAP_REQUEST_CONTENT, AMOUNT, LNURL, RELAYS_TAG); + + assertNotNull(instance.getTags()); + assertNotNull(instance.getContent()); + assertNotNull(instance.getZapRequest()); + + assertTrue(instance.getZapRequest().getRelaysTag().getRelays().stream().anyMatch(relay -> relay.getUri().equals(RELAYS_TAG))); + assertEquals(ZAP_REQUEST_CONTENT, instance.getContent()); + assertEquals(LNURL, instance.getZapRequest().getLnUrl()); + assertEquals(AMOUNT, instance.getZapRequest().getAmount()); + } + } \ No newline at end of file diff --git a/nostr-java-test/src/test/java/nostr/test/id/IdentityTest.java b/nostr-java-test/src/test/java/nostr/test/id/IdentityTest.java index 53cb2bb15..04f8183e5 100644 --- a/nostr-java-test/src/test/java/nostr/test/id/IdentityTest.java +++ b/nostr-java-test/src/test/java/nostr/test/id/IdentityTest.java @@ -1,66 +1,66 @@ -package nostr.test.id; - -import nostr.base.PublicKey; -import nostr.event.tag.DelegationTag; -import nostr.event.impl.GenericEvent; -import nostr.id.Identity; -import nostr.test.EntityFactory; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -/** - * - * @author squirrel - */ -public class IdentityTest { - - public IdentityTest() { - } - - @Test - public void testSignEvent() { - System.out.println("testSignEvent"); - Identity identity = Identity.generateRandomIdentity(); - PublicKey publicKey = identity.getPublicKey(); - GenericEvent instance = EntityFactory.Events.createTextNoteEvent(publicKey); - identity.sign(instance); - Assertions.assertNotNull(instance.getSignature()); - } - - @Test - public void testSignDelegationTag() { - System.out.println("testSignDelegationTag"); - Identity identity = Identity.generateRandomIdentity(); - PublicKey publicKey = identity.getPublicKey(); - DelegationTag delegationTag = new DelegationTag(publicKey, null); - identity.sign(delegationTag); - Assertions.assertNotNull(delegationTag.getSignature()); - } - - -/* - @Test - public void testDecryptMessage() { - try { - System.out.println("testDecryptMessage"); - var senderPublicKey = Identity.getInstance().getPublicKey(); - - PrivateKey rcptSecKey = new PrivateKey(NostrUtil.hexToBytes(Bech32.fromBech32("nsec13sntjjh35dd4u3lwy42lnpszydmkwar708y3jzwxr937fy2q73hsmvez4z"))); - PublicKey rcptPubKey = new PublicKey("edd898fc2817ee64f7ee1941d193d53c2daa77db4b8409240565fc9644626878"); - - final DirectMessageEvent dmEvent = EntityFactory.Events.createDirectMessageEvent(senderPublicKey, rcptPubKey, "Hello uq7yfx3l!"); - - new IdentityHelper(Identity.getInstance()).encryptDirectMessage(dmEvent); - - var rcptId = new Identity(rcptSecKey); - var msg = new IdentityHelper(rcptId).decryptMessage(dmEvent.getContent(), dmEvent.getPubKey()); - - Assertions.assertEquals("Hello uq7yfx3l!", msg); - } catch (NostrException ex) { - Assertions.fail(ex); - } - } -*/ - -} +package nostr.test.id; + +import nostr.base.PublicKey; +import nostr.event.tag.DelegationTag; +import nostr.event.impl.GenericEvent; +import nostr.id.Identity; +import nostr.test.EntityFactory; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * + * @author squirrel + */ +public class IdentityTest { + + public IdentityTest() { + } + + @Test + public void testSignEvent() { + System.out.println("testSignEvent"); + Identity identity = Identity.generateRandomIdentity(); + PublicKey publicKey = identity.getPublicKey(); + GenericEvent instance = EntityFactory.Events.createTextNoteEvent(publicKey); + identity.sign(instance); + Assertions.assertNotNull(instance.getSignature()); + } + + @Test + public void testSignDelegationTag() { + System.out.println("testSignDelegationTag"); + Identity identity = Identity.generateRandomIdentity(); + PublicKey publicKey = identity.getPublicKey(); + DelegationTag delegationTag = new DelegationTag(publicKey, null); + identity.sign(delegationTag); + Assertions.assertNotNull(delegationTag.getSignature()); + } + + +/* + @Test + public void testDecryptMessage() { + try { + System.out.println("testDecryptMessage"); + var senderPublicKey = Identity.getInstance().getPublicKey(); + + PrivateKey rcptSecKey = new PrivateKey(NostrUtil.hexToBytes(Bech32.fromBech32("nsec13sntjjh35dd4u3lwy42lnpszydmkwar708y3jzwxr937fy2q73hsmvez4z"))); + PublicKey rcptPubKey = new PublicKey("edd898fc2817ee64f7ee1941d193d53c2daa77db4b8409240565fc9644626878"); + + final DirectMessageEvent dmEvent = EntityFactory.Events.createDirectMessageEvent(senderPublicKey, rcptPubKey, "Hello uq7yfx3l!"); + + new IdentityHelper(Identity.getInstance()).encryptDirectMessage(dmEvent); + + var rcptId = new Identity(rcptSecKey); + var msg = new IdentityHelper(rcptId).decryptMessage(dmEvent.getContent(), dmEvent.getPubKey()); + + Assertions.assertEquals("Hello uq7yfx3l!", msg); + } catch (NostrException ex) { + Assertions.fail(ex); + } + } +*/ + +} 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 4684674eb..c04eb7b79 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 @@ -1,306 +1,316 @@ -package nostr.test.json; - -import com.fasterxml.jackson.core.JsonProcessingException; -import nostr.api.NIP01; -import nostr.base.Command; -import nostr.base.ElementAttribute; -import nostr.base.GenericTagQuery; -import nostr.base.PublicKey; -import nostr.crypto.bech32.Bech32; -import nostr.event.BaseEvent; -import nostr.event.BaseEvent.ProxyEvent; -import nostr.event.BaseMessage; -import nostr.event.BaseTag; -import nostr.event.Kind; -import nostr.event.Marker; -import nostr.event.impl.Filters; -import nostr.event.impl.GenericEvent; -import nostr.event.impl.GenericTag; -import nostr.event.json.codec.BaseEventEncoder; -import nostr.event.json.codec.BaseMessageDecoder; -import nostr.event.json.codec.BaseTagDecoder; -import nostr.event.json.codec.FiltersEncoder; -import nostr.event.json.codec.GenericEventDecoder; -import nostr.event.json.codec.GenericTagDecoder; -import nostr.event.message.EventMessage; -import nostr.event.message.ReqMessage; -import nostr.event.tag.EventTag; -import nostr.event.tag.PriceTag; -import nostr.event.tag.PubKeyTag; -import nostr.id.Identity; -import nostr.util.NostrException; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * @author eric - */ -public class JsonParseTest { - - @Test - public void testBaseMessageDecoder() { - System.out.println("testBaseMessageDecoder"); - - final String parseTarget = - "[\"REQ\", " + - "\"npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh\", " + - "{\"kinds\": [1], " + - "\"authors\": [\"f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75\"]," + - "\"#e\": [\"fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712\"]}]"; - - final var message = new BaseMessageDecoder<>().decode(parseTarget); - - assertEquals(Command.REQ.toString(), message.getCommand()); - assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", ((ReqMessage) message).getSubscriptionId()); - assertEquals(1, ((ReqMessage) message).getFiltersList().size()); - - var filters = ((ReqMessage) message).getFiltersList().get(0); - - assertEquals(1, filters.getKinds().size()); - assertEquals(Kind.TEXT_NOTE, filters.getKinds().get(0)); - - assertEquals(1, filters.getAuthors().size()); - assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", filters.getAuthors().get(0).toBech32String()); - - assertEquals(1, filters.getReferencedEvents().size()); - assertEquals("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712", (filters.getReferencedEvents().get(0).getId())); - } - - @Test - public void testBaseReqMessageDecoder() throws JsonProcessingException { - System.out.println("testBaseReqMessageDecoder"); - - final var filtersList = new ArrayList(); - var publicKey = Identity.generateRandomIdentity().getPublicKey(); - filtersList.add(Filters.builder().authors(new ArrayList<>(List.of(publicKey))).kinds(new ArrayList<>(List.of(Kind.CONTACT_LIST, Kind.DELETION))).build()); - filtersList.add(Filters.builder().kinds(new ArrayList<>(List.of(Kind.SET_METADATA, Kind.TEXT_NOTE))).build()); - - filtersList.add(Filters.builder().referencedEvents(new ArrayList<>(List.of(new ProxyEvent("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712")))).build()); - - final var reqMessage = new ReqMessage(publicKey.toString(), filtersList); - - var jsonMessage = reqMessage.encode(); - - var jsonMsg = jsonMessage.substring(1, jsonMessage.length() - 1); - var parts = jsonMsg.split(","); - Assertions.assertEquals("\"REQ\"", parts[0]); - Assertions.assertEquals("\"" + publicKey.toString() + "\"", parts[1]); - Assertions.assertFalse(parts[2].startsWith("[")); - Assertions.assertFalse(parts[parts.length - 1].endsWith("]")); - - var message = new BaseMessageDecoder<>().decode(jsonMessage); - - assertEquals(reqMessage, message); - } - - @Test - public void testBaseEventMessageDecoder() { - System.out.println("testBaseEventMessageDecoder"); - - final String parseTarget - = "[\"EVENT\"," - + "\"npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh\"," - + "{" - + "\"content\":\"直んないわ。まあええか\"," - + "\"created_at\":1686199583," - + "\"id\":\"fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712\"," - + "\"kind\":1," - + "\"pubkey\":\"8c59239319637f97e007dad0d681e65ce35b1ace333b629e2d33f9465c132608\"," - + "\"sig\":\"9584afd231c52fcbcec6ce668a2cc4b6dc9b4d9da20510dcb9005c6844679b4844edb7a2e1e0591958b0295241567c774dbf7d39a73932877542de1a5f963f4b\"," - + "\"tags\":[]" - + "}]"; - - final var message = new BaseMessageDecoder<>().decode(parseTarget); - - assertEquals(Command.EVENT.toString(), message.getCommand()); - - final var event = (GenericEvent) (((EventMessage) message).getEvent()); - assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", ((EventMessage) message).getSubscriptionId()); - assertEquals(1, event.getKind().intValue()); - assertEquals(1686199583, event.getCreatedAt().longValue()); - assertEquals("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712", event.getId()); - } - - @Test - public void testBaseEventMessageMarkerDecoder() { - System.out.println("testBaseEventMessageMarkerDecoder"); - - String json = "[" - + "\"EVENT\"," - + "\"temp20230627\"," - + "{" - + "\"id\":\"28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a\"," - + "\"kind\":1," - + "\"pubkey\":\"2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984\"," - + "\"created_at\":1687765220," - + "\"content\":\"手順書が間違ってたら作業者は無理だな\"," - + "\"tags\":[" - + "[\"e\",\"494001ac0c8af2a10f60f23538e5b35d3cdacb8e1cc956fe7a16dfa5cbfc4346\",\"\",\"root\"]," - + "[\"p\",\"2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984\"]" - + "]," - + "\"sig\":\"86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546\"" - + "}]"; - - BaseMessage message = new BaseMessageDecoder<>().decode(json); - - final var event = (GenericEvent) (((EventMessage) message).getEvent()); - var tags = event.getTags(); - for (BaseTag t : tags) { - if (t.getCode().equalsIgnoreCase("e")) { - EventTag et = (EventTag) t; - assertEquals(Marker.ROOT, et.getMarker()); - } - } - } - - @Test - public void testGenericTagDecoder() { - System.out.println("testGenericTagDecoder"); - final String jsonString = "[\"saturn\", \"jetpack\", false]"; - - var tag = new GenericTagDecoder<>().decode(jsonString); - - assertEquals("saturn", tag.getCode()); - assertEquals(2, tag.getAttributes().size()); - assertEquals("jetpack", ((ElementAttribute) (tag.getAttributes().toArray())[0]).getValue()); - assertEquals(false, Boolean.valueOf(((ElementAttribute) (tag.getAttributes().toArray())[1]).getValue().toString())); - } - - @Test - public void testClassifiedListingTagSerializer() throws NostrException, JsonProcessingException { - System.out.println("testClassifiedListingSerializer"); - var classifiedListingEventJson = "{" - + "\"id\":\"28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a\"," - + "\"kind\":30402," - + "\"content\":\"content ipsum\"," - + "\"pubkey\":\"ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de\"," - + "\"created_at\":1687765220," - + "\"tags\":[" - + "[\"p\",\"ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de\"]," - + "[\"title\",\"title ipsum\"]," - + "[\"summary\",\"summary ipsum\"]," - + "[\"published_at\",\"1687765220\"]," - + "[\"location\",\"location ipsum\"]," - + "[\"price\",\"11111\",\"BTC\",\"1\"]]," - + "\"sig\":\"86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546\"" - + "}]"; - - GenericEvent event = new GenericEventDecoder<>().decode(classifiedListingEventJson); - EventMessage message = NIP01.createEventMessage(event, "1"); - assertEquals(1, message.getNip()); - String encoded = new BaseEventEncoder<>((BaseEvent) message.getEvent()).encode(); - assertEquals("{\"id\":\"28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a\",\"kind\":30402,\"content\":\"content ipsum\",\"pubkey\":\"ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de\",\"created_at\":1687765220,\"tags\":[[\"p\",\"ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de\"],[\"title\",\"title ipsum\"],[\"summary\",\"summary ipsum\"],[\"published_at\",\"1687765220\"],[\"location\",\"location ipsum\"],[\"price\",\"11111\",\"BTC\",\"1\"]],\"sig\":\"86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546\"}", encoded); - - assertEquals("28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a", event.getId()); - assertEquals(30402, event.getKind()); - assertEquals("content ipsum", event.getContent()); - assertEquals("ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de", event.getPubKey().toString()); - assertEquals(1687765220L, event.getCreatedAt()); - assertEquals("86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546", event.getSignature().toString()); - - assertEquals(new BigDecimal("11111"), event.getTags().stream().filter(baseTag -> - baseTag.getCode().equalsIgnoreCase("price")) - .filter(PriceTag.class::isInstance) - .map(PriceTag.class::cast) - .map(PriceTag::getNumber).findFirst().orElseThrow()); - - assertEquals("BTC", event.getTags().stream().filter(baseTag -> - baseTag.getCode().equalsIgnoreCase("price")) - .filter(PriceTag.class::isInstance) - .map(PriceTag.class::cast) - .map(PriceTag::getCurrency).findFirst().orElseThrow()); - - assertEquals("1", event.getTags().stream().filter(baseTag -> - baseTag.getCode().equalsIgnoreCase("price")) - .filter(PriceTag.class::isInstance) - .map(PriceTag.class::cast) - .map(PriceTag::getFrequency).findFirst().orElseThrow()); - - List genericTags = event.getTags().stream() - .filter(GenericTag.class::isInstance) - .map(GenericTag.class::cast).toList(); - - assertEquals("title ipsum", genericTags.stream() - .filter(tag -> tag.getCode().equalsIgnoreCase("title")).map(GenericTag::getAttributes).toList().get(0).get(0).getValue()); - - assertEquals("summary ipsum", genericTags.stream() - .filter(tag -> tag.getCode().equalsIgnoreCase("summary")).map(GenericTag::getAttributes).toList().get(0).get(0).getValue()); - - assertEquals("1687765220", genericTags.stream() - .filter(tag -> tag.getCode().equalsIgnoreCase("published_at")).map(GenericTag::getAttributes).toList().get(0).get(0).getValue()); - - assertEquals("location ipsum", genericTags.stream() - .filter(tag -> tag.getCode().equalsIgnoreCase("location")).map(GenericTag::getAttributes).toList().get(0).get(0).getValue()); - } - - @Test - public void testDeserializeTag() throws NostrException { - System.out.println("testDeserializeTag"); - - String npubHex = new PublicKey(Bech32.decode("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9").data).toString(); - final String jsonString = "[\"p\", \"" + npubHex + "\", \"wss://nostr.java\", \"alice\"]"; - var tag = new BaseTagDecoder<>().decode(jsonString); - - Assertions.assertTrue(tag instanceof PubKeyTag); - - PubKeyTag pTag = (PubKeyTag) tag; - assertEquals("wss://nostr.java", pTag.getMainRelayUrl()); - assertEquals(npubHex, pTag.getPublicKey().toString()); - assertEquals("alice", pTag.getPetName()); - } - - @Test - public void testDeserializeGenericTag() throws NostrException { - System.out.println("testDeserializeGenericTag"); - - String npubHex = new PublicKey(Bech32.decode("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9").data).toString(); - final String jsonString = "[\"gt\", \"" + npubHex + "\", \"wss://nostr.java\", \"alice\"]"; - var tag = new BaseTagDecoder<>().decode(jsonString); - - Assertions.assertTrue(tag instanceof GenericTag); - - GenericTag gTag = (GenericTag) tag; - assertEquals("gt", gTag.getCode()); - } - - @Test - public void testFiltersEncoder() { - System.out.println("testFiltersEncoder"); - - String new_geohash = "2vghde"; - List geohashList = new ArrayList<>(); - geohashList.add(new_geohash); - GenericTagQuery genericTagQuery = new GenericTagQuery(); - genericTagQuery.setTagName("g"); - genericTagQuery.setValue(geohashList); - Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); - - FiltersEncoder encoder = new FiltersEncoder(filters); - String jsonMessage = encoder.encode(); - assertEquals("{\"#g\":[\"2vghde\"]}", jsonMessage); - } - - @Test - public void testReqMessageSerializer() throws JsonProcessingException { - System.out.println("testFiltersEncoder"); - - String new_geohash = "2vghde"; - List geohashList = new ArrayList<>(); - geohashList.add(new_geohash); - GenericTagQuery genericTagQuery = new GenericTagQuery(); - genericTagQuery.setTagName("g"); - genericTagQuery.setValue(geohashList); - Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); - - ReqMessage reqMessage = new ReqMessage("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9", new ArrayList(List.of(filters))); - String jsonMessage = reqMessage.encode(); - - assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\"]}]", jsonMessage); - } -} +package nostr.test.json; + +import lombok.extern.java.Log; +import nostr.api.NIP01; +import nostr.base.Command; +import nostr.base.ElementAttribute; +import nostr.base.GenericTagQuery; +import nostr.base.PublicKey; +import nostr.crypto.bech32.Bech32; +import nostr.event.BaseEvent; +import nostr.event.BaseEvent.ProxyEvent; +import nostr.event.BaseMessage; +import nostr.event.BaseTag; +import nostr.event.Kind; +import nostr.event.Marker; +import nostr.event.impl.Filters; +import nostr.event.impl.GenericEvent; +import nostr.event.impl.GenericTag; +import nostr.event.json.codec.BaseEventEncoder; +import nostr.event.json.codec.BaseMessageDecoder; +import nostr.event.json.codec.BaseTagDecoder; +import nostr.event.json.codec.FiltersEncoder; +import nostr.event.json.codec.GenericEventDecoder; +import nostr.event.json.codec.GenericTagDecoder; +import nostr.event.message.EventMessage; +import nostr.event.message.ReqMessage; +import nostr.event.tag.EventTag; +import nostr.event.tag.PriceTag; +import nostr.event.tag.PubKeyTag; +import nostr.id.Identity; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author eric + */ +@Log +public class JsonParseTest { + + @Test + public void testBaseMessageDecoder() { + log.info("testBaseMessageDecoder"); + + final String parseTarget = + "[\"REQ\", " + + "\"npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh\", " + + "{\"kinds\": [1], " + + "\"authors\": [\"f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75\"]," + + "\"#e\": [\"fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712\"]}]"; + + final var message = new BaseMessageDecoder<>().decode(parseTarget); + + assertEquals(Command.REQ.toString(), message.getCommand()); + assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", ((ReqMessage) message).getSubscriptionId()); + assertEquals(1, ((ReqMessage) message).getFiltersList().size()); + + var filters = ((ReqMessage) message).getFiltersList().get(0); + + assertEquals(1, filters.getKinds().size()); + assertEquals(Kind.TEXT_NOTE, filters.getKinds().get(0)); + + assertEquals(1, filters.getAuthors().size()); + assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", filters.getAuthors().get(0).toBech32String()); + + assertEquals(1, filters.getReferencedEvents().size()); + assertEquals("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712", (filters.getReferencedEvents().get(0).getId())); + } + + @Test + public void testBaseReqMessageDecoder() { + log.info("testBaseReqMessageDecoder"); + + final var filtersList = new ArrayList(); + var publicKey = Identity.generateRandomIdentity().getPublicKey(); + filtersList.add(Filters.builder().authors(new ArrayList<>(List.of(publicKey))).kinds(new ArrayList<>(List.of(Kind.CONTACT_LIST, Kind.DELETION))).build()); + filtersList.add(Filters.builder().kinds(new ArrayList<>(List.of(Kind.SET_METADATA, Kind.TEXT_NOTE))).build()); + + filtersList.add(Filters.builder().referencedEvents(new ArrayList<>(List.of(new ProxyEvent("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712")))).build()); + + final var reqMessage = new ReqMessage(publicKey.toString(), filtersList); + + assertDoesNotThrow(() -> { + String jsonMessage = reqMessage.encode(); + + String jsonMsg = jsonMessage.substring(1, jsonMessage.length() - 1); + String[] parts = jsonMsg.split(","); + assertEquals("\"REQ\"", parts[0]); + assertEquals("\"" + publicKey.toString() + "\"", parts[1]); + assertFalse(parts[2].startsWith("[")); + assertFalse(parts[parts.length - 1].endsWith("]")); + + BaseMessage message = new BaseMessageDecoder<>().decode(jsonMessage); + + assertEquals(reqMessage, message); + }); + } + + @Test + public void testBaseEventMessageDecoder() { + log.info("testBaseEventMessageDecoder"); + + final String parseTarget + = "[\"EVENT\"," + + "\"npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh\"," + + "{" + + "\"content\":\"直んないわ。まあええか\"," + + "\"created_at\":1686199583," + + "\"id\":\"fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712\"," + + "\"kind\":1," + + "\"pubkey\":\"8c59239319637f97e007dad0d681e65ce35b1ace333b629e2d33f9465c132608\"," + + "\"sig\":\"9584afd231c52fcbcec6ce668a2cc4b6dc9b4d9da20510dcb9005c6844679b4844edb7a2e1e0591958b0295241567c774dbf7d39a73932877542de1a5f963f4b\"," + + "\"tags\":[]" + + "}]"; + + final var message = new BaseMessageDecoder<>().decode(parseTarget); + + assertEquals(Command.EVENT.toString(), message.getCommand()); + + final var event = (GenericEvent) (((EventMessage) message).getEvent()); + assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", ((EventMessage) message).getSubscriptionId()); + assertEquals(1, event.getKind().intValue()); + assertEquals(1686199583, event.getCreatedAt().longValue()); + assertEquals("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712", event.getId()); + } + + @Test + public void testBaseEventMessageMarkerDecoder() { + log.info("testBaseEventMessageMarkerDecoder"); + + final String json = "[" + + "\"EVENT\"," + + "\"temp20230627\"," + + "{" + + "\"id\":\"28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a\"," + + "\"kind\":1," + + "\"pubkey\":\"2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984\"," + + "\"created_at\":1687765220," + + "\"content\":\"手順書が間違ってたら作業者は無理だな\"," + + "\"tags\":[" + + "[\"e\",\"494001ac0c8af2a10f60f23538e5b35d3cdacb8e1cc956fe7a16dfa5cbfc4346\",\"\",\"root\"]," + + "[\"p\",\"2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76984\"]" + + "]," + + "\"sig\":\"86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546\"" + + "}]"; + + BaseMessage message = new BaseMessageDecoder<>().decode(json); + + final var event = (GenericEvent) (((EventMessage) message).getEvent()); + var tags = event.getTags(); + for (BaseTag t : tags) { + if (t.getCode().equalsIgnoreCase("e")) { + EventTag et = (EventTag) t; + assertEquals(Marker.ROOT, et.getMarker()); + } + } + } + + @Test + public void testGenericTagDecoder() { + log.info("testGenericTagDecoder"); + final String jsonString = "[\"saturn\", \"jetpack\", false]"; + + var tag = new GenericTagDecoder<>().decode(jsonString); + + assertEquals("saturn", tag.getCode()); + assertEquals(2, tag.getAttributes().size()); + assertEquals("jetpack", ((ElementAttribute) (tag.getAttributes().toArray())[0]).getValue()); + assertEquals(false, Boolean.valueOf(((ElementAttribute) (tag.getAttributes().toArray())[1]).getValue().toString())); + } + + @Test + public void testClassifiedListingTagSerializer() { + log.info("testClassifiedListingSerializer"); + final String classifiedListingEventJson = "{" + + "\"id\":\"28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a\"," + + "\"kind\":30402," + + "\"content\":\"content ipsum\"," + + "\"pubkey\":\"ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de\"," + + "\"created_at\":1687765220," + + "\"tags\":[" + + "[\"p\",\"ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de\"]," + + "[\"title\",\"title ipsum\"]," + + "[\"summary\",\"summary ipsum\"]," + + "[\"published_at\",\"1687765220\"]," + + "[\"location\",\"location ipsum\"]," + + "[\"price\",\"11111\",\"BTC\",\"1\"]]," + + "\"sig\":\"86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546\"" + + "}]"; + + GenericEvent event = new GenericEventDecoder<>().decode(classifiedListingEventJson); + EventMessage message = NIP01.createEventMessage(event, "1"); + assertEquals(1, message.getNip()); + String encoded = new BaseEventEncoder<>((BaseEvent) message.getEvent()).encode(); + assertEquals("{\"id\":\"28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a\",\"kind\":30402,\"content\":\"content ipsum\",\"pubkey\":\"ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de\",\"created_at\":1687765220,\"tags\":[[\"p\",\"ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de\"],[\"title\",\"title ipsum\"],[\"summary\",\"summary ipsum\"],[\"published_at\",\"1687765220\"],[\"location\",\"location ipsum\"],[\"price\",\"11111\",\"BTC\",\"1\"]],\"sig\":\"86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546\"}", encoded); + + assertEquals("28f2fc030e335d061f0b9d03ce0e2c7d1253e6fadb15d89bd47379a96b2c861a", event.getId()); + assertEquals(30402, event.getKind()); + assertEquals("content ipsum", event.getContent()); + assertEquals("ec0762fe78b0f0b763d1324452d973a38bef576d1d76662722d2b8ff948af1de", event.getPubKey().toString()); + assertEquals(1687765220L, event.getCreatedAt()); + assertEquals("86f25c161fec51b9e441bdb2c09095d5f8b92fdce66cb80d9ef09fad6ce53eaa14c5e16787c42f5404905536e43ebec0e463aee819378a4acbe412c533e60546", event.getSignature().toString()); + + assertEquals(new BigDecimal("11111"), event.getTags().stream().filter(baseTag -> + baseTag.getCode().equalsIgnoreCase("price")) + .filter(PriceTag.class::isInstance) + .map(PriceTag.class::cast) + .map(PriceTag::getNumber).findFirst().orElseThrow()); + + assertEquals("BTC", event.getTags().stream().filter(baseTag -> + baseTag.getCode().equalsIgnoreCase("price")) + .filter(PriceTag.class::isInstance) + .map(PriceTag.class::cast) + .map(PriceTag::getCurrency).findFirst().orElseThrow()); + + assertEquals("1", event.getTags().stream().filter(baseTag -> + baseTag.getCode().equalsIgnoreCase("price")) + .filter(PriceTag.class::isInstance) + .map(PriceTag.class::cast) + .map(PriceTag::getFrequency).findFirst().orElseThrow()); + + List genericTags = event.getTags().stream() + .filter(GenericTag.class::isInstance) + .map(GenericTag.class::cast).toList(); + + assertEquals("title ipsum", genericTags.stream() + .filter(tag -> tag.getCode().equalsIgnoreCase("title")).map(GenericTag::getAttributes).toList().get(0).get(0).getValue()); + + assertEquals("summary ipsum", genericTags.stream() + .filter(tag -> tag.getCode().equalsIgnoreCase("summary")).map(GenericTag::getAttributes).toList().get(0).get(0).getValue()); + + assertEquals("1687765220", genericTags.stream() + .filter(tag -> tag.getCode().equalsIgnoreCase("published_at")).map(GenericTag::getAttributes).toList().get(0).get(0).getValue()); + + assertEquals("location ipsum", genericTags.stream() + .filter(tag -> tag.getCode().equalsIgnoreCase("location")).map(GenericTag::getAttributes).toList().get(0).get(0).getValue()); + } + + @Test + public void testDeserializeTag() { + log.info("testDeserializeTag"); + + assertDoesNotThrow(() -> { + String npubHex = new PublicKey(Bech32.decode("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9").data).toString(); + final String jsonString = "[\"p\", \"" + npubHex + "\", \"wss://nostr.java\", \"alice\"]"; + var tag = new BaseTagDecoder<>().decode(jsonString); + + assertTrue(tag instanceof PubKeyTag); + + PubKeyTag pTag = (PubKeyTag) tag; + assertEquals("wss://nostr.java", pTag.getMainRelayUrl()); + assertEquals(npubHex, pTag.getPublicKey().toString()); + assertEquals("alice", pTag.getPetName()); + }); + } + + @Test + public void testDeserializeGenericTag() { + log.info("testDeserializeGenericTag"); + assertDoesNotThrow(() -> { + String npubHex = new PublicKey(Bech32.decode("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9").data).toString(); + final String jsonString = "[\"gt\", \"" + npubHex + "\", \"wss://nostr.java\", \"alice\"]"; + var tag = new BaseTagDecoder<>().decode(jsonString); + + assertTrue(tag instanceof GenericTag); + + GenericTag gTag = (GenericTag) tag; + assertEquals("gt", gTag.getCode()); + }); + } + + @Test + public void testFiltersEncoder() { + log.info("testFiltersEncoder"); + + String new_geohash = "2vghde"; + List geohashList = new ArrayList<>(); + geohashList.add(new_geohash); + GenericTagQuery genericTagQuery = new GenericTagQuery(); + genericTagQuery.setTagName("g"); + genericTagQuery.setValue(geohashList); + Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + + FiltersEncoder encoder = new FiltersEncoder(filters); + String jsonMessage = encoder.encode(); + assertEquals("{\"#g\":[\"2vghde\"]}", jsonMessage); + } + + @Test + public void testReqMessageSerializer() { + log.info("testFiltersEncoder"); + + String new_geohash = "2vghde"; + List geohashList = new ArrayList<>(); + geohashList.add(new_geohash); + GenericTagQuery genericTagQuery = new GenericTagQuery(); + genericTagQuery.setTagName("g"); + genericTagQuery.setValue(geohashList); + Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + + ReqMessage reqMessage = new ReqMessage("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9", new ArrayList(List.of(filters))); + assertDoesNotThrow(() -> { + String jsonMessage = reqMessage.encode(); + + assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\"]}]", jsonMessage); + }); + } + +} \ No newline at end of file