Skip to content

Commit

Permalink
Add tests for message data encoding/decoding
Browse files Browse the repository at this point in the history
  • Loading branch information
jayohms committed Aug 10, 2023
1 parent 7603568 commit 4ff3378
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 4 deletions.
1 change: 1 addition & 0 deletions strada/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ dependencies {

testImplementation 'junit:junit:4.13.2'
testImplementation 'androidx.test:core:1.5.0'
testImplementation 'org.assertj:assertj-core:3.24.2'
testImplementation 'androidx.lifecycle:lifecycle-runtime-testing:2.6.1'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4"
testImplementation 'org.robolectric:robolectric:4.9.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ abstract class StradaJsonConverter {
"A Strada.config.jsonConverter must be set to encode or decode json"

const val INVALID_CONVERTER =
"The configured json converter must be a StradaJsonTypeConverter " +
"The configured json converter must implement a StradaJsonTypeConverter " +
"or use the provided KotlinXJsonConverter."

inline fun <reified T> toObject(jsonData: String): T? {
Expand Down
34 changes: 32 additions & 2 deletions strada/src/test/kotlin/dev/hotwire/strada/BridgeComponentTest.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package dev.hotwire.strada

import com.nhaarman.mockito_kotlin.*
import kotlinx.serialization.Serializable
import org.assertj.core.api.Assertions
import org.assertj.core.api.Assertions.assertThatThrownBy
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Before
Expand All @@ -21,6 +24,7 @@ class BridgeComponentTest {

@Before
fun setup() {
Strada.config.jsonConverter = KotlinXJsonConverter()
component = TestData.OneBridgeComponent("one", delegate)
whenever(delegate.bridge).thenReturn(bridge)
}
Expand Down Expand Up @@ -81,7 +85,7 @@ class BridgeComponentTest {
}

@Test
fun replyToReplacingData() {
fun replyToReplacingJsonData() {
val newJsonData = """{"title":"Page-title"}"""
val newMessage = message.replacing(jsonData = newJsonData)

Expand All @@ -92,6 +96,29 @@ class BridgeComponentTest {
verify(bridge).replyWith(eq(newMessage))
}

@Test
fun replyToReplacingData() {
val newJsonData = """{"title":"Page-title"}"""
val newMessage = message.replacing(jsonData = newJsonData)

component.didReceive(message)

val replied = component.replyTo("connect", MessageData(title = "Page-title"))
assertEquals(true, replied)
verify(bridge).replyWith(eq(newMessage))
}

@Test
fun replyToReplacingDataWithNoConverter() {
Strada.config.jsonConverter = null

component.didReceive(message)

assertThatThrownBy { component.replyTo("connect", MessageData(title = "Page-title")) }
.isInstanceOf(IllegalArgumentException::class.java)
.hasMessage(StradaJsonConverter.NO_CONVERTER)
}

@Test
fun replyToIgnoresNotReceived() {
val replied = component.replyTo("connect")
Expand All @@ -100,11 +127,14 @@ class BridgeComponentTest {
}

@Test
fun replyToReplacingDataIgnoresNotReceived() {
fun replyToReplacingJsonDataIgnoresNotReceived() {
val newJsonData = """{"title":"Page-title"}"""

val replied = component.replyTo("connect", newJsonData)
assertEquals(false, replied)
verify(bridge, never()).replyWith(any())
}

@Serializable
private class MessageData(val title: String)
}
115 changes: 114 additions & 1 deletion strada/src/test/kotlin/dev/hotwire/strada/MessageTest.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,54 @@
package dev.hotwire.strada

import kotlinx.serialization.Serializable
import org.assertj.core.api.Assertions.assertThatThrownBy
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Before
import org.junit.Test

class MessageTest {

@Before
fun setup() {
Strada.config.jsonConverter = KotlinXJsonConverter()
}

@Test
fun dataDecodesToObject() {
val metadata = Metadata("https://37signals.com")
val message = Message(
id = "1",
component = "page",
event = "connect",
metadata = metadata,
jsonData = """{"title":"Page-title","subtitle":"Page-subtitle"}"""
)

val data = message.data<MessageData>()

assertEquals("Page-title", data?.title)
assertEquals("Page-subtitle", data?.subtitle)
}

@Test
fun replacing() {
fun dataDoesNotDecodeToInvalidObject() {
val metadata = Metadata("https://37signals.com")
val message = Message(
id = "1",
component = "page",
event = "connect",
metadata = metadata,
jsonData = """{"title":"Page-title","subtitle":"Page-subtitle"}"""
)

val data = message.data<InvalidMessageData>()

assertNull(data)
}

@Test
fun replacingJsonData() {
val metadata = Metadata("https://37signals.com")
val message = Message(
id = "1",
Expand All @@ -26,4 +69,74 @@ class MessageTest {
assertEquals(metadata, newMessage.metadata)
assertEquals("{}", newMessage.jsonData)
}

@Test
fun replacingData() {
val metadata = Metadata("https://37signals.com")
val message = Message(
id = "1",
component = "page",
event = "connect",
metadata = metadata,
jsonData = "{}"
)

val data = MessageData(title = "New-title", subtitle = "New-subtitle")

val newMessage = message.replacing(
event = "disconnect",
data = data
)

assertEquals("1", newMessage.id)
assertEquals("page", newMessage.component)
assertEquals("disconnect", newMessage.event)
assertEquals(metadata, newMessage.metadata)
assertEquals("""{"title":"New-title","subtitle":"New-subtitle"}""", newMessage.jsonData)
}

@Test
fun replacingDataWithNoConverter() {
Strada.config.jsonConverter = null

val message = Message(
id = "1",
component = "page",
event = "connect",
metadata = Metadata("https://37signals.com"),
jsonData = "{}"
)

val data = MessageData(title = "New-title", subtitle = "New-subtitle")

assertThatThrownBy { message.replacing(data = data) }
.isInstanceOf(IllegalArgumentException::class.java)
.hasMessage(StradaJsonConverter.NO_CONVERTER)
}

@Test
fun replacingDataWithInvalidConverter() {
Strada.config.jsonConverter = InvalidJsonConverter()

val message = Message(
id = "1",
component = "page",
event = "connect",
metadata = Metadata("https://37signals.com"),
jsonData = "{}"
)

val data = MessageData(title = "New-title", subtitle = "New-subtitle")

assertThatThrownBy { message.replacing(data = data) }
.isInstanceOf(IllegalStateException::class.java)
.hasMessage(StradaJsonConverter.INVALID_CONVERTER)
}

@Serializable
private class MessageData(val title: String, val subtitle: String)

private class InvalidMessageData()

private class InvalidJsonConverter : StradaJsonConverter()
}

0 comments on commit 4ff3378

Please sign in to comment.