Commit 7bbad031 by Demid Merzlyakov

IOS-127: Tercept: add logs, refactor slilghtly.

parent 51e97f5d
......@@ -302,7 +302,6 @@
F2D8A706269D88D10060F36A /* x86_64.swiftinterface in Resources */ = {isa = PBXBuildFile; fileRef = F2D8A6DF269D88D10060F36A /* x86_64.swiftinterface */; };
F2D8A70D269D93210060F36A /* TerceptSDKManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2D8A70C269D93210060F36A /* TerceptSDKManager.swift */; };
F2D8A722269F05200060F36A /* Dependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2D8A721269F05200060F36A /* Dependency.swift */; };
F2D8A74E269FFDF10060F36A /* TerceptSDKManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2D8A74D269FFDF10060F36A /* TerceptSDKManagerTests.swift */; };
F2D8A7C9269FFFD50060F36A /* StubTerceptOptimizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2D8A7C8269FFFD50060F36A /* StubTerceptOptimizer.swift */; };
/* End PBXBuildFile section */
......@@ -657,7 +656,6 @@
F2D8A721269F05200060F36A /* Dependency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dependency.swift; sourceTree = "<group>"; };
F2D8A743269FFDC60060F36A /* 1WeatherTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = 1WeatherTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
F2D8A747269FFDC60060F36A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
F2D8A74D269FFDF10060F36A /* TerceptSDKManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerceptSDKManagerTests.swift; sourceTree = "<group>"; };
F2D8A7C8269FFFD50060F36A /* StubTerceptOptimizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StubTerceptOptimizer.swift; sourceTree = "<group>"; };
FC2041C3048EAF6B296224F6 /* Pods-OneWeatherWidgetExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneWeatherWidgetExtension.debug.xcconfig"; path = "Target Support Files/Pods-OneWeatherWidgetExtension/Pods-OneWeatherWidgetExtension.debug.xcconfig"; sourceTree = "<group>"; };
FD761FE0D947B3A79121A941 /* Pods-OneWeatherNotificationServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneWeatherNotificationServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-OneWeatherNotificationServiceExtension/Pods-OneWeatherNotificationServiceExtension.release.xcconfig"; sourceTree = "<group>"; };
......@@ -1736,7 +1734,6 @@
isa = PBXGroup;
children = (
F2D8A7C8269FFFD50060F36A /* StubTerceptOptimizer.swift */,
F2D8A74D269FFDF10060F36A /* TerceptSDKManagerTests.swift */,
F227B22F26B7B97200DD7EBB /* TerceptSDKEnablerTests.swift */,
);
path = TerceptSDK;
......@@ -2382,7 +2379,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F2D8A74E269FFDF10060F36A /* TerceptSDKManagerTests.swift in Sources */,
F227B23026B7B97200DD7EBB /* TerceptSDKEnablerTests.swift in Sources */,
F2D8A7C9269FFFD50060F36A /* StubTerceptOptimizer.swift in Sources */,
);
......
......@@ -8,7 +8,7 @@
import Foundation
@testable import _Weather
class StubTerceptOptimizer: TerceptOpimizable {
class StubTerceptOptimizer: TerceptOptimizer {
private let customTargettingKeys: [String : String?]
private(set) var initParamsMethodParams: (String, String, [String: Any]?)? = nil
......
//
// TerceptSDKManagerTests.swift
// 1WeatherTests
//
// Created by Shailesh on 15/07/21.
//
import XCTest
class TerceptSDKManagerTests: XCTestCase {
private let adUnits = ["Test/Ad/1", "Test/Ad/2"]
func testInitParams() {
let stub = StubTerceptOptimizer(customTargettingKeys: [:])
XCTAssertNil(stub.initParamsMethodParams?.0)
XCTAssertNil(stub.initParamsMethodParams?.1)
XCTAssertNil(stub.initParamsMethodParams?.2)
_ = TerceptSDKManager(optimizable: stub, adUnitIDs: adUnits)
XCTAssertNotNil(stub.initParamsMethodParams?.0)
XCTAssertNotNil(stub.initParamsMethodParams?.1)
XCTAssertNotNil(stub.initParamsMethodParams?.2)
}
func testFetchAdUnitsKeys() {
let stub = StubTerceptOptimizer(customTargettingKeys: [:])
XCTAssertNil(stub.fetchMethodParams)
_ = TerceptSDKManager(optimizable: stub, adUnitIDs: adUnits)
XCTAssertEqual(adUnits, stub.fetchMethodParams)
}
func testFetchAdUnitsKeysCustomTargettingKeys() {
let customTargettingKeys = ["Custom Target Key": "Value"]
let stub = StubTerceptOptimizer(customTargettingKeys: customTargettingKeys)
let manager = TerceptSDKManager(optimizable: stub, adUnitIDs: adUnits)
let tracker = manager.getTracker(with: adUnits.first!)
XCTAssertEqual(customTargettingKeys, tracker.getCustomTrackableKeys())
}
func testSetCustomParameter() {
let customParam = ["Custom Param Key": "Custom Param Value"]
let stub = StubTerceptOptimizer(customTargettingKeys: [:])
XCTAssertNil(stub.setCustomParametersMethodParams)
let manager = TerceptSDKManager(optimizable: stub, adUnitIDs: adUnits)
manager.setCustomParameters(customParam)
XCTAssertEqual(customParam, stub.setCustomParametersMethodParams)
}
func testLogEvent() {
let stub = StubTerceptOptimizer(customTargettingKeys: [:])
XCTAssertNil(stub.logEventMethodParams)
let manager = TerceptSDKManager(optimizable: stub, adUnitIDs: adUnits)
let tracker = manager.getTracker(with: adUnits.first!)
for item in AdLifeCycleState.allCases {
tracker.recordAdState(item)
XCTAssertEqual(stub.logEventMethodParams?.0, adUnits.first!)
XCTAssertEqual(stub.logEventMethodParams?.1, item.rawValue)
XCTAssertTrue(stub.logEventMethodParams?.2.isEmpty == true)
}
}
func testSendEventData() {
let stub = StubTerceptOptimizer(customTargettingKeys: [:])
XCTAssertFalse(stub.sentEventDataCalled)
let manager = TerceptSDKManager(optimizable: stub, adUnitIDs: adUnits)
NotificationCenter.default.post(name: UIApplication.didEnterBackgroundNotification, object: nil)
XCTAssertTrue(stub.sentEventDataCalled)
}
func testTerceptInit() {
let sdkManager = TerceptSDKManager()
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
let configManager = ConfigManager()
configManager.config = AppConfig(popularCities: nil,
adConfig: AdConfig(),
ccpaUpdateInterval: nil,
nwsAlertsViaMoEngageEnabled: false,
showAttPrompt: false,
shortsLeftBelowCountKey: 0,
shortsLastNudgeEnabledKey: false,
shortsSwipeUpNudgeCountKey: 0,
terceptSDKTrackingEnabled: true)
sdkManager.dataUpdated(by: configManager)
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
sdkManager.canCollectData = true
XCTAssertTrue(sdkManager.logEvent("", "", [:]))
}
func testTerceptFirebaseToggleOff() {
let sdkManager = TerceptSDKManager()
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
let configManager = ConfigManager()
configManager.config = AppConfig(popularCities: nil,
adConfig: AdConfig(),
ccpaUpdateInterval: nil,
nwsAlertsViaMoEngageEnabled: false,
showAttPrompt: false,
shortsLeftBelowCountKey: 0,
shortsLastNudgeEnabledKey: false,
shortsSwipeUpNudgeCountKey: 0,
terceptSDKTrackingEnabled: false)
sdkManager.dataUpdated(by: configManager)
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
sdkManager.canCollectData = true
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
sdkManager.canCollectData = false
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
}
func testDataCollectionPermission() {
let sdkManager = TerceptSDKManager()
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
let configManager = ConfigManager()
configManager.config = AppConfig(popularCities: nil,
adConfig: AdConfig(),
ccpaUpdateInterval: nil,
nwsAlertsViaMoEngageEnabled: false,
showAttPrompt: false,
shortsLeftBelowCountKey: 0,
shortsLastNudgeEnabledKey: false,
shortsSwipeUpNudgeCountKey: 0,
terceptSDKTrackingEnabled: true)
sdkManager.dataUpdated(by: configManager)
sdkManager.canCollectData = true
XCTAssertTrue(sdkManager.logEvent("", "", [:]))
sdkManager.canCollectData = false
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
}
}
......@@ -5,6 +5,8 @@
// Created by Shailesh on 02/08/21.
//
//TODO: got to get rid of all of this...
struct TerceptConditionsObserver {
let initSDK: (() -> Void)
let deinitSDK: (() -> Void)
......
......@@ -7,8 +7,10 @@
import UIKit
import TerceptSDK
import AlgoliaSearchClient
import OneWeatherAnalytics
protocol TerceptOpimizable: AdEventLoggable {
protocol TerceptOptimizer: AdEventLoggable {
func fetch(_ adunits: [String]?)
func setCustomParameters(_ params: [String : String])
func sendEventsData()
......@@ -16,15 +18,56 @@ protocol TerceptOpimizable: AdEventLoggable {
func initParams(_ IDFA: String, _ IDFV: String, _ params: [String : Any]?)
}
struct TerceptOptimizerWrapper: TerceptOptimizer {
private let wrapperOptimizer: TerceptSDK.TerceptOptimization
private let log = Logger(componentName: "Tercept")
public init(optimizer: TerceptSDK.TerceptOptimization) {
wrapperOptimizer = optimizer
}
func fetch(_ adunits: [String]?) {
log.info("fetch for ad units: \(adunits ?? [String]())")
wrapperOptimizer.fetch(adunits)
}
func setCustomParameters(_ params: [String : String]) {
log.info("set custom params: \(params)")
wrapperOptimizer.setCustomParameters(params)
}
func sendEventsData() {
log.info("send events data")
wrapperOptimizer.sendEventsData()
}
func getCustomTargetingKeys(_ adunit: String?) -> [String : String?] {
let result = wrapperOptimizer.getCustomTargetingKeys(adunit)
log.info("custom targeting keys for ad unit: \(adunit ?? "-"): \(result)")
return result
}
func initParams(_ IDFA: String, _ IDFV: String, _ params: [String : Any]?) {
log.info("Initialize with IDFA \(IDFA) IDFV \(IDFV) params: \(params ?? [String: Any]())")
wrapperOptimizer.initParams(IDFA, IDFV, params)
}
func logEvent(_ adunit: String?, _ event: String?, _ customParams: [String : Any]) -> Bool {
let result = wrapperOptimizer.logEvent(adunit, event, customParams)
log.info("log event \(event ?? "-") for ad ad unit: \(adunit ?? "-"); result: \(result)")
return result
}
}
protocol AdEventLoggable {
@discardableResult func logEvent(_ adunit: String?, _ event: String?, _ customParams: [String : Any]) -> Bool
}
extension TerceptOptimization: TerceptOpimizable { }
final class TerceptSDKManager: AdEventLoggable, DependencyRepresentable {
private var optimizer: TerceptOpimizable?
private var optimizer: TerceptOptimizer?
private let enabler: TerceptSDKEnabler
private let log = Logger(componentName: "Tercept")
private struct Constants {
static let DFPCode: String = "120348554"
static var IDFA: String { AppInfo.idfa ?? "UNKNOWN" }
......@@ -44,33 +87,40 @@ final class TerceptSDKManager: AdEventLoggable, DependencyRepresentable {
registerNotifications()
}
init(optimizable: TerceptOpimizable, adUnitIDs: [String]) {
self.optimizer = optimizable
init(optimizer: TerceptOptimizer, adUnitIDs: [String]) {
self.optimizer = optimizer
self.enabler = TerceptSDKEnabler()
attachObserver()
updateKeys()
optimizable.fetch(adUnitIDs)
optimizer.fetch(adUnitIDs)
registerNotifications()
fetchIfAvailable()
}
//MARK:- Private
private func attachObserver() {
//TODO: got to get rid of all of this...
self.enabler.attachObserver(observer: TerceptConditionsObserver(initSDK: initializeSDK, deinitSDK: deinitSDK))
}
private func initializeSDK() {
optimizer = TerceptOptimization(Constants.DFPCode)
log.info("Initialize the SDK")
optimizer = TerceptOptimizerWrapper(optimizer: TerceptOptimization(Constants.DFPCode))
updateKeys()
fetchIfAvailable()
}
private func deinitSDK() {
log.info("Shut down the SDK")
optimizer = nil
}
private func updateKeys() {
optimizer?.initParams(Constants.IDFA, Constants.IDFV, ["appVersion": Constants.version])
let idfa = Constants.IDFA
let idfv = Constants.IDFV
let params = ["appVersion": Constants.version]
log.info("Update keys: IDFA \(idfa) IDFV \(idfv)")
optimizer?.initParams(idfa, idfv, params)
}
private func registerNotifications() {
......@@ -159,6 +209,8 @@ final class TerceptAdTracker: CustomTargetedAdLifeCycleTrackable {
}
func recordAdState(_ state: AdLifeCycleState) {
// TODO: unravel all this.
// This will eventually be forwarded to the TerceptOptimizer above, thata will log the info into the console.
logger.logEvent(adUnitId, state.rawValue, [:])
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment