Skip to content

Commit c2e0ac3

Browse files
committed
fix: fixed the objc tests that failed the request consolidator tests
1 parent 8f46aac commit c2e0ac3

File tree

10 files changed

+113
-94
lines changed

10 files changed

+113
-94
lines changed

DevCycle/DVCUser.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ public class UserBuilder {
7474

7575
public func build() throws -> DVCUser {
7676
guard let _ = self.user.userId,
77-
let _ = self.user.isAnonymous
77+
let _ = self.user.isAnonymous,
78+
self.user.userId != ""
7879
else {
7980
throw UserError.MissingUserIdAndIsAnonymousFalse
8081
}

DevCycle/Models/Cache.swift

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import Foundation
99
protocol CacheServiceProtocol {
1010
func load() -> Cache
1111
func save(user: DVCUser)
12-
func save(config: Data)
13-
func save(config: UserConfig)
1412
}
1513

1614
struct Cache {
@@ -41,16 +39,6 @@ class CacheService: CacheServiceProtocol {
4139
return Cache(config: userConfig, user: dvcUser)
4240
}
4341

44-
func save(config: Data) {
45-
let defaults = UserDefaults.standard
46-
defaults.set(config, forKey: CacheKeys.config)
47-
}
48-
49-
func save(config: UserConfig) {
50-
let defaults = UserDefaults.standard
51-
defaults.set(config, forKey: CacheKeys.config)
52-
}
53-
5442
func save(user: DVCUser) {
5543
let defaults = UserDefaults.standard
5644
if let data = try? JSONEncoder().encode(user) {

DevCycle/Networking/DevCycleService.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,6 @@ class DevCycleService: DevCycleServiceProtocol {
197197
}.resume()
198198
}
199199

200-
func makeAndProcessRequest() {
201-
202-
}
203-
204200
func createConfigRequest(user: DVCUser, enableEdgeDB: Bool) -> URLRequest {
205201
var userQueryItems: [URLQueryItem] = user.toQueryItems()
206202
let queryItem = URLQueryItem(name: "enableEdgeDB", value: String(enableEdgeDB))

DevCycle/ObjC/ObjCDVCUser.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,19 @@ public class ObjCUser: NSObject {
1717
@objc public var customData: [String: Any]?
1818
@objc public var privateCustomData: [String: Any]?
1919

20+
public override init() {
21+
self.isAnonymous = true
22+
}
23+
2024
@objc(initializeWithUserId:)
2125
public static func initialize(userId: String?) -> ObjCUser {
2226
let builder = ObjCUser()
23-
builder.userId = userId
27+
if (userId == nil) {
28+
builder.isAnonymous = true
29+
} else {
30+
builder.userId = userId
31+
builder.isAnonymous = false
32+
}
2433
return builder
2534
}
2635

DevCycle/Utils/RequestConsolidator.swift

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,44 +10,73 @@ import Foundation
1010
class RequestConsolidator {
1111
var requestCallbacks: [RequestWithCallback]
1212
var service: DevCycleServiceProtocol
13+
var requestInFlight: Bool
1314

1415
init(service: DevCycleServiceProtocol) {
1516
self.service = service
1617
self.requestCallbacks = []
18+
self.requestInFlight = false
1719
}
1820

1921
func queue(request: URLRequest, callback: @escaping ConfigCompletionHandler) {
20-
let configComplete: ConfigCompletionHandler = { config in
21-
if let lastRequestCallback = self.requestCallbacks.last, lastRequestCallback.request == request {
22-
for requestCallback in self.requestCallbacks {
23-
requestCallback.callback(config)
22+
if (self.requestInFlight) {
23+
self.requestCallbacks.append(
24+
RequestWithCallback(
25+
callback: callback,
26+
request: request
27+
)
28+
)
29+
return
30+
}
31+
32+
self.requestInFlight = true
33+
service.makeRequest(request: request) { response in
34+
if (self.requestCallbacks.isEmpty) {
35+
guard let config = processConfig(response.data) else {
36+
callback((nil, response.error))
37+
return
38+
}
39+
callback((config, response.error))
40+
self.requestInFlight = false
41+
} else {
42+
self.requestCallbacks.insert(
43+
RequestWithCallback(
44+
callback: callback,
45+
request: request
46+
),
47+
at: 0
48+
)
49+
self.makeLastRequestInQueue {
50+
self.requestInFlight = false
2451
}
25-
self.requestCallbacks = []
2652
}
2753
}
28-
self.requestCallbacks.append(
29-
RequestWithCallback(
30-
callback: callback,
31-
request: request,
32-
service: self.service,
33-
finish: configComplete
34-
)
35-
)
54+
}
55+
56+
func makeLastRequestInQueue(complete: (() -> Void)?) {
57+
guard let lastRequest = self.requestCallbacks.last?.request else {
58+
print("No last request to make in queue")
59+
return
60+
}
61+
service.makeRequest(request: lastRequest) { response in
62+
for requestCallback in self.requestCallbacks {
63+
guard let config = processConfig(response.data) else {
64+
requestCallback.callback((nil, response.error))
65+
return
66+
}
67+
requestCallback.callback((config, response.error))
68+
}
69+
self.requestCallbacks = []
70+
complete?()
71+
}
3672
}
3773
}
3874

39-
class RequestWithCallback {
75+
struct RequestWithCallback {
4076
var callback: ConfigCompletionHandler
4177
var request: URLRequest
42-
init(callback: @escaping ConfigCompletionHandler, request: URLRequest, service: DevCycleServiceProtocol, finish: @escaping ConfigCompletionHandler) {
78+
init(callback: @escaping ConfigCompletionHandler, request: URLRequest) {
4379
self.callback = callback
4480
self.request = request
45-
service.makeRequest(request: request) { response in
46-
guard let config = processConfig(response.data) else {
47-
finish((nil, response.error))
48-
return
49-
}
50-
finish((config, response.error))
51-
}
5281
}
5382
}

DevCycleTests/Models/DVCClientTest.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class DVCClientTest: XCTestCase {
116116
}
117117

118118
extension DVCClientTest {
119-
class MockService: DevCycleServiceProtocol {
119+
private class MockService: DevCycleServiceProtocol {
120120
public var publishCallCount: Int = 0
121121

122122
func getConfig(user: DVCUser, enableEdgeDB: Bool, completion: @escaping ConfigCompletionHandler) {

DevCycleTests/Networking/DevCycleServiceTests.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class DevCycleServiceTests: XCTestCase {
3636
}
3737

3838
func testProcessConfigReturnsNilIfMissingProperties() throws {
39-
let service = getService()
4039
let data = "{\"config\":\"key\"}".data(using: .utf8)
4140
let config = processConfig(data)
4241
XCTAssertNil(config)
@@ -63,14 +62,6 @@ extension DevCycleServiceTests {
6362
func save(user: DVCUser) {
6463
self.saveUserCalled = true
6564
}
66-
67-
func save(config: Data) {
68-
self.saveConfigCalled = true
69-
}
70-
71-
func save(config: UserConfig) {
72-
self.saveConfigCalled = true
73-
}
7465
}
7566

7667
func getService() -> DevCycleService {

DevCycleTests/ObjC/ObjCDVCClientTests.m

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,43 +14,44 @@ @interface ObjcDVCClientTests : XCTestCase
1414
@implementation ObjcDVCClientTests
1515

1616
- (void)testBuilderReturnsErrorIfNoEnvKey {
17+
XCTestExpectation *expectation = [self expectationWithDescription:@"Builder returns error if no env key"];
1718
DVCUser *user = [DVCUser initializeWithUserId:@"my_user"];
1819
DVCClient *client = [DVCClient initialize:nil user:user options:nil onInitialized:^(NSError * _Nullable err) {
1920
XCTAssertNil(client);
2021
XCTAssertNotNil(err);
22+
[expectation fulfill];
2123
}];
24+
[self waitForExpectationsWithTimeout:5.0 handler:nil];
2225
}
2326

2427
- (void)testBuilderReturnsErrorIfNoUser {
28+
XCTestExpectation *expectation = [self expectationWithDescription:@"Builder returns error if no user"];
2529
DVCClient *client = [DVCClient initialize:@"my_env_key" user:nil options:nil onInitialized:^(NSError * _Nullable err) {
2630
XCTAssertNil(client);
2731
XCTAssertNotNil(err);
32+
[expectation fulfill];
2833
}];
34+
[self waitForExpectationsWithTimeout:5.0 handler:nil];
2935
}
3036

3137
- (void)testBuilderCreatesClientWithUserAndEnvKey {
3238
DVCUser *user = [DVCUser initializeWithUserId:@"my_user"];
33-
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:^(NSError * _Nullable err) {
34-
XCTAssertNil(err);
35-
XCTAssertNotNil(client);
36-
}];
39+
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:nil];
40+
XCTAssertNotNil(client);
3741
}
3842

3943
#pragma mark - Variable Tests
4044

4145
- (void)testVariableIsCreated {
4246
DVCUser *user = [DVCUser initializeWithUserId:@"my_user"];
43-
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:^(NSError * _Nullable err) {
44-
XCTAssertNil(err);
45-
XCTAssertNotNil(client);
46-
47-
DVCVariable *variable = [client stringVariableWithKey:@"my-key" defaultValue:@"default-value"];
48-
XCTAssertNotNil(variable);
49-
XCTAssertNil(variable.type);
50-
XCTAssertNil(variable.evalReason);
51-
XCTAssertEqual(variable.value, @"default-value");
52-
XCTAssertEqual(variable.defaultValue, @"default-value");
53-
}];
47+
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:nil];
48+
XCTAssertNotNil(client);
49+
DVCVariable *variable = [client stringVariableWithKey:@"my-key" defaultValue:@"default-value"];
50+
XCTAssertNotNil(variable);
51+
XCTAssertTrue([variable.type isEqualToString:@"String"]);
52+
XCTAssertNil(variable.evalReason);
53+
XCTAssertEqual(variable.value, @"default-value");
54+
XCTAssertEqual(variable.defaultValue, @"default-value");
5455
}
5556

5657
@end

DevCycleTests/ObjC/ObjcDVCUserTests.m

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,29 @@ @implementation ObjcDVCUserTests
1515

1616
- (void)testCreateUser {
1717
DVCUser *user = [DVCUser initializeWithUserId:@"my_user"];
18-
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:^(NSError * _Nullable err) {
19-
XCTAssertNil(err);
20-
}];
18+
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:nil];
19+
XCTAssertNotNil(user);
20+
XCTAssertNotNil(client);
2121
}
2222

2323
- (void)testAnonUser {
2424
DVCUser *user = [[DVCUser alloc] init];
25-
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:^(NSError * _Nullable err) {
26-
XCTAssertNil(err);
27-
XCTAssertTrue(user.isAnonymous);
28-
}];
25+
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:nil];
26+
XCTAssertNotNil(user);
27+
XCTAssertTrue(user.isAnonymous);
2928
}
3029

3130
- (void)testNonUserIdPropertiesAreNil {
3231
DVCUser *user = [DVCUser initializeWithUserId:@"my_user"];
33-
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:^(NSError * _Nullable err) {
34-
XCTAssertNil(err);
35-
XCTAssertNotNil(user);
36-
XCTAssert([user.userId isEqual:@"my_user"]);
37-
XCTAssertFalse([user.isAnonymous boolValue]);
38-
XCTAssertNil(user.email);
39-
XCTAssertNil(user.name);
40-
XCTAssertNil(user.country);
41-
XCTAssertNil(user.customData);
42-
XCTAssertNil(user.privateCustomData);
43-
}];
32+
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:nil];
33+
XCTAssertNotNil(user);
34+
XCTAssert([user.userId isEqual:@"my_user"]);
35+
XCTAssertFalse([user.isAnonymous boolValue]);
36+
XCTAssertNil(user.email);
37+
XCTAssertNil(user.name);
38+
XCTAssertNil(user.country);
39+
XCTAssertNil(user.customData);
40+
XCTAssertNil(user.privateCustomData);
4441
}
4542

4643
- (void)testNonUserIdPropertiesAreNotNil {
@@ -49,15 +46,13 @@ - (void)testNonUserIdPropertiesAreNotNil {
4946
user.email = @"email.com";
5047
user.name = @"Jason Smith";
5148
user.country = @"CAN";
52-
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:^(NSError * _Nullable err) {
53-
XCTAssertNil(err);
54-
XCTAssertNotNil(user);
55-
XCTAssert([user.userId isEqual:@"my_user"]);
56-
XCTAssertFalse([user.isAnonymous boolValue]);
57-
XCTAssertEqual(user.email, @"email.com");
58-
XCTAssertEqual(user.name, @"Jason Smith");
59-
XCTAssertEqual(user.country, @"CAN");
60-
}];
49+
DVCClient *client = [DVCClient initialize:@"my_env_key" user:user options:nil onInitialized:nil];
50+
XCTAssertNotNil(user);
51+
XCTAssert([user.userId isEqual:@"my_user"]);
52+
XCTAssertFalse([user.isAnonymous boolValue]);
53+
XCTAssertEqual(user.email, @"email.com");
54+
XCTAssertEqual(user.name, @"Jason Smith");
55+
XCTAssertEqual(user.country, @"CAN");
6156
}
6257

6358
@end

DevCycleTests/Utils/RequestConsolidatorTests.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ class RequestConsolidatorTests: XCTestCase {
1919
XCTAssertEqual(response.config?.variables["testVar"]?.value as! String, "any_value")
2020
expectation.fulfill()
2121
}
22-
waitForExpectations(timeout: 2)
22+
waitForExpectations(timeout: 2.0)
23+
XCTAssertFalse(requestConsolidator.requestInFlight)
2324
}
2425

2526
func testMultipleRequestFinishesWithLatestURLConfig() {
@@ -31,18 +32,26 @@ class RequestConsolidatorTests: XCTestCase {
3132
let expectation = expectation(description: "Multiple request completes")
3233
expectation.expectedFulfillmentCount = 3
3334
requestConsolidator.queue(request: request1) { response in
35+
print("testVar variable 1: \(response.config?.variables["testVar"]?.value as! String)")
3436
XCTAssertEqual(response.config?.variables["testVar"]?.value as! String, "thirdPage")
37+
print("Fulfill 1")
3538
expectation.fulfill()
3639
}
40+
XCTAssertTrue(requestConsolidator.requestInFlight)
3741
requestConsolidator.queue(request: request2) { response in
42+
print("testVar variable 2: \(response.config?.variables["testVar"]?.value as! String)")
3843
XCTAssertEqual(response.config?.variables["testVar"]?.value as! String, "thirdPage")
44+
print("Fulfill 2")
3945
expectation.fulfill()
4046
}
4147
requestConsolidator.queue(request: request3) { response in
48+
print("testVar variable 3: \(response.config?.variables["testVar"]?.value as! String)")
4249
XCTAssertEqual(response.config?.variables["testVar"]?.value as! String, "thirdPage")
50+
print("Fulfill 3")
4351
expectation.fulfill()
4452
}
45-
waitForExpectations(timeout: 2)
53+
waitForExpectations(timeout: 5.0)
54+
XCTAssertFalse(requestConsolidator.requestInFlight)
4655
}
4756
}
4857

0 commit comments

Comments
 (0)