// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import Amplify import XCTest @_spi(InternalAWSPinpoint) @testable import InternalAWSPinpoint @testable import AWSPinpointAnalyticsPlugin // swiftlint:disable:next type_name class AWSPinpointAnalyticsPluginConfigurationTests: XCTestCase { let testAppId = "testAppId" let appId: JSONValue = "testAppId" let testRegion = "us-east-1" let region: JSONValue = "us-east-1" let testAutoFlushInterval = 300 let autoFlushInterval: JSONValue = 300 let testTrackAppSession = false let trackAppSession: JSONValue = false let testAutoSessionTrackingInterval = 100 let autoSessionTrackingInterval: JSONValue = 100 let pinpointAnalyticsPluginConfiguration = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.appIdConfigKey, "testAppId"), (AWSPinpointAnalyticsPluginConfiguration.regionConfigKey, "us-east-1") ) func testConfigureSuccess_withTargetingConfiguration() throws { let regionConfiguration = JSONValue(dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.regionConfigKey, "us-east-1")) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration), (AWSPinpointAnalyticsPluginConfiguration.pinpointTargetingConfigKey, regionConfiguration) ) do { let config = try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig) XCTAssertNotNil(config) XCTAssertEqual(config.appId, testAppId) XCTAssertEqual(config.region, testRegion) XCTAssertEqual(config.autoFlushEventsInterval, AWSPinpointAnalyticsPluginConfiguration.defaultAutoFlushEventsInterval) XCTAssertEqual(config.trackAppSessions, AWSPinpointAnalyticsPluginConfiguration.defaultTrackAppSession) XCTAssertEqual(config.autoSessionTrackingInterval, AWSPinpointAnalyticsPluginConfiguration.defaultAutoSessionTrackingInterval) } catch { XCTFail("Failed to instantiate analytics plugin configuration") } } func testConfigureSuccess_withoutTargetingConfiguration() throws { let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration) ) do { let config = try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig) XCTAssertNotNil(config) XCTAssertEqual(config.appId, testAppId) XCTAssertEqual(config.region, testRegion) XCTAssertEqual(config.autoFlushEventsInterval, AWSPinpointAnalyticsPluginConfiguration.defaultAutoFlushEventsInterval) XCTAssertEqual(config.trackAppSessions, AWSPinpointAnalyticsPluginConfiguration.defaultTrackAppSession) XCTAssertEqual(config.autoSessionTrackingInterval, AWSPinpointAnalyticsPluginConfiguration.defaultAutoSessionTrackingInterval) } catch { XCTFail("Failed to instantiate analytics plugin configuration") } } func testConfigureWithAutoFlushEventsIntervalSuccess() { let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration), (AWSPinpointAnalyticsPluginConfiguration.autoFlushEventsIntervalKey, autoFlushInterval) ) do { let config = try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig) XCTAssertNotNil(config) XCTAssertEqual(config.appId, testAppId) XCTAssertEqual(config.region, testRegion) XCTAssertEqual(config.autoFlushEventsInterval, testAutoFlushInterval) XCTAssertEqual(config.trackAppSessions, AWSPinpointAnalyticsPluginConfiguration.defaultTrackAppSession) XCTAssertEqual(config.autoSessionTrackingInterval, AWSPinpointAnalyticsPluginConfiguration.defaultAutoSessionTrackingInterval) } catch { XCTFail("Failed to instantiate analytics plugin configuration") } } func testConfigureThrowsErrorForInvalidAutoFlushEventsIntervalValue() { let autoFlushInterval = JSONValue(integerLiteral: -100) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration), (AWSPinpointAnalyticsPluginConfiguration.autoFlushEventsIntervalKey, autoFlushInterval) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AnalyticsPluginErrorConstant.invalidAutoFlushEventsInterval.errorDescription) } } func testConfigureWithTrackAppSessionSuccess() { let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration), (AWSPinpointAnalyticsPluginConfiguration.trackAppSessionsKey, trackAppSession) ) do { let config = try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig) XCTAssertNotNil(config) XCTAssertEqual(config.appId, testAppId) XCTAssertEqual(config.region, testRegion) XCTAssertEqual(config.autoFlushEventsInterval, AWSPinpointAnalyticsPluginConfiguration.defaultAutoFlushEventsInterval) XCTAssertEqual(config.trackAppSessions, testTrackAppSession) XCTAssertEqual(config.autoSessionTrackingInterval, AWSPinpointAnalyticsPluginConfiguration.defaultAutoSessionTrackingInterval) } catch { XCTFail("Failed to instantiate analytics plugin configuration") } } func testConfigureWithAutoSessionTrackingIntervalSuccess() { let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration), (AWSPinpointAnalyticsPluginConfiguration.autoSessionTrackingIntervalKey, autoSessionTrackingInterval) ) do { let config = try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig) XCTAssertNotNil(config) XCTAssertEqual(config.appId, testAppId) XCTAssertEqual(config.region, testRegion) XCTAssertEqual(config.autoFlushEventsInterval, AWSPinpointAnalyticsPluginConfiguration.defaultAutoFlushEventsInterval) XCTAssertEqual(config.trackAppSessions, AWSPinpointAnalyticsPluginConfiguration.defaultTrackAppSession) XCTAssertEqual(config.autoSessionTrackingInterval, testAutoSessionTrackingInterval) } catch { XCTFail("Failed to instantiate analytics plugin configuration") } } func testConfigureThrowsErrorForInvalidAutoSessionTrackingValue() { let autoSessionTrackingInterval = JSONValue(integerLiteral: -100) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration), (AWSPinpointAnalyticsPluginConfiguration.autoSessionTrackingIntervalKey, autoSessionTrackingInterval) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AnalyticsPluginErrorConstant.invalidAutoSessionTrackingInterval.errorDescription) } } func testConfigureThrowsErrorForMissingConfigurationObject() { let analyticsPluginConfig = JSONValue(stringLiteral: "notADictionaryLiteral") XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AnalyticsPluginErrorConstant.configurationObjectExpected.errorDescription) } } func testConfigureThrowsErrorForMissingPinpointAnalyticsConfiguration() { let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.regionConfigKey, region) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AnalyticsPluginErrorConstant.missingPinpointAnalyicsConfiguration.errorDescription) } } func testConfigureThrowsErrorForMissingPinpointAnalyticsConfigurationObject() { let pinpointAnalyticsPluginConfiguration = JSONValue(stringLiteral: "notDictionary") let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AWSPinpointErrorConstants.pinpointConfigurationExpected.errorDescription) } } func testConfigureThrowsErrorForMissingPinpointAnalyticsAppId() { let pinpointAnalyticsPluginConfiguration = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.regionConfigKey, region)) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AWSPinpointErrorConstants.missingAppId.errorDescription) } } func testConfigureThrowsErrorForEmptyPinpointAnalyticsAppIdValue() { let pinpointAnalyticsPluginConfiguration = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.appIdConfigKey, ""), (AWSPinpointAnalyticsPluginConfiguration.regionConfigKey, region) ) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AWSPinpointErrorConstants.emptyAppId.errorDescription) } } func testConfigureThrowsErrorForInvalidPinpointAnalyticsAppIdValue() { let pinpointAnalyticsPluginConfiguration = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.appIdConfigKey, 1), (AWSPinpointAnalyticsPluginConfiguration.regionConfigKey, region) ) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AWSPinpointErrorConstants.invalidAppId.errorDescription) } } func testConfigureThrowsErrorForMissingPinpointAnalyticsRegion() { let pinpointAnalyticsPluginConfiguration = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.appIdConfigKey, appId)) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AWSPinpointErrorConstants.missingRegion.errorDescription) } } func testConfigureThrowsErrorForEmptyPinpointAnalyticsRegionValue() { let pinpointAnalyticsPluginConfiguration = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.appIdConfigKey, appId), (AWSPinpointAnalyticsPluginConfiguration.regionConfigKey, "") ) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AWSPinpointErrorConstants.emptyRegion.errorDescription) } } func testConfigureThrowsErrorForInvalidPinpointAnalyticsRegionValue() { let pinpointAnalyticsPluginConfiguration = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.appIdConfigKey, appId), (AWSPinpointAnalyticsPluginConfiguration.regionConfigKey, "") ) let analyticsPluginConfig = JSONValue( dictionaryLiteral: (AWSPinpointAnalyticsPluginConfiguration.pinpointAnalyticsConfigKey, pinpointAnalyticsPluginConfiguration) ) XCTAssertThrowsError(try AWSPinpointAnalyticsPluginConfiguration(analyticsPluginConfig)) { error in guard case let PluginError.pluginConfigurationError(errorDescription, _, _) = error else { XCTFail("Expected PluginError pluginConfigurationError, got: \(error)") return } XCTAssertEqual(errorDescription, AWSPinpointErrorConstants.emptyRegion.errorDescription) } } func testThrowsOnMissingConfig() throws { let plugin = AWSPinpointAnalyticsPlugin() try Amplify.add(plugin: plugin) let categoryConfig = AnalyticsCategoryConfiguration(plugins: ["NonExistentPlugin": true]) let amplifyConfig = AmplifyConfiguration(analytics: categoryConfig) do { try Amplify.configure(amplifyConfig) XCTFail("Should have thrown a pluginConfigurationError if not supplied with a plugin-specific config.") } catch { guard case PluginError.pluginConfigurationError = error else { XCTFail("Should have thrown a pluginConfigurationError if not supplied with a plugin-specific config.") return } } } }