YH_AnalyticsLogicTests.m 8.26 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 "OCMock.h"
#import <CoreLocation/CoreLocation.h>
#import "YHCrashReporter.h"
#import "YHAssemblyAssistant.h"
#import "YH_Analytics.h"
#import "YHEvent.h"

#import "FakeLocationManager.h"

@interface YH_AnalyticsLogicTests : XCTestCase {
@private
    id assemblyAssistantMock;
    id crashReporterMock;
    id networkAssistantMock;
    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] setObject:@"0" forKey:kKeyUserDefaultsLastUploadTimestamp];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    assemblyAssistantMock = OCMClassMock([YHAssemblyAssistant class]);
    OCMStub([assemblyAssistantMock sharedInstance]).andReturn(assemblyAssistantMock);
    
    crashReporterMock = OCMClassMock([YHCrashReporter class]);
    OCMStub([crashReporterMock sharedInstance]).andReturn(crashReporterMock);
    
    networkAssistantMock = OCMClassMock([YHNetworkAssistant class]);
    OCMStub([networkAssistantMock sharedInstance]).andReturn(networkAssistantMock);
    
    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;
    networkAssistantMock = nil;
    analytics = nil;

    [super tearDown];
}

+ (void)tearDown {
    // 结束时恢复初始化设置
    [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:kKeyUserDefaultsLastUploadTimestamp];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    [super tearDown];
}

#pragma mark - 行为测试

- (void)testStartWithAppIdMethod {
    NSLog(@"%@ start", self.name);
    
    OCMExpect([networkAssistantMock addReachabilityChangedHandler:[OCMArg any]]);
    OCMExpect(ClassMethod([crashReporterMock sharedInstance]));
    OCMExpect([assemblyAssistantMock prepareImmediUploadDic]);
    
    [analytics startWithAppId:@"appId"];
    
    OCMVerifyAll(networkAssistantMock);
    OCMVerify(ClassMethod([crashReporterMock sharedInstance]));
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testStartWithAppIdMethodReceiveNotification {
    NSLog(@"%@ start", self.name);
    
//    NSNotificationCenter *center = [[NSNotificationCenter alloc] init];
//    id observerMock = [OCMockObject observerMock];
//    
//    [center addMockObserver:observerMock name:UIApplicationWillEnterForegroundNotification object:nil];
//    [[observerMock expect] notificationWithName:UIApplicationWillEnterForegroundNotification object:[OCMArg any]];
    
    
    
    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;
    
    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);
}

- (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);
}

- (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 - Test Location Sevice

- (void)testLocationUpdateSuccess {
    NSLog(@"%@ start", self.name);
    
    analytics.locationManager = [[FakeLocationManager alloc] init];
    analytics.locationManager.delegate = analytics;
    CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];

    [[[assemblyAssistantMock expect] andReturnValue:@YES] updateLocation:newLocation];
    OCMExpect([assemblyAssistantMock updateImmediUploadDic]);
    
    [analytics startWithAppId:@"appId"];
    [(FakeLocationManager *)analytics.locationManager updateLocation:newLocation oldLocation:nil];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}

- (void)testLocationUpdateFailed {
    NSLog(@"%@ start", self.name);
    
    analytics.locationManager = [[FakeLocationManager alloc] init];
    analytics.locationManager.delegate = analytics;
    CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
    
    [[[assemblyAssistantMock expect] andReturnValue:@NO] updateLocation:newLocation];
    [[assemblyAssistantMock reject] updateImmediUploadDic];
    
    [analytics startWithAppId:@"appId"];
    [(FakeLocationManager *)analytics.locationManager updateLocation:newLocation oldLocation:nil];
    
    OCMVerifyAll(assemblyAssistantMock);
    
    NSLog(@"%@ end", self.name);
}
@end