From 27bc75b854325198b5c3efb886a62a5817172209 Mon Sep 17 00:00:00 2001 From: Prayansh Srivastava Date: Mon, 3 Oct 2022 15:46:42 -0700 Subject: [PATCH 1/4] fix metadata logic --- .../Plugins/DestinationMetadataPlugin.swift | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Sources/Segment/Plugins/DestinationMetadataPlugin.swift b/Sources/Segment/Plugins/DestinationMetadataPlugin.swift index ef3211ac..ade5d5bf 100644 --- a/Sources/Segment/Plugins/DestinationMetadataPlugin.swift +++ b/Sources/Segment/Plugins/DestinationMetadataPlugin.swift @@ -29,7 +29,7 @@ public class DestinationMetadataPlugin: Plugin { guard let destinations = analytics?.timeline.plugins[.destination]?.plugins as? [DestinationPlugin] else { return event } // Mark all loaded and enabled destinations as bundled - var bundled = [String]() + var bundled: Set = [] for plugin in destinations { // Skip processing for Segment.io if (plugin is SegmentDestination) { @@ -38,21 +38,30 @@ public class DestinationMetadataPlugin: Plugin { let hasSettings = integrationSettings.hasIntegrationSettings(forPlugin: plugin) if hasSettings { // we have a device mode plugin installed. - bundled.append(plugin.key) + bundled.insert(plugin.key) } } - + + // All active integrations, not in `bundled` are put in `unbundled` // All unbundledIntegrations not in `bundled` are put in `unbundled` - var unbundled = [String]() + var unbundled: Set = [] + + let activeIntegrations = integrationSettings.integrations?.dictionaryValue ?? [:] + for (integration, _) in activeIntegrations { + if (integration != "Segment.io" && !bundled.contains(integration)) { + unbundled.insert(integration) + } + } + let segmentInfo = integrationSettings.integrationSettings(forKey: "Segment.io") let unbundledIntegrations = segmentInfo?["unbundledIntegrations"] as? [String] ?? [] for integration in unbundledIntegrations { if (!bundled.contains(integration)) { - unbundled.append(integration) + unbundled.insert(integration) } } - modified._metadata = DestinationMetadata(bundled: bundled, unbundled: unbundled, bundledIds: []) + modified._metadata = DestinationMetadata(bundled: Array(bundled), unbundled: Array(unbundled), bundledIds: []) return modified } From 7c879c4c4a3a27d5348e73b0666954078d64d675 Mon Sep 17 00:00:00 2001 From: Prayansh Srivastava Date: Wed, 5 Oct 2022 17:18:20 -0700 Subject: [PATCH 2/4] update test --- Tests/Segment-Tests/Analytics_Tests.swift | 42 ++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/Tests/Segment-Tests/Analytics_Tests.swift b/Tests/Segment-Tests/Analytics_Tests.swift index 22d7df8b..91bec911 100644 --- a/Tests/Segment-Tests/Analytics_Tests.swift +++ b/Tests/Segment-Tests/Analytics_Tests.swift @@ -358,6 +358,7 @@ final class Analytics_Tests: XCTestCase { } } + // Test to ensure bundled and unbundled integrations are populated correctly func testDestinationMetadata() { let analytics = Analytics(configuration: Configuration(writeKey: "test")) let mixpanel = AnyDestination(key: "Mixpanel") @@ -393,6 +394,45 @@ final class Analytics_Tests: XCTestCase { let metadata = trackEvent?._metadata XCTAssertEqual(metadata?.bundled, ["Mixpanel"]) - XCTAssertEqual(metadata?.unbundled, ["Customer.io", "Amplitude"]) + XCTAssertEqual(metadata?.unbundled, ["Amplitude", "Customer.io"]) + } + + // Test to ensure bundled and active integrations are populated correctly + func testDestinationMetadataUnbundled() { + let analytics = Analytics(configuration: Configuration(writeKey: "test")) + let mixpanel = AnyDestination(key: "Mixpanel") + let outputReader = OutputReaderPlugin() + + // we want the output reader on the segment plugin + // cuz that's the only place the metadata is getting added. + let segmentDest = analytics.find(pluginType: SegmentDestination.self) + segmentDest?.add(plugin: outputReader) + + analytics.add(plugin: mixpanel) + var settings = Settings(writeKey: "123") + let integrations = try? JSON([ + "Segment.io": JSON([ + "unbundledIntegrations": + [ + "Customer.io" + ] + ]), + "Mixpanel": JSON(["someKey": "someVal"]), + "Amplitude": JSON(["someKey": "somVal"]), + "dest1": JSON(["someKey": "someVal"]) + ]) + settings.integrations = integrations + analytics.store.dispatch(action: System.UpdateSettingsAction(settings: settings)) + + waitUntilStarted(analytics: analytics) + + + analytics.track(name: "sampleEvent") + + let trackEvent: TrackEvent? = outputReader.lastEvent as? TrackEvent + let metadata = trackEvent?._metadata + + XCTAssertEqual(metadata?.bundled, ["Mixpanel"]) + XCTAssertEqual(metadata?.unbundled, ["Amplitude", "dest1", "Customer.io"]) } } From e6727b4bfcb2982ce05caf63d94ecda5eb187e7f Mon Sep 17 00:00:00 2001 From: Prayansh Srivastava Date: Wed, 5 Oct 2022 17:23:26 -0700 Subject: [PATCH 3/4] update test --- Tests/Segment-Tests/Analytics_Tests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Segment-Tests/Analytics_Tests.swift b/Tests/Segment-Tests/Analytics_Tests.swift index 91bec911..7968ba95 100644 --- a/Tests/Segment-Tests/Analytics_Tests.swift +++ b/Tests/Segment-Tests/Analytics_Tests.swift @@ -394,7 +394,7 @@ final class Analytics_Tests: XCTestCase { let metadata = trackEvent?._metadata XCTAssertEqual(metadata?.bundled, ["Mixpanel"]) - XCTAssertEqual(metadata?.unbundled, ["Amplitude", "Customer.io"]) + XCTAssertEqual(metadata?.unbundled, ["Customer.io", "Amplitude"]) } // Test to ensure bundled and active integrations are populated correctly From 18114284afcc148f6118d805d794ae05482a14d3 Mon Sep 17 00:00:00 2001 From: Prayansh Srivastava Date: Thu, 6 Oct 2022 10:22:50 -0700 Subject: [PATCH 4/4] fix test --- Tests/Segment-Tests/Analytics_Tests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/Segment-Tests/Analytics_Tests.swift b/Tests/Segment-Tests/Analytics_Tests.swift index 7968ba95..7620e090 100644 --- a/Tests/Segment-Tests/Analytics_Tests.swift +++ b/Tests/Segment-Tests/Analytics_Tests.swift @@ -394,7 +394,7 @@ final class Analytics_Tests: XCTestCase { let metadata = trackEvent?._metadata XCTAssertEqual(metadata?.bundled, ["Mixpanel"]) - XCTAssertEqual(metadata?.unbundled, ["Customer.io", "Amplitude"]) + XCTAssertEqual(metadata?.unbundled.sorted(), ["Amplitude", "Customer.io"]) } // Test to ensure bundled and active integrations are populated correctly @@ -433,6 +433,6 @@ final class Analytics_Tests: XCTestCase { let metadata = trackEvent?._metadata XCTAssertEqual(metadata?.bundled, ["Mixpanel"]) - XCTAssertEqual(metadata?.unbundled, ["Amplitude", "dest1", "Customer.io"]) + XCTAssertEqual(metadata?.unbundled.sorted(), ["Amplitude", "Customer.io", "dest1"]) } }