Skip to content

Commit

Permalink
added missing unit test for [AMAReporter privacyTimerDidFire:]
Browse files Browse the repository at this point in the history
2d3ffb7f723d0eeba20bc557cad2c66ea4f92c1f
  • Loading branch information
alex-oleynik committed May 21, 2024
1 parent 2456d2f commit b70e855
Show file tree
Hide file tree
Showing 9 changed files with 182 additions and 12 deletions.
2 changes: 2 additions & 0 deletions .mapping.json
Original file line number Diff line number Diff line change
Expand Up @@ -1106,6 +1106,8 @@
"AppMetricaCore/Tests/Utilities/AMAReportHostProviderMock.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Tests/Utilities/AMAReportHostProviderMock.m",
"AppMetricaCore/Tests/Utilities/AMAReportRequestMock.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Tests/Utilities/AMAReportRequestMock.h",
"AppMetricaCore/Tests/Utilities/AMAReportRequestMock.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Tests/Utilities/AMAReportRequestMock.m",
"AppMetricaCore/Tests/Utilities/AMAReporter+TestUtilities.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Tests/Utilities/AMAReporter+TestUtilities.h",
"AppMetricaCore/Tests/Utilities/AMAReporter+TestUtilities.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Tests/Utilities/AMAReporter+TestUtilities.m",
"AppMetricaCore/Tests/Utilities/AMAReporterTestHelper.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Tests/Utilities/AMAReporterTestHelper.h",
"AppMetricaCore/Tests/Utilities/AMAReporterTestHelper.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Tests/Utilities/AMAReporterTestHelper.m",
"AppMetricaCore/Tests/Utilities/AMARevenueInfoMutableModel.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Tests/Utilities/AMARevenueInfoMutableModel.h",
Expand Down
13 changes: 7 additions & 6 deletions AppMetricaCore/Sources/Reporter/AMAReporter.m
Original file line number Diff line number Diff line change
Expand Up @@ -79,24 +79,25 @@ - (instancetype)initWithApiKey:(NSString *)apiKey
attributionCheckExecutor:(id<AMAAsyncExecuting>)attributionCheckExecutor
{
AMACancelableDelayedExecutor *executor = [[AMACancelableDelayedExecutor alloc] initWithIdentifier:self];

AMAAdServicesDataProvider *adServicesDataProvider = nil;
if (@available(iOS 14.3, *)) {
adServicesDataProvider = [[AMAAdServicesDataProvider alloc] init];
}

AMAAdProvider *adProvider = [AMAAdProvider sharedInstance];

AMASessionExpirationHandler *sessionExpirationHandler =
[[AMASessionExpirationHandler alloc] initWithConfiguration:[AMAMetricaConfiguration sharedInstance]
APIKey:apiKey];

AMAAdProvider *adProvider = [AMAAdProvider sharedInstance];
AMAMetrikaPrivacyTimerStorage *timerStorage =
[[AMAMetrikaPrivacyTimerStorage alloc] initWithReporterMetricaConfiguration:[AMAMetricaConfiguration sharedInstance]
stateStorage:reporterStorage.stateStorage];
AMAPrivacyTimer *privacyTimer = [[AMAPrivacyTimer alloc] initWithTimerStorage:timerStorage
delegateExecutor:executor
adProvider:adProvider];

AMAAdServicesDataProvider *adServicesDataProvider = nil;
if (@available(iOS 14.3, *)) {
adServicesDataProvider = [[AMAAdServicesDataProvider alloc] init];
}

return [self initWithApiKey:apiKey
main:main
reporterStorage:reporterStorage
Expand Down
37 changes: 37 additions & 0 deletions AppMetricaCore/Tests/AMAReporterTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@
#import "AMAEventFirstOccurrenceController.h"
#import "AMAEventValueFactory.h"
#import "AMAExtrasContainer.h"
#import "AMAPrivacyTimer.h"
#import "AMAPrivacyTimerStorage.h"
#import "AMAAdProvider.h"
#import "AMAPrivacyTimerStorageMock.h"
#import "AMAIdentifiersTestUtilities.h"

@interface AMAReporterStorage (Test)

Expand Down Expand Up @@ -1811,6 +1816,38 @@ @interface AMAReporterStorage (Test)
});
#endif
});

context(@"Privacy manifest", ^{
NSUUID *newIDFA = [NSUUID UUID];

__block id reporter = nil;
__block AMAPrivacyTimerStorageMock *privacyStorageMock;

beforeEach(^{
reporter = [reporterTestHelper appReporterForApiKey:apiKey];
privacyStorageMock = [reporterTestHelper privacyTimerStorageMockForApiKey:apiKey];

AMAAdProvider *provider = [reporterTestHelper adProviderForApiKey:apiKey];
[provider stub:@selector(isAdvertisingTrackingEnabled) andReturn:theValue(YES)];
[AMAIdentifiersTestUtilities stubIdfaWithEnabled:YES value:newIDFA.UUIDString];

id<AMADatabaseProtocol> db = [reporterTestHelper databaseForApiKey:apiKey];
privacyStorageMock.isResendPeriodOutdated = YES;


[reporter resumeSession];
[reporter privacyTimerDidFire:[reporterTestHelper privacyTimerForApiKey:apiKey]];
});

it(@"Should fire event if tracking is enabled", ^{
[[[eventStorage() amatest_savedEventWithType:AMAEventTypeApplePrivacy] should] beNonNil];
});

it(@"Should update IDFA if tracking enabled", ^{
[[[sessionStorage() lastSessionWithError:nil].appState.IFA should] equal:newIDFA.UUIDString];
});
});

});

SPEC_END
1 change: 1 addition & 0 deletions AppMetricaCore/Tests/Utilities/AMAPrivacyTimerMock.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ NS_ASSUME_NONNULL_BEGIN

@property (nonatomic, strong, nullable) NSLock *onTimerLock;
@property (nonatomic, strong, nullable) XCTestExpectation *onTimerExpectation;
@property (nonatomic) BOOL disableFire;

@end

Expand Down
9 changes: 9 additions & 0 deletions AppMetricaCore/Tests/Utilities/AMAPrivacyTimerMock.m
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,21 @@
@interface AMAPrivacyTimer (Private)

- (void)multitimerDidFire:(AMAMultitimer *)multitimer;
- (void)fireEvent;

@end


@implementation AMAPrivacyTimerMock

- (void)fireEvent
{
if (self.disableFire) {
return;
}
[super fireEvent];
}

- (void)multitimerDidFire:(AMAMultitimer *)multitimer
{
[self.onTimerLock lock];
Expand Down
19 changes: 19 additions & 0 deletions AppMetricaCore/Tests/Utilities/AMAReporter+TestUtilities.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

#import <Foundation/Foundation.h>
#import "AMAReporter.h"

NS_ASSUME_NONNULL_BEGIN

@interface AMAReporter (TestUtilities)

- (instancetype)initWithApiKey:(NSString *)apiKey
main:(BOOL)main
reporterStorage:(AMAReporterStorage *)reporterStorage
eventBuilder:(AMAEventBuilder *)eventBuilder
internalReporter:(AMAInternalEventsReporter *)internalReporter
attributionCheckExecutor:(id<AMAAsyncExecuting>)attributionCheckExecutor
privacyTimer:(AMAPrivacyTimer *)privacyTimer;

@end

NS_ASSUME_NONNULL_END
50 changes: 50 additions & 0 deletions AppMetricaCore/Tests/Utilities/AMAReporter+TestUtilities.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@

#import "AMAReporter+TestUtilities.h"
#import "AMAAdServicesDataProvider.h"
#import "AMASessionExpirationHandler.h"
#import "AMAMetricaConfiguration.h"
#import "AMAAdProvider.h"
#import "AMAECommerceSerializer.h"
#import "AMAECommerceTruncator.h"
#import "AMAExternalAttributionSerializer.h"

@implementation AMAReporter (TestUtilities)

- (instancetype)initWithApiKey:(NSString *)apiKey
main:(BOOL)main
reporterStorage:(AMAReporterStorage *)reporterStorage
eventBuilder:(AMAEventBuilder *)eventBuilder
internalReporter:(AMAInternalEventsReporter *)internalReporter
attributionCheckExecutor:(id<AMAAsyncExecuting>)attributionCheckExecutor
privacyTimer:(AMAPrivacyTimer *)privacyTimer
{
AMACancelableDelayedExecutor *executor = [[AMACancelableDelayedExecutor alloc] initWithIdentifier:self];

AMAAdServicesDataProvider *adServicesDataProvider = nil;
if (@available(iOS 14.3, *)) {
adServicesDataProvider = [[AMAAdServicesDataProvider alloc] init];
}

AMASessionExpirationHandler *sessionExpirationHandler =
[[AMASessionExpirationHandler alloc] initWithConfiguration:[AMAMetricaConfiguration sharedInstance]
APIKey:apiKey];

AMAAdProvider *adProvider = [AMAAdProvider sharedInstance];

return [self initWithApiKey:apiKey
main:main
reporterStorage:reporterStorage
eventBuilder:eventBuilder
internalReporter:internalReporter
executor:executor
attributionCheckExecutor:attributionCheckExecutor
eCommerceSerializer:[[AMAECommerceSerializer alloc] init]
eCommerceTruncator:[[AMAECommerceTruncator alloc] init]
adServices:adServicesDataProvider
externalAttributionSerializer:[[AMAExternalAttributionSerializer alloc] init]
sessionExpirationHandler:sessionExpirationHandler
adProvider:adProvider
privacyTimer:privacyTimer];
}

@end
6 changes: 6 additions & 0 deletions AppMetricaCore/Tests/Utilities/AMAReporterTestHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
@class AMAReporter;
@class AMAEventBuilder;
@class AMAAppMetricaPreloadInfo;
@class AMAPrivacyTimerStorageMock;
@class AMAPrivacyTimer;
@class AMAAdProvider;
@protocol AMACancelableExecuting;
@protocol AMADatabaseProtocol;
@protocol AMAAsyncExecuting;
Expand Down Expand Up @@ -48,6 +51,9 @@
attributionCheckExecutor:(id<AMAAsyncExecuting>)attributionCheckExecutor;

- (NSObject<AMADatabaseProtocol> *)databaseForApiKey:(NSString *)apiKey;
- (AMAPrivacyTimerStorageMock *)privacyTimerStorageMockForApiKey:(NSString *)apiKey;
- (AMAPrivacyTimer *)privacyTimerForApiKey:(NSString *)apiKey;
- (AMAAdProvider *)adProviderForApiKey:(NSString*)apiKey;

- (void)initReporterAndSendEventWithParameters:(NSDictionary *)parameters;
- (void)initReporterAndSendEventWithParameters:(NSDictionary *)parameters async:(BOOL)isAsync;
Expand Down
57 changes: 51 additions & 6 deletions AppMetricaCore/Tests/Utilities/AMAReporterTestHelper.m
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,19 @@
#import "AMAPrivacyTimer.h"
#import "AMAPrivacyTimerStorage.h"
#import "AMAExternalAttributionSerializer.h"
#import "AMAPrivacyTimerStorageMock.h"
#import "AMAPrivacyTimerMock.h"
#import "AMAReporter+TestUtilities.h"

@interface AMAReporterTestHelper ()

@property (nonatomic, strong, readonly) AMAReporterStoragesContainer *storagesContainer;
@property (nonatomic, strong, readonly) NSMutableDictionary<NSString *, AMAReporter *> *reporters;
@property (nonatomic, strong, readonly) NSMutableDictionary<NSString *, NSObject<AMADatabaseProtocol> *> *databases;
@property (nonatomic, strong, readonly) NSMutableDictionary<NSString *, AMAReporterStorage *> *reporterStorages;
@property (nonatomic, strong, readonly) NSMutableDictionary<NSString *, AMAPrivacyTimer *> *privacyTimers;
@property (nonatomic, strong, readonly) NSMutableDictionary<NSString *, AMAPrivacyTimerStorageMock *> *privacyTimerStorages;
@property (nonatomic, strong, readonly) NSMutableDictionary<NSString *, AMAAdProvider *> *adProviders;

@end

Expand All @@ -48,6 +54,9 @@ - (instancetype)init
_reporters = [NSMutableDictionary dictionary];
_databases = [NSMutableDictionary dictionary];
_reporterStorages = [NSMutableDictionary dictionary];
_adProviders = [NSMutableDictionary dictionary];
_privacyTimerStorages = [NSMutableDictionary dictionary];
_privacyTimers = [NSMutableDictionary dictionary];

__weak __typeof(self) weakSelf = self;
[_storagesContainer stub:@selector(storageForApiKey:) withBlock:^id(NSArray *params) {
Expand Down Expand Up @@ -164,20 +173,27 @@ - (AMAReporter *)appReporterForApiKey:(NSString *)apiKey
AMASessionExpirationHandler *expirationHandler =
[[AMASessionExpirationHandler alloc] initWithConfiguration:[AMAMetricaConfiguration sharedInstance]
APIKey:apiKey];

AMAAdProvider *adProvider = [self adProviderForApiKey:apiKey];
AMAPrivacyTimerStorageMock *privacyStorage = [self privacyTimerStorageMockForApiKey:apiKey];
AMAPrivacyTimerMock *privacyTimer = [[AMAPrivacyTimerMock alloc] initWithTimerStorage:privacyStorage
delegateExecutor:executor
adProvider:adProvider];
privacyTimer.disableFire = YES;

_privacyTimers[apiKey] = privacyTimer;
AMAReporter *reporter = nil;
if (executor == nil) {
reporter = [[AMAReporter alloc] initWithApiKey:apiKey
main:main
reporterStorage:reporterStorage
eventBuilder:builder
internalReporter:[AMAInternalEventsReporter nullMock]
attributionCheckExecutor:attributionCheckExecutor];
attributionCheckExecutor:attributionCheckExecutor
privacyTimer:privacyTimer];
}
else {
AMAMetrikaPrivacyTimerStorage *privacyStorage = [[AMAMetrikaPrivacyTimerStorage alloc] init];
AMAPrivacyTimer *privacyTimer = [[AMAPrivacyTimer alloc] initWithTimerStorage:privacyStorage
delegateExecutor:executor
adProvider:[AMAAdProvider sharedInstance]];

reporter = [[AMAReporter alloc] initWithApiKey:apiKey
main:main
reporterStorage:reporterStorage
Expand All @@ -190,7 +206,7 @@ - (AMAReporter *)appReporterForApiKey:(NSString *)apiKey
adServices:[AMAAdServicesDataProvider nullMock]
externalAttributionSerializer:[AMAExternalAttributionSerializer nullMock]
sessionExpirationHandler:expirationHandler
adProvider:[AMAAdProvider sharedInstance]
adProvider:adProvider
privacyTimer:privacyTimer];
}
#pragma clang diagnostic push
Expand All @@ -203,6 +219,24 @@ - (AMAReporter *)appReporterForApiKey:(NSString *)apiKey
return reporter;
}

- (AMAPrivacyTimerStorageMock *)privacyTimerStorageMockForApiKey:(NSString *)apiKey
{
AMAPrivacyTimerStorageMock *storage = self.privacyTimerStorages[apiKey];
if (storage != nil)
{
return storage;
}

storage = [[AMAPrivacyTimerStorageMock alloc] init];
_privacyTimerStorages[apiKey] = storage;
return storage;
}

- (AMAPrivacyTimer *)privacyTimerForApiKey:(NSString *)apiKey
{
return self.privacyTimers[apiKey];
}

- (AMAReporterStorage *)reporterStorageForApiKey:(NSString *)apiKey inMemory:(BOOL)inMemory
{
if (self.reporterStorages[apiKey] != nil) {
Expand Down Expand Up @@ -240,6 +274,17 @@ - (AMAReporterStorage *)reporterStorageForApiKey:(NSString *)apiKey inMemory:(BO
return reporterStorage;
}

- (AMAAdProvider *)adProviderForApiKey:(NSString*)apiKey
{
AMAAdProvider *provider = self.adProviders[apiKey];
if (provider != nil) {
return provider;
}
provider = [AMAAdProvider nullMock];
_adProviders[apiKey] = provider;
return provider;
}

- (NSObject<AMADatabaseProtocol> *)databaseForApiKey:(NSString *)apiKey
{
return self.databases[apiKey];
Expand Down

0 comments on commit b70e855

Please sign in to comment.