Skip to content

Commit 603e7fe

Browse files
committed
Merge branch 'trunk' into issue/8324-release-sessions-card
2 parents 61bfa25 + 3c3e38c commit 603e7fe

File tree

7 files changed

+165
-0
lines changed

7 files changed

+165
-0
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,10 +730,13 @@
730730
E1BAB2C32913FA6400C3982B /* ResponseDataValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BAB2C22913FA6400C3982B /* ResponseDataValidator.swift */; };
731731
E1BAB2C52913FB1800C3982B /* WordPressApiValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BAB2C42913FB1800C3982B /* WordPressApiValidator.swift */; };
732732
E1BAB2C72913FB5800C3982B /* WordPressApiError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BAB2C62913FB5800C3982B /* WordPressApiError.swift */; };
733+
EE338A0E294AF9BD00183934 /* ApplicationPasswordMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE338A0D294AF9BD00183934 /* ApplicationPasswordMapperTests.swift */; };
733734
EE54C89F2947782E00A9BF61 /* ApplicationPasswordUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE54C89E2947782E00A9BF61 /* ApplicationPasswordUseCase.swift */; };
734735
EE54C8A5294859D200A9BF61 /* ApplicationPasswordNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE54C8A4294859D200A9BF61 /* ApplicationPasswordNetwork.swift */; };
735736
EE54C8A729486B6800A9BF61 /* ApplicationPasswordMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE54C8A629486B6800A9BF61 /* ApplicationPasswordMapper.swift */; };
736737
EE8A86F1286C5226003E8AA4 /* media-update-product-id-in-wordpress-site.json in Resources */ = {isa = PBXBuildFile; fileRef = EE8A86F0286C5226003E8AA4 /* media-update-product-id-in-wordpress-site.json */; };
738+
EE8DE42F294AFC58005054E7 /* generate-application-password-using-wpcom-token-success.json in Resources */ = {isa = PBXBuildFile; fileRef = EE8DE42E294AFC58005054E7 /* generate-application-password-using-wpcom-token-success.json */; };
739+
EE8DE432294B17CD005054E7 /* DefaultApplicationPasswordUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE8DE431294B17CD005054E7 /* DefaultApplicationPasswordUseCaseTests.swift */; };
737740
EECB7EE8286555180028C888 /* media-update-product-id.json in Resources */ = {isa = PBXBuildFile; fileRef = EECB7EE7286555180028C888 /* media-update-product-id.json */; };
738741
FE28F6E226840DED004465C7 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E126840DED004465C7 /* User.swift */; };
739742
FE28F6E426842848004465C7 /* UserMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E326842848004465C7 /* UserMapper.swift */; };
@@ -1495,10 +1498,13 @@
14951498
E1BAB2C22913FA6400C3982B /* ResponseDataValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseDataValidator.swift; sourceTree = "<group>"; };
14961499
E1BAB2C42913FB1800C3982B /* WordPressApiValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressApiValidator.swift; sourceTree = "<group>"; };
14971500
E1BAB2C62913FB5800C3982B /* WordPressApiError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressApiError.swift; sourceTree = "<group>"; };
1501+
EE338A0D294AF9BD00183934 /* ApplicationPasswordMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationPasswordMapperTests.swift; sourceTree = "<group>"; };
14981502
EE54C89E2947782E00A9BF61 /* ApplicationPasswordUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationPasswordUseCase.swift; sourceTree = "<group>"; };
14991503
EE54C8A4294859D200A9BF61 /* ApplicationPasswordNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationPasswordNetwork.swift; sourceTree = "<group>"; };
15001504
EE54C8A629486B6800A9BF61 /* ApplicationPasswordMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationPasswordMapper.swift; sourceTree = "<group>"; };
15011505
EE8A86F0286C5226003E8AA4 /* media-update-product-id-in-wordpress-site.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "media-update-product-id-in-wordpress-site.json"; sourceTree = "<group>"; };
1506+
EE8DE42E294AFC58005054E7 /* generate-application-password-using-wpcom-token-success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "generate-application-password-using-wpcom-token-success.json"; sourceTree = "<group>"; };
1507+
EE8DE431294B17CD005054E7 /* DefaultApplicationPasswordUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultApplicationPasswordUseCaseTests.swift; sourceTree = "<group>"; };
15021508
EECB7EE7286555180028C888 /* media-update-product-id.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "media-update-product-id.json"; sourceTree = "<group>"; };
15031509
F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
15041510
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>"; };
@@ -1843,6 +1849,7 @@
18431849
B557D9F0209753AA005962F4 /* NetworkingTests */ = {
18441850
isa = PBXGroup;
18451851
children = (
1852+
EE8DE430294B17BA005054E7 /* ApplicationPassword */,
18461853
DE97C3902861B8CD0042E973 /* Encoder */,
18471854
5726F7322460A8E30031CAAC /* Copiable */,
18481855
B559EBA820A0B5B100836CD4 /* Responses */,
@@ -2028,6 +2035,7 @@
20282035
B559EBA820A0B5B100836CD4 /* Responses */ = {
20292036
isa = PBXGroup;
20302037
children = (
2038+
EE338A0A294AF92A00183934 /* AppliicationPassword */,
20312039
DE9DEEF4291CF1B40070AD7C /* site-plugin-without-envelope.json */,
20322040
028CB714290223CB00331C09 /* account-username-suggestions.json */,
20332041
028CB71C2902589E00331C09 /* create-account-error-email-exists.json */,
@@ -2513,6 +2521,7 @@
25132521
0359EA1E27AAE4680048DE2D /* WCPayChargeMapperTests.swift */,
25142522
68CB801328D8A05200E169F8 /* CustomerMapperTests.swift */,
25152523
68F48B1028E3BBC60045C15B /* WCAnalyticsCustomerMapperTests.swift */,
2524+
EE338A0D294AF9BD00183934 /* ApplicationPasswordMapperTests.swift */,
25162525
);
25172526
path = Mapper;
25182527
sourceTree = "<group>";
@@ -2587,6 +2596,14 @@
25872596
path = SystemStatusDetails;
25882597
sourceTree = "<group>";
25892598
};
2599+
EE338A0A294AF92A00183934 /* AppliicationPassword */ = {
2600+
isa = PBXGroup;
2601+
children = (
2602+
EE8DE42E294AFC58005054E7 /* generate-application-password-using-wpcom-token-success.json */,
2603+
);
2604+
path = AppliicationPassword;
2605+
sourceTree = "<group>";
2606+
};
25902607
EE54C899294777D000A9BF61 /* ApplicationPassword */ = {
25912608
isa = PBXGroup;
25922609
children = (
@@ -2595,6 +2612,14 @@
25952612
path = ApplicationPassword;
25962613
sourceTree = "<group>";
25972614
};
2615+
EE8DE430294B17BA005054E7 /* ApplicationPassword */ = {
2616+
isa = PBXGroup;
2617+
children = (
2618+
EE8DE431294B17CD005054E7 /* DefaultApplicationPasswordUseCaseTests.swift */,
2619+
);
2620+
path = ApplicationPassword;
2621+
sourceTree = "<group>";
2622+
};
25982623
/* End PBXGroup section */
25992624

26002625
/* Begin PBXHeadersBuildPhase section */
@@ -2777,6 +2802,7 @@
27772802
31A451D827863A2E00FE81AA /* stripe-account-restricted-overdue.json in Resources */,
27782803
D865CE69278CA245002C8520 /* stripe-payment-intent-unknown-status.json in Resources */,
27792804
0205021C27C86B9700FB1C6B /* inbox-note-without-isRead.json in Resources */,
2805+
EE8DE42F294AFC58005054E7 /* generate-application-password-using-wpcom-token-success.json in Resources */,
27802806
24F98C622502EFF600F49B68 /* feature-flags-load-all.json in Resources */,
27812807
DE50296128C609A300551736 /* jetpack-connected-user.json in Resources */,
27822808
B58D10C82114D21D00107ED4 /* generic_error.json in Resources */,
@@ -3379,9 +3405,11 @@
33793405
03EB998A2906AB0C00F06A39 /* JustInTimeMessagesRemoteTests.swift in Sources */,
33803406
DE34051D28BDF1C900CF0D97 /* JetpackConnectionURLMapperTests.swift in Sources */,
33813407
451A9836260B9DF90059D135 /* ShippingLabelPackagesMapperTests.swift in Sources */,
3408+
EE338A0E294AF9BD00183934 /* ApplicationPasswordMapperTests.swift in Sources */,
33823409
02BDB83723EA9C4D00BCC63E /* String+HTMLTests.swift in Sources */,
33833410
74CF5E8421402C04000CED0A /* TopEarnerStatsRemoteTests.swift in Sources */,
33843411
45B204BA24890A8C00FE6526 /* ProductCategoryMapperTests.swift in Sources */,
3412+
EE8DE432294B17CD005054E7 /* DefaultApplicationPasswordUseCaseTests.swift in Sources */,
33853413
74749B9522413119005C4CF2 /* ProductsRemoteTests.swift in Sources */,
33863414
B524194321AC622500D6FC0A /* DotcomDeviceMapperTests.swift in Sources */,
33873415
E1A5C27228F93ED900081046 /* InAppPurchaseOrderResultMapperTests.swift in Sources */,
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import XCTest
2+
@testable import Networking
3+
4+
5+
/// DefaultApplicationPasswordUseCase Unit Tests
6+
///
7+
final class DefaultApplicationPasswordUseCaseTests: XCTestCase {
8+
/// Mock Network: Allows us to inject predefined responses!
9+
///
10+
private var network: MockNetwork!
11+
12+
/// Testing SiteID
13+
///
14+
private let sampleSiteID: Int64 = 123
15+
16+
/// Dummy WPCOM auth token
17+
///
18+
private let credentials = Credentials(authToken: "dummy-token")
19+
20+
/// Dummy WPCOM auth token
21+
///
22+
private let applicationPasswordURLSuffix = Credentials(authToken: "dummy-token")
23+
24+
/// URL suffixes
25+
///
26+
private enum URLSuffix {
27+
static let generateApplicationPassword = "users/me/application-passwords"
28+
static let usersMe = "users/me"
29+
}
30+
31+
override func setUp() {
32+
super.setUp()
33+
network = MockNetwork(useResponseQueue: true)
34+
}
35+
36+
override func tearDown() {
37+
network = nil
38+
super.tearDown()
39+
}
40+
41+
func test_password_is_generated_with_correct_values_upon_success_response() async throws {
42+
// Given
43+
network.simulateResponse(requestUrlSuffix: URLSuffix.generateApplicationPassword,
44+
filename: "generate-application-password-using-wpcom-token-success")
45+
network.simulateResponse(requestUrlSuffix: URLSuffix.usersMe, filename: "user-complete")
46+
47+
let sut = DefaultApplicationPasswordUseCase(siteID: sampleSiteID,
48+
networkcredentials: credentials,
49+
network: network)
50+
51+
let password = try await sut.generateNewPassword()
52+
XCTAssertEqual(password.password.secretValue, "passwordvalue")
53+
XCTAssertEqual(password.wpOrgUsername, "test-username")
54+
}
55+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import XCTest
2+
@testable import Networking
3+
4+
5+
/// ApplicationPasswordMapper Unit Tests
6+
///
7+
final class ApplicationPasswordMapperTests: XCTestCase {
8+
9+
/// Verifies that generate password using WPCOM token response is parsed properly
10+
///
11+
func test_response_is_properly_parsed_while_generating_password_using_WPCOM_token() {
12+
guard let password = mapGenerateUsingWPCOMResponse() else {
13+
XCTFail()
14+
return
15+
}
16+
17+
XCTAssertEqual(password, "passwordvalue")
18+
}
19+
}
20+
21+
// MARK: - Private Methods.
22+
//
23+
private extension ApplicationPasswordMapperTests {
24+
25+
/// Returns the ApplicationPasswordMapper output upon receiving success response
26+
///
27+
func mapGenerateUsingWPCOMResponse() -> String? {
28+
guard let response = Loader.contentsOf("generate-application-password-using-wpcom-token-success") else {
29+
return nil
30+
}
31+
32+
return try? ApplicationPasswordMapper().map(response: response)
33+
}
34+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"data": {
3+
"uuid": "8ef68e6b-4670-4cfd-8ca0-456e616bcd5e",
4+
"app_id": "",
5+
"name": "com.automattic.woocommerce.ios-app-client.iPhone",
6+
"created": "2022-12-15T06:39:38",
7+
"last_used": null,
8+
"last_ip": null,
9+
"password": "passwordvalue",
10+
"_links": {
11+
"self": [
12+
{
13+
"href": "https://website.com/wp-json/wp/v2/users/1/application-passwords/8ef68e6b-4670-4cfd-8ca0-456e616bcd5e"
14+
}
15+
]
16+
}
17+
}
18+
}

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ struct AnalyticsHubView: View {
113113

114114
Divider()
115115
}
116+
.renderedIf(viewModel.showSessionsCard)
116117

117118
Spacer()
118119
}

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModel.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ final class AnalyticsHubViewModel: ObservableObject {
5353
///
5454
@Published var sessionsCard = AnalyticsHubViewModel.sessionsCard(currentPeriodStats: nil, siteStats: nil)
5555

56+
/// Sessions Card display state
57+
///
58+
var showSessionsCard: Bool {
59+
switch timeRangeSelectionType {
60+
case .custom:
61+
return false
62+
default:
63+
return true
64+
}
65+
}
66+
5667
/// Time Range Selection Type
5768
///
5869
@Published var timeRangeSelectionType: AnalyticsHubTimeRangeSelection.SelectionType

WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModelTests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,22 @@ final class AnalyticsHubViewModelTests: XCTestCase {
118118
XCTAssertEqual(loadingItemsSoldCard?.isRedacted, true)
119119
XCTAssertEqual(loadingSessionsCard?.isRedacted, true)
120120
}
121+
122+
func test_session_card_is_hidden_for_custom_range() async {
123+
// Given
124+
let vm = AnalyticsHubViewModel(siteID: 123, statsTimeRange: .today, usageTracksEventEmitter: eventEmitter, stores: stores)
125+
XCTAssertTrue(vm.showSessionsCard)
126+
127+
// When
128+
vm.timeRangeSelectionType = .custom(start: Date(), end: Date())
129+
130+
// Then
131+
XCTAssertFalse(vm.showSessionsCard)
132+
133+
// When
134+
vm.timeRangeSelectionType = .lastMonth
135+
136+
// Then
137+
XCTAssertTrue(vm.showSessionsCard)
138+
}
121139
}

0 commit comments

Comments
 (0)