From acf426ccdc4d8462cbee83b85c5e9fe21b329a73 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 18 Jun 2025 13:28:43 -0300 Subject: [PATCH 1/2] Add a UnsignedEventDeserializer --- .../quartz/nip01Core/jackson/EventMapper.kt | 3 +- .../jackson/UnsignedEventDeserializer.kt | 33 +++++++++++ .../UnsignedEventManualDeserializer.kt | 43 ++++++++++++++ .../jackson/EventDeserializerTest.kt | 56 +++++++++++++++++++ 4 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt create mode 100644 quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt index 9794d9bb9..f99a3e665 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt @@ -60,7 +60,8 @@ class EventMapper { .addSerializer(BunkerRequest::class.java, BunkerRequest.BunkerRequestSerializer()) .addDeserializer(BunkerRequest::class.java, BunkerRequest.BunkerRequestDeserializer()) .addSerializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseSerializer()) - .addDeserializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseDeserializer()), + .addDeserializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseDeserializer()) + .addDeserializer(Event::class.java, UnsignedEventDeserializer()), ) fun fromJson(json: String): Event = mapper.readValue(json, Event::class.java) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt new file mode 100644 index 000000000..af118db2d --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2025 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip01Core.jackson + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import com.vitorpamplona.quartz.nip01Core.core.Event + +class UnsignedEventDeserializer : StdDeserializer(Event::class.java) { + override fun deserialize( + jp: JsonParser, + ctxt: DeserializationContext, + ): Event = UnsignedEventManualDeserializer.fromJson(jp.codec.readTree(jp)) +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt new file mode 100644 index 000000000..8d3b4528c --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2025 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip01Core.jackson + +import com.fasterxml.jackson.databind.JsonNode +import com.vitorpamplona.quartz.EventFactory +import com.vitorpamplona.quartz.nip01Core.core.Event + +class UnsignedEventManualDeserializer { + companion object { + fun fromJson(jsonObject: JsonNode): Event = + EventFactory.create( + id = jsonObject.get("id")?.asText()?.intern() ?: "", + pubKey = jsonObject.get("pubkey")?.asText()?.intern() ?: "", + createdAt = jsonObject.get("created_at").asLong(), + kind = jsonObject.get("kind").asInt(), + tags = + jsonObject.get("tags").toTypedArray { + it.toTypedArray { s -> if (s.isNull) "" else s.asText().intern() } + }, + content = jsonObject.get("content").asText(), + sig = jsonObject.get("sig")?.asText()?.intern() ?: "", + ) + } +} diff --git a/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt b/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt new file mode 100644 index 000000000..d591b4baa --- /dev/null +++ b/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2025 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip01Core.jackson + +import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair +import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal +import com.vitorpamplona.quartz.nip01Core.verify +import com.vitorpamplona.quartz.nip10Notes.TextNoteEvent +import org.junit.Test + +class EventDeserializerTest { + @Test + fun testUnsignedEvent() { + val unsignedEventJson = """{"kind":"1","content":"This is an unsigned event.","created_at":1234,"tags":[]}""" + val event = Event.fromJson(unsignedEventJson) + assert(event.id.isEmpty()) + assert(event.pubKey.isEmpty()) + assert(event.sig.isEmpty()) + assert(!event.verify()) + } + + @Test + fun testSignedEvent() { + val keyPair = KeyPair() + val signer = NostrSignerInternal(keyPair) + + val unsignedEvent = TextNoteEvent.build("test") + val signedEvent = signer.signerSync.sign(unsignedEvent)!! + val eventJson = signedEvent.toJson() + val event = Event.fromJson(eventJson) + + assert(event.id.isNotEmpty()) + assert(event.sig.isNotEmpty()) + assert(event.pubKey.isNotEmpty()) + assert(event.verify()) + } +} From 9e58c2d3b9b7181c9ffc5b60b4d94d00d05765b0 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 18 Jun 2025 17:24:43 -0300 Subject: [PATCH 2/2] Use EventTemplate instead of Event in BunkerRequestSign --- .../quartz/nip01Core/jackson/EventMapper.kt | 3 +- .../quartz/nip01Core/signers/EventTemplate.kt | 11 ++++- .../EventTemplateDeserializer.kt} | 6 +-- .../EventTemplateManualDeserializer.kt} | 13 +++--- .../nip46RemoteSigner/BunkerRequestSign.kt | 5 ++- .../jackson/EventDeserializerTest.kt | 43 +++++++++++-------- .../nip46RemoteSigner/BunkerRequestTest.kt | 35 +++++++++++++++ 7 files changed, 83 insertions(+), 33 deletions(-) rename quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/{jackson/UnsignedEventDeserializer.kt => signers/EventTemplateDeserializer.kt} (85%) rename quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/{jackson/UnsignedEventManualDeserializer.kt => signers/EventTemplateManualDeserializer.kt} (78%) create mode 100644 quartz/src/test/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestTest.kt diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt index f99a3e665..9794d9bb9 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt @@ -60,8 +60,7 @@ class EventMapper { .addSerializer(BunkerRequest::class.java, BunkerRequest.BunkerRequestSerializer()) .addDeserializer(BunkerRequest::class.java, BunkerRequest.BunkerRequestDeserializer()) .addSerializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseSerializer()) - .addDeserializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseDeserializer()) - .addDeserializer(Event::class.java, UnsignedEventDeserializer()), + .addDeserializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseDeserializer()), ) fun fromJson(json: String): Event = mapper.readValue(json, Event::class.java) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplate.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplate.kt index 8617b1e61..6b7a0b978 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplate.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplate.kt @@ -20,19 +20,28 @@ */ package com.vitorpamplona.quartz.nip01Core.signers +import com.fasterxml.jackson.annotation.JsonProperty import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.TagArray import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.builder import com.vitorpamplona.quartz.nip01Core.core.tagArray +import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.utils.TimeUtils class EventTemplate( + @JsonProperty("created_at") val createdAt: Long, val kind: Int, val tags: TagArray, val content: String, -) +) { + fun toJson(): String = EventMapper.mapper.writeValueAsString(this) + + companion object { + fun fromJson(json: String): EventTemplate = EventTemplateManualDeserializer.fromJson(EventMapper.mapper.readTree(json)) + } +} inline fun eventTemplate( kind: Int, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateDeserializer.kt similarity index 85% rename from quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt rename to quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateDeserializer.kt index af118db2d..94e69cf39 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateDeserializer.kt @@ -18,16 +18,16 @@ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package com.vitorpamplona.quartz.nip01Core.jackson +package com.vitorpamplona.quartz.nip01Core.signers import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.deser.std.StdDeserializer import com.vitorpamplona.quartz.nip01Core.core.Event -class UnsignedEventDeserializer : StdDeserializer(Event::class.java) { +class EventTemplateDeserializer : StdDeserializer>(EventTemplate::class.java) { override fun deserialize( jp: JsonParser, ctxt: DeserializationContext, - ): Event = UnsignedEventManualDeserializer.fromJson(jp.codec.readTree(jp)) + ): EventTemplate = EventTemplateManualDeserializer.fromJson(jp.codec.readTree(jp)) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateManualDeserializer.kt similarity index 78% rename from quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt rename to quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateManualDeserializer.kt index 8d3b4528c..abdded6bd 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateManualDeserializer.kt @@ -18,18 +18,16 @@ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package com.vitorpamplona.quartz.nip01Core.jackson +package com.vitorpamplona.quartz.nip01Core.signers import com.fasterxml.jackson.databind.JsonNode -import com.vitorpamplona.quartz.EventFactory import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.jackson.toTypedArray -class UnsignedEventManualDeserializer { +class EventTemplateManualDeserializer { companion object { - fun fromJson(jsonObject: JsonNode): Event = - EventFactory.create( - id = jsonObject.get("id")?.asText()?.intern() ?: "", - pubKey = jsonObject.get("pubkey")?.asText()?.intern() ?: "", + fun fromJson(jsonObject: JsonNode): EventTemplate = + EventTemplate( createdAt = jsonObject.get("created_at").asLong(), kind = jsonObject.get("kind").asInt(), tags = @@ -37,7 +35,6 @@ class UnsignedEventManualDeserializer { it.toTypedArray { s -> if (s.isNull) "" else s.asText().intern() } }, content = jsonObject.get("content").asText(), - sig = jsonObject.get("sig")?.asText()?.intern() ?: "", ) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestSign.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestSign.kt index 8c755f1d3..4629e489b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestSign.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestSign.kt @@ -21,11 +21,12 @@ package com.vitorpamplona.quartz.nip46RemoteSigner import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate import java.util.UUID class BunkerRequestSign( id: String = UUID.randomUUID().toString(), - val event: Event, + val event: EventTemplate, ) : BunkerRequest(id, METHOD_NAME, arrayOf(event.toJson())) { companion object { val METHOD_NAME = "sign_event" @@ -33,6 +34,6 @@ class BunkerRequestSign( fun parse( id: String, params: Array, - ): BunkerRequestSign = BunkerRequestSign(id, Event.fromJson(params[0])) + ): BunkerRequestSign = BunkerRequestSign(id, EventTemplate.fromJson(params[0])) } } diff --git a/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt b/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt index d591b4baa..cb22c26ba 100644 --- a/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt +++ b/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt @@ -20,22 +20,31 @@ */ package com.vitorpamplona.quartz.nip01Core.jackson -import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair +import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal import com.vitorpamplona.quartz.nip01Core.verify -import com.vitorpamplona.quartz.nip10Notes.TextNoteEvent import org.junit.Test class EventDeserializerTest { @Test - fun testUnsignedEvent() { - val unsignedEventJson = """{"kind":"1","content":"This is an unsigned event.","created_at":1234,"tags":[]}""" - val event = Event.fromJson(unsignedEventJson) - assert(event.id.isEmpty()) - assert(event.pubKey.isEmpty()) - assert(event.sig.isEmpty()) - assert(!event.verify()) + fun testEventTemplateToJson() { + val templateJson = """{"created_at":1234,"kind":1,"tags":[],"content":"This is an unsigned event."}""" + val template = EventTemplate.fromJson(templateJson) + + val json = template.toJson() + + assert(json == templateJson) + } + + @Test + fun testEventTemplate() { + val templateJson = """{"kind":"1","content":"This is an unsigned event.","created_at":1234,"tags":[]}""" + val template = EventTemplate.fromJson(templateJson) + + assert(template.kind == 1) + assert(template.content == "This is an unsigned event.") + assert(template.tags.isEmpty()) } @Test @@ -43,14 +52,14 @@ class EventDeserializerTest { val keyPair = KeyPair() val signer = NostrSignerInternal(keyPair) - val unsignedEvent = TextNoteEvent.build("test") - val signedEvent = signer.signerSync.sign(unsignedEvent)!! - val eventJson = signedEvent.toJson() - val event = Event.fromJson(eventJson) + val templateJson = """{"kind":"1","content":"This is an unsigned event.","created_at":1234,"tags":[]}""" + val template = EventTemplate.fromJson(templateJson) - assert(event.id.isNotEmpty()) - assert(event.sig.isNotEmpty()) - assert(event.pubKey.isNotEmpty()) - assert(event.verify()) + val signedEvent = signer.signerSync.sign(template)!! + + assert(signedEvent.id.isNotEmpty()) + assert(signedEvent.sig.isNotEmpty()) + assert(signedEvent.pubKey.isNotEmpty()) + assert(signedEvent.verify()) } } diff --git a/quartz/src/test/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestTest.kt b/quartz/src/test/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestTest.kt new file mode 100644 index 000000000..3d94e0c4b --- /dev/null +++ b/quartz/src/test/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestTest.kt @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2025 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip46RemoteSigner + +import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper +import org.junit.Test + +class BunkerRequestTest { + @Test + fun testBunkerRequestDeSerialization() { + val requestJson = """{"id":"123","method":"sign_event","params":["{\"created_at\":1234,\"kind\":1,\"tags\":[],\"content\":\"This is an unsigned event.\"}"]}""" + val bunkerRequest = EventMapper.mapper.readValue(requestJson, BunkerRequest::class.java) + + assert(bunkerRequest is BunkerRequestSign) + assert((bunkerRequest as BunkerRequestSign).event.kind == 1) + } +}