From 0e058ca3171297d141956dddea85e0ce22a88ecc Mon Sep 17 00:00:00 2001 From: Inder Dhir Date: Mon, 10 Apr 2023 13:29:12 -0400 Subject: [PATCH] 2.5.0 Release (#5) Co-authored-by: Nimbus Deploy --- Package.swift | 188 ++--- .../Line Items/NimbusAd+Targeting.swift | 5 +- .../Line Items/NimbusGAMDynamicPrice.swift | 2 +- .../NimbusGAMLinearPriceMapping.swift | 2 +- .../Mediation/NimbusCustomEventBanner.swift | 3 +- .../NimbusCustomEventInterstitial.swift | 3 +- .../Mediation/NimbusSizeToFormatMapper.swift | 2 +- Sources/NimbusKit/Export.swift | 7 + .../NimbusLiveRampInterceptor.swift | 2 +- .../Resources/NimbusLiveRampKit.h | 16 + .../NimbusFANAdController.swift | 2 +- .../NimbusFANAdRenderer.swift | 2 +- Sources/NimbusRenderKit/Export.swift | 7 + .../Resources/NimbusRenderOMKit.h | 16 + Sources/NimbusRenderStaticKit/Export.swift | 7 + .../Placeholder.swift | 1 - Sources/NimbusRenderTarget/Placeholder.swift | 1 - Sources/NimbusRenderVideoKit/Export.swift | 7 + .../NimbusRenderVideoTarget/Placeholder.swift | 1 - .../Helpers/NimbusAPSRequestHelper.swift | 16 +- .../Helpers/NimbusLogLevel+DTBLogLevel.swift | 1 - .../NimbusAPSLegacyRequestManager.swift | 109 +++ .../NimbusAPSRequestInterceptor.swift | 13 +- .../NimbusAPSViewabilityManager.swift | 0 .../NimbusRequest+APS.swift | 50 ++ .../NimbusAPSOnRequestInterceptor.swift | 83 +++ .../Request/NimbusAPSRequestManager.swift | 87 +-- .../Resources/NimbusRequestAPSKit.h | 17 + .../Helpers/NimbusLogLevel+FBAdLogLevel.swift | 2 +- .../NimbusFANRequestInterceptor.swift | 4 +- Sources/NimbusRequestKit/Export.swift | 7 + Sources/NimbusRequestTarget/Placeholder.swift | 1 - Sources/NimbusTarget/Placeholder.swift | 1 - .../Helpers/Data+Extensions.swift | 40 -- .../Helpers/Dictionary+Extensions.swift | 61 -- .../Helpers/JSONEncoder+Dict.swift | 21 - .../NimbusFANRequestInterceptorTests.swift | 275 -------- .../NimbusRenderFANKitTests.swift | 346 ---------- .../NimbusAdTargetingTests.swift | 74 -- .../NimbusGAMDynamicPriceTests.swift | 152 ---- .../NimbusGAMLinearPriceMappingTests.swift | 47 -- .../NimbusSizeToFormatMapperTests.swift | 60 -- .../Helpers/Data+Extensions.swift | 41 -- .../Helpers/Dictionary+Extensions.swift | 64 -- .../Helpers/JSONEncoder+Dict.swift | 21 - ...ockNimbusLiveRampInterceptorDelegate.swift | 28 - .../NimbusLiveRampKitTests.swift | 270 -------- .../Helpers/Data+Extensions.swift | 40 -- .../Helpers/Dictionary+Extensions.swift | 61 -- .../Helpers/JSONEncoder+Dict.swift | 21 - .../Helpers/NimbusAPSRequestHelperTests.swift | 112 --- .../MockAPSRequestManager.swift | 65 -- .../NimbusRequestAPSTests.swift | 647 ------------------ .../Helpers/Data+Extensions.swift | 40 -- .../Helpers/Dictionary+Extensions.swift | 61 -- .../Helpers/JSONEncoder+Dict.swift | 21 - .../NimbusUnityKitTests.swift | 34 - .../NimbusUnityRequestInterceptorTests.swift | 134 ---- .../StubNimbusUnityRequestInterceptor.swift | 16 - 59 files changed, 487 insertions(+), 2930 deletions(-) create mode 100644 Sources/NimbusKit/Export.swift create mode 100644 Sources/NimbusLiveRampKit/Resources/NimbusLiveRampKit.h rename Sources/{NimbusFANKit => NimbusRenderFANKit}/NimbusFANAdController.swift (100%) rename Sources/{NimbusFANKit => NimbusRenderFANKit}/NimbusFANAdRenderer.swift (100%) create mode 100644 Sources/NimbusRenderKit/Export.swift create mode 100644 Sources/NimbusRenderOMKit/Resources/NimbusRenderOMKit.h create mode 100644 Sources/NimbusRenderStaticKit/Export.swift delete mode 100644 Sources/NimbusRenderStaticTarget/Placeholder.swift delete mode 100644 Sources/NimbusRenderTarget/Placeholder.swift create mode 100644 Sources/NimbusRenderVideoKit/Export.swift delete mode 100644 Sources/NimbusRenderVideoTarget/Placeholder.swift create mode 100644 Sources/NimbusRequestAPSKit/Legacy/NimbusAPSLegacyRequestManager.swift rename Sources/NimbusRequestAPSKit/{Request => Legacy}/NimbusAPSRequestInterceptor.swift (89%) rename Sources/NimbusRequestAPSKit/{Request => }/NimbusAPSViewabilityManager.swift (100%) create mode 100644 Sources/NimbusRequestAPSKit/NimbusRequest+APS.swift create mode 100644 Sources/NimbusRequestAPSKit/Request/NimbusAPSOnRequestInterceptor.swift create mode 100644 Sources/NimbusRequestAPSKit/Resources/NimbusRequestAPSKit.h rename Sources/{NimbusFANKit => NimbusRequestFANKit}/Helpers/NimbusLogLevel+FBAdLogLevel.swift (93%) rename Sources/{NimbusFANKit => NimbusRequestFANKit}/NimbusFANRequestInterceptor.swift (97%) create mode 100644 Sources/NimbusRequestKit/Export.swift delete mode 100644 Sources/NimbusRequestTarget/Placeholder.swift delete mode 100644 Sources/NimbusTarget/Placeholder.swift delete mode 100644 Tests/NimbusFANKitTests/Helpers/Data+Extensions.swift delete mode 100644 Tests/NimbusFANKitTests/Helpers/Dictionary+Extensions.swift delete mode 100644 Tests/NimbusFANKitTests/Helpers/JSONEncoder+Dict.swift delete mode 100644 Tests/NimbusFANKitTests/NimbusFANRequestInterceptorTests.swift delete mode 100644 Tests/NimbusFANKitTests/NimbusRenderFANKitTests.swift delete mode 100644 Tests/NimbusGAMKitTests/NimbusAdTargetingTests.swift delete mode 100644 Tests/NimbusGAMKitTests/NimbusGAMDynamicPriceTests.swift delete mode 100644 Tests/NimbusGAMKitTests/NimbusGAMLinearPriceMappingTests.swift delete mode 100644 Tests/NimbusGAMKitTests/NimbusSizeToFormatMapperTests.swift delete mode 100644 Tests/NimbusLiveRampKitTests/Helpers/Data+Extensions.swift delete mode 100644 Tests/NimbusLiveRampKitTests/Helpers/Dictionary+Extensions.swift delete mode 100644 Tests/NimbusLiveRampKitTests/Helpers/JSONEncoder+Dict.swift delete mode 100644 Tests/NimbusLiveRampKitTests/MockNimbusLiveRampInterceptorDelegate.swift delete mode 100644 Tests/NimbusLiveRampKitTests/NimbusLiveRampKitTests.swift delete mode 100644 Tests/NimbusRequestAPSKitTests/Helpers/Data+Extensions.swift delete mode 100644 Tests/NimbusRequestAPSKitTests/Helpers/Dictionary+Extensions.swift delete mode 100644 Tests/NimbusRequestAPSKitTests/Helpers/JSONEncoder+Dict.swift delete mode 100644 Tests/NimbusRequestAPSKitTests/Helpers/NimbusAPSRequestHelperTests.swift delete mode 100644 Tests/NimbusRequestAPSKitTests/MockAPSRequestManager.swift delete mode 100644 Tests/NimbusRequestAPSKitTests/NimbusRequestAPSTests.swift delete mode 100644 Tests/NimbusUnityKitTests/Helpers/Data+Extensions.swift delete mode 100644 Tests/NimbusUnityKitTests/Helpers/Dictionary+Extensions.swift delete mode 100644 Tests/NimbusUnityKitTests/Helpers/JSONEncoder+Dict.swift delete mode 100644 Tests/NimbusUnityKitTests/NimbusUnityKitTests.swift delete mode 100644 Tests/NimbusUnityKitTests/NimbusUnityRequestInterceptorTests.swift delete mode 100644 Tests/NimbusUnityKitTests/StubNimbusUnityRequestInterceptor.swift diff --git a/Package.swift b/Package.swift index 1b7c0f0..06904d1 100644 --- a/Package.swift +++ b/Package.swift @@ -1,5 +1,6 @@ // swift-tools-version: 5.6 +import Foundation import PackageDescription let package = Package( @@ -7,134 +8,95 @@ let package = Package( platforms: [.iOS(.v12)], products: [ .library( - name: "NimbusKit", - targets: ["NimbusTarget"]), + name: "NimbusKit", + targets: ["NimbusTarget"]), .library( - name: "NimbusRenderKit", - targets: ["NimbusRenderTarget"]), + name: "NimbusRenderKit", + targets: ["NimbusRenderTarget", "OMSDK_Adsbynimbus"]), .library( - name: "NimbusRenderStaticKit", - targets: ["NimbusRenderStaticTarget"]), + name: "NimbusRenderStaticKit", + targets: ["NimbusRenderStaticTarget"]), .library( - name: "NimbusRenderVideoKit", - targets: ["NimbusRenderVideoTarget", "GoogleInteractiveMediaAds"]), + name: "NimbusRenderVideoKit", + targets: ["NimbusRenderVideoTarget", "GoogleInteractiveMediaAds"]), .library( - name: "NimbusRequestKit", - targets: ["NimbusRequestTarget"]), + name: "NimbusRequestKit", + targets: ["NimbusRequestTarget"]), .library( - name: "NimbusGAMKit", - targets: ["NimbusGAMKit"]), + name: "NimbusGAMKit", + targets: ["NimbusGAMKit"]), .library( - name: "NimbusFANKit", - targets: ["NimbusFANKit", "FBAudienceNetwork"]), + name: "NimbusFANKit", + targets: ["NimbusRenderFANKit", "NimbusRequestFANKit", "FBAudienceNetwork"]), .library( - name: "NimbusLiveRampKit", - targets: ["NimbusLiveRampKit"]), + name: "NimbusLiveRampKit", + targets: ["NimbusLiveRampKit"]), .library( - name: "NimbusRequestAPSKit", - targets: ["NimbusRequestAPSKit", "DTBiOSSDK"]), + name: "NimbusRequestAPSKit", + targets: ["NimbusRequestAPSKit", "DTBiOSSDK"]), .library( - name: "NimbusUnityKit", - targets: ["NimbusUnityKit", "UnityAds"]), + name: "NimbusUnityKit", + targets: ["NimbusUnityKit", "UnityAds"]), .library( - name: "NimbusRenderVideoKit-WithoutGoogleInteractiveMediaAds", - targets: ["NimbusRenderVideoTarget"]), + name: "NimbusRenderVideoKit-WithoutGoogleInteractiveMediaAds", + targets: ["NimbusRenderVideoTarget"]), .library( - name: "NimbusRequestAPSKit-WithoutDTBiOSSDK", - targets: ["NimbusRequestAPSKit"]), + name: "NimbusRequestAPSKit-WithoutDTBiOSSDK", + targets: ["NimbusRequestAPSKit"]), .library( - name: "NimbusFANKit-WithoutFBAudienceNetwork", - targets: ["NimbusFANKit"]), + name: "NimbusFANKit-WithoutFBAudienceNetwork", + targets: ["NimbusRenderFANKit", "NimbusRequestFANKit"]), .library( - name: "NimbusUnityKit-WithoutUnityAds", - targets: ["NimbusUnityKit"]), + name: "NimbusUnityKit-WithoutUnityAds", + targets: ["NimbusUnityKit"]), ], dependencies: [ - .package(url: "https://github.com/faktorio/ats-sdk-ios-prod", from: "1.4.0"), - .package(url: "https://github.com/googleads/swift-package-manager-google-mobile-ads", "9.12.0"..<"11.0.0"), + .package(url: "https://github.com/LiveRamp/ats-sdk-ios.git", from: "1.4.0"), + .package(url: "https://github.com/birdrides/mockingbird.git", from: "0.20.0"), + .package(url: "https://github.com/googleads/swift-package-manager-google-mobile-ads.git", "9.12.0"..<"11.0.0"), ], targets: [ - .target( + .framework( name: "NimbusRenderTarget", - dependencies: ["NimbusRenderKit", "NimbusCoreKit", "OMSDK_Adsbynimbus"]), - .target( + dependencies: ["NimbusCoreKit", "NimbusRenderKit"]), + .framework( + name: "NimbusRequestTarget", + dependencies: ["NimbusCoreKit", "NimbusRequestKit"]), + .framework( + name: "NimbusTarget", + dependencies: ["NimbusRequestTarget", "NimbusRenderTarget", "NimbusKit"]), + .framework( name: "NimbusRenderStaticTarget", - dependencies: ["NimbusRenderStaticKit", "NimbusRenderTarget"]), - .target( + dependencies: ["NimbusRenderTarget", "NimbusRenderStaticKit"]), + .framework( name: "NimbusRenderVideoTarget", - dependencies: ["NimbusRenderVideoKit", "NimbusRenderTarget"]), + dependencies: ["NimbusRenderTarget", "NimbusRenderVideoKit"]), .target( - name: "NimbusRequestTarget", - dependencies: ["NimbusRequestKit", "NimbusCoreKit"]), + name: "NimbusRenderFANKit", + dependencies: ["NimbusRenderTarget"]), .target( - name: "NimbusTarget", - dependencies: ["NimbusKit", "NimbusRequestTarget", "NimbusRenderTarget"]), + name: "NimbusRequestFANKit", + dependencies: ["NimbusRequestTarget"]), .target( name: "NimbusGAMKit", - dependencies: [ - "NimbusTarget", - .product(name: "GoogleMobileAds", package: "swift-package-manager-google-mobile-ads")]), - .testTarget( - name: "NimbusGAMKitTests", - dependencies: ["NimbusGAMKit"]), + dependencies: ["NimbusTarget", .GoogleMobileAds]), .target( name: "NimbusLiveRampKit", - dependencies: [ - "NimbusRequestKit", - .product(name: "LRAtsSDK", package: "ats-sdk-ios-prod")]), - .testTarget( - name: "NimbusLiveRampKitTests", - dependencies: ["NimbusLiveRampKit"]), - .target( - name: "NimbusFANKit", - dependencies: ["NimbusRenderTarget", "NimbusRequestTarget"]), - .testTarget( - name: "NimbusFANKitTests", - dependencies: ["NimbusFANKit", "FBAudienceNetwork"]), + dependencies: [ "NimbusRequestTarget", .LiveRamp]), .target( name: "NimbusRequestAPSKit", dependencies: ["NimbusRequestTarget"]), - .testTarget( - name: "NimbusRequestAPSKitTests", - dependencies: ["NimbusRequestAPSKit", "DTBiOSSDK"]), .target( name: "NimbusUnityKit", dependencies: ["NimbusRenderTarget", "NimbusRequestTarget"]), - .testTarget( - name: "NimbusUnityKitTests", - dependencies: ["NimbusUnityKit", "UnityAds"]), - .binaryTarget( - name: "NimbusKit", - url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.4.1/NimbusKit-2.4.1.zip", - checksum: "27db7850b35ae871ded3430be503ac6555a31b58eab75670552b525be7368949"), - .binaryTarget( - name: "NimbusRequestKit", - url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.4.1/NimbusRequestKit-2.4.1.zip", - checksum: "78edbea655de6ca6eb1b12c06224095f54ccc8f29b166a27a9fa522b6e673750"), - .binaryTarget( - name: "NimbusRenderKit", - url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.4.1/NimbusRenderKit-2.4.1.zip", - checksum: "00b877ba91d521fcb855f4a830102153ed28e5bee2cc08160e3cc24d523de70c"), - .binaryTarget( - name: "NimbusRenderStaticKit", - url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.4.1/NimbusRenderStaticKit-2.4.1.zip", - checksum: "bf340e302256f99c6f5dd52243bca9d0a030748bcaab0733f9789970591b390f"), - .binaryTarget( - name: "NimbusRenderVideoKit", - url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.4.1/NimbusRenderVideoKit-2.4.1.zip", - checksum: "24140b2623155cb0dbc48e2a3e35f94db38c8f4361c0357be788553b574a9421"), - .binaryTarget( - name: "NimbusCoreKit", - url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.4.1/NimbusCoreKit-2.4.1.zip", - checksum: "2dcc6bc37a11cebadc736eb3d519e27db9c8c41a413ad7c4f77cdb21cd00316b"), .binaryTarget( name: "GoogleInteractiveMediaAds", url: "https://imasdk.googleapis.com/native/downloads/ima-ios-v3.16.3.zip", checksum: "049bac92551b50247ea14dcbfde9aeb99ac2bea578a74f67c6f3e781d9aca101"), .binaryTarget( name: "OMSDK_Adsbynimbus", - url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/external/omsdk/1.4.2/OMSDK_Adsbynimbus-1.4.2.zip", - checksum: "c92acd23f1cec2c3418ae9f5b01c0dcc9aa4abaf3cfc7cd12de3aa4ed6c2b785"), + url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/external/omsdk/1.4.2/omsdk-adsbynimbus-1.4.2.zip", + checksum: "d42443a5d19a34418976945d8afcd11f25d471fa3178f80eba1c3f6035c0ad24"), .binaryTarget( name: "DTBiOSSDK", url: "https://mdtb-sdk-packages.s3.us-west-2.amazonaws.com/iOS_APS_SDK/APS_iOS_SDK-4.5.5.zip", @@ -142,11 +104,53 @@ let package = Package( .binaryTarget( name: "FBAudienceNetwork", url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/external/facebook/6.12.0/FBAudienceNetwork.zip", - checksum: "4bf37ee5949de007349d85b069da1095a30e82e696e72642dfe117aba08a86a2" - ), + checksum: "4bf37ee5949de007349d85b069da1095a30e82e696e72642dfe117aba08a86a2"), .binaryTarget( name: "UnityAds", url: "https://github.com/Unity-Technologies/unity-ads-ios/releases/download/4.4.1/UnityAds.zip", checksum: "8196b13a0a5eae6ba817e2e7fc9096a584f22aedb1958980d2064955e448d5ad"), ] ) + +extension Target { + static func framework(name: String, dependencies: [Target.Dependency]) -> Target { + target( + name: name, + dependencies: dependencies, + path: "Sources/\(name.replacingOccurrences(of: "Target", with: "Kit"))", + sources: ["Export.swift"]) + } +} + +extension Target.Dependency { + static let GoogleMobileAds = product(name: "GoogleMobileAds", package: "swift-package-manager-google-mobile-ads") + static let LiveRamp = product(name: "LRAtsSDK", package: "ats-sdk-ios") + static let MockingBird = product(name: "Mockingbird", package: "Mockingbird") +} + +package.targets += [ + .binaryTarget( + name: "NimbusCoreKit", + url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.5.0/NimbusCoreKit-2.5.0.zip", + checksum: "709d1c76a1a96f9021d63db1eea102fa48343f1b4b3e54cfdf7714e3ef651697"), + .binaryTarget( + name: "NimbusKit", + url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.5.0/NimbusKit-2.5.0.zip", + checksum: "5047181243a06ddffe92a25d3af27b2e2325b74f3f385c718edfd8ebbb0fdac3"), + .binaryTarget( + name: "NimbusRenderKit", + url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.5.0/NimbusRenderKit-2.5.0.zip", + checksum: "39b0362bc659aaf100cd5097201c6664abfd1e628f41c8869d6cf3250efb9aa0"), + .binaryTarget( + name: "NimbusRenderStaticKit", + url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.5.0/NimbusRenderStaticKit-2.5.0.zip", + checksum: "61aab44a872c5020fe582304c7d8db008ee14294a61a2aa539f35c4e05881964"), + .binaryTarget( + name: "NimbusRenderVideoKit", + url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.5.0/NimbusRenderVideoKit-2.5.0.zip", + checksum: "5559cde580e0ef491297d5c31e13ad942d725b6fd987f9d6cef6fc962ef34c24"), + .binaryTarget( + name: "NimbusRequestKit", + url: "https://adsbynimbus-public.s3.amazonaws.com/iOS/sdks/2.5.0/NimbusRequestKit-2.5.0.zip", + checksum: "8360a5c4e81bd89cc6493fcad0b1f85397a3d93faa118f50097a2a4c34a33dc4"), +] \ No newline at end of file diff --git a/Sources/NimbusGAMKit/Line Items/NimbusAd+Targeting.swift b/Sources/NimbusGAMKit/Line Items/NimbusAd+Targeting.swift index 1ca2336..960cd82 100644 --- a/Sources/NimbusGAMKit/Line Items/NimbusAd+Targeting.swift +++ b/Sources/NimbusGAMKit/Line Items/NimbusAd+Targeting.swift @@ -6,11 +6,12 @@ // Copyright © 2022 Timehop. All rights reserved. // -import GoogleMobileAds @_exported import NimbusRequestKit +import GoogleMobileAds public extension NimbusAd { - + + /// Add keywords for custom targeting from Nimbus ad to GAMRequest /// - Parameters: /// - request: GAMRequest to add keywords to diff --git a/Sources/NimbusGAMKit/Line Items/NimbusGAMDynamicPrice.swift b/Sources/NimbusGAMKit/Line Items/NimbusGAMDynamicPrice.swift index 9270f4f..1c5b20b 100644 --- a/Sources/NimbusGAMKit/Line Items/NimbusGAMDynamicPrice.swift +++ b/Sources/NimbusGAMKit/Line Items/NimbusGAMDynamicPrice.swift @@ -6,8 +6,8 @@ // Copyright © 2020 Timehop. All rights reserved. // -import GoogleMobileAds @_exported import NimbusRequestKit +import GoogleMobileAds /// Nimbus Dynamice Price implementation for GAM which applies keywords to a `GADRequest` public class NimbusGAMDynamicPrice { diff --git a/Sources/NimbusGAMKit/Line Items/NimbusGAMLinearPriceMapping.swift b/Sources/NimbusGAMKit/Line Items/NimbusGAMLinearPriceMapping.swift index 3aca4fb..cccb4f3 100644 --- a/Sources/NimbusGAMKit/Line Items/NimbusGAMLinearPriceMapping.swift +++ b/Sources/NimbusGAMKit/Line Items/NimbusGAMLinearPriceMapping.swift @@ -6,8 +6,8 @@ // Copyright © 2020 Timehop. All rights reserved. // -import Foundation @_exported import NimbusRequestKit +import Foundation /// A mapping composed of multiple LinearPriceGranularities in ascending order public struct NimbusGAMLinearPriceMapping: NimbusDynamicPriceMapping { diff --git a/Sources/NimbusGAMKit/Mediation/NimbusCustomEventBanner.swift b/Sources/NimbusGAMKit/Mediation/NimbusCustomEventBanner.swift index 0c59aa9..f71fafc 100644 --- a/Sources/NimbusGAMKit/Mediation/NimbusCustomEventBanner.swift +++ b/Sources/NimbusGAMKit/Mediation/NimbusCustomEventBanner.swift @@ -6,8 +6,8 @@ // Copyright © 2020 Timehop. All rights reserved. // +@_exported import NimbusKit import GoogleMobileAds -import NimbusKit /// :nodoc: public final class NimbusCustomEventBanner: NSObject, GADCustomEventBanner { @@ -84,7 +84,6 @@ extension NimbusCustomEventBanner: AdControllerDelegate { public func didReceiveNimbusEvent(controller: AdController, event: NimbusEvent) { if event == .clicked { delegate?.customEventBannerWasClicked(self) - delegate?.customEventBannerWillLeaveApplication(self) } } diff --git a/Sources/NimbusGAMKit/Mediation/NimbusCustomEventInterstitial.swift b/Sources/NimbusGAMKit/Mediation/NimbusCustomEventInterstitial.swift index 69e09f8..ca622fb 100644 --- a/Sources/NimbusGAMKit/Mediation/NimbusCustomEventInterstitial.swift +++ b/Sources/NimbusGAMKit/Mediation/NimbusCustomEventInterstitial.swift @@ -6,8 +6,8 @@ // Copyright © 2020 Timehop. All rights reserved. // +@_exported import NimbusKit import GoogleMobileAds -import NimbusKit /// :nodoc: public final class NimbusCustomEventInterstitial: NSObject, GADCustomEventInterstitial { @@ -77,7 +77,6 @@ extension NimbusCustomEventInterstitial: AdControllerDelegate { public func didReceiveNimbusEvent(controller: AdController, event: NimbusEvent) { if event == .clicked { delegate?.customEventInterstitialWasClicked(self) - delegate?.customEventInterstitialWillLeaveApplication(self) } } diff --git a/Sources/NimbusGAMKit/Mediation/NimbusSizeToFormatMapper.swift b/Sources/NimbusGAMKit/Mediation/NimbusSizeToFormatMapper.swift index e8486b1..878e621 100644 --- a/Sources/NimbusGAMKit/Mediation/NimbusSizeToFormatMapper.swift +++ b/Sources/NimbusGAMKit/Mediation/NimbusSizeToFormatMapper.swift @@ -6,7 +6,7 @@ // Copyright © 2022 Timehop. All rights reserved. // -import NimbusRequestKit +@_exported import NimbusRequestKit final class NimbusSizeToFormatMapper { diff --git a/Sources/NimbusKit/Export.swift b/Sources/NimbusKit/Export.swift new file mode 100644 index 0000000..39724c2 --- /dev/null +++ b/Sources/NimbusKit/Export.swift @@ -0,0 +1,7 @@ +// +// Export.swift +// +// DO NOT REMOVE THIS FILE, it is used with Swift Packager Manager to fix Dependency Resolution +// +// Created by Jason Sznol on 3/14/23. +// diff --git a/Sources/NimbusLiveRampKit/NimbusLiveRampInterceptor.swift b/Sources/NimbusLiveRampKit/NimbusLiveRampInterceptor.swift index dd5b09f..9ad085b 100644 --- a/Sources/NimbusLiveRampKit/NimbusLiveRampInterceptor.swift +++ b/Sources/NimbusLiveRampKit/NimbusLiveRampInterceptor.swift @@ -6,8 +6,8 @@ // Copyright © 2022 Timehop. All rights reserved. // -import LRAtsSDK @_exported import NimbusRequestKit +import LRAtsSDK /// Delegate for listening LiveRamp's initialization and envelope fetching public protocol NimbusLiveRampInterceptorDelegate { diff --git a/Sources/NimbusLiveRampKit/Resources/NimbusLiveRampKit.h b/Sources/NimbusLiveRampKit/Resources/NimbusLiveRampKit.h new file mode 100644 index 0000000..5a1ab48 --- /dev/null +++ b/Sources/NimbusLiveRampKit/Resources/NimbusLiveRampKit.h @@ -0,0 +1,16 @@ +// +// NimbusLiveRampKit.h +// NimbusLiveRampKit +// +// Created by Victor Takai on 20/07/22. +// Copyright © 2022 Timehop. All rights reserved. +// + +#import +#import + +//! Project version number for NimbusLiveRampKit. +FOUNDATION_EXPORT double NimbusLiveRampKitVersionNumber; + +//! Project version string for NimbusLiveRampKit. +FOUNDATION_EXPORT const unsigned char NimbusLiveRampKitVersionString[]; diff --git a/Sources/NimbusFANKit/NimbusFANAdController.swift b/Sources/NimbusRenderFANKit/NimbusFANAdController.swift similarity index 100% rename from Sources/NimbusFANKit/NimbusFANAdController.swift rename to Sources/NimbusRenderFANKit/NimbusFANAdController.swift index 0d36a0b..1b69c43 100644 --- a/Sources/NimbusFANKit/NimbusFANAdController.swift +++ b/Sources/NimbusRenderFANKit/NimbusFANAdController.swift @@ -6,8 +6,8 @@ // Copyright © 2020 Timehop. All rights reserved. // -import FBAudienceNetwork @_exported import NimbusRenderKit +import FBAudienceNetwork final class NimbusFANAdController: NSObject { diff --git a/Sources/NimbusFANKit/NimbusFANAdRenderer.swift b/Sources/NimbusRenderFANKit/NimbusFANAdRenderer.swift similarity index 100% rename from Sources/NimbusFANKit/NimbusFANAdRenderer.swift rename to Sources/NimbusRenderFANKit/NimbusFANAdRenderer.swift index e52a83a..c39ca17 100644 --- a/Sources/NimbusFANKit/NimbusFANAdRenderer.swift +++ b/Sources/NimbusRenderFANKit/NimbusFANAdRenderer.swift @@ -6,8 +6,8 @@ // Copyright © 2020 Timehop. All rights reserved. // -import FBAudienceNetwork @_exported import NimbusRenderKit +import FBAudienceNetwork public protocol NimbusFANAdRendererDelegate: AnyObject { /** diff --git a/Sources/NimbusRenderKit/Export.swift b/Sources/NimbusRenderKit/Export.swift new file mode 100644 index 0000000..39724c2 --- /dev/null +++ b/Sources/NimbusRenderKit/Export.swift @@ -0,0 +1,7 @@ +// +// Export.swift +// +// DO NOT REMOVE THIS FILE, it is used with Swift Packager Manager to fix Dependency Resolution +// +// Created by Jason Sznol on 3/14/23. +// diff --git a/Sources/NimbusRenderOMKit/Resources/NimbusRenderOMKit.h b/Sources/NimbusRenderOMKit/Resources/NimbusRenderOMKit.h new file mode 100644 index 0000000..75b3001 --- /dev/null +++ b/Sources/NimbusRenderOMKit/Resources/NimbusRenderOMKit.h @@ -0,0 +1,16 @@ +// +// NimbusRenderOMKit.h +// NimbusRenderOMKit +// +// Created by Inder Dhir on 9/7/21. +// Copyright © 2021 Timehop. All rights reserved. +// + +#import +#import + +//! Project version number for NimbusRenderOMKit. +FOUNDATION_EXPORT double NimbusRenderOMKitVersionNumber; + +//! Project version string for NimbusRenderOMKit. +FOUNDATION_EXPORT const unsigned char NimbusRenderOMKitVersionString[]; diff --git a/Sources/NimbusRenderStaticKit/Export.swift b/Sources/NimbusRenderStaticKit/Export.swift new file mode 100644 index 0000000..39724c2 --- /dev/null +++ b/Sources/NimbusRenderStaticKit/Export.swift @@ -0,0 +1,7 @@ +// +// Export.swift +// +// DO NOT REMOVE THIS FILE, it is used with Swift Packager Manager to fix Dependency Resolution +// +// Created by Jason Sznol on 3/14/23. +// diff --git a/Sources/NimbusRenderStaticTarget/Placeholder.swift b/Sources/NimbusRenderStaticTarget/Placeholder.swift deleted file mode 100644 index 8b13789..0000000 --- a/Sources/NimbusRenderStaticTarget/Placeholder.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Sources/NimbusRenderTarget/Placeholder.swift b/Sources/NimbusRenderTarget/Placeholder.swift deleted file mode 100644 index 8b13789..0000000 --- a/Sources/NimbusRenderTarget/Placeholder.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Sources/NimbusRenderVideoKit/Export.swift b/Sources/NimbusRenderVideoKit/Export.swift new file mode 100644 index 0000000..39724c2 --- /dev/null +++ b/Sources/NimbusRenderVideoKit/Export.swift @@ -0,0 +1,7 @@ +// +// Export.swift +// +// DO NOT REMOVE THIS FILE, it is used with Swift Packager Manager to fix Dependency Resolution +// +// Created by Jason Sznol on 3/14/23. +// diff --git a/Sources/NimbusRenderVideoTarget/Placeholder.swift b/Sources/NimbusRenderVideoTarget/Placeholder.swift deleted file mode 100644 index 8b13789..0000000 --- a/Sources/NimbusRenderVideoTarget/Placeholder.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Sources/NimbusRequestAPSKit/Helpers/NimbusAPSRequestHelper.swift b/Sources/NimbusRequestAPSKit/Helpers/NimbusAPSRequestHelper.swift index dba4910..ff6ca7c 100644 --- a/Sources/NimbusRequestAPSKit/Helpers/NimbusAPSRequestHelper.swift +++ b/Sources/NimbusRequestAPSKit/Helpers/NimbusAPSRequestHelper.swift @@ -6,28 +6,26 @@ // Copyright © 2022 Timehop. All rights reserved. // +@_exported import NimbusRequestKit import DTBiOSSDK import Foundation -@_exported import NimbusRequestKit /// Internal class, DO NOT USE /// :nodoc: -public final class NimbusAPSRequestHelper { - let requestManager: APSRequestManagerType +final class NimbusAPSRequestHelper { + let requestManager: APSLegacyRequestManagerType var adSizes: [DTBAdSize] = [] public init( appKey: String, - requestManager: APSRequestManagerType? = nil, - timeoutInSeconds: Double, - enableTestMode: Bool = false + requestManager: APSLegacyRequestManagerType? = nil, + timeoutInSeconds: Double ) { - self.requestManager = requestManager ?? NimbusAPSRequestManager( + self.requestManager = requestManager ?? NimbusAPSLegacyRequestManager( appKey: appKey, logger: Nimbus.shared.logger, logLevel: Nimbus.shared.logLevel, - timeoutInSeconds: timeoutInSeconds, - enableTestMode: enableTestMode + timeoutInSeconds: timeoutInSeconds ) } diff --git a/Sources/NimbusRequestAPSKit/Helpers/NimbusLogLevel+DTBLogLevel.swift b/Sources/NimbusRequestAPSKit/Helpers/NimbusLogLevel+DTBLogLevel.swift index b4808e0..2b648fd 100644 --- a/Sources/NimbusRequestAPSKit/Helpers/NimbusLogLevel+DTBLogLevel.swift +++ b/Sources/NimbusRequestAPSKit/Helpers/NimbusLogLevel+DTBLogLevel.swift @@ -7,7 +7,6 @@ // import DTBiOSSDK -import NimbusCoreKit extension NimbusLogLevel { var apsLogLevel: DTBLogLevel { diff --git a/Sources/NimbusRequestAPSKit/Legacy/NimbusAPSLegacyRequestManager.swift b/Sources/NimbusRequestAPSKit/Legacy/NimbusAPSLegacyRequestManager.swift new file mode 100644 index 0000000..1c3e7d6 --- /dev/null +++ b/Sources/NimbusRequestAPSKit/Legacy/NimbusAPSLegacyRequestManager.swift @@ -0,0 +1,109 @@ +// +// NimbusAPSLegacyRequestManager.swift +// NimbusRequestAPSKit +// +// Created by Inder Dhir on 7/14/22. +// Copyright © 2022 Timehop. All rights reserved. +// + +@_exported import NimbusRequestKit +import DTBiOSSDK + +protocol APSLegacyRequestManagerType { + var usPrivacyString: String? { get set } + func loadAdsSync(for adSizes: [DTBAdSize]) -> [[AnyHashable: Any]] +} + + +final class NimbusAPSLegacyRequestManager: APSLegacyRequestManagerType { + private let requestsDispatchGroup = DispatchGroup() + private let requestsTimeoutInSeconds: Double + private let logger: Logger + private let logLevel: NimbusLogLevel + + private var adLoadersDict: [String: DTBAdLoader] = [:] + var usPrivacyString: String? + + init( + appKey: String, + logger: Logger, + logLevel: NimbusLogLevel, + timeoutInSeconds: Double = 0.5 + ) { + self.logger = logger + self.logLevel = logLevel + self.requestsTimeoutInSeconds = timeoutInSeconds + + DTBAds.sharedInstance().setAppKey(appKey) + DTBAds.sharedInstance().mraidPolicy = CUSTOM_MRAID + DTBAds.sharedInstance().mraidCustomVersions = ["1.0", "2.0", "3.0"] + DTBAds.sharedInstance().setLogLevel(logLevel.apsLogLevel) + } + + func loadAdsSync(for adSizes: [DTBAdSize]) -> [[AnyHashable: Any]] { + var callbacks: [DTBCallback] = [] + adSizes.forEach { adSize in + let adLoader = reuseOrCreateAdLoader(for: adSize) + + requestsDispatchGroup.enter() + let callback = DTBCallback(loaders: adLoadersDict, requestsDispatchGroup: requestsDispatchGroup) + callbacks.append(callback) + adLoader.loadAd(callback) + } + + let result = requestsDispatchGroup.wait(timeout: .now() + requestsTimeoutInSeconds) + switch result { + case .success: + logger.log("APS requests completed successfully", level: logLevel) + case .timedOut: + logger.log("APS requests timed out", level: logLevel) + } + + return callbacks.compactMap { $0.payload } + } + + private func reuseOrCreateAdLoader(for adSize: DTBAdSize) -> DTBAdLoader { + if let existingAdLoader = adLoadersDict.removeValue(forKey: adSize.slotUUID) { + return existingAdLoader + } + + let adLoader = DTBAdLoader() + adLoader.setAdSizes([adSize as Any]) + if let usPrivacyString { + adLoader.putCustomTarget(usPrivacyString, withKey: "us_privacy") + } + + return adLoader + } +} + +// MARK: DTBAdCallback + +/// :nodoc: +final class DTBCallback: DTBAdCallback { + + private let requestsDispatchGroup: DispatchGroup + private var adLoadersDict: [String: DTBAdLoader] + var payload: [AnyHashable: Any]? + + init(loaders: [String: DTBAdLoader], requestsDispatchGroup: DispatchGroup) { + self.adLoadersDict = loaders + self.requestsDispatchGroup = requestsDispatchGroup + } + + /// :nodoc: + public func onFailure(_ error: DTBAdError) { + Nimbus.shared.logger.log("APS ad fetching failed with code: \(error.rawValue)", level: .error) + + requestsDispatchGroup.leave() + } + + /// :nodoc: + public func onSuccess(_ adResponse: DTBAdResponse!) { + Nimbus.shared.logger.log("APS ad fetching succeeded", level: .debug) + + adLoadersDict[adResponse.adSize().slotUUID] = adResponse.dtbAdLoader + payload = adResponse.customTargeting() + requestsDispatchGroup.leave() + } +} diff --git a/Sources/NimbusRequestAPSKit/Request/NimbusAPSRequestInterceptor.swift b/Sources/NimbusRequestAPSKit/Legacy/NimbusAPSRequestInterceptor.swift similarity index 89% rename from Sources/NimbusRequestAPSKit/Request/NimbusAPSRequestInterceptor.swift rename to Sources/NimbusRequestAPSKit/Legacy/NimbusAPSRequestInterceptor.swift index c5139e3..54125af 100644 --- a/Sources/NimbusRequestAPSKit/Request/NimbusAPSRequestInterceptor.swift +++ b/Sources/NimbusRequestAPSKit/Legacy/NimbusAPSRequestInterceptor.swift @@ -8,15 +8,15 @@ import DTBiOSSDK import Foundation -import NimbusRequestKit /// Enables APS demand for NimbusRequest. /// Add an instance of this to `NimbusAdManager.requestInterceptors` +@available(*, deprecated, message: "") public final class NimbusAPSRequestInterceptor { private let adSizes: [DTBAdSize] private let viewabilityManager = NimbusAPSViewabilityManager() - var requestManager: APSRequestManagerType + var requestManager: APSLegacyRequestManagerType /** Initializes a NimbusAPSRequestInterceptor instance @@ -28,7 +28,7 @@ public final class NimbusAPSRequestInterceptor { public init(appKey: String, adSizes: [DTBAdSize]) { self.adSizes = adSizes - requestManager = NimbusAPSRequestManager( + requestManager = NimbusAPSLegacyRequestManager( appKey: appKey, logger: Nimbus.shared.logger, logLevel: Nimbus.shared.logLevel @@ -63,6 +63,12 @@ extension NimbusAPSRequestInterceptor: NimbusRequestInterceptor { /// :nodoc: public func modifyRequest(request: NimbusRequest) { + let hasNewAPSInterceptorPresent = request.interceptors?.first(where: { $0 is NimbusAPSOnRequestInterceptor }) != nil + guard !hasNewAPSInterceptorPresent else { + // Don't use old code if the new APS implementation is setup + return + } + Nimbus.shared.logger.log("Modifying NimbusRequest for APS", level: .debug) viewabilityManager.setup(for: request) @@ -102,6 +108,7 @@ extension NimbusAPSRequestInterceptor: NimbusRequestInterceptor { var resultingPayload: [[String: NimbusCodable]] = [] apsPayloads.forEach { apsPayload in Nimbus.shared.logger.log("Modifying NimbusRequest with APS payload", level: .debug) + modify(payload: &resultingPayload, with: apsPayload) } diff --git a/Sources/NimbusRequestAPSKit/Request/NimbusAPSViewabilityManager.swift b/Sources/NimbusRequestAPSKit/NimbusAPSViewabilityManager.swift similarity index 100% rename from Sources/NimbusRequestAPSKit/Request/NimbusAPSViewabilityManager.swift rename to Sources/NimbusRequestAPSKit/NimbusAPSViewabilityManager.swift diff --git a/Sources/NimbusRequestAPSKit/NimbusRequest+APS.swift b/Sources/NimbusRequestAPSKit/NimbusRequest+APS.swift new file mode 100644 index 0000000..da4382d --- /dev/null +++ b/Sources/NimbusRequestAPSKit/NimbusRequest+APS.swift @@ -0,0 +1,50 @@ +// +// NimbusRequest+APS.swift +// NimbusRequestAPSKit +// +// Created by Inder Dhir on 3/22/23. +// Copyright © 2023 Timehop. All rights reserved. +// + +import DTBiOSSDK + +public extension NimbusRequest { + + func addAPSResponse(_ response: DTBAdResponse) { + guard let targeting = response.customTargeting() else { return } + + let impressionObjectExists = impressions[safe: 0] != nil + guard impressionObjectExists else { + Nimbus.shared.logger.log("Unable to add APS response payload, request is malformed", level: .error) + + return + } + + if impressions[0].extensions == nil { + impressions[0].extensions = [:] + } + + if impressions[0].extensions?["aps"] == nil { + impressions[0].extensions?["aps"] = NimbusCodable([targeting]) + } else if let originalAPSArray = + impressions[0].extensions?["aps"]?.value as? [[String: String]] { + var modifiedAPSArray = originalAPSArray + modifiedAPSArray.append(targeting) + impressions[0].extensions?["aps"] = NimbusCodable(modifiedAPSArray) + } + } + + func addAPSLoader(_ loader: DTBAdLoader) { + if let existingInterceptor = + interceptors?.first(where: {$0 is NimbusAPSOnRequestInterceptor }) as? NimbusAPSOnRequestInterceptor { + existingInterceptor.appendLoader(loader) + } else { + let apsInterceptor = NimbusAPSOnRequestInterceptor(adLoaders: [loader]) + if interceptors == nil { + interceptors = [apsInterceptor] + } else { + interceptors?.append(apsInterceptor) + } + } + } +} diff --git a/Sources/NimbusRequestAPSKit/Request/NimbusAPSOnRequestInterceptor.swift b/Sources/NimbusRequestAPSKit/Request/NimbusAPSOnRequestInterceptor.swift new file mode 100644 index 0000000..94f6905 --- /dev/null +++ b/Sources/NimbusRequestAPSKit/Request/NimbusAPSOnRequestInterceptor.swift @@ -0,0 +1,83 @@ +// +// NimbusAPSOnRequestInterceptor.swift +// NimbusRequestAPSKit +// +// Created by Inder Dhir on 3/22/23. +// Copyright © 2023 Timehop. All rights reserved. +// + +import DTBiOSSDK + +final class NimbusAPSOnRequestInterceptor { + weak var currentRequestInFlight: NimbusRequest? + var shouldModifyRequest = false + var adLoaders: [DTBAdLoader] + var requestManager: APSRequestManagerType + private let viewabilityManager = NimbusAPSViewabilityManager() + + init(adLoaders: [DTBAdLoader], requestManager: APSRequestManagerType? = nil) { + self.adLoaders = adLoaders + + self.requestManager = requestManager ?? NimbusAPSRequestManager() + + Nimbus.shared.logger.log("APS provider initialized", level: .info) + } + + @inlinable + func appendLoader(_ loader: DTBAdLoader) { + adLoaders.append(loader) + shouldModifyRequest = false + } + + private func clearAPSParamsAndRequest() { + guard let currentRequestInFlight else { return } + + if currentRequestInFlight.impressions.count > 0 { + currentRequestInFlight.impressions[0].extensions?["aps"] = nil + } + self.currentRequestInFlight = nil + } +} + +// MARK: NimbusRequestInterceptor + +extension NimbusAPSOnRequestInterceptor: NimbusRequestInterceptor { + func modifyRequest(request: NimbusRequestKit.NimbusRequest) { + guard shouldModifyRequest else { + Nimbus.shared.logger.log("Skipping initial request modification for APS", level: .debug) + + currentRequestInFlight = request + shouldModifyRequest = true + return + } + + Nimbus.shared.logger.log("Modifying NimbusRequest for APS", level: .debug) + + currentRequestInFlight = request + + let (adLoaders, apsResponses) = requestManager.loadAdsSync(with: adLoaders) + guard apsResponses.count > 0 else { + Nimbus.shared.logger.log("No APS ad payload to inject into the NimbusRequest", level: .debug) + + return + } + + Nimbus.shared.logger.log("Refreshing ad loaders from APS responses", level: .debug) + self.adLoaders = adLoaders + + Nimbus.shared.logger.log("Modifying NimbusRequest with APS payload", level: .debug) + apsResponses.forEach { request.addAPSResponse($0) } + } + + func didCompleteNimbusRequest(with ad: NimbusCoreKit.NimbusAd) { + Nimbus.shared.logger.log("Completed NimbusRequest for APS", level: .debug) + + clearAPSParamsAndRequest() + } + + func didFailNimbusRequest(with error: NimbusCoreKit.NimbusError) { + Nimbus.shared.logger.log("Failed NimbusRequest for APS", level: .error) + + clearAPSParamsAndRequest() + } +} diff --git a/Sources/NimbusRequestAPSKit/Request/NimbusAPSRequestManager.swift b/Sources/NimbusRequestAPSKit/Request/NimbusAPSRequestManager.swift index 57a4b21..1195e63 100644 --- a/Sources/NimbusRequestAPSKit/Request/NimbusAPSRequestManager.swift +++ b/Sources/NimbusRequestAPSKit/Request/NimbusAPSRequestManager.swift @@ -2,94 +2,71 @@ // NimbusAPSRequestManager.swift // NimbusRequestAPSKit // -// Created by Inder Dhir on 7/14/22. -// Copyright © 2022 Timehop. All rights reserved. +// Created by Inder Dhir on 3/22/23. +// Copyright © 2023 Timehop. All rights reserved. // -import DTBiOSSDK +import Foundation @_exported import NimbusRequestKit +import DTBiOSSDK public protocol APSRequestManagerType { - var usPrivacyString: String? { get set } - func loadAdsSync(for adSizes: [DTBAdSize]) -> [[AnyHashable: Any]] + func loadAdsSync(with loaders: [DTBAdLoader]) -> ([DTBAdLoader], [DTBAdResponse]) } - final class NimbusAPSRequestManager: APSRequestManagerType { private let requestsDispatchGroup = DispatchGroup() - private let requestsTimeoutInSeconds: Double + private let requestsTimeoutInSeconds: Double = 0.5 private let logger: Logger private let logLevel: NimbusLogLevel - private var adLoadersDict: [String: DTBAdLoader] = [:] - var usPrivacyString: String? - init( - appKey: String, - logger: Logger, - logLevel: NimbusLogLevel, - timeoutInSeconds: Double = 0.5, - enableTestMode: Bool = false + logger: Logger = Nimbus.shared.logger, + logLevel: NimbusLogLevel = Nimbus.shared.logLevel ) { self.logger = logger self.logLevel = logLevel - self.requestsTimeoutInSeconds = timeoutInSeconds - - DTBAds.sharedInstance().setAppKey(appKey) - DTBAds.sharedInstance().mraidPolicy = CUSTOM_MRAID - DTBAds.sharedInstance().mraidCustomVersions = ["1.0", "2.0", "3.0"] - DTBAds.sharedInstance().setLogLevel(logLevel.apsLogLevel) - DTBAds.sharedInstance().testMode = enableTestMode } - func loadAdsSync(for adSizes: [DTBAdSize]) -> [[AnyHashable: Any]] { - var callbacks: [DTBCallback] = [] - adSizes.forEach { adSize in - let adLoader = reuseOrCreateAdLoader(for: adSize) - + func loadAdsSync(with loaders: [DTBAdLoader]) -> ([DTBAdLoader], [DTBAdResponse]) { + var callbacks: [DTBLoadingCallback] = [] + + loaders.forEach { loader in requestsDispatchGroup.enter() - let callback = DTBCallback(loaders: adLoadersDict, requestsDispatchGroup: requestsDispatchGroup) + + let callback = DTBLoadingCallback( + loader: loader, + requestsDispatchGroup: requestsDispatchGroup + ) callbacks.append(callback) - adLoader.loadAd(callback) + loader.loadAd(callback) } let result = requestsDispatchGroup.wait(timeout: .now() + requestsTimeoutInSeconds) switch result { case .success: - logger.log("APS requests completed successfully", level: logLevel) + logger.log("APS requests completed successfully", level: .debug) case .timedOut: - logger.log("APS requests timed out", level: logLevel) + logger.log("APS requests timed out", level: .debug) } - return callbacks.compactMap { $0.payload } - } - - private func reuseOrCreateAdLoader(for adSize: DTBAdSize) -> DTBAdLoader { - if let existingAdLoader = adLoadersDict.removeValue(forKey: adSize.slotUUID) { - return existingAdLoader - } - - let adLoader = DTBAdLoader() - adLoader.setAdSizes([adSize as Any]) - if let usPrivacyString { - adLoader.putCustomTarget(usPrivacyString, withKey: "us_privacy") - } - - return adLoader + let adLoaders = callbacks.compactMap { $0.loader } + let successfulResponses = callbacks.compactMap { $0.response } + return (adLoaders, successfulResponses) } } // MARK: DTBAdCallback /// :nodoc: -final class DTBCallback: DTBAdCallback { +final class DTBLoadingCallback: DTBAdCallback { private let requestsDispatchGroup: DispatchGroup - private var adLoadersDict: [String: DTBAdLoader] - var payload: [AnyHashable: Any]? + var loader: DTBAdLoader + var response: DTBAdResponse? - init(loaders: [String: DTBAdLoader], requestsDispatchGroup: DispatchGroup) { - self.adLoadersDict = loaders + init(loader: DTBAdLoader, requestsDispatchGroup: DispatchGroup) { + self.loader = loader self.requestsDispatchGroup = requestsDispatchGroup } @@ -103,8 +80,12 @@ final class DTBCallback: DTBAdCallback { /// :nodoc: public func onSuccess(_ adResponse: DTBAdResponse!) { Nimbus.shared.logger.log("APS ad fetching succeeded", level: .debug) - adLoadersDict[adResponse.adSize().slotUUID] = adResponse.dtbAdLoader - payload = adResponse.customTargeting() + + if let adloader = adResponse.dtbAdLoader { + loader = adloader + } + response = adResponse + requestsDispatchGroup.leave() } } diff --git a/Sources/NimbusRequestAPSKit/Resources/NimbusRequestAPSKit.h b/Sources/NimbusRequestAPSKit/Resources/NimbusRequestAPSKit.h new file mode 100644 index 0000000..15bb64a --- /dev/null +++ b/Sources/NimbusRequestAPSKit/Resources/NimbusRequestAPSKit.h @@ -0,0 +1,17 @@ +// +// NimbusRequestingAPS.h +// NimbusRequestingAPS +// +// Created by Inder Dhir on 10/4/19. +// Copyright © 2019 Timehop. All rights reserved. +// + +#import +#import +#import + +//! Project version number for NimbusRequestingAPS. +FOUNDATION_EXPORT double NimbusRequestAPSKitVersionNumber; + +//! Project version string for NimbusRequestingAPS. +FOUNDATION_EXPORT const unsigned char NimbusRequestAPSKitVersionString[]; diff --git a/Sources/NimbusFANKit/Helpers/NimbusLogLevel+FBAdLogLevel.swift b/Sources/NimbusRequestFANKit/Helpers/NimbusLogLevel+FBAdLogLevel.swift similarity index 93% rename from Sources/NimbusFANKit/Helpers/NimbusLogLevel+FBAdLogLevel.swift rename to Sources/NimbusRequestFANKit/Helpers/NimbusLogLevel+FBAdLogLevel.swift index 642e89d..d1753b2 100644 --- a/Sources/NimbusFANKit/Helpers/NimbusLogLevel+FBAdLogLevel.swift +++ b/Sources/NimbusRequestFANKit/Helpers/NimbusLogLevel+FBAdLogLevel.swift @@ -6,7 +6,7 @@ // Copyright © 2020 Timehop. All rights reserved. // -import NimbusRequestKit +@_exported import NimbusRequestKit import FBAudienceNetwork public extension NimbusLogLevel { diff --git a/Sources/NimbusFANKit/NimbusFANRequestInterceptor.swift b/Sources/NimbusRequestFANKit/NimbusFANRequestInterceptor.swift similarity index 97% rename from Sources/NimbusFANKit/NimbusFANRequestInterceptor.swift rename to Sources/NimbusRequestFANKit/NimbusFANRequestInterceptor.swift index 0d54069..a9c5e61 100644 --- a/Sources/NimbusFANKit/NimbusFANRequestInterceptor.swift +++ b/Sources/NimbusRequestFANKit/NimbusFANRequestInterceptor.swift @@ -6,8 +6,8 @@ // Copyright © 2019 Timehop. All rights reserved. // -import FBAudienceNetwork @_exported import NimbusRequestKit +import FBAudienceNetwork /// Enables FAN demand for NimbusRequest /// Add an instance of this to `NimbusAdManager.requestInterceptors` @@ -80,7 +80,7 @@ public final class NimbusFANRequestInterceptor: NimbusRequestInterceptor { if request.user?.extensions == nil { request.user?.extensions = [:] } - request.user?.extensions = ["facebook_buyeruid": NimbusCodable(bidderToken)] + request.user?.extensions?["facebook_buyeruid"] = NimbusCodable(bidderToken) } /// :nodoc: diff --git a/Sources/NimbusRequestKit/Export.swift b/Sources/NimbusRequestKit/Export.swift new file mode 100644 index 0000000..39724c2 --- /dev/null +++ b/Sources/NimbusRequestKit/Export.swift @@ -0,0 +1,7 @@ +// +// Export.swift +// +// DO NOT REMOVE THIS FILE, it is used with Swift Packager Manager to fix Dependency Resolution +// +// Created by Jason Sznol on 3/14/23. +// diff --git a/Sources/NimbusRequestTarget/Placeholder.swift b/Sources/NimbusRequestTarget/Placeholder.swift deleted file mode 100644 index 8b13789..0000000 --- a/Sources/NimbusRequestTarget/Placeholder.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Sources/NimbusTarget/Placeholder.swift b/Sources/NimbusTarget/Placeholder.swift deleted file mode 100644 index 8b13789..0000000 --- a/Sources/NimbusTarget/Placeholder.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Tests/NimbusFANKitTests/Helpers/Data+Extensions.swift b/Tests/NimbusFANKitTests/Helpers/Data+Extensions.swift deleted file mode 100644 index f738a22..0000000 --- a/Tests/NimbusFANKitTests/Helpers/Data+Extensions.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// Data+Extensions.swift -// NimbusRequestingFANTests -// -// Created by Inder Dhir on 5/24/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import Foundation - -extension Data { - func dict() throws -> [String: Any] { - let dict = try JSONSerialization.jsonObject(with: self) as! [String: Any] - return modify(dict) - } - - private func modify(_ dict: [String: Any]) -> [String: Any] { - var modifiedDict: [String: Any] = [:] - for key in dict.keys { - if let value = dict[key] as? [[String: Any]] { - modifiedDict[key] = value.map { modify($0 )} - } else if let value = dict[key] as? [String: Any] { - modifiedDict[key] = modify(value) - } else if let value = dict[key] as? String { - modifiedDict[key] = value - } else if let value = dict[key] as? [String] { - modifiedDict[key] = value - } else if let value = dict[key] as? Int { - modifiedDict[key] = value - } else if let value = dict[key] as? [Int] { - modifiedDict[key] = value - } else if let value = dict[key] as? Float { - modifiedDict[key] = value - } else if let value = dict[key] as? [Float] { - modifiedDict[key] = value - } - } - return modifiedDict - } -} diff --git a/Tests/NimbusFANKitTests/Helpers/Dictionary+Extensions.swift b/Tests/NimbusFANKitTests/Helpers/Dictionary+Extensions.swift deleted file mode 100644 index e2b966d..0000000 --- a/Tests/NimbusFANKitTests/Helpers/Dictionary+Extensions.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// Dictionary+Extensions.swift -// NimbusRequestingFANTests -// -// Created by Inder Dhir on 5/24/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import NimbusRequestKit - -extension Dictionary where Value: Any { - func isEqual(to otherDict: [Key: Any]) -> Bool { - guard count == otherDict.count else { - return false - } - - for (k1, v1) in self { - guard let v2 = otherDict[k1] else { - return false - } - - switch (v1, v2) { - case (let v1 as String, let v2 as String): - if v1 != v2 { - return false - - } - case (let v1 as [String], let v2 as [String]): - if v1.sorted() != v2.sorted() { - return false - } - case (let v1 as Int, let v2 as Int): if v1 != v2 { - return false - } - case (let v1 as [Int], let v2 as [Int]): if v1.sorted() != v2.sorted() { - return false - } - case (let v1 as Float, let v2 as Float): - if !v1.isEqual(to: v2) { - return false - } - case (let v1 as [Key: Any], let v2 as [Key: Any]): - if !v1.isEqual(to: v2) { - return false - } - case (let v1 as [[Key: Any]], let v2 as [[Key: Any]]): - guard v1.count == v2.count else { - return false - } - for dict1 in v1 { - guard v2.contains(where: { $0.isEqual(to: dict1) }) else { - return false - } - } - default: - return false - } - } - return true - } -} diff --git a/Tests/NimbusFANKitTests/Helpers/JSONEncoder+Dict.swift b/Tests/NimbusFANKitTests/Helpers/JSONEncoder+Dict.swift deleted file mode 100644 index baba5d4..0000000 --- a/Tests/NimbusFANKitTests/Helpers/JSONEncoder+Dict.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// JSONEncoder+Dict.swift -// NimbusRequestingFANTests -// -// Created by Inder Dhir on 11/5/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import XCTest - -extension Encodable { - - func jsonDict() -> [String: Any] { - do { - let data = try JSONEncoder().encode(self) - return try data.dict() - } catch { - return [:] - } - } -} diff --git a/Tests/NimbusFANKitTests/NimbusFANRequestInterceptorTests.swift b/Tests/NimbusFANKitTests/NimbusFANRequestInterceptorTests.swift deleted file mode 100644 index 090e154..0000000 --- a/Tests/NimbusFANKitTests/NimbusFANRequestInterceptorTests.swift +++ /dev/null @@ -1,275 +0,0 @@ -// -// NimbusFANRequestInterceptorTests.swift -// NimbusRequestingFANTests -// -// Created by Inder Dhir on 10/4/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -@testable import NimbusFANKit -import XCTest - -final class NimbusFANRequestInterceptorTests: XCTestCase { - - let deviceWidth = Int(UIScreen.main.bounds.width) - let deviceHeight = Int(UIScreen.main.bounds.height) - - override func setUp() { - super.setUp() - Nimbus.shared.testMode = false - } - - func test_facebook_request_withoutUserPresent() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let requestInterceptor = NimbusFANRequestInterceptor(appId: "appId", bidderToken: "bidderToken") - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position", - "facebook_app_id": "appId" - ] - ] - ], - "user": [ - "ext": [ - "facebook_buyeruid": "bidderToken" - ] - ] - ] - - let jsonDict = request.jsonDict() - XCTAssertTrue(jsonDict.isEqual(to: expectedJsonDict)) - } - - func test_facebook_request_withUserPresent() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - request.user = NimbusUser(age: 24) - - let requestInterceptor = NimbusFANRequestInterceptor(appId: "appId", bidderToken: "bidderToken") - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position", - "facebook_app_id": "appId" - ] - ] - ], - "user": [ - "age": 24, - "ext": [ - "facebook_buyeruid": "bidderToken" - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_facebook_request_testAd_withTestMode() { - Nimbus.shared.testMode = true - - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let requestInterceptor = NimbusFANRequestInterceptor( - appId: "appId", - bidderToken: "bidderToken" - ) - requestInterceptor.forceTestAd = true - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position", - "facebook_app_id": "appId", - "facebook_test_ad_type": "IMG_16_9_LINK" - ] - ] - ], - "user": [ - "ext": [ - "facebook_buyeruid": "bidderToken" - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_facebook_request_testAd_withoutTestMode() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let requestInterceptor = NimbusFANRequestInterceptor( - appId: "appId", - bidderToken: "bidderToken" - ) - requestInterceptor.forceTestAd = true - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position", - "facebook_app_id": "appId" - ] - ] - ], - "user": [ - "ext": [ - "facebook_buyeruid": "bidderToken" - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } -} diff --git a/Tests/NimbusFANKitTests/NimbusRenderFANKitTests.swift b/Tests/NimbusFANKitTests/NimbusRenderFANKitTests.swift deleted file mode 100644 index 9d9d75d..0000000 --- a/Tests/NimbusFANKitTests/NimbusRenderFANKitTests.swift +++ /dev/null @@ -1,346 +0,0 @@ -// -// NimbusRenderFANKitTests.swift -// NimbusRenderFANKitTests -// -// Created by Inder Dhir on 2/3/20. -// Copyright © 2020 Timehop. All rights reserved. -// - -@testable import NimbusFANKit -import XCTest - -class NimbusRenderFANKitTests: XCTestCase { - - func testEmptyMarkup_native_disabledTestMode() { - Nimbus.shared.testMode = false - - let ad = createNimbusAd( - auctionType: .native, - markup: "", - isInterstitial: false, - isMraid: false - ) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let delegate = MockAdControllerDelegate() - - let _ = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: delegate, - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertEqual(delegate.errors.count, 1) - XCTAssertEqual( - delegate.errors.first?.localizedDescription, - NimbusRenderError.adRenderingFailed(message: "No markup present to render Facebook native ad").localizedDescription - ) - } - - func testEmptyMarkup_native_enabledTestMode() { - Nimbus.shared.testMode = true - - let ad = createNimbusAd( - auctionType: .native, - markup: "", - isInterstitial: false, - isMraid: false - ) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let delegate = MockAdControllerDelegate() - - let controller = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: delegate, - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertTrue(delegate.errors.isEmpty) - - XCTAssertNil(controller.fbAdView) - XCTAssertNil(controller.fbInterstitialAd) - XCTAssertNotNil(controller.fbNativeAd) - } - - func testEmptyMarkup_static_disabledTestMode() { - Nimbus.shared.testMode = false - - let ad = createNimbusAd( - auctionType: .static, - markup: "", - isInterstitial: false, - isMraid: false - ) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let delegate = MockAdControllerDelegate() - - let _ = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: delegate, - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertEqual(delegate.errors.count, 1) - XCTAssertEqual( - delegate.errors.first?.localizedDescription, - NimbusRenderError.adRenderingFailed(message: "No markup present to render Facebook banner ad").localizedDescription - ) - } - - func testEmptyMarkup_static_enabledTestMode() { - Nimbus.shared.testMode = true - - let ad = createNimbusAd( - auctionType: .static, - markup: "", - isInterstitial: false, - isMraid: false - ) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let delegate = MockAdControllerDelegate() - - let controller = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: delegate, - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertTrue(delegate.errors.isEmpty) - - XCTAssertNotNil(controller.fbAdView) - XCTAssertNil(controller.fbInterstitialAd) - XCTAssertNil(controller.fbNativeAd) - } - - func testEmptyMarkup_video_disabledTestMode() { - Nimbus.shared.testMode = false - - let ad = createNimbusAd( - auctionType: .video, - markup: "", - isInterstitial: true, - isMraid: false - ) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let delegate = MockAdControllerDelegate() - - let _ = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: delegate, - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertEqual(delegate.errors.count, 1) - XCTAssertEqual( - delegate.errors.first?.localizedDescription, - NimbusRenderError.adRenderingFailed(message: "No markup present to render Facebook interstitial ad").localizedDescription - ) - } - - func testEmptyMarkup_video_enabledTestMode() { - Nimbus.shared.testMode = true - - let ad = createNimbusAd( - auctionType: .video, - markup: "", - isInterstitial: true, - isMraid: false - ) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let delegate = MockAdControllerDelegate() - - let controller = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: delegate, - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertTrue(delegate.errors.isEmpty) - - XCTAssertNil(controller.fbAdView) - XCTAssertNotNil(controller.fbInterstitialAd) - XCTAssertNil(controller.fbNativeAd) - } - - func testFBPlacementId() { - Nimbus.shared.testMode = false - - let ad = createNimbusAd( - auctionType: .native, - markup: "nonEmptyMarkup", - placementId: nil, - isInterstitial: false, - isMraid: false - ) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let delegate = MockAdControllerDelegate() - - let _ = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: delegate, - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertEqual(delegate.errors.count, 1) - XCTAssertEqual( - delegate.errors.first?.localizedDescription, - NimbusRenderError.adRenderingFailed(message: "Placement id not valid for FB ad").localizedDescription - ) - } - - func testFBBannerAd() { - Nimbus.shared.testMode = false - - let ad = createNimbusAd(auctionType: .static, isInterstitial: false, isMraid: true) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let controller = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: MockAdControllerDelegate(), - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertNotNil(controller.fbAdView) - XCTAssertNil(controller.fbInterstitialAd) - XCTAssertNil(controller.fbNativeAd) - } - - func testFBInterstitialAd_static() { - Nimbus.shared.testMode = false - - let ad = createNimbusAd(auctionType: .static, isInterstitial: true, isMraid: true) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let controller = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: MockAdControllerDelegate(), - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertNil(controller.fbAdView) - XCTAssertNotNil(controller.fbInterstitialAd) - XCTAssertNil(controller.fbNativeAd) - } - - func testFBInterstitialAd_video() { - Nimbus.shared.testMode = false - - let ad = createNimbusAd(auctionType: .video, isInterstitial: true, isMraid: false) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let controller = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: MockAdControllerDelegate(), - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertNil(controller.fbAdView) - XCTAssertNotNil(controller.fbInterstitialAd) - XCTAssertNil(controller.fbNativeAd) - } - - func testFBNativeAd() { - Nimbus.shared.testMode = false - - let ad = createNimbusAd(auctionType: .native, isInterstitial: false, isMraid: false) - let viewController = UIViewController() - let view = NimbusAdView(adPresentingViewController: viewController) - - let controller = NimbusFANAdController( - ad: ad, - container: view, - logger: Nimbus.shared.logger, - delegate: MockAdControllerDelegate(), - adRendererDelegate: nil, - adPresentingViewController: viewController - ) - - XCTAssertNil(controller.fbAdView) - XCTAssertNil(controller.fbInterstitialAd) - XCTAssertNotNil(controller.fbNativeAd) - } - - private func createNimbusAd( - auctionType: NimbusAuctionType, - markup: String = "", - placementId: String? = "placementId", - isInterstitial: Bool, - isMraid: Bool - ) -> NimbusAd { - NimbusAd( - position: "position", - auctionType: auctionType, - bidRaw: 0, - bidInCents: 0, - contentType: "", - auctionId: "", - network: "facebook", - markup: markup, - isInterstitial: isInterstitial, - placementId: placementId, - duration: nil, - adDimensions: nil, - trackers: nil, - isMraid: isMraid, - extensions: nil - ) - } -} - -class MockAdControllerDelegate: AdControllerDelegate { - var errors: [NimbusError] = [] - - func didRegisterImpressionForView() {} - - func didReceiveNimbusEvent(controller: AdController, event: NimbusEvent) {} - - func didReceiveNimbusError(controller: AdController, error: NimbusError) { - errors.append(error) - } -} diff --git a/Tests/NimbusGAMKitTests/NimbusAdTargetingTests.swift b/Tests/NimbusGAMKitTests/NimbusAdTargetingTests.swift deleted file mode 100644 index c2f0d36..0000000 --- a/Tests/NimbusGAMKitTests/NimbusAdTargetingTests.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// NimbusAdTargetingTests.swift -// NimbusGAMKitTests -// -// Created by Inder Dhir on 8/12/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -@testable import NimbusGAMKit -import GoogleMobileAds -import XCTest - -class NimbusAdTargetingTests: XCTestCase { - - func test_keywordsPresent_static() { - let ad = createNimbusAd(type: .static) - let request = GAMRequest() - ad.applyDynamicPrice(into: request) - - XCTAssertEqual(request.customTargeting?["na_id"], ad.auctionId) - XCTAssertNil(request.customTargeting?["na_bid_video"]) - XCTAssertNil(request.customTargeting?["na_duration"]) - } - - func test_keywordsPresent_video() { - let ad = createNimbusAd(type: .video) - let request = GAMRequest() - - let mapping = NimbusGAMLinearPriceMapping.banner() - ad.applyDynamicPrice(into: request, mapping: mapping) - - XCTAssertEqual(request.customTargeting?["na_id"], ad.auctionId) - XCTAssertEqual(request.customTargeting?["na_bid_video"], mapping.getKeywords(ad: ad)) - XCTAssertEqual(request.customTargeting?["na_duration"], String(ad.duration ?? -1)) - } - - func test_keywordsPresent_existingKeywords() { - let ad = createNimbusAd(type: .static) - let request = GAMRequest() - request.customTargeting = [:] - request.customTargeting?["test_key"] = "test_value" - - let mapping = NimbusGAMLinearPriceMapping.banner() - ad.applyDynamicPrice(into: request, mapping: mapping) -// - XCTAssertEqual(request.customTargeting?["na_id"], ad.auctionId) - XCTAssertEqual(request.customTargeting?["na_bid"], mapping.getKeywords(ad: ad)) - XCTAssertEqual(request.customTargeting?["na_duration"], nil) - XCTAssertEqual(request.customTargeting?["test_key"], "test_value") - } - - private func createNimbusAd( - type: NimbusAuctionType = .static, - dimensPresent: Bool = true - ) -> NimbusAd { - NimbusAd( - position: "position", - auctionType: type, - bidRaw: 0, - bidInCents: 200, - contentType: "", - auctionId: "123456", - network: "network", - markup: "markup", - isInterstitial: true, - placementId: "", - duration: type == .video ? 1 : nil, - adDimensions: dimensPresent ? NimbusAdDimensions(width: 320, height: 50) : nil, - trackers: nil, - isMraid: true, - extensions: nil - ) - } -} diff --git a/Tests/NimbusGAMKitTests/NimbusGAMDynamicPriceTests.swift b/Tests/NimbusGAMKitTests/NimbusGAMDynamicPriceTests.swift deleted file mode 100644 index 850ce4f..0000000 --- a/Tests/NimbusGAMKitTests/NimbusGAMDynamicPriceTests.swift +++ /dev/null @@ -1,152 +0,0 @@ -// -// NimbusGAMDynamicPriceTests.swift -// NimbusGAMKitTests -// -// Created by Inder Dhir on 11/12/20. -// Copyright © 2020 Timehop. All rights reserved. -// - -@testable import NimbusGAMKit -import XCTest -import GoogleMobileAds - -final class NimbusGAMDynamicPriceTests: XCTestCase { - - private let bannerView = GAMBannerView(adSize: GADAdSizeBanner) - - override func setUp() { - super.setUp() - bannerView.adUnitID = "adUnitId" - } - - func test_init() { - let linearPriceGran = NimbusGAMLinearPriceGranularity(min: 10, max: 200) - XCTAssertEqual(linearPriceGran.min, 10) - XCTAssertEqual(linearPriceGran.max, 200) - XCTAssertEqual(linearPriceGran.step, 20) - } - - func test_comparable() { - var linearPriceGran1 = NimbusGAMLinearPriceGranularity(min: 10, max: 200) - var linearPriceGran2 = NimbusGAMLinearPriceGranularity(min: 20, max: 100) - XCTAssertTrue(linearPriceGran1 < linearPriceGran2) - - linearPriceGran1 = NimbusGAMLinearPriceGranularity(min: 10, max: 200) - linearPriceGran2 = NimbusGAMLinearPriceGranularity(min: 10, max: 100) - XCTAssertEqual(linearPriceGran1, linearPriceGran2) - - linearPriceGran1 = NimbusGAMLinearPriceGranularity(min: 20, max: 100, step: 10) - linearPriceGran2 = NimbusGAMLinearPriceGranularity(min: 10, max: 200, step: 20) - XCTAssertTrue(linearPriceGran1 > linearPriceGran2) - } - - func test_keywordsPresent_static() { - let linearPriceGran1 = NimbusGAMLinearPriceGranularity(min: 10, max: 200) - let linearPriceGran2 = NimbusGAMLinearPriceGranularity(min: 20, max: 100) - let mapping = NimbusGAMLinearPriceMapping( - granularities: [linearPriceGran1, linearPriceGran2] - ) - - let ad = createNimbusAd(type: .static) - let request = GAMRequest() - let dynamicPrice = NimbusGAMDynamicPrice(request: request, mapping: mapping) - - let manager = NimbusRequestManager() - manager.delegate = dynamicPrice - manager.delegate?.didCompleteNimbusRequest( - request: NimbusRequest.forInterstitialAd(position: "position1"), - ad: ad - ) - - XCTAssertEqual(request.customTargeting?["na_id"], ad.auctionId) - XCTAssertNil(request.customTargeting?["na_bid_video"]) - XCTAssertNil(request.customTargeting?["na_duration"]) - } - - func test_keywordsPresent_video() { - let linearPriceGran1 = NimbusGAMLinearPriceGranularity(min: 10, max: 200) - let linearPriceGran2 = NimbusGAMLinearPriceGranularity(min: 20, max: 100) - let mapping = NimbusGAMLinearPriceMapping( - granularities: [linearPriceGran1, linearPriceGran2] - ) - - let ad = createNimbusAd(type: .video) - let request = GAMRequest() - let dynamicPrice = NimbusGAMDynamicPrice(request: request, mapping: mapping) - - let manager = NimbusRequestManager() - manager.delegate = dynamicPrice - manager.delegate?.didCompleteNimbusRequest( - request: NimbusRequest.forInterstitialAd(position: "position1"), - ad: ad - ) - - XCTAssertEqual(request.customTargeting?["na_id"], ad.auctionId) - XCTAssertEqual(request.customTargeting?["na_bid_video"], mapping.getKeywords(ad: ad)) - XCTAssertEqual(request.customTargeting?["na_duration"], String(ad.duration ?? -1)) - } - - func test_keywordsPresent_existingKeywords() { - let linearPriceGran1 = NimbusGAMLinearPriceGranularity(min: 10, max: 200) - let linearPriceGran2 = NimbusGAMLinearPriceGranularity(min: 20, max: 100) - let mapping = NimbusGAMLinearPriceMapping( - granularities: [linearPriceGran1, linearPriceGran2] - ) - - let ad = createNimbusAd(type: .static) - let request = GAMRequest() - request.customTargeting = [:] - request.customTargeting?["test_key"] = "test_value" - let dynamicPrice = NimbusGAMDynamicPrice(request: request, mapping: mapping) - - let manager = NimbusRequestManager() - manager.delegate = dynamicPrice - manager.delegate?.didCompleteNimbusRequest( - request: NimbusRequest.forInterstitialAd(position: "position1"), - ad: ad - ) - - XCTAssertEqual(request.customTargeting?["na_id"], ad.auctionId) - XCTAssertEqual(request.customTargeting?["na_bid"], mapping.getKeywords(ad: ad)) - XCTAssertEqual(request.customTargeting?["na_duration"], nil) - XCTAssertEqual(request.customTargeting?["test_key"], "test_value") - } - - func test_keywordsAbsent() { - let mapping = NimbusGAMLinearPriceMapping(granularities: []) - let ad = createNimbusAd(type: .video) - let request = GAMRequest() - let dynamicPrice = NimbusGAMDynamicPrice(request: request, mapping: mapping) - - let manager = NimbusRequestManager() - manager.delegate = dynamicPrice - manager.delegate?.didCompleteNimbusRequest( - request: NimbusRequest.forInterstitialAd(position: "position1"), - ad: ad - ) - XCTAssertNil(request.customTargeting) - } - - private func createNimbusAd( - type: NimbusAuctionType = .static, - dimensPresent: Bool = true - ) -> NimbusAd { - NimbusAd( - position: "position", - auctionType: type, - bidRaw: 0, - bidInCents: 200, - contentType: "", - auctionId: "123456", - network: "network", - markup: "markup", - isInterstitial: true, - placementId: "", - duration: type == .video ? 1 : nil, - adDimensions: dimensPresent ? NimbusAdDimensions(width: 320, height: 50) : nil, - trackers: nil, - isMraid: true, - extensions: nil - ) - } -} diff --git a/Tests/NimbusGAMKitTests/NimbusGAMLinearPriceMappingTests.swift b/Tests/NimbusGAMKitTests/NimbusGAMLinearPriceMappingTests.swift deleted file mode 100644 index f7e374b..0000000 --- a/Tests/NimbusGAMKitTests/NimbusGAMLinearPriceMappingTests.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// NimbusGAMLinearPriceMappingTests.swift -// NimbusGAMKitTests -// -// Created by Inder Dhir on 6/15/21. -// Copyright © 2021 Timehop. All rights reserved. -// - -@testable import NimbusGAMKit -import XCTest - -final class NimbusGAMLinearPriceMappingTests: XCTestCase { - - func testBannerDefault() { - let mapping = NimbusGAMLinearPriceMapping.banner() - XCTAssertEqual(mapping.granularities.count, 4) - XCTAssertEqual( - mapping.granularities[0], - NimbusGAMLinearPriceGranularity(min: 0, max: 300, step: 1) - ) - XCTAssertEqual( - mapping.granularities[1], - NimbusGAMLinearPriceGranularity(min: 300, max: 800, step: 5) - ) - XCTAssertEqual( - mapping.granularities[2], - NimbusGAMLinearPriceGranularity(min: 800, max: 2000, step: 50) - ) - XCTAssertEqual( - mapping.granularities[3], - NimbusGAMLinearPriceGranularity(min: 2000, max: 3500, step: 100) - ) - } - - func testFullscreenDefault() { - let mapping = NimbusGAMLinearPriceMapping.fullscreen() - XCTAssertEqual(mapping.granularities.count, 2) - XCTAssertEqual( - mapping.granularities[0], - NimbusGAMLinearPriceGranularity(min: 0, max: 3500, step: 5) - ) - XCTAssertEqual( - mapping.granularities[1], - NimbusGAMLinearPriceGranularity(min: 3500, max: 6000, step: 100) - ) - } -} diff --git a/Tests/NimbusGAMKitTests/NimbusSizeToFormatMapperTests.swift b/Tests/NimbusGAMKitTests/NimbusSizeToFormatMapperTests.swift deleted file mode 100644 index 03093a3..0000000 --- a/Tests/NimbusGAMKitTests/NimbusSizeToFormatMapperTests.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// NimbusSizeToFormatMapperTests.swift -// NimbusGAMKitTests -// -// Created by Inder Dhir on 12/1/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -@testable import NimbusGAMKit -import XCTest - -final class NimbusSizeToFormatMapperTests: XCTestCase { - - var mapper: NimbusSizeToFormatMapper! - - override func setUp() { - mapper = NimbusSizeToFormatMapper() - } - - func test_casesWhereSizeUsedAsIs() { - XCTAssertEqual(mapper.map(width: 768, height: 1024), .init(width: 768, height: 1024)) - XCTAssertEqual(mapper.map(width: 1024, height: 768), .init(width: 1024, height: 768)) - XCTAssertNotEqual(mapper.map(width: 767, height: 1024), .init(width: 767, height: 1024)) - } - - func test_casesWhere320By50BannerIsUsed() { - XCTAssertEqual(mapper.map(width: 320, height: 90), .init(width: 320, height: 50)) - XCTAssertNotEqual(mapper.map(width: 728, height: 90), .init(width: 320, height: 50)) - } - - func test_casesWhere728y90BannerIsUsed() { - XCTAssertEqual(mapper.map(width: 728, height: 90), .init(width: 728, height: 90)) - XCTAssertNotEqual(mapper.map(width: 728, height: 250), .init(width: 728, height: 90)) - } - - func test_casesWhere480By320BannerIsUsed() { - XCTAssertEqual(mapper.map(width: 480, height: 320), .init(width: 480, height: 320)) - XCTAssertNotEqual(mapper.map(width: 479, height: 320), .init(width: 480, height: 320)) - XCTAssertNotEqual(mapper.map(width: 480, height: 319), .init(width: 480, height: 320)) - } - - func test_casesWhere320By480BannerIsUsed() { - XCTAssertEqual(mapper.map(width: 320, height: 480), .init(width: 320, height: 480)) - XCTAssertNotEqual(mapper.map(width: 320, height: 479), .init(width: 320, height: 480)) - XCTAssertNotEqual(mapper.map(width: 319, height: 480), .init(width: 320, height: 480)) - } - - func test_casesWhere300By600BannerIsUsed() { - XCTAssertEqual(mapper.map(width: 300, height: 600), .init(width: 300, height: 600)) - XCTAssertNotEqual(mapper.map(width: 320, height: 600), .init(width: 300, height: 600)) - XCTAssertNotEqual(mapper.map(width: 300, height: 599), .init(width: 300, height: 600)) - } - - func test_casesWhere300By250BannerIsUsed() { - XCTAssertEqual(mapper.map(width: 300, height: 250), .init(width: 300, height: 250)) - XCTAssertEqual(mapper.map(width: 320, height: 300), .init(width: 300, height: 250)) - XCTAssertEqual(mapper.map(width: 480, height: 275), .init(width: 300, height: 250)) - XCTAssertEqual(mapper.map(width: 600, height: 300), .init(width: 300, height: 250)) - } -} diff --git a/Tests/NimbusLiveRampKitTests/Helpers/Data+Extensions.swift b/Tests/NimbusLiveRampKitTests/Helpers/Data+Extensions.swift deleted file mode 100644 index b65e0ae..0000000 --- a/Tests/NimbusLiveRampKitTests/Helpers/Data+Extensions.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// Data+Extensions.swift -// NimbusLiveRampKitTests -// -// Created by Victor Takai on 01/08/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -import Foundation - -extension Data { - - func dict() throws -> [String: Any] { - let dict = try JSONSerialization.jsonObject(with: self) as! [String: Any] - return modify(dict) - } - - private func modify(_ dict: [String: Any]) -> [String: Any] { - var modifiedDict: [String: Any] = [:] - for key in dict.keys { - if let value = dict[key] as? [[String: Any]] { - modifiedDict[key] = value.map { modify($0 )} - } else if let value = dict[key] as? [String: Any] { - modifiedDict[key] = modify(value) - } else if let value = dict[key] as? String { - modifiedDict[key] = value - } else if let value = dict[key] as? [String] { - modifiedDict[key] = value - } else if let value = dict[key] as? Int { - modifiedDict[key] = value - } else if let value = dict[key] as? [Int] { - modifiedDict[key] = value - } else if let value = dict[key] as? Float { - modifiedDict[key] = value - } else if let value = dict[key] as? [Float] { - modifiedDict[key] = value - } - } - return modifiedDict - } -} diff --git a/Tests/NimbusLiveRampKitTests/Helpers/Dictionary+Extensions.swift b/Tests/NimbusLiveRampKitTests/Helpers/Dictionary+Extensions.swift deleted file mode 100644 index 2bd1613..0000000 --- a/Tests/NimbusLiveRampKitTests/Helpers/Dictionary+Extensions.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// Dictionary+Extensions.swift -// NimbusLiveRampKitTests -// -// Created by Victor Takai on 01/08/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -import Foundation -@testable import NimbusRequestKit - -extension Dictionary where Value: Any { - func isEqual(to otherDict: [Key: Any]) -> Bool { - guard count == otherDict.count else { - return false - } - - for (k1, v1) in self { - guard let v2 = otherDict[k1] else { - return false - } - - switch (v1, v2) { - case (let v1 as String, let v2 as String): - if v1 != v2 { - return false - } - case (let v1 as [String], let v2 as [String]): - if v1.sorted() != v2.sorted() { - return false - } - case (let v1 as Int, let v2 as Int): if v1 != v2 { - return false - } - case (let v1 as [Int], let v2 as [Int]): if v1.sorted() != v2.sorted() { - return false - } - case (let v1 as Float, let v2 as Float): - if !v1.isEqual(to: v2) { - return false - } - case (let v1 as [Key: Any], let v2 as [Key: Any]): - if !v1.isEqual(to: v2) { - return false - } - case (let v1 as [[Key: Any]], let v2 as [[Key: Any]]): - guard v1.count == v2.count else { - return false - - } - for dict1 in v1 { - guard v2.contains(where: { $0.isEqual(to: dict1) }) else { - return false - } - } - case (let v1 as [String: Any], let v2 as [String: Any]): - return (v1 as NSDictionary) == (v2 as NSDictionary) - default: - return false - } - } - return true - } -} diff --git a/Tests/NimbusLiveRampKitTests/Helpers/JSONEncoder+Dict.swift b/Tests/NimbusLiveRampKitTests/Helpers/JSONEncoder+Dict.swift deleted file mode 100644 index 88d7691..0000000 --- a/Tests/NimbusLiveRampKitTests/Helpers/JSONEncoder+Dict.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// JSONEncoder+Dict.swift -// NimbusLiveRampKitTests -// -// Created by Victor Takai on 01/08/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -import Foundation - -extension Encodable { - - func jsonDict() -> [String: Any] { - do { - let data = try JSONEncoder().encode(self) - return try data.dict() - } catch { - return [:] - } - } -} diff --git a/Tests/NimbusLiveRampKitTests/MockNimbusLiveRampInterceptorDelegate.swift b/Tests/NimbusLiveRampKitTests/MockNimbusLiveRampInterceptorDelegate.swift deleted file mode 100644 index 476b277..0000000 --- a/Tests/NimbusLiveRampKitTests/MockNimbusLiveRampInterceptorDelegate.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// MockNimbusLiveRampInterceptorDelegate.swift -// NimbusLiveRampKitTests -// -// Created by Victor Takai on 01/08/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -@testable import NimbusLiveRampKit - -final class MockNimbusLiveRampInterceptorDelegate: NimbusLiveRampInterceptorDelegate { - - private(set) var didTryToInitializeLiveRamp = false - private(set) var didInitializeLiveRampError: Error? - - private(set) var didTryToFetchLiveRampEnvelope = false - private(set) var didFetchLiveRampEnvelopeError: Error? - - func didInitializeLiveRamp(error: Error?) { - didTryToInitializeLiveRamp = true - didInitializeLiveRampError = error - } - - func didFetchLiveRampEnvelope(error: Error?) { - didTryToFetchLiveRampEnvelope = true - didFetchLiveRampEnvelopeError = error - } -} diff --git a/Tests/NimbusLiveRampKitTests/NimbusLiveRampKitTests.swift b/Tests/NimbusLiveRampKitTests/NimbusLiveRampKitTests.swift deleted file mode 100644 index 9aa1dab..0000000 --- a/Tests/NimbusLiveRampKitTests/NimbusLiveRampKitTests.swift +++ /dev/null @@ -1,270 +0,0 @@ -// -// NimbusLiveRampKitTests.swift -// NimbusLiveRampKitTests -// -// Created by Victor Takai on 20/07/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -@testable import NimbusLiveRampKit -import LRAtsSDK -import XCTest - -final class NimbusLiveRampKitTests: XCTestCase { - - let configId = "012345" - let email = "test@email.com" - let phoneNumber = "15005550000" - - func testInitInterceptorWithEmail() { - let delegate = MockNimbusLiveRampInterceptorDelegate() - let interceptor = NimbusLiveRampInterceptor( - configId: configId, - email: email, - isTestMode: true, - delegate: delegate - ) - - XCTAssertNotNil(interceptor.email) - XCTAssertEqual(interceptor.email!, email) - XCTAssertNil(interceptor.phoneNumber) - - XCTAssertTrue(delegate.didTryToInitializeLiveRamp) - XCTAssertNil(delegate.didInitializeLiveRampError) - - XCTAssertTrue(delegate.didTryToFetchLiveRampEnvelope) - XCTAssertNil(delegate.didFetchLiveRampEnvelopeError) - } - - func testInitInterceptorWithPhoneNumber() { - let delegate = MockNimbusLiveRampInterceptorDelegate() - let interceptor = NimbusLiveRampInterceptor( - configId: configId, - phoneNumber: phoneNumber, - isTestMode: true, - delegate: delegate - ) - - XCTAssertNotNil(interceptor.phoneNumber) - XCTAssertEqual(interceptor.phoneNumber!, phoneNumber) - XCTAssertNil(interceptor.email) - - XCTAssertTrue(delegate.didTryToInitializeLiveRamp) - XCTAssertNil(delegate.didInitializeLiveRampError) - - XCTAssertTrue(delegate.didTryToFetchLiveRampEnvelope) - XCTAssertNil(delegate.didFetchLiveRampEnvelopeError) - } - - func testHasConsentForNoLegislation() { - XCTAssertEqual(LRAts.shared.hasConsentForNoLegislation, false) - - let _ = NimbusLiveRampInterceptor( - configId: configId, - email: email, - hasConsentForNoLegislation: true, - isTestMode: true - ) - - XCTAssertEqual(LRAts.shared.hasConsentForNoLegislation, true) - } - - func testModifyRequestWithNoExtensions() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.user = NimbusUser() - - XCTAssertNil(request.user?.extensions) - - let interceptor = NimbusLiveRampInterceptor( - configId: configId, - phoneNumber: phoneNumber, - isTestMode: true - ) - interceptor.liveRampEnvelope = "envelope" - interceptor.modifyRequest(request: request) - - NimbusRequestModifier().insertExtendedIds(for: request, globalIds: nil) - - guard let extensionsJsonDict = request.user?.extensions?.jsonDict() else { - XCTFail("Could not find extensions for request") - return - } - - let expectedJsonDict = [ - "eids": [[ - "source": "liveramp.com", - "uids": [ - [ - "id": "envelope", - "ext": [ - "rtiPartner": "idl" - ] - ] - ] - ]] - ] - - XCTAssertTrue(extensionsJsonDict.isEqual(to: expectedJsonDict)) - } - - func testModifyRequestWithExistingLiveRampDataInExtensions() { - let request = NimbusRequest.forInterstitialAd(position: "position") - - var originalLiveRampExtendedId = NimbusExtendedId(source: "liveramp.com", id: "id1") - originalLiveRampExtendedId.extensions = ["rtiPartner": "idl"] - request.addExtendedId(originalLiveRampExtendedId) - - let interceptor = NimbusLiveRampInterceptor( - configId: configId, - phoneNumber: phoneNumber, - isTestMode: true - ) - interceptor.liveRampEnvelope = "envelope" - interceptor.modifyRequest(request: request) - - NimbusRequestModifier().insertExtendedIds(for: request, globalIds: nil) - - guard let extensionsJsonDict = request.user?.extensions?.jsonDict() else { - XCTFail("Could not find extensions for request") - return - } - - let expectedJsonDict = [ - "eids": [ - [ - "source": "liveramp.com", - "uids": [ - [ - "id": "id1", - "ext": [ - "rtiPartner": "idl" - ] - ] - ] - ] - ] - ] - - XCTAssertTrue(extensionsJsonDict.isEqual(to: expectedJsonDict)) - } - - func testModifyRequestWithNoLiveRampDataInExtensions() { - let request = NimbusRequest.forInterstitialAd(position: "position") - - request.addExtendedId(NimbusExtendedId(source: "source", id: "extra1.eid")) - - let interceptor = NimbusLiveRampInterceptor( - configId: configId, - phoneNumber: phoneNumber, - isTestMode: true - ) - interceptor.liveRampEnvelope = "envelope" - interceptor.modifyRequest(request: request) - - NimbusRequestModifier().insertExtendedIds(for: request, globalIds: nil) - - guard let extensionsJsonDict = request.user?.extensions?.jsonDict() else { - XCTFail("Could not find extensions for request") - return - } - - let expectedJsonDict = [ - "eids": [ - [ - "source": "source", - "uids": [ - [ - "id": "extra1.eid" - ] - ] - ], - [ - "source": "liveramp.com", - "uids": [ - [ - "id": "envelope", - "ext": [ - "rtiPartner": "idl" - ] - ] - ] - ] - ] - ] - - XCTAssertTrue(extensionsJsonDict.isEqual(to: expectedJsonDict)) - } - - func testModifyRequestWithNoUserPresent() { - let request = NimbusRequest.forInterstitialAd(position: "position") - - let interceptor = NimbusLiveRampInterceptor( - configId: configId, - phoneNumber: phoneNumber, - isTestMode: true - ) - interceptor.liveRampEnvelope = "envelope" - interceptor.modifyRequest(request: request) - - NimbusRequestModifier().insertExtendedIds(for: request, globalIds: nil) - - guard let extensionsJsonDict = request.user?.extensions?.jsonDict() else { - XCTFail("Could not find extensions for request") - return - } - - let expectedJsonDict = [ - "eids": [ - [ - "source": "liveramp.com", - "uids": [ - [ - "id": "envelope", - "ext": [ - "rtiPartner": "idl" - ] - ] - ] - ] - ] - ] - - XCTAssertTrue(extensionsJsonDict.isEqual(to: expectedJsonDict)) - } - - func testModifyRequestWithNoUserExtensionsPresent() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.user = .init() - - let interceptor = NimbusLiveRampInterceptor( - configId: configId, - phoneNumber: phoneNumber, - isTestMode: true - ) - interceptor.liveRampEnvelope = "envelope" - interceptor.modifyRequest(request: request) - - NimbusRequestModifier().insertExtendedIds(for: request, globalIds: nil) - - guard let extensionsJsonDict = request.user?.extensions?.jsonDict() else { - XCTFail("Could not find extensions for request") - return - } - - let expectedJsonDict = [ - "eids": [[ - "source": "liveramp.com", - "uids": [ - [ - "id": "envelope", - "ext": [ - "rtiPartner": "idl" - ] - ] - ] - ]] - ] - - XCTAssertTrue(extensionsJsonDict.isEqual(to: expectedJsonDict)) - } -} diff --git a/Tests/NimbusRequestAPSKitTests/Helpers/Data+Extensions.swift b/Tests/NimbusRequestAPSKitTests/Helpers/Data+Extensions.swift deleted file mode 100644 index 5ec84d9..0000000 --- a/Tests/NimbusRequestAPSKitTests/Helpers/Data+Extensions.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// Data+Extensions.swift -// NimbusRequestingAPSTests -// -// Created by Inder Dhir on 11/5/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import Foundation - -extension Data { - func dict() throws -> [String: Any] { - let dict = try JSONSerialization.jsonObject(with: self) as! [String: Any] - return modify(dict) - } - - private func modify(_ dict: [String: Any]) -> [String: Any] { - var modifiedDict: [String: Any] = [:] - for key in dict.keys { - if let value = dict[key] as? [[String: Any]] { - modifiedDict[key] = value.map { modify($0 )} - } else if let value = dict[key] as? [String: Any] { - modifiedDict[key] = modify(value) - } else if let value = dict[key] as? String { - modifiedDict[key] = value - } else if let value = dict[key] as? [String] { - modifiedDict[key] = value - } else if let value = dict[key] as? Int { - modifiedDict[key] = value - } else if let value = dict[key] as? [Int] { - modifiedDict[key] = value - } else if let value = dict[key] as? Float { - modifiedDict[key] = value - } else if let value = dict[key] as? [Float] { - modifiedDict[key] = value - } - } - return modifiedDict - } -} diff --git a/Tests/NimbusRequestAPSKitTests/Helpers/Dictionary+Extensions.swift b/Tests/NimbusRequestAPSKitTests/Helpers/Dictionary+Extensions.swift deleted file mode 100644 index 47641d2..0000000 --- a/Tests/NimbusRequestAPSKitTests/Helpers/Dictionary+Extensions.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// Dictionary+Extensions.swift -// NimbusRequestingAPSTests -// -// Created by Inder Dhir on 11/5/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import NimbusRequestKit - -extension Dictionary where Value: Any { - func isEqual(to otherDict: [Key: Any]) -> Bool { - guard count == otherDict.count else { - return false - } - - for (k1, v1) in self { - guard let v2 = otherDict[k1] else { - return false - } - - switch (v1, v2) { - case (let v1 as String, let v2 as String): - if v1 != v2 { - return false - } - case (let v1 as [String], let v2 as [String]): - if v1.sorted() != v2.sorted() { - return false - } - case (let v1 as Int, let v2 as Int): if v1 != v2 { - return false - } - case (let v1 as [Int], let v2 as [Int]): if v1.sorted() != v2.sorted() { - return false - } - case (let v1 as Float, let v2 as Float): - if !v1.isEqual(to: v2) { - return false - } - case (let v1 as [Key: Any], let v2 as [Key: Any]): - if !v1.isEqual(to: v2) { - return false - } - case (let v1 as [[Key: Any]], let v2 as [[Key: Any]]): - guard v1.count == v2.count else { - return false - - } - for dict1 in v1 { - guard v2.contains(where: { $0.isEqual(to: dict1) }) else { - return false - } - } - default: - return false - } - } - return true - } -} diff --git a/Tests/NimbusRequestAPSKitTests/Helpers/JSONEncoder+Dict.swift b/Tests/NimbusRequestAPSKitTests/Helpers/JSONEncoder+Dict.swift deleted file mode 100644 index 875bc51..0000000 --- a/Tests/NimbusRequestAPSKitTests/Helpers/JSONEncoder+Dict.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// JSONEncoder+Dict.swift -// NimbusRequestingAPSTests -// -// Created by Inder Dhir on 11/5/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import XCTest - -extension Encodable { - - func jsonDict() -> [String: Any] { - do { - let data = try JSONEncoder().encode(self) - return try data.dict() - } catch { - return [:] - } - } -} diff --git a/Tests/NimbusRequestAPSKitTests/Helpers/NimbusAPSRequestHelperTests.swift b/Tests/NimbusRequestAPSKitTests/Helpers/NimbusAPSRequestHelperTests.swift deleted file mode 100644 index 573e241..0000000 --- a/Tests/NimbusRequestAPSKitTests/Helpers/NimbusAPSRequestHelperTests.swift +++ /dev/null @@ -1,112 +0,0 @@ -// -// NimbusAPSRequestHelperTests.swift -// NimbusRequestAPSKitTests -// -// Created by Inder Dhir on 9/5/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -@testable import NimbusRequestAPSKit -import DTBiOSSDK -import XCTest - -class NimbusAPSRequestHelperTests: XCTestCase { - - var requestHelper: NimbusAPSRequestHelper! - fileprivate var requestManager: MockNimbusAPSRequestManager! - - override func setUpWithError() throws { - requestManager = MockNimbusAPSRequestManager() - requestHelper = NimbusAPSRequestHelper( - appKey: "appKey", - requestManager: requestManager, - timeoutInSeconds: 0.5 - ) - } - - func test_APSAdSlot_video() throws { - XCTAssertTrue(requestHelper.adSizes.isEmpty) - - requestHelper.addAPSSlot(slotUUID: "slotUUID", width: 320, height: 480, isVideo: true) - - XCTAssertFalse(requestHelper.adSizes.isEmpty) - XCTAssertEqual(requestHelper.adSizes.first?.adType.rawValue, 0) - } - - func test_APSAdSlot_staticInterstitial_portrait() { - XCTAssertTrue(requestHelper.adSizes.isEmpty) - - requestHelper.addAPSSlot(slotUUID: "slotUUID", width: 320, height: 480, isVideo: false) - - XCTAssertFalse(requestHelper.adSizes.isEmpty) - XCTAssertEqual(requestHelper.adSizes.first?.adType.rawValue, 2) - } - - func test_APSAdSlot_staticInterstitial_landscape() { - XCTAssertTrue(requestHelper.adSizes.isEmpty) - - requestHelper.addAPSSlot(slotUUID: "slotUUID", width: 480, height: 320, isVideo: false) - - XCTAssertFalse(requestHelper.adSizes.isEmpty) - XCTAssertEqual(requestHelper.adSizes.first?.adType.rawValue, 2) - } - - func testFetchParams_withVideoPresent_excludeVideo() { - requestHelper.addAPSSlot(slotUUID: "slotUUID", width: 320, height: 480, isVideo: true) - _ = requestHelper.fetchAPSParams(width: 320, height: 480, includeVideo: false) - - XCTAssertTrue(requestManager.adSizes.isEmpty) - } - - func testFetchParams_withVideoPresent_includeVideo() { - requestHelper.addAPSSlot(slotUUID: "slotUUID", width: 320, height: 480, isVideo: true) - _ = requestHelper.fetchAPSParams(width: 320, height: 480, includeVideo: true) - - XCTAssertFalse(requestManager.adSizes.isEmpty) - } - - func testFetchParams_withVideoAndInterstitials() { - requestHelper.addAPSSlot(slotUUID: "slotUUID", width: 320, height: 480, isVideo: true) - requestHelper.addAPSSlot(slotUUID: "slotUUID2", width: 320, height: 480, isVideo: false) - requestHelper.addAPSSlot(slotUUID: "slotUUID3", width: 480, height: 320, isVideo: false) - - _ = requestHelper.fetchAPSParams(width: 320, height: 480, includeVideo: true) - - XCTAssertEqual(requestManager.adSizes.count, 3) - } - - func testFetchParams_forBanner_withVideoAndInterstitial_withOtherValidAndInvalidSizes() { - requestHelper.addAPSSlot(slotUUID: "slotUUID", width: 320, height: 480, isVideo: true) - requestHelper.addAPSSlot(slotUUID: "slotUUID2", width: 320, height: 480, isVideo: false) - - requestHelper.addAPSSlot(slotUUID: "slotUUID3", width: 300, height: 50, isVideo: false) - requestHelper.addAPSSlot(slotUUID: "slotUUID4", width: 300, height: 250, isVideo: false) - - _ = requestHelper.fetchAPSParams(width: 300, height: 50, includeVideo: true) - - XCTAssertEqual(requestManager.adSizes.count, 2) - } - - func testFetchParams_forInterstitial_withVideoAndInterstitial_withOtherValidAndInvalidSizes() { - requestHelper.addAPSSlot(slotUUID: "slotUUID", width: 320, height: 480, isVideo: true) - requestHelper.addAPSSlot(slotUUID: "slotUUID2", width: 320, height: 480, isVideo: false) - - requestHelper.addAPSSlot(slotUUID: "slotUUID3", width: 300, height: 50, isVideo: false) - requestHelper.addAPSSlot(slotUUID: "slotUUID4", width: 300, height: 250, isVideo: false) - - _ = requestHelper.fetchAPSParams(width: 320, height: 480, includeVideo: true) - - XCTAssertEqual(requestManager.adSizes.count, 2) - } -} - -private class MockNimbusAPSRequestManager: APSRequestManagerType { - var usPrivacyString: String? = "test" - - var adSizes: [DTBAdSize] = [] - - func loadAdsSync(for adSizes: [DTBAdSize]) -> [[AnyHashable: Any]] { - self.adSizes = adSizes - return [] - } -} diff --git a/Tests/NimbusRequestAPSKitTests/MockAPSRequestManager.swift b/Tests/NimbusRequestAPSKitTests/MockAPSRequestManager.swift deleted file mode 100644 index d742937..0000000 --- a/Tests/NimbusRequestAPSKitTests/MockAPSRequestManager.swift +++ /dev/null @@ -1,65 +0,0 @@ -// -// MockAPSRequestManager.swift -// NimbusRequestAPSKitTests -// -// Created by Inder Dhir on 7/18/22. -// Copyright © 2022 Timehop. All rights reserved. -// - -@testable import NimbusRequestAPSKit -import DTBiOSSDK - -final class MockAPSRequestManager: APSRequestManagerType { - - var usPrivacyString: String? = nil - let mockResponse: [AnyHashable: Any] = [ - "amzn_h": ["test-nimbus-url.com"], - "amznslots": ["slotdimens"], - "amznrdr": ["default"], - "amznp": ["blala"], - "amzn_b": ["blalbal"], - "dc": ["iad"] - ] - - init(sizes: [DTBAdSize]) {} - - func loadAdsSync(for adSizes: [DTBAdSize]) -> [[AnyHashable: Any]] { - if adSizes.isEmpty { return [] } - - return [ - mockResponse - ] - } -} - -final class MockAPSRequestManagerMultipleSizes: APSRequestManagerType { - - var usPrivacyString: String? = nil - let mockResponse1: [AnyHashable: Any] = [ - "amzn_h": ["test-nimbus-url.com"], - "amznslots": ["slotdimens"], - "amznrdr": ["default"], - "amznp": ["blala"], - "amzn_b": ["blalbal"], - "dc": ["iad"] - ] - let mockResponse2: [AnyHashable: Any] = [ - "amzn_h": ["test-nimbus-url.com2"], - "amznslots": ["slot1dimens2"], - "amznrdr": ["default2"], - "amznp": ["blala2"], - "amzn_b": ["blalbal2"], - "dc": ["iad2"] - ] - - init(sizes: [DTBAdSize]) {} - - func loadAdsSync(for adSizes: [DTBAdSize]) -> [[AnyHashable: Any]] { - if adSizes.isEmpty { return [] } - - return [ - mockResponse1, - mockResponse2 - ] - } -} diff --git a/Tests/NimbusRequestAPSKitTests/NimbusRequestAPSTests.swift b/Tests/NimbusRequestAPSKitTests/NimbusRequestAPSTests.swift deleted file mode 100644 index 666a344..0000000 --- a/Tests/NimbusRequestAPSKitTests/NimbusRequestAPSTests.swift +++ /dev/null @@ -1,647 +0,0 @@ -// -// NimbusRequestingAPSTests.swift -// NimbusRequestingAPSTests -// -// Created by Inder Dhir on 10/4/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -@testable import NimbusRequestAPSKit -import DTBiOSSDK -import XCTest - -final class NimbusRequestingAPSTests: XCTestCase { - - let deviceWidth = Int(UIScreen.main.bounds.width) - let deviceHeight = Int(UIScreen.main.bounds.height) - - func test_aps_request_interstitial_validation() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].isInterstitial = nil - - let size = DTBAdSize(interstitialAdSizeWithSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor( - appKey: "appKey", - adSizes: [size] - ) - let mockRequestManager = MockAPSRequestManager(sizes: [size]) - requestInterceptor.requestManager = mockRequestManager - - requestInterceptor.modifyRequest(request: request) - var expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "devicetype": 1, - "lmt": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "ext": [ - "position": "position" - ] - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - - request.impressions[0].isInterstitial = false - requestInterceptor.modifyRequest(request: request) - expectedJsonDict = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 0, - "ext": [ - "position": "position" - ] - ] - ] - ] - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - - request.impressions[0].isInterstitial = true - request.impressions[0].banner = nil - - requestInterceptor.modifyRequest(request: request) - - expectedJsonDict = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position" - ] - ] - ] - ] - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_aps_request_interstitial() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let size = DTBAdSize(interstitialAdSizeWithSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor( - appKey: "appKey", - adSizes: [size] - ) - let mockRequestManager = MockAPSRequestManager(sizes: [size]) - requestInterceptor.requestManager = mockRequestManager - - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position", - "aps": [ - mockRequestManager.mockResponse - ] - ] - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_aps_request_video_validation() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let size = DTBAdSize(videoAdSizeWithPlayerWidth: 320, height: 480, andSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor( - appKey: "appKey", - adSizes: [size] - ) - let mockRequestManager = MockAPSRequestManager(sizes: [size]) - requestInterceptor.requestManager = mockRequestManager - - request.impressions[0].video = nil - requestInterceptor.modifyRequest(request: request) - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "instl": 1, - "ext": [ - "position": "position" - ] - ] - ] - ] - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_aps_request_video() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let size = DTBAdSize(videoAdSizeWithPlayerWidth: 320, height: 480, andSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor( - appKey: "appKey", - adSizes: [size] - ) - let mockRequestManager = MockAPSRequestManager(sizes: [size]) - requestInterceptor.requestManager = mockRequestManager - - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position", - "aps": [ - mockRequestManager.mockResponse - ] - ] - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_aps_request_display_validation() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let size = DTBAdSize(bannerAdSizeWithWidth: 320, height: 480, andSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor( - appKey: "appKey", - adSizes: [size] - ) - let mockRequestManager = MockAPSRequestManager(sizes: [size]) - requestInterceptor.requestManager = mockRequestManager - - request.impressions[0].video = nil - requestInterceptor.modifyRequest(request: request) - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "instl": 1, - "ext": [ - "position": "position", - "aps": [ - mockRequestManager.mockResponse - ] - ] - ] - ] - ] - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_aps_request_display() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = [NimbusAdFormat(width: 320, height: 480)] - - let size = DTBAdSize(videoAdSizeWithPlayerWidth: 320, height: 480, andSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor( - appKey: "appKey", - adSizes: [size] - ) - let mockRequestManager = MockAPSRequestManager(sizes: [size]) - requestInterceptor.requestManager = mockRequestManager - - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480, - "format": [ - ["w": 320, "h": 480] - ] - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position", - "aps": [ - mockRequestManager.mockResponse - ] - ] - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_aps_request_multipleAdSizes() { - let request = NimbusRequest.forInterstitialAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let size1 = DTBAdSize(videoAdSizeWithPlayerWidth: 320, height: 480, andSlotUUID: "slotUUID")! - let size2 = DTBAdSize(interstitialAdSizeWithSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor( - appKey: "appKey", - adSizes: [size1, size2] - ) - let mockRequestManager = MockAPSRequestManagerMultipleSizes(sizes: [size1, size2]) - requestInterceptor.requestManager = mockRequestManager - - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 7, - "h": 480 - ], - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight - ], - "instl": 1, - "ext": [ - "position": "position", - "aps": [ - mockRequestManager.mockResponse1, - mockRequestManager.mockResponse2 - ] - ] - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_aps_request_320x50_banner_with_no_formats() { - let request = NimbusRequest.forBannerAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let size = DTBAdSize(bannerAdSizeWithWidth: 320, height: 50, andSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor(appKey: "appKey", adSizes: [size]) - let mockRequestManager = MockAPSRequestManager(sizes: [size]) - requestInterceptor.requestManager = mockRequestManager - - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "devicetype": 1, - "ua": "userAgent", - "lmt": 1, - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 320, - "pos": 1, - "h": 50 - ], - "ext": [ - "position": "position", - "aps": [ - mockRequestManager.mockResponse - ] - ] - ] - ] - ] - - print(request.jsonDict()) - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_aps_request_320x50_banner_with_formats() { - let request = NimbusRequest.forBannerAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - - request.impressions[0].banner?.width = 400 - request.impressions[0].banner?.height = 200 - request.impressions[0].banner?.formats = [NimbusAdFormat(width: 320, height: 50)] - - let size = DTBAdSize(bannerAdSizeWithWidth: 320, height: 50, andSlotUUID: "slotUUID")! - let requestInterceptor = NimbusAPSRequestInterceptor(appKey: "appKey", adSizes: [size]) - let mockRequestManager = MockAPSRequestManager(sizes: [size]) - requestInterceptor.requestManager = mockRequestManager - - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "devicetype": 1, - "ua": "userAgent", - "lmt": 1, - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "banner": [ - "api": [3, 5, 6], - "w": 400, - "pos": 1, - "h": 200, - "format": [ - [ - "w": 320, - "h": 50 - ] - ] - ], - "ext": [ - "position": "position", - "aps": [ - mockRequestManager.mockResponse - ] - ] - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } -} diff --git a/Tests/NimbusUnityKitTests/Helpers/Data+Extensions.swift b/Tests/NimbusUnityKitTests/Helpers/Data+Extensions.swift deleted file mode 100644 index f738a22..0000000 --- a/Tests/NimbusUnityKitTests/Helpers/Data+Extensions.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// Data+Extensions.swift -// NimbusRequestingFANTests -// -// Created by Inder Dhir on 5/24/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import Foundation - -extension Data { - func dict() throws -> [String: Any] { - let dict = try JSONSerialization.jsonObject(with: self) as! [String: Any] - return modify(dict) - } - - private func modify(_ dict: [String: Any]) -> [String: Any] { - var modifiedDict: [String: Any] = [:] - for key in dict.keys { - if let value = dict[key] as? [[String: Any]] { - modifiedDict[key] = value.map { modify($0 )} - } else if let value = dict[key] as? [String: Any] { - modifiedDict[key] = modify(value) - } else if let value = dict[key] as? String { - modifiedDict[key] = value - } else if let value = dict[key] as? [String] { - modifiedDict[key] = value - } else if let value = dict[key] as? Int { - modifiedDict[key] = value - } else if let value = dict[key] as? [Int] { - modifiedDict[key] = value - } else if let value = dict[key] as? Float { - modifiedDict[key] = value - } else if let value = dict[key] as? [Float] { - modifiedDict[key] = value - } - } - return modifiedDict - } -} diff --git a/Tests/NimbusUnityKitTests/Helpers/Dictionary+Extensions.swift b/Tests/NimbusUnityKitTests/Helpers/Dictionary+Extensions.swift deleted file mode 100644 index e2b966d..0000000 --- a/Tests/NimbusUnityKitTests/Helpers/Dictionary+Extensions.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// Dictionary+Extensions.swift -// NimbusRequestingFANTests -// -// Created by Inder Dhir on 5/24/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import NimbusRequestKit - -extension Dictionary where Value: Any { - func isEqual(to otherDict: [Key: Any]) -> Bool { - guard count == otherDict.count else { - return false - } - - for (k1, v1) in self { - guard let v2 = otherDict[k1] else { - return false - } - - switch (v1, v2) { - case (let v1 as String, let v2 as String): - if v1 != v2 { - return false - - } - case (let v1 as [String], let v2 as [String]): - if v1.sorted() != v2.sorted() { - return false - } - case (let v1 as Int, let v2 as Int): if v1 != v2 { - return false - } - case (let v1 as [Int], let v2 as [Int]): if v1.sorted() != v2.sorted() { - return false - } - case (let v1 as Float, let v2 as Float): - if !v1.isEqual(to: v2) { - return false - } - case (let v1 as [Key: Any], let v2 as [Key: Any]): - if !v1.isEqual(to: v2) { - return false - } - case (let v1 as [[Key: Any]], let v2 as [[Key: Any]]): - guard v1.count == v2.count else { - return false - } - for dict1 in v1 { - guard v2.contains(where: { $0.isEqual(to: dict1) }) else { - return false - } - } - default: - return false - } - } - return true - } -} diff --git a/Tests/NimbusUnityKitTests/Helpers/JSONEncoder+Dict.swift b/Tests/NimbusUnityKitTests/Helpers/JSONEncoder+Dict.swift deleted file mode 100644 index 15c6077..0000000 --- a/Tests/NimbusUnityKitTests/Helpers/JSONEncoder+Dict.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// JSONEncoder+Dict.swift -// NimbusRequestingFANTests -// -// Created by Inder Dhir on 11/5/19. -// Copyright © 2019 Timehop. All rights reserved. -// - -import Foundation - -extension Encodable { - - func jsonDict() -> [String: Any] { - do { - let data = try JSONEncoder().encode(self) - return try data.dict() - } catch { - return [:] - } - } -} diff --git a/Tests/NimbusUnityKitTests/NimbusUnityKitTests.swift b/Tests/NimbusUnityKitTests/NimbusUnityKitTests.swift deleted file mode 100644 index 32a67ac..0000000 --- a/Tests/NimbusUnityKitTests/NimbusUnityKitTests.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// NimbusUnityKitTests.swift -// NimbusUnityKitTests -// -// Created by Inder Dhir on 12/13/21. -// Copyright © 2021 Timehop. All rights reserved. -// - -@testable import NimbusUnityKit -import XCTest - -class NimbusUnityKitTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() throws { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/Tests/NimbusUnityKitTests/NimbusUnityRequestInterceptorTests.swift b/Tests/NimbusUnityKitTests/NimbusUnityRequestInterceptorTests.swift deleted file mode 100644 index 44fecc4..0000000 --- a/Tests/NimbusUnityKitTests/NimbusUnityRequestInterceptorTests.swift +++ /dev/null @@ -1,134 +0,0 @@ -// -// NimbusUnityRequestInterceptor.swift -// NimbusUnityKitTests -// -// Created by Inder Dhir on 12/13/21. -// Copyright © 2021 Timehop. All rights reserved. -// - -@testable import NimbusUnityKit -import UnityAds -import XCTest - -final class NimbusUnityRequestInterceptorTests: XCTestCase { - - let deviceWidth = Int(UIScreen.main.bounds.width) - let deviceHeight = Int(UIScreen.main.bounds.height) - - override func setUp() { - super.setUp() - - Nimbus.shared.testMode = false - } - - func test_unity_request_withoutRewardedRequest() { - let request = NimbusRequest.forVideoAd(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let requestInterceptor = StubNimbusUnityRequestInterceptor(gameId: "gameId") - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 0, - "h": deviceHeight - ], - "ext": [ - "position": "position", - ] - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } - - func test_unity_request_witRewardedRequest() { - let request = NimbusRequest.forRewardedVideo(position: "position") - request.device.userAgent = "userAgent" - request.device.model = "model" - request.device.advertisingId = "ifa" - request.impressions[0].banner?.formats = nil - - let requestInterceptor = StubNimbusUnityRequestInterceptor(gameId: "gameId") - requestInterceptor.modifyRequest(request: request) - - let expectedJsonDict: [String: Any] = [ - "format": [ - "w": deviceWidth, - "h": deviceHeight - ], - "device": [ - "make": "apple", - "model": "model", - "lmt": 1, - "devicetype": 1, - "ua": "userAgent", - "os": "ios", - "osv": UIDevice.current.systemVersion, - "hwv": UIDevice.current.nimbusModelName, - "connectiontype": Nimbus.shared.connectionType.rawValue, - "ifa": "ifa", - "w": deviceWidth, - "h": deviceHeight - ], - "imp": [ - [ - "video": [ - "protocols": [2, 3, 5, 6], - "w": deviceWidth, - "mimes": ["video/mp4", "video/3gpp", "application/x-mpegurl"], - "pos": 7, - "h": deviceHeight, - "companionad": [ - [ - "w": 320, - "h": 480, - "vcm": 1 - ] - ], - "ext": [ - "is_rewarded": 1 - ] - ], - "instl": 1, - "ext": [ - "position": "position", - ] - ] - ], - "user": [ - "ext": [ - "unity_buyeruid": "token" - ] - ] - ] - - XCTAssertTrue(request.jsonDict().isEqual(to: expectedJsonDict)) - } -} diff --git a/Tests/NimbusUnityKitTests/StubNimbusUnityRequestInterceptor.swift b/Tests/NimbusUnityKitTests/StubNimbusUnityRequestInterceptor.swift deleted file mode 100644 index d93f3d8..0000000 --- a/Tests/NimbusUnityKitTests/StubNimbusUnityRequestInterceptor.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// StubNimbusUnityRequestInterceptor.swift -// NimbusUnityKitTests -// -// Created by Inder Dhir on 12/14/21. -// Copyright © 2021 Timehop. All rights reserved. -// - -@testable import NimbusUnityKit - -final class StubNimbusUnityRequestInterceptor: NimbusUnityRequestInterceptor { - - override var isSupported: Bool { true } - override var isInitialized: Bool { true } - override var token: String? { "token" } -}