Skip to content

Commit

Permalink
RUMM-1615 Update identity property name and documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
maxep committed Nov 17, 2021
1 parent ec1a94b commit c807806
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,22 @@ import Foundation
import SwiftUI
import Datadog

@available(iOS 13, *)
/// A custom SwiftUI Hosting controller for `RootView`.
///
/// This definition only exist to allow instantiation from `RUMSwiftUIInstrumentationScenario`
/// storyboard and should be ignored from RUM instrumentation.
@available(iOS 13, *)
class SwiftUIRootViewController: UIHostingController<RootView> {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder, rootView: RootView())
}
}

@available(iOS 13, *)
/// The root view of the SwiftUI instrumentation test.
///
/// This view creates a navigation stack and present a`ScreenView` as fist view.
/// This view creates a `SwiftUI.TabView` to present
/// navigation contexts..
@available(iOS 13, *)
struct RootView: View {
var body: some View {
TabView {
Expand Down Expand Up @@ -79,11 +80,11 @@ struct RootView: View {
}
}

@available(iOS 13, *)
/// A basic Screen View at a given index in the stack.
///
/// This view presents a single navigation button to push a
/// `UIScreenView` onto the stack.
/// This view presents a button to push a new view onto the
/// navigation stack, and a button to present a modal page sheet.
@available(iOS 13, *)
struct ScreenView: View {

/// The view index in the stack.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ internal final class SwiftUIRUMViewsHandler: SwiftUIViewHandler {
/// Respond to a `SwiftUI.View.onAppear` event.
///
/// - Parameters:
/// - key: The appearing `SwiftUI.View` key.
/// - identity: The appearing `SwiftUI.View` identity.
/// - name: The appearing `SwiftUI.View` name.
/// - attributes: The appearing `SwiftUI.View` attributes.
func onAppear(identity: String, name: String, path: String, attributes: [AttributeKey: AttributeValue]) {
Expand Down Expand Up @@ -130,7 +130,7 @@ internal final class SwiftUIRUMViewsHandler: SwiftUIViewHandler {

/// Respond to a `SwiftUI.View.onDisappear` event.
///
/// - Parameter key: The disappearing `SwiftUI.View` key.
/// - Parameter identity: The disappearing `SwiftUI.View` identity.
func onDisappear(identity: String) {
guard stack.last?.identity == identity else {
// Remove any disappearing view from the stack if
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import SwiftUI
internal struct RUMViewModifier: SwiftUI.ViewModifier {
/// The Content View identifier.
/// The id will be unique per modified view.
let id: String = UUID().uuidString
let identity: String = UUID().uuidString

/// View Name used for RUM Explorer.
let name: String
Expand All @@ -28,15 +28,15 @@ internal struct RUMViewModifier: SwiftUI.ViewModifier {
content.onAppear {
RUMInstrumentation.instance?.swiftUIViewInstrumentation
.onAppear(
identity: id,
identity: identity,
name: name,
path: path,
attributes: attributes
)
}
.onDisappear {
RUMInstrumentation.instance?.swiftUIViewInstrumentation
.onDisappear(identity: id)
.onDisappear(identity: identity)
}
}
}
Expand Down
4 changes: 0 additions & 4 deletions Sources/Datadog/RUM/RUMMonitor/Scopes/RUMViewIdentity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,6 @@ extension String: RUMViewIdentifiable {
var defaultViewPath: String { self }
}

internal func == (lhs: RUMViewIdentifiable?, rhs: RUMViewIdentifiable) -> Bool {
return lhs?.equals(rhs) ?? false
}

// MARK: - `RUMViewIdentity`

/// Manages the `RUMViewIdentifiable` by using either reference or value semantic.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@ class SwiftUIRUMViewsHandlerTests: XCTestCase {

func testWhenOnAppear_itStartsRUMView() throws {
// Given
let viewKey: String = UUID().uuidString
let viewIdentity: String = UUID().uuidString
let viewName: String = .mockRandom()
let viewPath: String = .mockRandom()
let viewAttributes = mockRandomAttributes()

// When
handler.onAppear(
identity: viewKey,
identity: viewIdentity,
name: viewName,
path: viewPath,
attributes: viewAttributes
Expand All @@ -43,34 +43,34 @@ class SwiftUIRUMViewsHandlerTests: XCTestCase {

let command = try XCTUnwrap(commandSubscriber.receivedCommands[0] as? RUMStartViewCommand)
XCTAssertEqual(command.time, .mockDecember15th2019At10AMUTC())
XCTAssertTrue(command.identity.equals(viewKey))
XCTAssertTrue(command.identity.equals(viewIdentity))
XCTAssertEqual(command.name, viewName)
XCTAssertEqual(command.path, viewPath)
AssertDictionariesEqual(command.attributes, viewAttributes)
}

func testWhenOnAppear_itStopsPreviousRUMView() throws {
// Given
let view1Key: String = UUID().uuidString
let view1Identity: String = UUID().uuidString
let view1Name: String = .mockRandom()
let view1Path: String = .mockRandom()
let view1Attributes = mockRandomAttributes()

let view2Key: String = UUID().uuidString
let view2Identity: String = UUID().uuidString
let view2Name: String = .mockRandom()
let view2Path: String = .mockRandom()
let view2Attributes = mockRandomAttributes()

// When
handler.onAppear(
identity: view1Key,
identity: view1Identity,
name: view1Name,
path: view1Path,
attributes: view1Attributes
)

handler.onAppear(
identity: view2Key,
identity: view2Identity,
name: view2Name,
path: view2Path,
attributes: view2Attributes
Expand All @@ -83,31 +83,31 @@ class SwiftUIRUMViewsHandlerTests: XCTestCase {
let stopCommand = try XCTUnwrap(commandSubscriber.receivedCommands[1] as? RUMStopViewCommand)
let startCommand2 = try XCTUnwrap(commandSubscriber.receivedCommands[2] as? RUMStartViewCommand)

XCTAssertTrue(startCommand1.identity.equals(view1Key))
XCTAssertTrue(startCommand1.identity.equals(view1Identity))
AssertDictionariesEqual(startCommand1.attributes, view1Attributes)
XCTAssertTrue(stopCommand.identity.equals(view1Key))
XCTAssertTrue(stopCommand.identity.equals(view1Identity))
XCTAssertEqual(stopCommand.attributes.count, 0)
XCTAssertTrue(startCommand2.identity.equals(view2Key))
XCTAssertTrue(startCommand2.identity.equals(view2Identity))
AssertDictionariesEqual(startCommand2.attributes, view2Attributes)
}

func testWhenOnAppear_itDoesNotStartTheSameRUMViewTwice() throws {
// Given
let viewKey: String = UUID().uuidString
let viewIdentity: String = UUID().uuidString
let viewName: String = .mockRandom()
let viewPath: String = .mockRandom()
let viewAttributes = mockRandomAttributes()

// When
handler.onAppear(
identity: viewKey,
identity: viewIdentity,
name: viewName,
path: viewPath,
attributes: viewAttributes
)

handler.onAppear(
identity: viewKey,
identity: viewIdentity,
name: viewName,
path: viewPath,
attributes: viewAttributes
Expand All @@ -122,72 +122,72 @@ class SwiftUIRUMViewsHandlerTests: XCTestCase {

func testWhenOnDisappear_itDoesNotSendAnyCommand() {
// Given
let viewKey: String = UUID().uuidString
let viewIdentity: String = UUID().uuidString

// When
handler.onDisappear(identity: viewKey)
handler.onDisappear(identity: viewIdentity)

// Then
XCTAssertEqual(commandSubscriber.receivedCommands.count, 0)
}

func testGivenAppearedView_whenOnDisappear_itSopsTheRUMView() throws {
// Given
let viewKey: String = UUID().uuidString
let viewIdentity: String = UUID().uuidString
let viewName: String = .mockRandom()
let viewPath: String = .mockRandom()
let viewAttributes = mockRandomAttributes()

// When
handler.onAppear(
identity: viewKey,
identity: viewIdentity,
name: viewName,
path: viewPath,
attributes: viewAttributes
)

handler.onDisappear(identity: viewKey)
handler.onDisappear(identity: viewIdentity)

// Then
XCTAssertEqual(commandSubscriber.receivedCommands.count, 2)

let startCommand = try XCTUnwrap(commandSubscriber.receivedCommands[0] as? RUMStartViewCommand)
let stopCommand = try XCTUnwrap(commandSubscriber.receivedCommands[1] as? RUMStopViewCommand)

XCTAssertTrue(startCommand.identity.equals(viewKey))
XCTAssertTrue(startCommand.identity.equals(viewIdentity))
AssertDictionariesEqual(startCommand.attributes, viewAttributes)
XCTAssertTrue(stopCommand.identity.equals(viewKey))
XCTAssertTrue(stopCommand.identity.equals(viewIdentity))
XCTAssertEqual(stopCommand.attributes.count, 0)
}

func testGiven2AppearedView_whenTheFirstDisappears_itDoesNotStopItTwice() throws {
// Given
let view1Key: String = UUID().uuidString
let view1Identity: String = UUID().uuidString
let view1Name: String = .mockRandom()
let view1Path: String = .mockRandom()
let view1Attributes = mockRandomAttributes()

let view2Key: String = UUID().uuidString
let view2Identity: String = UUID().uuidString
let view2Name: String = .mockRandom()
let view2Path: String = .mockRandom()
let view2Attributes = mockRandomAttributes()

// When
handler.onAppear(
identity: view1Key,
identity: view1Identity,
name: view1Name,
path: view1Path,
attributes: view1Attributes
)

handler.onAppear(
identity: view2Key,
identity: view2Identity,
name: view2Name,
path: view2Path,
attributes: view2Attributes
)

handler.onDisappear(identity: view1Key)
handler.onDisappear(identity: view1Identity)

// Then
XCTAssertEqual(commandSubscriber.receivedCommands.count, 3)
Expand All @@ -196,41 +196,41 @@ class SwiftUIRUMViewsHandlerTests: XCTestCase {
let stopCommand1 = try XCTUnwrap(commandSubscriber.receivedCommands[1] as? RUMStopViewCommand)
let startCommand2 = try XCTUnwrap(commandSubscriber.receivedCommands[2] as? RUMStartViewCommand)

XCTAssertTrue(startCommand1.identity.equals(view1Key))
XCTAssertTrue(startCommand1.identity.equals(view1Identity))
AssertDictionariesEqual(startCommand1.attributes, view1Attributes)
XCTAssertTrue(stopCommand1.identity.equals(view1Key))
XCTAssertTrue(startCommand2.identity.equals(view2Key))
XCTAssertTrue(stopCommand1.identity.equals(view1Identity))
XCTAssertTrue(startCommand2.identity.equals(view2Identity))
AssertDictionariesEqual(startCommand2.attributes, view2Attributes)
}

func testGiven2AppearedView_whenTheLastDisappears_itRestartsThePreviousRUMView() throws {
// Given
let view1Key: String = UUID().uuidString
let view1Identity: String = UUID().uuidString
let view1Name: String = .mockRandom()
let view1Path: String = .mockRandom()
let view1Attributes = mockRandomAttributes()

let view2Key: String = UUID().uuidString
let view2Identity: String = UUID().uuidString
let view2Name: String = .mockRandom()
let view2Path: String = .mockRandom()
let view2Attributes = mockRandomAttributes()

// When
handler.onAppear(
identity: view1Key,
identity: view1Identity,
name: view1Name,
path: view1Path,
attributes: view1Attributes
)

handler.onAppear(
identity: view2Key,
identity: view2Identity,
name: view2Name,
path: view2Path,
attributes: view2Attributes
)

handler.onDisappear(identity: view2Key)
handler.onDisappear(identity: view2Identity)

// Then
XCTAssertEqual(commandSubscriber.receivedCommands.count, 5)
Expand All @@ -241,28 +241,28 @@ class SwiftUIRUMViewsHandlerTests: XCTestCase {
let stopCommand2 = try XCTUnwrap(commandSubscriber.receivedCommands[3] as? RUMStopViewCommand)
let startCommand3 = try XCTUnwrap(commandSubscriber.receivedCommands[4] as? RUMStartViewCommand)

XCTAssertTrue(startCommand1.identity.equals(view1Key))
XCTAssertTrue(startCommand1.identity.equals(view1Identity))
AssertDictionariesEqual(startCommand1.attributes, view1Attributes)
XCTAssertTrue(stopCommand1.identity.equals(view1Key))
XCTAssertTrue(startCommand2.identity.equals(view2Key))
XCTAssertTrue(stopCommand1.identity.equals(view1Identity))
XCTAssertTrue(startCommand2.identity.equals(view2Identity))
AssertDictionariesEqual(startCommand2.attributes, view2Attributes)
XCTAssertTrue(stopCommand2.identity.equals(view2Key))
XCTAssertTrue(startCommand3.identity.equals(view1Key))
XCTAssertTrue(stopCommand2.identity.equals(view2Identity))
XCTAssertTrue(startCommand3.identity.equals(view1Identity))
AssertDictionariesEqual(startCommand1.attributes, view1Attributes)
}

// MARK: - Handling Application Activity

func testGivenRUMViewStarted_whenAppStateChanges_itStopsAndRestartsRUMView() throws {
// Given
let viewKey: String = UUID().uuidString
let viewIdentity: String = UUID().uuidString
let viewName: String = .mockRandom()
let viewPath: String = .mockRandom()
let viewAttributes = mockRandomAttributes()

// When
handler.onAppear(
identity: viewKey,
identity: viewIdentity,
name: viewName,
path: viewPath,
attributes: viewAttributes
Expand All @@ -277,10 +277,10 @@ class SwiftUIRUMViewsHandlerTests: XCTestCase {

let stopCommand = try XCTUnwrap(commandSubscriber.receivedCommands[1] as? RUMStopViewCommand)
let startCommand = try XCTUnwrap(commandSubscriber.receivedCommands[2] as? RUMStartViewCommand)
XCTAssertTrue(stopCommand.identity.equals(viewKey))
XCTAssertTrue(stopCommand.identity.equals(viewIdentity))
XCTAssertEqual(stopCommand.attributes.count, 0)
XCTAssertEqual(stopCommand.time, .mockDecember15th2019At10AMUTC())
XCTAssertTrue(startCommand.identity.equals(viewKey))
XCTAssertTrue(startCommand.identity.equals(viewIdentity))
XCTAssertEqual(startCommand.path, viewPath)
XCTAssertEqual(startCommand.name, viewName)
AssertDictionariesEqual(startCommand.attributes, viewAttributes)
Expand All @@ -289,10 +289,10 @@ class SwiftUIRUMViewsHandlerTests: XCTestCase {

func testGivenRUMViewDidNotStart_whenAppStateChanges_itDoesNothing() throws {
// Given
let viewKey: String = UUID().uuidString
let viewIdentity: String = UUID().uuidString

// When
handler.onDisappear(identity: viewKey)
handler.onDisappear(identity: viewIdentity)

notificationCenter.post(name: UIApplication.willResignActiveNotification, object: nil)
dateProvider.advance(bySeconds: 1)
Expand Down

0 comments on commit c807806

Please sign in to comment.