YH_AnalyticsLogicTests.m 8.22 KB
//
//  YH_AnalyticsLogicTests.m
//  YH_Analytics
//
//  Created by Zhou Rongjun on 15/4/16.
//  Copyright (c) 2015年 YOHO. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#import "YHCrashReporter.h"
#import "YHAssemblyAssistant.h"
#import "YH_Analytics.h"
#import "YHEvent.h"
#import "YHError.h"

@interface YH_Analytics (XCTestCase)

@property (assign, nonatomic) YHLogStrategy logStrategy;
@property (assign, nonatomic) NSTimeInterval currentInterval;

@end

@interface YH_AnalyticsLogicTests : XCTestCase {
@private
    id assemblyAssistantMock;
    id crashReporterMock;
    YH_Analytics *analytics;
}

@end

@implementation YH_AnalyticsLogicTests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
    // 开始每个测试时,恢复初始化设置
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyUserDefaultsLastUploadTimestamp];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyUserDefaultsLogStrategy];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyUserDefaultsCustomInterval];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    assemblyAssistantMock = OCMClassMock([YHAssemblyAssistant class]);
    OCMStub([assemblyAssistantMock sharedInstance]).andReturn(assemblyAssistantMock);
    
    crashReporterMock = OCMClassMock([YHCrashReporter class]);
    OCMStub([crashReporterMock sharedInstance]).andReturn(crashReporterMock);
    
    analytics = [[YH_Analytics alloc] init];
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    assemblyAssistantMock = nil;
    crashReporterMock = nil;
    analytics = nil;

    [super tearDown];
}

+ (void)tearDown {
    // 结束时恢复初始化设置
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyUserDefaultsLastUploadTimestamp];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyUserDefaultsLogStrategy];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyUserDefaultsCustomInterval];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    [super tearDown];
}

#pragma mark - 行为测试
#pragma mark -
- (void)testStartWithAppIdMethod {
    NSLog(@"%@ start", self.name);
    
    OCMExpect(ClassMethod([crashReporterMock sharedInstance]));
    OCMExpect([assemblyAssistantMock prepareImmediUploadDic:@"appId" sessionId:[OCMArg any]]);
    
    [analytics startWithAppId:@"appId"];
    
    OCMVerify(ClassMethod([crashReporterMock sharedInstance]));
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testStartWithAppIdMethodWithLogStrategyAppLaunch {
    NSLog(@"%@ start", self.name);

    analytics.logStrategy = LogStrategyAppLaunch;

    OCMExpect([assemblyAssistantMock uploadDiskData]);
    
    [analytics startWithAppId:@"appId"];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testStartWithAppIdMethodWithLogStrategyCustom {
    NSLog(@"%@ start", self.name);

    analytics.logStrategy = LogStrategyCustom;
    analytics.currentInterval = 100;
    
    OCMExpect([assemblyAssistantMock uploadDiskData]);
    
    [analytics startWithAppId:@"appId"];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testStartWithAppIdMethodWithLogStrategyImmedi {
    NSLog(@"%@ start", self.name);
    
    analytics.logStrategy = LogStrategyImmedi;
    
    [[assemblyAssistantMock reject] uploadDiskData];
    
    [analytics startWithAppId:@"appId"];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

#pragma mark -
- (void)testLogEventMethodWithSpecailEvent {
    NSLog(@"%@ start", self.name);

    NSString *eventId = @"eventId";
    NSDictionary *param = @{@"key":@"value"};

    [analytics logEvent:eventId parameters:param];

    XCTAssertEqual(analytics.event.op, eventId);
    XCTAssertEqual(analytics.event.param, param);
    
    NSLog(@"%@ end", self.name);
}

- (void)testLogEventMethodWithLogStrategyImmedi {
    NSLog(@"%@ start", self.name);

    analytics.logStrategy = LogStrategyImmedi;
    
    OCMExpect([assemblyAssistantMock uploadImmedilyWithEvent:[OCMArg isKindOfClass:[YHEvent class]]]);
    
    [analytics logEvent:@"eventId" parameters:nil];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testLogEventMethodWithLogStrategyAppLaunch {
    NSLog(@"%@ start", self.name);
    
    analytics.logStrategy = LogStrategyAppLaunch;
    
    OCMExpect([assemblyAssistantMock saveItemData:[OCMArg isKindOfClass:[YHEvent class]]]);
    
    [analytics logEvent:@"eventId" parameters:nil];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testLogEventMethodWithLogStrategyCustom {
    NSLog(@"%@ start", self.name);
    
    analytics.logStrategy = LogStrategyCustom;
    
    OCMExpect([assemblyAssistantMock saveItemData:[OCMArg isKindOfClass:[YHEvent class]]]);
    
    [analytics logEvent:@"eventId" parameters:nil];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

#pragma mark -
- (void)testLogErrorMethodWithSpecailError {
    NSLog(@"%@ start", self.name);

    NSString *errorId = @"errorId";
    NSDictionary *param = @{@"key":@"value"};
    
    [analytics logError:errorId parameters:param];
    
    XCTAssertEqual(analytics.error.et, errorId);
    XCTAssertEqual(analytics.error.param, param);
    
    NSLog(@"%@ end", self.name);
}

- (void)testLogErrorMethodWithLogStrategyImmedi {
    NSLog(@"%@ start", self.name);
    
    analytics.logStrategy = LogStrategyImmedi;
    
    OCMExpect([assemblyAssistantMock uploadImmedilyWithEvent:[OCMArg isKindOfClass:[YHError class]]]);
    
    [analytics logError:@"errorId" parameters:nil];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testLogErrorMethodWithLogStrategyAppLaunch {
    NSLog(@"%@ start", self.name);
    
    analytics.logStrategy = LogStrategyAppLaunch;
    
    OCMExpect([assemblyAssistantMock saveItemData:[OCMArg isKindOfClass:[YHError class]]]);
    
    [analytics logError:@"errorId" parameters:nil];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testLogErrorMethodWithLogStrategyCustom {
    NSLog(@"%@ start", self.name);
    
    analytics.logStrategy = LogStrategyCustom;
    
    OCMExpect([assemblyAssistantMock saveItemData:[OCMArg isKindOfClass:[YHError class]]]);
    
    [analytics logError:@"errorId" parameters:nil];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

#pragma mark -
- (void)testUpdateLogStrategyMethodWithAppLaunch {
    NSLog(@"%@ start", self.name);
    
    [analytics updateLogStrategy:LogStrategyAppLaunch customInterval:0];
    YHLogStrategy logStrategy = [[[NSUserDefaults standardUserDefaults] objectForKey:kKeyUserDefaultsLogStrategy] intValue];
    NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:kKeyUserDefaultsCustomInterval];
    XCTAssertEqual(logStrategy, LogStrategyAppLaunch);
    XCTAssertEqual(interval, 0);
    
    NSLog(@"%@ end", self.name);
}

- (void)testUpdateLogStrategyMethodWithImmediate{
    NSLog(@"%@ start", self.name);
    
    [analytics updateLogStrategy:LogStrategyImmedi customInterval:0];
    YHLogStrategy logStrategy = [[[NSUserDefaults standardUserDefaults] objectForKey:kKeyUserDefaultsLogStrategy] intValue];
    NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:kKeyUserDefaultsCustomInterval];
    XCTAssertEqual(logStrategy, LogStrategyImmedi);
    XCTAssertEqual(interval, 0);
    
    NSLog(@"%@ end", self.name);
}

- (void)testUpdateLogStrategyMethodWithCustom {
    NSLog(@"%@ start", self.name);
    
    [analytics updateLogStrategy:LogStrategyCustom customInterval:100];
    YHLogStrategy logStrategy = [[[NSUserDefaults standardUserDefaults] objectForKey:kKeyUserDefaultsLogStrategy] intValue];
    NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:kKeyUserDefaultsCustomInterval];
    XCTAssertEqual(logStrategy, LogStrategyCustom);
    XCTAssertEqual(interval, 100);
    
    NSLog(@"%@ end", self.name);
}

@end