Skip to content

Commit 0d52c61

Browse files
Merge pull request #8515 from woocommerce/feat/8507-unit-test-request-processor
[REST API] Add unit tests for `RequestProcessor`
2 parents 998ba6f + 6a822bd commit 0d52c61

File tree

6 files changed

+296
-20
lines changed

6 files changed

+296
-20
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@
723723
DEC51B02276AFB35009F3DF4 /* SystemStatus+DropinMustUsePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEC51B01276AFB34009F3DF4 /* SystemStatus+DropinMustUsePlugin.swift */; };
724724
DEFBA74E29485A7600C35BA9 /* RESTRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFBA74D29485A7600C35BA9 /* RESTRequest.swift */; };
725725
DEFBA7542949CE6600C35BA9 /* RequestProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFBA7532949CE6600C35BA9 /* RequestProcessor.swift */; };
726-
DEFBA7562949D17400C35BA9 /* RequestAuthenticatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFBA7552949D17300C35BA9 /* RequestAuthenticatorTests.swift */; };
726+
DEFBA7562949D17400C35BA9 /* DefaultRequestAuthenticatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFBA7552949D17300C35BA9 /* DefaultRequestAuthenticatorTests.swift */; };
727727
E12552C526385B05001CEE70 /* ShippingLabelAddressValidationSuccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = E12552C426385B05001CEE70 /* ShippingLabelAddressValidationSuccess.swift */; };
728728
E137619929151C7400FD098F /* error-wp-rest-forbidden.json in Resources */ = {isa = PBXBuildFile; fileRef = E137619829151C7400FD098F /* error-wp-rest-forbidden.json */; };
729729
E137619B2915222100FD098F /* WordPressApiValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E137619A2915222100FD098F /* WordPressApiValidatorTests.swift */; };
@@ -748,6 +748,7 @@
748748
EE62EE65295AD46D009C965B /* String+URLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE62EE64295AD46D009C965B /* String+URLTests.swift */; };
749749
EE71CC3D2951A8EA0074D908 /* ApplicationPasswordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE71CC3C2951A8EA0074D908 /* ApplicationPasswordStorage.swift */; };
750750
EE71CC412951CE700074D908 /* generate-application-password-using-wporg-creds-success.json in Resources */ = {isa = PBXBuildFile; fileRef = EE71CC402951CE700074D908 /* generate-application-password-using-wporg-creds-success.json */; };
751+
EE76762F2962B85E000066FA /* RequestProcessorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE76762E2962B85E000066FA /* RequestProcessorTests.swift */; };
751752
EE80A24729547F8B003591E4 /* coupons-all-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = EE80A24529547F8B003591E4 /* coupons-all-without-data.json */; };
752753
EE80A24829547F8B003591E4 /* coupon-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = EE80A24629547F8B003591E4 /* coupon-without-data.json */; };
753754
EE80A25029556FBD003591E4 /* coupon-reports-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = EE80A24F29556FBD003591E4 /* coupon-reports-without-data.json */; };
@@ -756,11 +757,11 @@
756757
EE99814E295AA7430074AE68 /* RequestAuthenticator.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE99814D295AA7430074AE68 /* RequestAuthenticator.swift */; };
757758
EE998150295AACE10074AE68 /* RequestConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE99814F295AACE10074AE68 /* RequestConverter.swift */; };
758759
EECB7EE8286555180028C888 /* media-update-product-id.json in Resources */ = {isa = PBXBuildFile; fileRef = EECB7EE7286555180028C888 /* media-update-product-id.json */; };
760+
EEFAA579295D2FC7003583BE /* RESTRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA578295D2FC7003583BE /* RESTRequestTests.swift */; };
759761
EEFAA57B295D7793003583BE /* AuthenticatedDotcomRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA57A295D7793003583BE /* AuthenticatedDotcomRequest.swift */; };
760762
EEFAA57D295D77F0003583BE /* AuthenticatedRESTRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA57C295D77F0003583BE /* AuthenticatedRESTRequest.swift */; };
761763
EEFAA57F295D78DF003583BE /* AuthenticatedDotcomRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA57E295D78DF003583BE /* AuthenticatedDotcomRequestTests.swift */; };
762764
EEFAA581295D78E9003583BE /* AuthenticatedRESTRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA580295D78E9003583BE /* AuthenticatedRESTRequestTests.swift */; };
763-
EEFAA579295D2FC7003583BE /* RESTRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA578295D2FC7003583BE /* RESTRequestTests.swift */; };
764765
FE28F6E226840DED004465C7 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E126840DED004465C7 /* User.swift */; };
765766
FE28F6E426842848004465C7 /* UserMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E326842848004465C7 /* UserMapper.swift */; };
766767
FE28F6E6268429B6004465C7 /* UserRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E5268429B6004465C7 /* UserRemote.swift */; };
@@ -1514,7 +1515,7 @@
15141515
DEC51B01276AFB34009F3DF4 /* SystemStatus+DropinMustUsePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SystemStatus+DropinMustUsePlugin.swift"; sourceTree = "<group>"; };
15151516
DEFBA74D29485A7600C35BA9 /* RESTRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RESTRequest.swift; sourceTree = "<group>"; };
15161517
DEFBA7532949CE6600C35BA9 /* RequestProcessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestProcessor.swift; sourceTree = "<group>"; };
1517-
DEFBA7552949D17300C35BA9 /* RequestAuthenticatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestAuthenticatorTests.swift; sourceTree = "<group>"; };
1518+
DEFBA7552949D17300C35BA9 /* DefaultRequestAuthenticatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultRequestAuthenticatorTests.swift; sourceTree = "<group>"; };
15181519
E12552C426385B05001CEE70 /* ShippingLabelAddressValidationSuccess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelAddressValidationSuccess.swift; sourceTree = "<group>"; };
15191520
E137619829151C7400FD098F /* error-wp-rest-forbidden.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "error-wp-rest-forbidden.json"; sourceTree = "<group>"; };
15201521
E137619A2915222100FD098F /* WordPressApiValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressApiValidatorTests.swift; sourceTree = "<group>"; };
@@ -1539,6 +1540,7 @@
15391540
EE62EE64295AD46D009C965B /* String+URLTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+URLTests.swift"; sourceTree = "<group>"; };
15401541
EE71CC3C2951A8EA0074D908 /* ApplicationPasswordStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationPasswordStorage.swift; sourceTree = "<group>"; };
15411542
EE71CC402951CE700074D908 /* generate-application-password-using-wporg-creds-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "generate-application-password-using-wporg-creds-success.json"; sourceTree = "<group>"; };
1543+
EE76762E2962B85E000066FA /* RequestProcessorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestProcessorTests.swift; sourceTree = "<group>"; };
15421544
EE80A24529547F8B003591E4 /* coupons-all-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "coupons-all-without-data.json"; sourceTree = "<group>"; };
15431545
EE80A24629547F8B003591E4 /* coupon-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "coupon-without-data.json"; sourceTree = "<group>"; };
15441546
EE80A24F29556FBD003591E4 /* coupon-reports-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "coupon-reports-without-data.json"; sourceTree = "<group>"; };
@@ -1547,11 +1549,11 @@
15471549
EE99814D295AA7430074AE68 /* RequestAuthenticator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestAuthenticator.swift; sourceTree = "<group>"; };
15481550
EE99814F295AACE10074AE68 /* RequestConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestConverter.swift; sourceTree = "<group>"; };
15491551
EECB7EE7286555180028C888 /* media-update-product-id.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "media-update-product-id.json"; sourceTree = "<group>"; };
1552+
EEFAA578295D2FC7003583BE /* RESTRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RESTRequestTests.swift; sourceTree = "<group>"; };
15501553
EEFAA57A295D7793003583BE /* AuthenticatedDotcomRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticatedDotcomRequest.swift; sourceTree = "<group>"; };
15511554
EEFAA57C295D77F0003583BE /* AuthenticatedRESTRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticatedRESTRequest.swift; sourceTree = "<group>"; };
15521555
EEFAA57E295D78DF003583BE /* AuthenticatedDotcomRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticatedDotcomRequestTests.swift; sourceTree = "<group>"; };
15531556
EEFAA580295D78E9003583BE /* AuthenticatedRESTRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticatedRESTRequestTests.swift; sourceTree = "<group>"; };
1554-
EEFAA578295D2FC7003583BE /* RESTRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RESTRequestTests.swift; sourceTree = "<group>"; };
15551557
F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
15561558
F6CEE1CA2AD376C0C28AE9F6 /* Pods-NetworkingTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkingTests.release.xcconfig"; path = "../Pods/Target Support Files/Pods-NetworkingTests/Pods-NetworkingTests.release.xcconfig"; sourceTree = "<group>"; };
15571559
FE28F6E126840DED004465C7 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
@@ -2455,7 +2457,7 @@
24552457
isa = PBXGroup;
24562458
children = (
24572459
B57B1E6621C916850046E764 /* NetworkErrorTests.swift */,
2458-
DEFBA7552949D17300C35BA9 /* RequestAuthenticatorTests.swift */,
2460+
DEFBA7552949D17300C35BA9 /* DefaultRequestAuthenticatorTests.swift */,
24592461
EE62EE60295ACF8D009C965B /* RequestConverterTests.swift */,
24602462
);
24612463
path = Network;
@@ -2717,6 +2719,7 @@
27172719
isa = PBXGroup;
27182720
children = (
27192721
EE8DE431294B17CD005054E7 /* DefaultApplicationPasswordUseCaseTests.swift */,
2722+
EE76762E2962B85E000066FA /* RequestProcessorTests.swift */,
27202723
);
27212724
path = ApplicationPassword;
27222725
sourceTree = "<group>";
@@ -3603,6 +3606,7 @@
36033606
D800DA0A25EFEB9C001E13CE /* WCPayRemoteTests.swift in Sources */,
36043607
E13BAD5328F8625600217769 /* InAppPurchasesRemoteTests.swift in Sources */,
36053608
CC851D1425E52AB500249E9C /* Decimal+ExtensionsTests.swift in Sources */,
3609+
EE76762F2962B85E000066FA /* RequestProcessorTests.swift in Sources */,
36063610
B554FA8B2180B1D500C54DFF /* NotificationsRemoteTests.swift in Sources */,
36073611
B518662A20A09C6F00037A38 /* OrdersRemoteTests.swift in Sources */,
36083612
02EF166E292F0C5800D90AD6 /* PaymentRemoteTests.swift in Sources */,
@@ -3637,7 +3641,7 @@
36373641
0212683524C046CB00F8A892 /* MockNetwork+Path.swift in Sources */,
36383642
68BD37B328D9B8BD00C2A517 /* CustomerRemoteTests.swift in Sources */,
36393643
B554FA932180C17200C54DFF /* NoteHashListMapperTests.swift in Sources */,
3640-
DEFBA7562949D17400C35BA9 /* RequestAuthenticatorTests.swift in Sources */,
3644+
DEFBA7562949D17400C35BA9 /* DefaultRequestAuthenticatorTests.swift in Sources */,
36413645
CC07866526790B1100BA9AC1 /* ShippingLabelPurchaseMapperTests.swift in Sources */,
36423646
74002D6A2118B26100A63C19 /* SiteVisitStatsMapperTests.swift in Sources */,
36433647
743E84FA221742E300FAC9D7 /* ShipmentsRemoteTests.swift in Sources */,

Networking/Networking/ApplicationPassword/RequestAuthenticator.swift

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,31 @@ enum RequestAuthenticatorError: Error {
33
case applicationPasswordNotAvailable
44
}
55

6+
protocol RequestAuthenticator {
7+
/// Credentials to authenticate the URLRequest
8+
///
9+
var credentials: Credentials? { get }
10+
11+
/// Authenticates the provided urlRequest using the `credentials`
12+
///
13+
/// - Parameter urlRequest: `URLRequest` to authenticate
14+
/// - Returns: Authenticated `URLRequest`
15+
///
16+
func authenticate(_ urlRequest: URLRequest) throws -> URLRequest
17+
18+
/// Generates application password
19+
///
20+
func generateApplicationPassword() async throws
21+
22+
/// Checks whether the given URLRequest is eligible for retyring
23+
///
24+
func shouldRetry(_ urlRequest: URLRequest) -> Bool
25+
}
26+
627
/// Authenticates request
728
///
8-
public struct RequestAuthenticator {
9-
/// Credentials.
29+
public struct DefaultRequestAuthenticator: RequestAuthenticator {
30+
/// Credentials to authenticate the URLRequest
1031
///
1132
let credentials: Credentials?
1233

@@ -33,6 +54,11 @@ public struct RequestAuthenticator {
3354
self.applicationPasswordUseCase = useCase
3455
}
3556

57+
/// Authenticates the provided urlRequest using the `credentials`
58+
///
59+
/// - Parameter urlRequest: `URLRequest` to authenticate
60+
/// - Returns: Authenticated `URLRequest`
61+
///
3662
func authenticate(_ urlRequest: URLRequest) throws -> URLRequest {
3763
if isRestAPIRequest(urlRequest) {
3864
return try authenticateUsingApplicationPasswordIfPossible(urlRequest)
@@ -41,6 +67,8 @@ public struct RequestAuthenticator {
4167
}
4268
}
4369

70+
/// Generates application password
71+
///
4472
func generateApplicationPassword() async throws {
4573
guard let applicationPasswordUseCase else {
4674
throw RequestAuthenticatorError.applicationPasswordUseCaseNotAvailable
@@ -56,7 +84,7 @@ public struct RequestAuthenticator {
5684
}
5785
}
5886

59-
private extension RequestAuthenticator {
87+
private extension DefaultRequestAuthenticator {
6088
/// To check whether the given URLRequest is a REST API request
6189
///
6290
func isRestAPIRequest(_ urlRequest: URLRequest) -> Bool {

Networking/Networking/ApplicationPassword/RequestProcessor.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ final class RequestProcessor {
1010

1111
private let requestAuthenticator: RequestAuthenticator
1212

13-
init(credentials: Credentials?) {
14-
requestAuthenticator = RequestAuthenticator(credentials: credentials)
13+
init(requestAuthenticator: RequestAuthenticator) {
14+
self.requestAuthenticator = requestAuthenticator
1515
}
1616
}
1717

Networking/Networking/Network/AlamofireNetwork.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class AlamofireNetwork: Network {
3636
///
3737
public required init(credentials: Credentials?) {
3838
self.requestConverter = RequestConverter(credentials: credentials)
39-
self.requestAuthenticator = RequestProcessor(credentials: credentials)
39+
self.requestAuthenticator = RequestProcessor(requestAuthenticator: DefaultRequestAuthenticator(credentials: credentials))
4040
}
4141

4242
/// Executes the specified Network Request. Upon completion, the payload will be sent back to the caller as a Data instance.

0 commit comments

Comments
 (0)