1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//
// GMPhotoTest.m
// GMPhobos
//
// Created by Thierry on 16/1/28.
// Copyright © 2016年 licong. All rights reserved.
//
#import <XCTest/XCTest.h>
#import <GMPhobos/Phobos.h>
#import <GMCache/WMCacheService.h>
#define PhobosCacheKey @"PhobosCacheKey"
NSString *const MockAppName = @"gengmei_test";
NSString *const MockChannelId = @"AppStore";
NSString *const MockEventId = @"eventId";
NSInteger const MockUserId = 1;
NSString *const MockCityId = @"beijing";
@interface GMPhotoTest : XCTestCase
@property Phobos *client;
@property WMCacheService *cache;
@end
@implementation GMPhotoTest
- (void)setUp {
[super setUp];
_client = [Phobos clientWithAppName:MockAppName channelId:MockChannelId];
[Phobos setSharedClient:_client];
_cache = [WMCacheService sharedInstance];
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
[_cache removeObjectAtDiskWithkey:PhobosCacheKey];
}
/**
* @brief 测试有用户ID的时候,埋点事件是否正确
*
* @since <#version number#>
*/
- (void)testClientWithUserId{
[_client setUserId:MockUserId];
[_client setCurrentCityId:MockCityId];
[Phobos track:MockEventId];
NSArray *array = [_cache fetchObjectAtDiskWithkey:PhobosCacheKey];
XCTAssertTrue(array.count == 1, @"array is empty");
NSDictionary *dict = [array objectAtIndex:0];
[self verfiyDict:dict];
XCTAssertTrue([[dict objectForKey:@"user_id"] integerValue] == MockUserId, @"Invalid user_id value");
}
/**
* @brief 测试发送不带参数事件成功 (由之前的实例方法变成类方法)
*
* @since <#version number#>
*/
- (void)testTrackEventWithoutAttr{
[Phobos track:MockEventId];
NSArray *array = [_cache fetchObjectAtDiskWithkey:PhobosCacheKey];
XCTAssertTrue(array.count == 1, @"array is empty");
NSDictionary *dict = [array objectAtIndex:0];
[self verfiyDict:dict];
}
/**
* @brief 测试发送带参数事件成功
*
* @since <#version number#>
*/
- (void)testTrackEventWithAttr{
NSDictionary *attr = @{@"attr":@"track_attr"};
[Phobos track:MockEventId attributes:attr];
NSArray *array = [_cache fetchObjectAtDiskWithkey:PhobosCacheKey];
XCTAssertTrue(array.count == 1, @"array is empty");
NSDictionary *dict = [array objectAtIndex:0];
[self verfiyDict:dict];
//验证Param的值是否正确
NSString *value = [[dict valueForKey:@"params"] valueForKey:@"attr"];
XCTAssertTrue([value isEqualToString:@"track_attr"], @"Invalid event attributes");
}
/**
* @brief 测试立即发送带参数事件成功
*
* @since <#version number#>
*/
- (void)testTrackEventWithAttrAndSendNow{
// Given
NSDictionary *attr = @{@"attr":@"track_attr"};
// When
[Phobos track:MockEventId attributes:attr sendNow:YES];
// Then
NSArray *array = [_cache fetchObjectAtDiskWithkey:PhobosCacheKey];
XCTAssertTrue(array.count == 0, @"array should be empty");
}
- (void)verfiyDict:(NSDictionary *)dict{
NSArray *keys = [dict allKeys];
XCTAssertTrue([keys containsObject:@"type"], @"Missing type");
XCTAssertTrue([keys containsObject:@"app"], @"Missing app");
XCTAssertTrue([keys containsObject:@"version"], @"Missing version");
XCTAssertTrue([keys containsObject:@"device"], @"Missing device");
XCTAssertTrue([keys containsObject:@"user_id"], @"Missing user_id");
XCTAssertTrue([keys containsObject:@"create_at"], @"Missing create_at");
XCTAssertTrue([keys containsObject:@"params"], @"Missing params");
}
- (void)testOnPageStartThenOnPageEnd {
[_client onPageStart:nil businessId:nil referer:nil];
NSDictionary *pageEnterParam1 = [_client valueForKey:@"_pageEnterParam"];
XCTAssertTrue(pageEnterParam1 != nil, @"pageEnterParam 应该实例化成功");
XCTAssertTrue(pageEnterParam1.allKeys.count == 4, @"pageEnterParam 应该有4个key");
[_client onPageStart:@"aaa" businessId:@"adf" referer:nil];
NSDictionary *pageEnterParam2 = [_client valueForKey:@"_pageEnterParam"];
XCTAssertTrue(pageEnterParam2 != nil, @"pageEnterParam 应该实例化成功");
XCTAssertTrue(pageEnterParam2.allKeys.count == 4, @"pageEnterParam 应该有4个key");
[_client onPageEnd];
[self paramUnNilCheck];
NSDictionary *pageEnterParam3 = [_client valueForKey:@"_pageEnterParam"];
XCTAssertTrue(pageEnterParam3.allKeys.count == 0, @"pageEnterParam 应该在onPageEnd后为空的");
}
// 某种情况下没有先走 onPageStart,只走了OnPageEnd,此时数据应该完整,某个key对应的value可以是空
- (void)testOnPageEnd {
[_client setValue:nil forKey:@"_pageEnterParam"];
[_client onPageEnd];
[self paramUnNilCheck];
}
- (void)testSimulativePageViewEvent {
[_client simulativePageViewEventWithPageName:nil BusinessId:nil referer:nil];
[self paramUnNilCheck];
}
- (void)paramUnNilCheck {
NSArray *array = [[WMCacheService sharedInstance] fetchObjectAtDiskWithkey:PhobosCacheKey];
XCTAssertTrue(array.count != 0, @"PhobosCacheKey 下面应该有数据");
NSDictionary *dic = array[0][@"params"];
XCTAssertTrue(dic[@"page_name"] != nil, @"page_name至少使用默认的空字符串");
XCTAssertTrue(dic[@"referer"] != nil, @"referer至少使用默认的空字符串");
XCTAssertTrue(dic[@"business_id"] != nil, @"business_id至少使用默认的空字符串");
}
@end