From eaa69c4fe17abf9a694c92a5290eed731586cb9d Mon Sep 17 00:00:00 2001 From: Pallab Maiti Date: Wed, 15 Feb 2023 15:05:13 +0530 Subject: [PATCH] onetrust cloud mode --- .../project.pbxproj | 4 ++ .../RudderSampleAppSwift/AppDelegate.swift | 1 + .../RudderSampleAppSwift/CustomFilter.swift | 20 ++++++ Sources/Classes/Public/RSClient.h | 3 + Sources/Classes/Public/RSConsentFilter.h | 5 +- .../Classes/Public/RSConsentFilterHandler.h | 6 +- Sources/Classes/Public/RSConstants.h | 6 ++ Sources/Classes/Public/RSContext.h | 55 ++++++++-------- Sources/Classes/Public/RSIntegration.h | 2 + Sources/Classes/Public/RSMessage.h | 14 ++-- Sources/Classes/Public/RSServerConfigSource.h | 1 + Sources/Classes/RSConsentFilterHandler.m | 37 +++++++---- Sources/Classes/RSConstants.m | 6 ++ Sources/Classes/RSContext.m | 19 +++--- Sources/Classes/RSDeviceInfo.m | 1 + Sources/Classes/RSMessage.m | 6 +- Tests/ConserFilterHandlerTests.swift | 64 +++++++++---------- 17 files changed, 156 insertions(+), 94 deletions(-) create mode 100644 Examples/RudderSampleAppSwift/RudderSampleAppSwift/CustomFilter.swift diff --git a/Examples/RudderSampleAppSwift/RudderSampleAppSwift.xcodeproj/project.pbxproj b/Examples/RudderSampleAppSwift/RudderSampleAppSwift.xcodeproj/project.pbxproj index ab56eaea..b7457fc2 100644 --- a/Examples/RudderSampleAppSwift/RudderSampleAppSwift.xcodeproj/project.pbxproj +++ b/Examples/RudderSampleAppSwift/RudderSampleAppSwift.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 06EABC9224665E480043D720 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 06EABC9024665E480043D720 /* LaunchScreen.storyboard */; }; D55B72537AC03E9A3F7524FA /* Pods_RudderSampleAppSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95FE82D63F0324B1B29DBA09 /* Pods_RudderSampleAppSwift.framework */; }; ED00467228A64DE50007206F /* SessionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED00467128A64DE50007206F /* SessionViewController.swift */; }; + EDEAEBC7299CB30200D537C3 /* CustomFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDEAEBC6299CB30200D537C3 /* CustomFilter.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -29,6 +30,7 @@ 95FE82D63F0324B1B29DBA09 /* Pods_RudderSampleAppSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RudderSampleAppSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E32C35F6B909BB22A7F0553E /* Pods-RudderSampleAppSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RudderSampleAppSwift.release.xcconfig"; path = "Target Support Files/Pods-RudderSampleAppSwift/Pods-RudderSampleAppSwift.release.xcconfig"; sourceTree = ""; }; ED00467128A64DE50007206F /* SessionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionViewController.swift; sourceTree = ""; }; + EDEAEBC6299CB30200D537C3 /* CustomFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomFilter.swift; sourceTree = ""; }; FD4DAD4049ABA2A60254AD71 /* Pods-RudderSampleAppSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RudderSampleAppSwift.debug.xcconfig"; path = "Target Support Files/Pods-RudderSampleAppSwift/Pods-RudderSampleAppSwift.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -73,6 +75,7 @@ 06EABC8E24665E480043D720 /* Assets.xcassets */, 06EABC9024665E480043D720 /* LaunchScreen.storyboard */, 06EABC9324665E480043D720 /* Info.plist */, + EDEAEBC6299CB30200D537C3 /* CustomFilter.swift */, ); path = RudderSampleAppSwift; sourceTree = ""; @@ -214,6 +217,7 @@ ED00467228A64DE50007206F /* SessionViewController.swift in Sources */, 06EABC8624665E470043D720 /* AppDelegate.swift in Sources */, 06EABC8824665E470043D720 /* SceneDelegate.swift in Sources */, + EDEAEBC7299CB30200D537C3 /* CustomFilter.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Examples/RudderSampleAppSwift/RudderSampleAppSwift/AppDelegate.swift b/Examples/RudderSampleAppSwift/RudderSampleAppSwift/AppDelegate.swift index 8cdb33f8..297e63f7 100644 --- a/Examples/RudderSampleAppSwift/RudderSampleAppSwift/AppDelegate.swift +++ b/Examples/RudderSampleAppSwift/RudderSampleAppSwift/AppDelegate.swift @@ -24,6 +24,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { .withRecordScreenViews(false) .withSleepTimeOut(4) .withSessionTimeoutMillis(30000) +// .withConsentFilter(CustomFilter()) RSClient.getInstance("1wvsoF3Kx2SczQNlx1dvcqW9ODW", config: builder.build()) diff --git a/Examples/RudderSampleAppSwift/RudderSampleAppSwift/CustomFilter.swift b/Examples/RudderSampleAppSwift/RudderSampleAppSwift/CustomFilter.swift new file mode 100644 index 00000000..b3a979f6 --- /dev/null +++ b/Examples/RudderSampleAppSwift/RudderSampleAppSwift/CustomFilter.swift @@ -0,0 +1,20 @@ +// +// CustomFilter.swift +// RudderSampleAppSwift +// +// Created by Pallab Maiti on 15/02/23. +// Copyright © 2023 RudderStack. All rights reserved. +// + +import Foundation +import Rudder + +class CustomFilter: RSConsentFilter { + func filterConsentedDestinations(_ destinations: [RSServerDestination]) -> [String : NSNumber]? { + return [:] + } + + func getConsentCategoriesDict() -> [String : NSNumber]? { + return [:] + } +} diff --git a/Sources/Classes/Public/RSClient.h b/Sources/Classes/Public/RSClient.h index f8459db8..3c3002be 100644 --- a/Sources/Classes/Public/RSClient.h +++ b/Sources/Classes/Public/RSClient.h @@ -22,6 +22,9 @@ NS_ASSUME_NONNULL_BEGIN @protocol RSIntegrationFactory; @protocol RSIntegration; @class RSConfig; +@class RSMessage; +@class RSContext; +@class RSMessageBuilder; @interface RSClient : NSObject + (instancetype) getInstance; diff --git a/Sources/Classes/Public/RSConsentFilter.h b/Sources/Classes/Public/RSConsentFilter.h index ad9a8b2a..43073cba 100644 --- a/Sources/Classes/Public/RSConsentFilter.h +++ b/Sources/Classes/Public/RSConsentFilter.h @@ -10,12 +10,15 @@ NS_ASSUME_NONNULL_BEGIN -@class RSServerDestination; +//@class RSServerDestination; @protocol RSConsentFilter - (NSDictionary * __nullable)filterConsentedDestinations:(NSArray *)destinations; +@optional +- (NSDictionary * __nullable)getConsentCategoriesDict; + @end NS_ASSUME_NONNULL_END diff --git a/Sources/Classes/Public/RSConsentFilterHandler.h b/Sources/Classes/Public/RSConsentFilterHandler.h index 1c801a78..5d8271b2 100644 --- a/Sources/Classes/Public/RSConsentFilterHandler.h +++ b/Sources/Classes/Public/RSConsentFilterHandler.h @@ -8,13 +8,17 @@ #import #import "RSServerConfigSource.h" #import "RSConsentFilter.h" -#import "RSIntegrationFactory.h" +#import "RSMessage.h" NS_ASSUME_NONNULL_BEGIN +@class RSMessage; +@class RSServerConfigSource; + @interface RSConsentFilterHandler : NSObject { RSServerConfigSource *serverConfig; NSDictionary *consentedIntegrationsDict; + NSArray *deniedConsentIds; } + (instancetype)initiate:(id)consentFilter withServerConfig:(RSServerConfigSource *)serverConfig; diff --git a/Sources/Classes/Public/RSConstants.h b/Sources/Classes/Public/RSConstants.h index 516558de..6a26463a 100644 --- a/Sources/Classes/Public/RSConstants.h +++ b/Sources/Classes/Public/RSConstants.h @@ -54,6 +54,12 @@ extern NSString* const EVENT_NAME; extern NSString *const WRITE_KEY_ERROR; extern NSString *const DATA_PLANE_URL_ERROR; extern NSString *const DATA_PLANE_URL_FLUSH_ERROR; + +extern int const RSATTNotDetermined; +extern int const RSATTRestricted; +extern int const RSATTDenied; +extern int const RSATTAuthorize; + @end NS_ASSUME_NONNULL_END diff --git a/Sources/Classes/Public/RSContext.h b/Sources/Classes/Public/RSContext.h index afd65067..e4046643 100644 --- a/Sources/Classes/Public/RSContext.h +++ b/Sources/Classes/Public/RSContext.h @@ -22,6 +22,7 @@ NS_ASSUME_NONNULL_BEGIN @interface RSContext : NSObject { RSPreferenceManager *preferenceManager; + NSDictionary *> * _Nullable consentManagement; } extern int const RSATTNotDetermined; @@ -29,35 +30,35 @@ extern int const RSATTRestricted; extern int const RSATTDenied; extern int const RSATTAuthorize; -@property (nonatomic, readwrite) RSApp* app; -@property (nonatomic, readwrite) NSMutableDictionary* traits; -@property (nonatomic, readwrite) RSLibraryInfo* library; -@property (nonatomic, readwrite) RSOSInfo* os; -@property (nonatomic, readwrite) RSScreenInfo* screen; -@property (nonatomic, readwrite) NSString* userAgent; -@property (nonatomic, readwrite) NSString* locale; -@property (nonatomic, readwrite) RSDeviceInfo* device; -@property (nonatomic, readwrite) RSNetwork* network; -@property (nonatomic, readwrite) NSString* timezone; -@property (nonatomic, readwrite) NSNumber * _Nullable sessionId; +@property (nonatomic, readwrite) NSMutableDictionary *traits; +@property (nonatomic, readwrite) RSApp *app; +@property (nonatomic, readwrite) RSLibraryInfo *library; +@property (nonatomic, readwrite) RSOSInfo *os; +@property (nonatomic, readwrite) RSScreenInfo *screen; +@property (nonatomic, readwrite) NSString *userAgent; +@property (nonatomic, readwrite) NSString *locale; +@property (nonatomic, readwrite) RSDeviceInfo *device; +@property (nonatomic, readwrite) RSNetwork *network; +@property (nonatomic, readwrite) NSString *timezone; +@property (nonatomic, readwrite) NSNumber *_Nullable sessionId; @property (nonatomic, readwrite) BOOL sessionStart; -@property (nonatomic, readwrite) NSMutableArray*>* externalIds; +@property (nonatomic, readwrite) NSMutableArray*> *externalIds; - -+ (dispatch_queue_t) getQueue; -- (NSDictionary*) dict; -- (void) resetTraits; -- (void) updateTraits: (RSTraits* _Nullable) traits; -- (void) persistTraits; -- (void) updateTraitsDict: (NSMutableDictionary*) traitsDict; -- (void) updateTraitsAnonymousId; -- (void) putDeviceToken: (NSString*) deviceToken; -- (void) putAdvertisementId: (NSString *_Nonnull) idfa; -- (void) putAppTrackingConsent: (int) att; -- (void) updateExternalIds: (NSMutableArray* __nullable) externalIds; -- (void) resetExternalIds; -- (void) persistExternalIds; -- (void) setSessionData:(RSUserSession *) userSession; ++ (dispatch_queue_t)getQueue; +- (NSDictionary*)dict; +- (void)resetTraits; +- (void)updateTraits:(RSTraits *_Nullable) traits; +- (void)persistTraits; +- (void)updateTraitsDict:(NSMutableDictionary*)traitsDict; +- (void)updateTraitsAnonymousId; +- (void)putDeviceToken:(NSString*)deviceToken; +- (void)putAdvertisementId:(NSString *_Nonnull)idfa; +- (void)putAppTrackingConsent:(int)att; +- (void)updateExternalIds:(NSMutableArray *__nullable)externalIds; +- (void)resetExternalIds; +- (void)persistExternalIds; +- (void)setSessionData:(RSUserSession *)userSession; +- (void)setConsentData:(NSArray *)deniedConsentIds; @end diff --git a/Sources/Classes/Public/RSIntegration.h b/Sources/Classes/Public/RSIntegration.h index 67ff1f89..941a3cbb 100644 --- a/Sources/Classes/Public/RSIntegration.h +++ b/Sources/Classes/Public/RSIntegration.h @@ -10,6 +10,8 @@ NS_ASSUME_NONNULL_BEGIN +@class RSMessage; + @protocol RSIntegration - (void) dump: (RSMessage*) message; diff --git a/Sources/Classes/Public/RSMessage.h b/Sources/Classes/Public/RSMessage.h index 7a454559..14c748c3 100644 --- a/Sources/Classes/Public/RSMessage.h +++ b/Sources/Classes/Public/RSMessage.h @@ -13,6 +13,8 @@ NS_ASSUME_NONNULL_BEGIN +@class RSContext; + @interface RSMessage : NSObject @property (atomic, readwrite) NSString* messageId; @@ -34,12 +36,12 @@ NS_ASSUME_NONNULL_BEGIN @property (atomic, readwrite) NSString* destinationProps; @property (atomic, readwrite) RSOption* option; -- (NSDictionary*) dict; -- (void) updateContext: (RSContext*) context; -- (void) updateTraits: (RSTraits*) traits; -- (void) updateTraitsDict:(NSMutableDictionary*)traits; -- (void) setRudderOption: (RSOption*) option; -- (void) setSessionData:(RSUserSession *) userSession; +- (NSDictionary*)dict; +- (void)updateContext:(RSContext*)context; +- (void)updateTraits:(RSTraits*)traits; +- (void)updateTraitsDict:(NSMutableDictionary*)traits; +- (void)setRudderOption:(RSOption*)option; +- (void)setSessionData:(RSUserSession *)userSession; @end diff --git a/Sources/Classes/Public/RSServerConfigSource.h b/Sources/Classes/Public/RSServerConfigSource.h index 4a0a9e1a..205c9f6e 100644 --- a/Sources/Classes/Public/RSServerConfigSource.h +++ b/Sources/Classes/Public/RSServerConfigSource.h @@ -9,6 +9,7 @@ #import #import "RSConfig.h" #import "RSServerDestination.h" +#import "RSEnums.h" NS_ASSUME_NONNULL_BEGIN diff --git a/Sources/Classes/RSConsentFilterHandler.m b/Sources/Classes/RSConsentFilterHandler.m index cf510812..496de8b8 100644 --- a/Sources/Classes/RSConsentFilterHandler.m +++ b/Sources/Classes/RSConsentFilterHandler.m @@ -32,13 +32,31 @@ - (instancetype)init:(id)_consentFilter withServerConfig:(RSSer } self->serverConfig = _serverConfig; [self updateConsentedIntegrationsDict:_consentFilter]; + [self updateDeniedConsentIds:_consentFilter]; } return self; } -- (void)updateConsentedIntegrationsDict:(id)consentFilter { +- (void)updateConsentedIntegrationsDict:(id)_consentFilter { dispatch_sync(queue, ^{ - consentedIntegrationsDict = [consentFilter filterConsentedDestinations:serverConfig.destinations]; + consentedIntegrationsDict = [_consentFilter filterConsentedDestinations:serverConfig.destinations]; + }); +} + +- (void)updateDeniedConsentIds:(id)_consentFilter { + dispatch_sync(queue, ^{ + id consentFilter = _consentFilter; + if ([consentFilter respondsToSelector:@selector(getConsentCategoriesDict)]) { + NSMutableArray *_deniedConsentIds = [[NSMutableArray alloc] init]; + [[_consentFilter getConsentCategoriesDict] enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSNumber * _Nonnull obj, BOOL * _Nonnull stop) { + if (![obj boolValue]) { + [_deniedConsentIds addObject:key]; + } + }]; + if (_deniedConsentIds != nil && [_deniedConsentIds count] > 0) { + deniedConsentIds = _deniedConsentIds; + } + } }); } @@ -59,20 +77,11 @@ - (void)updateConsentedIntegrationsDict:(id)consentFilter { } - (RSMessage *)applyConsents:(RSMessage *)message { - if (message.integrations == nil || consentedIntegrationsDict == nil) { + if (deniedConsentIds == nil || [deniedConsentIds count] == 0 || message.context == nil) { return message; } - __block RSMessage *updatedMessage = message; - __block NSMutableDictionary *consentedMessageIntegrationsDict = [[NSMutableDictionary alloc] initWithDictionary:message.integrations]; - dispatch_sync(queue, ^{ - [consentedIntegrationsDict enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSNumber * _Nonnull obj, BOOL * _Nonnull stop) { - if (![obj boolValue]) { - [consentedMessageIntegrationsDict setObject:[NSNumber numberWithBool:false] forKey:key]; - } - }]; - updatedMessage.integrations = consentedMessageIntegrationsDict; - }); - return updatedMessage; + [message.context setConsentData:deniedConsentIds]; + return message; } @end diff --git a/Sources/Classes/RSConstants.m b/Sources/Classes/RSConstants.m index 14fd80b0..0fc8ef3e 100644 --- a/Sources/Classes/RSConstants.m +++ b/Sources/Classes/RSConstants.m @@ -31,4 +31,10 @@ @implementation RSConstants NSString *const WRITE_KEY_ERROR = @"Invalid writeKey: Provided writeKey is empty"; NSString *const DATA_PLANE_URL_ERROR = @"Invalid dataPlaneUrl: The dataPlaneUrl is not provided or given dataPlaneUrl is not valid\n**Note: dataPlaneUrl or dataResidencyServer(for Enterprise Users only) is mandatory from version 1.11.0**"; NSString *const DATA_PLANE_URL_FLUSH_ERROR = @"Invalid dataPlaneUrl: The dataPlaneUrl is not provided or given dataPlaneUrl is not valid. Ignoring flush call. \n**Note: dataPlaneUrl or dataResidencyServer(for Enterprise Users only) is mandatory from version 1.11.0**"; + +int const RSATTNotDetermined = 0; +int const RSATTRestricted = 1; +int const RSATTDenied = 2; +int const RSATTAuthorize = 3; + @end diff --git a/Sources/Classes/RSContext.m b/Sources/Classes/RSContext.m index 3295a5e6..c347224b 100644 --- a/Sources/Classes/RSContext.m +++ b/Sources/Classes/RSContext.m @@ -10,19 +10,13 @@ #import "RSUtils.h" #import "RSLogger.h" #import "RSClient.h" +#import "RSConstants.h" @implementation RSContext -int const RSATTNotDetermined = 0; -int const RSATTRestricted = 1; -int const RSATTDenied = 2; -int const RSATTAuthorize = 3; - - static dispatch_queue_t queue; -- (instancetype)init -{ +- (instancetype)init { self = [super init]; if (self) { @@ -225,6 +219,12 @@ - (void) setSessionData:(RSUserSession *) userSession { }); } +- (void)setConsentData:(NSArray *)deniedConsentIds { + dispatch_async(queue, ^{ + self->consentManagement = @{@"deniedConsentIds": deniedConsentIds}; + }); +} + - (NSDictionary *)dict { NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init]; dispatch_sync(queue, ^{ @@ -252,6 +252,9 @@ - (void) setSessionData:(RSUserSession *) userSession { [tempDict setObject:@YES forKey:@"sessionStart"]; } } + if (consentManagement != nil) { + [tempDict setObject:consentManagement forKey:@"consentManagement"]; + } }); return [tempDict copy]; } diff --git a/Sources/Classes/RSDeviceInfo.m b/Sources/Classes/RSDeviceInfo.m index 4c5c0b0f..15e1d8cc 100644 --- a/Sources/Classes/RSDeviceInfo.m +++ b/Sources/Classes/RSDeviceInfo.m @@ -9,6 +9,7 @@ #import "RSDeviceInfo.h" #import "RSContext.h" #import +#import "RSConstants.h" #if TARGET_OS_WATCH #import #endif diff --git a/Sources/Classes/RSMessage.m b/Sources/Classes/RSMessage.m index 901af753..7b5d9acc 100644 --- a/Sources/Classes/RSMessage.m +++ b/Sources/Classes/RSMessage.m @@ -77,7 +77,7 @@ - (instancetype)init - (void)updateContext:(RSContext *)context { if (context != nil) { - self.context = context; + _context = context; } } @@ -95,6 +95,8 @@ - (void)setRudderOption:(RSOption *)option { } - (void) setSessionData: (RSUserSession*) userSession { - [_context setSessionData:userSession]; + if (_context != nil) { + [_context setSessionData:userSession]; + } } @end diff --git a/Tests/ConserFilterHandlerTests.swift b/Tests/ConserFilterHandlerTests.swift index 19261704..fd2e43d2 100644 --- a/Tests/ConserFilterHandlerTests.swift +++ b/Tests/ConserFilterHandlerTests.swift @@ -60,40 +60,13 @@ final class ConserFilterHandlerTests: XCTestCase { } XCTAssertEqual(filteredDisplayNames, expectedDisplayNames) } - - func test_applyConsents_EmptyDestinationList() { - let expected = [ - "test_destination_1": true as NSObject, - "test_destination_2": false as NSObject, - "test_destination_4": false as NSObject, - "test_destination_5": false as NSObject - ] - - let options = RSOption() - options.putIntegration("test_destination_1", isEnabled: true) - options.putIntegration("test_destination_2", isEnabled: true) - - let message = RSMessageBuilder() - .setEventName("Test Track") - .setRSOption(options) - .build() - - let serverConfig = RSServerConfigSource() - let consentFilterHandler = RSConsentFilterHandler.initiate(TestConsentFilter(), withServerConfig: serverConfig) - let updatedMessage = consentFilterHandler.applyConsents(message) - XCTAssertNotNil(updatedMessage) - XCTAssertEqual(updatedMessage.event, "Test Track") - XCTAssertEqual(updatedMessage.integrations, expected) - } - - func test_applyConsents() { + func test_applyConsents_Integrations() { let expected = [ "test_destination_1": false as NSObject, - "test_destination_2": false as NSObject, - "test_destination_4": false as NSObject, - "test_destination_22": true as NSObject, - "test_destination_5": false as NSObject + "test_destination_2": true as NSObject, + "test_destination_4": true as NSObject, + "test_destination_22": true as NSObject ] var serverConfig = RSServerConfigSource() @@ -117,13 +90,30 @@ final class ConserFilterHandlerTests: XCTestCase { XCTAssertEqual(updatedMessage.integrations, expected) } + func test_applyConsents() { + let expected = ["CAT03", "CAT05", "CAT08"] + + RSElementCache.initiate() + let message = RSMessageBuilder() + .setEventName("Test Track") + .build() + + let serverConfig = RSServerConfigSource() + let consentFilterHandler = RSConsentFilterHandler.initiate(TestConsentFilter(), withServerConfig: serverConfig) + + let updatedMessage = consentFilterHandler.applyConsents(message) + XCTAssertNotNil(updatedMessage) + XCTAssertEqual(updatedMessage.event, "Test Track") + let consentManagement = (updatedMessage.context.dict()["consentManagement"] as! [String: [String]])["deniedConsentIds"] + XCTAssertEqual(Set(consentManagement!), Set(expected)) + } + func test_applyConsents_ThreadSafety() { let expected = [ "test_destination_1": false as NSObject, - "test_destination_2": false as NSObject, - "test_destination_4": false as NSObject, - "test_destination_22": true as NSObject, - "test_destination_5": false as NSObject + "test_destination_2": true as NSObject, + "test_destination_4": true as NSObject, + "test_destination_22": true as NSObject ] var serverConfig = RSServerConfigSource() @@ -180,4 +170,8 @@ class TestConsentFilter: RSConsentFilter { func filterConsentedDestinations(_ destinations: [RSServerDestination]) -> [String: NSNumber]? { return ["test_destination_2": NSNumber(booleanLiteral: false), "test_destination_4": NSNumber(booleanLiteral: false), "test_destination_5": NSNumber(booleanLiteral: false)] } + + func getConsentCategoriesDict() -> [String : NSNumber]? { + return ["CAT01": true, "CAT02": true, "CAT03": false, "CAT04": true, "CAT05": false, "CAT06": true, "CAT07": true, "CAT08": false] + } }