Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package io.sentry.rnsentryandroidtester

import io.sentry.Breadcrumb
import io.sentry.SentryLevel
import io.sentry.react.RNSentryReplayBreadcrumbConverter
import io.sentry.rrweb.RRWebBreadcrumbEvent
import io.sentry.rrweb.RRWebEventType
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
Expand All @@ -12,26 +14,63 @@ import org.junit.runners.JUnit4
class RNSentryReplayBreadcrumbConverterTest {

@Test
fun testConvertForegroundBreadcrumb() {
fun convertNavigationBreadcrumb() {
val converter = RNSentryReplayBreadcrumbConverter()
val testBreadcrumb = Breadcrumb()
testBreadcrumb.level = SentryLevel.INFO
testBreadcrumb.type = "navigation"
testBreadcrumb.category = "navigation"
testBreadcrumb.setData("from", "HomeScreen")
testBreadcrumb.setData("to", "ProfileScreen")
val actual = converter.convert(testBreadcrumb) as RRWebBreadcrumbEvent

assertRRWebBreadcrumbDefaults(actual)
assertEquals(SentryLevel.INFO, actual.level)
assertEquals("navigation", actual.category)
assertEquals("HomeScreen", actual.data?.get("from"))
assertEquals("ProfileScreen", actual.data?.get("to"))
}

@Test
fun convertNavigationBreadcrumbWithOnlyTo() {
val converter = RNSentryReplayBreadcrumbConverter()
val testBreadcrumb = Breadcrumb()
testBreadcrumb.level = SentryLevel.INFO
testBreadcrumb.type = "navigation"
testBreadcrumb.category = "navigation"
testBreadcrumb.setData("to", "ProfileScreen")
val actual = converter.convert(testBreadcrumb) as RRWebBreadcrumbEvent

assertRRWebBreadcrumbDefaults(actual)
assertEquals(SentryLevel.INFO, actual.level)
assertEquals("navigation", actual.category)
assertEquals(null, actual.data?.get("from"))
assertEquals("ProfileScreen", actual.data?.get("to"))
}

@Test
fun convertForegroundBreadcrumb() {
val converter = RNSentryReplayBreadcrumbConverter()
val testBreadcrumb = Breadcrumb()
testBreadcrumb.type = "navigation"
testBreadcrumb.category = "app.lifecycle"
testBreadcrumb.setData("state", "foreground");
val actual = converter.convert(testBreadcrumb) as RRWebBreadcrumbEvent

assertRRWebBreadcrumbDefaults(actual)
assertEquals("app.foreground", actual.category)
}

@Test
fun testConvertBackgroundBreadcrumb() {
fun convertBackgroundBreadcrumb() {
val converter = RNSentryReplayBreadcrumbConverter()
val testBreadcrumb = Breadcrumb()
testBreadcrumb.type = "navigation"
testBreadcrumb.category = "app.lifecycle"
testBreadcrumb.setData("state", "background");
val actual = converter.convert(testBreadcrumb) as RRWebBreadcrumbEvent

assertRRWebBreadcrumbDefaults(actual)
assertEquals("app.background", actual.category)
}

Expand All @@ -53,6 +92,32 @@ class RNSentryReplayBreadcrumbConverterTest {
assertEquals(null, actual)
}

@Test
fun convertTouchBreadcrumb() {
val converter = RNSentryReplayBreadcrumbConverter()
val testBreadcrumb = Breadcrumb()
testBreadcrumb.level = SentryLevel.INFO
testBreadcrumb.type = "user"
testBreadcrumb.category = "touch"
testBreadcrumb.message = "this won't be used for replay"
testBreadcrumb.setData(
"path",
arrayListOf(mapOf(
"element" to "element4",
"file" to "file4")))
val actual = converter.convert(testBreadcrumb) as RRWebBreadcrumbEvent

assertRRWebBreadcrumbDefaults(actual)
assertEquals(SentryLevel.INFO, actual.level)
assertEquals("ui.tap", actual.category)
assertEquals(1, actual.data?.keys?.size)
assertEquals(
arrayListOf(mapOf(
"element" to "element4",
"file" to "file4")),
actual.data?.get("path"))
}

@Test
fun doesNotConvertNullPath() {
val actual = RNSentryReplayBreadcrumbConverter.getTouchPathMessage(null)
Expand Down Expand Up @@ -96,4 +161,10 @@ class RNSentryReplayBreadcrumbConverterTest {
mapOf("name" to "name7")))
assertEquals("label5(element5, file5) > label4(file4) > label3(element3) > label2", actual)
}

private fun assertRRWebBreadcrumbDefaults(actual: RRWebBreadcrumbEvent) {
assertEquals("default", actual.breadcrumbType)
assertEquals(actual.breadcrumbTimestamp * 1000, actual.timestamp.toDouble(), 0.05)
assert(actual.breadcrumbTimestamp > 0)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,57 @@
import XCTest
import Sentry

final class RNSentryReplayBreadcrumbConverterTests: XCTestCase {

func testConvertNavigationBreadcrumb() {
let converter = RNSentryReplayBreadcrumbConverter()
let testBreadcrumb = Breadcrumb()
testBreadcrumb.timestamp = Date()
testBreadcrumb.level = .info
testBreadcrumb.type = "navigation"
testBreadcrumb.category = "navigation"
testBreadcrumb.data = [
"from": "HomeScreen",
"to": "ProfileScreen",
]
let actual = converter.convert(from: testBreadcrumb)

XCTAssertNotNil(actual)
let event = actual!.serialize()
let data = event["data"] as! [String: Any?]
let payload = data["payload"] as! [String: Any?]
let payloadData = payload["data"] as! [String: Any?]
assertRRWebBreadcrumbDefaults(actual: event)
XCTAssertEqual("info", payload["level"] as! String)
XCTAssertEqual("navigation", payload["category"] as! String)
XCTAssertEqual("HomeScreen", payloadData["from"] as! String)
XCTAssertEqual("ProfileScreen", payloadData["to"] as! String)
}

func testConvertNavigationBreadcrumbWithOnlyTo() {
let converter = RNSentryReplayBreadcrumbConverter()
let testBreadcrumb = Breadcrumb()
testBreadcrumb.timestamp = Date()
testBreadcrumb.level = .info
testBreadcrumb.type = "navigation"
testBreadcrumb.category = "navigation"
testBreadcrumb.data = [
"to": "ProfileScreen",
]
let actual = converter.convert(from: testBreadcrumb)

XCTAssertNotNil(actual)
let event = actual!.serialize()
let data = event["data"] as! [String: Any?]
let payload = data["payload"] as! [String: Any?]
let payloadData = payload["data"] as! [String: Any?]
assertRRWebBreadcrumbDefaults(actual: event)
XCTAssertEqual("info", payload["level"] as! String)
XCTAssertEqual("navigation", payload["category"] as! String)
XCTAssertNil(payloadData["from"] ?? nil)
XCTAssertEqual("ProfileScreen", payloadData["to"] as! String)
}

func testConvertForegroundBreadcrumb() {
let converter = RNSentryReplayBreadcrumbConverter()
let testBreadcrumb = Breadcrumb()
Expand All @@ -11,8 +61,10 @@ final class RNSentryReplayBreadcrumbConverterTests: XCTestCase {
let actual = converter.convert(from: testBreadcrumb)

XCTAssertNotNil(actual)
let data = actual!.serialize()["data"] as! [String: Any?];
let event = actual!.serialize()
let data = event["data"] as! [String: Any?]
let payload = data["payload"] as! [String: Any?];
assertRRWebBreadcrumbDefaults(actual: event)
XCTAssertEqual(payload["category"] as! String, "app.foreground")
}

Expand All @@ -25,8 +77,10 @@ final class RNSentryReplayBreadcrumbConverterTests: XCTestCase {
let actual = converter.convert(from: testBreadcrumb)

XCTAssertNotNil(actual)
let data = actual!.serialize()["data"] as! [String: Any?];
let event = actual!.serialize()
let data = event["data"] as! [String: Any?]
let payload = data["payload"] as! [String: Any?];
assertRRWebBreadcrumbDefaults(actual: event)
XCTAssertEqual(payload["category"] as! String, "app.background")
}

Expand All @@ -46,6 +100,36 @@ final class RNSentryReplayBreadcrumbConverterTests: XCTestCase {
XCTAssertNil(actual)
}

func testConvertTouchBreadcrumb() {
let converter = RNSentryReplayBreadcrumbConverter()
let testBreadcrumb = Breadcrumb()
testBreadcrumb.timestamp = Date()
testBreadcrumb.level = .info
testBreadcrumb.type = "user"
testBreadcrumb.category = "touch"
testBreadcrumb.message = "this won't be used for replay"
testBreadcrumb.data = [
"path": [
["element": "element4", "file": "file4"]
]
]
let actual = converter.convert(from: testBreadcrumb)

XCTAssertNotNil(actual)
let event = actual!.serialize()
let data = event["data"] as! [String: Any?]
let payload = data["payload"] as! [String: Any?]
let payloadData = payload["data"] as! [String: Any?]
assertRRWebBreadcrumbDefaults(actual: event)
XCTAssertEqual("info", payload["level"] as! String)
XCTAssertEqual("ui.tap", payload["category"] as! String)
XCTAssertEqual(1, payloadData.keys.count)
XCTAssertEqual([[
"element": "element4",
"file": "file4"
]], payloadData["path"] as! [[String: String]])
}

func testTouchMessageReturnsNilOnEmptyArray() throws {
let actual = RNSentryReplayBreadcrumbConverter.getTouchPathMessage(from: [])
XCTAssertEqual(actual, nil);
Expand Down Expand Up @@ -88,4 +172,12 @@ final class RNSentryReplayBreadcrumbConverterTests: XCTestCase {
XCTAssertEqual(actual, "label5(element5, file5) > label4(file4) > label3(element3) > label2");
}

private func assertRRWebBreadcrumbDefaults(actual: [String: Any?]) {
let data = actual["data"] as! [String: Any?]
let payload = data["payload"] as! [String: Any?]
XCTAssertEqual("default", payload["type"] as! String)
XCTAssertEqual((payload["timestamp"] as! Double) * 1000.0, Double(actual["timestamp"] as! Int), accuracy: 1.0)
XCTAssertTrue(payload["timestamp"] as! Double > 0.0)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,7 @@ public RNSentryReplayBreadcrumbConverter() {
return convertTouchBreadcrumb(breadcrumb);
}
if (breadcrumb.getCategory().equals("navigation")) {
final RRWebBreadcrumbEvent rrWebBreadcrumb = new RRWebBreadcrumbEvent();
rrWebBreadcrumb.setCategory(breadcrumb.getCategory());
rrWebBreadcrumb.setData(breadcrumb.getData());
return rrWebBreadcrumb;
return convertNavigationBreadcrumb(breadcrumb);
}
if (breadcrumb.getCategory().equals("xhr")) {
return convertNetworkBreadcrumb(breadcrumb);
Expand All @@ -60,6 +57,14 @@ public RNSentryReplayBreadcrumbConverter() {
return nativeBreadcrumb;
}

@TestOnly
public @NotNull RRWebEvent convertNavigationBreadcrumb(final @NotNull Breadcrumb breadcrumb) {
final RRWebBreadcrumbEvent rrWebBreadcrumb = new RRWebBreadcrumbEvent();
rrWebBreadcrumb.setCategory(breadcrumb.getCategory());
setRRWebEventDefaultsFrom(rrWebBreadcrumb, breadcrumb);
return rrWebBreadcrumb;
}

@TestOnly
public @NotNull RRWebEvent convertTouchBreadcrumb(final @NotNull Breadcrumb breadcrumb) {
final RRWebBreadcrumbEvent rrWebBreadcrumb = new RRWebBreadcrumbEvent();
Expand All @@ -69,11 +74,7 @@ public RNSentryReplayBreadcrumbConverter() {
rrWebBreadcrumb.setMessage(RNSentryReplayBreadcrumbConverter
.getTouchPathMessage(breadcrumb.getData("path")));

rrWebBreadcrumb.setLevel(breadcrumb.getLevel());
rrWebBreadcrumb.setData(breadcrumb.getData());
rrWebBreadcrumb.setTimestamp(breadcrumb.getTimestamp().getTime());
rrWebBreadcrumb.setBreadcrumbTimestamp(breadcrumb.getTimestamp().getTime() / 1000.0);
rrWebBreadcrumb.setBreadcrumbType("default");
setRRWebEventDefaultsFrom(rrWebBreadcrumb, breadcrumb);
return rrWebBreadcrumb;
}

Expand Down Expand Up @@ -175,4 +176,12 @@ public RNSentryReplayBreadcrumbConverter() {
rrWebSpanEvent.setData(data);
return rrWebSpanEvent;
}

private void setRRWebEventDefaultsFrom(final @NotNull RRWebBreadcrumbEvent rrWebBreadcrumb, final @NotNull Breadcrumb breadcrumb) {
rrWebBreadcrumb.setLevel(breadcrumb.getLevel());
rrWebBreadcrumb.setData(breadcrumb.getData());
rrWebBreadcrumb.setTimestamp(breadcrumb.getTimestamp().getTime());
rrWebBreadcrumb.setBreadcrumbTimestamp(breadcrumb.getTimestamp().getTime() / 1000.0);
rrWebBreadcrumb.setBreadcrumbType("default");
}
}