Skip to content

Commit 3938d56

Browse files
authored
Merge pull request #7102 from woocommerce/issue/6079-wpadmin-url-unwanted-redirects
Avoid HubMenu unwanted redirects
2 parents 09bbf3d + 8c55bf3 commit 3938d56

File tree

4 files changed

+95
-8
lines changed

4 files changed

+95
-8
lines changed

WooCommerce/Classes/Extensions/Site+PluginsURL.swift renamed to WooCommerce/Classes/Extensions/Site+URL.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,26 @@ private extension CardPresentPaymentsPlugin {
1212
}
1313
}
1414

15-
/// Encapsulates the logic related to the provision of the Site URLs that point to plugins related content
15+
/// Encapsulates the logic related to the provision of the Site URLs
1616
///
1717
extension Site {
1818
/// Site's plugins section in wp-admin.
1919
///
2020
var pluginsURL: String {
2121
adminURL + "plugins.php"
2222
}
23-
2423
/// Payment plugin settings in wp-admin. This can be helpful when the plugin needs to be setup completely.
2524
///
2625
func pluginSettingsSectionURL(from plugin: CardPresentPaymentsPlugin) -> String {
2726
adminURL + "admin.php?page=wc-settings&tab=checkout&section=" + plugin.setupURLSectionPath
2827
}
28+
/// Returns the WooCommerce admin URL, or attempts to construct it from the site URL.
29+
///
30+
func adminURLWithFallback() -> URL? {
31+
guard let adminURL = URL(string: adminURL) else {
32+
let adminURLFromSiteURLString = url + "/wp-admin"
33+
return URL(string: adminURLFromSiteURLString)
34+
}
35+
return adminURL
36+
}
2937
}

WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewModel.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ final class HubMenuViewModel: ObservableObject {
3232
}
3333
return url
3434
}
35-
3635
var woocommerceAdminURL: URL {
3736
guard let urlString = stores.sessionManager.defaultSite?.adminURL, let url = URL(string: urlString) else {
38-
return WooConstants.URLs.blog.asURL()
37+
return stores.sessionManager.defaultSite?.adminURLWithFallback() ??
38+
WooConstants.URLs.blog.asURL()
3939
}
4040
return url
4141
}

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,7 +1230,7 @@
12301230
B92FF9B027FC7821005C34E3 /* ProductsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B92FF9AF27FC7821005C34E3 /* ProductsViewController.xib */; };
12311231
B96B536B2816ECFC00F753E6 /* CardPresentPluginsDataProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B96B536A2816ECFC00F753E6 /* CardPresentPluginsDataProviderTests.swift */; };
12321232
B979A9BA282D62A500EBB383 /* InPersonPaymentsDeactivateStripeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B979A9B9282D62A500EBB383 /* InPersonPaymentsDeactivateStripeView.swift */; };
1233-
B9B6DEEF283F8B9F00901FB7 /* Site+PluginsURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B6DEEE283F8B9F00901FB7 /* Site+PluginsURL.swift */; };
1233+
B9B6DEEF283F8B9F00901FB7 /* Site+URL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B6DEEE283F8B9F00901FB7 /* Site+URL.swift */; };
12341234
B9B6DEF1283F8EB100901FB7 /* SitePluginsURLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B6DEF0283F8EB100901FB7 /* SitePluginsURLTests.swift */; };
12351235
B9C4AB2527FDE4B6007008B8 /* CardPresentPluginsDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C4AB2427FDE4B6007008B8 /* CardPresentPluginsDataProvider.swift */; };
12361236
B9C4AB2728002AF3007008B8 /* PaymentReceiptEmailParameterDeterminer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C4AB2628002AF3007008B8 /* PaymentReceiptEmailParameterDeterminer.swift */; };
@@ -3000,7 +3000,7 @@
30003000
B92FF9AF27FC7821005C34E3 /* ProductsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ProductsViewController.xib; sourceTree = "<group>"; };
30013001
B96B536A2816ECFC00F753E6 /* CardPresentPluginsDataProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentPluginsDataProviderTests.swift; sourceTree = "<group>"; };
30023002
B979A9B9282D62A500EBB383 /* InPersonPaymentsDeactivateStripeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsDeactivateStripeView.swift; sourceTree = "<group>"; };
3003-
B9B6DEEE283F8B9F00901FB7 /* Site+PluginsURL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Site+PluginsURL.swift"; sourceTree = "<group>"; };
3003+
B9B6DEEE283F8B9F00901FB7 /* Site+URL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Site+URL.swift"; sourceTree = "<group>"; };
30043004
B9B6DEF0283F8EB100901FB7 /* SitePluginsURLTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SitePluginsURLTests.swift; sourceTree = "<group>"; };
30053005
B9C4AB2427FDE4B6007008B8 /* CardPresentPluginsDataProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentPluginsDataProvider.swift; sourceTree = "<group>"; };
30063006
B9C4AB2628002AF3007008B8 /* PaymentReceiptEmailParameterDeterminer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentReceiptEmailParameterDeterminer.swift; sourceTree = "<group>"; };
@@ -7110,7 +7110,7 @@
71107110
DEC51B05276B3F3C009F3DF4 /* Int64+Helpers.swift */,
71117111
02DE5CA8279F857D007CBEF3 /* Double+Rounding.swift */,
71127112
02645D8727BA2E820065DC68 /* NSAttributedString+Attributes.swift */,
7113-
B9B6DEEE283F8B9F00901FB7 /* Site+PluginsURL.swift */,
7113+
B9B6DEEE283F8B9F00901FB7 /* Site+URL.swift */,
71147114
);
71157115
path = Extensions;
71167116
sourceTree = "<group>";
@@ -9407,7 +9407,7 @@
94079407
E15FC74526BC213500CF83E6 /* InPersonPaymentsLearnMore.swift in Sources */,
94089408
D83C12A022250BF0004CA04C /* OrderTrackingTableViewCell.swift in Sources */,
94099409
E1ABAEF728479E0300F40BB2 /* InPersonPaymentsSelectPluginView.swift in Sources */,
9410-
B9B6DEEF283F8B9F00901FB7 /* Site+PluginsURL.swift in Sources */,
9410+
B9B6DEEF283F8B9F00901FB7 /* Site+URL.swift in Sources */,
94119411
D83F5930225B269C00626E75 /* DatePickerTableViewCell.swift in Sources */,
94129412
26FF455F24BE49EE00B3B2F4 /* DeprecatedStatsDashboardViewController.swift in Sources */,
94139413
0272C00322EE9C3200D7CA2C /* AsyncDictionary.swift in Sources */,

WooCommerce/WooCommerceTests/ViewRelated/HubMenu/HubMenuViewModelTests.swift

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,85 @@ final class HubMenuViewModelTests: XCTestCase {
160160
// Then
161161
XCTAssertEqual(viewModel.menuElements, [.woocommerceAdmin, .viewStore, .reviews])
162162
}
163+
func test_storeURL_when_site_has_storeURL_then_returns_storeURL() {
164+
// Given
165+
let sampleStoreURL = "https://testshop.com/"
166+
let sessionManager = SessionManager.testingInstance
167+
let site = Site.fake().copy(url: sampleStoreURL)
168+
sessionManager.defaultSite = site
169+
let stores = MockStoresManager(sessionManager: sessionManager)
170+
171+
// When
172+
let viewModel = HubMenuViewModel(siteID: site.siteID,
173+
stores: stores)
174+
175+
// Then
176+
XCTAssertEqual(viewModel.storeURL, try sampleStoreURL.asURL())
177+
}
178+
func test_woocommerceAdminURL_when_site_has_adminURL_then_returns_adminURL() {
179+
// Given
180+
let sampleAdminURL = "https://testshop.com/wp-admin/"
181+
let sessionManager = SessionManager.testingInstance
182+
let site = Site.fake().copy(adminURL: sampleAdminURL)
183+
sessionManager.defaultSite = site
184+
let stores = MockStoresManager(sessionManager: sessionManager)
185+
186+
// When
187+
let viewModel = HubMenuViewModel(siteID: site.siteID,
188+
stores: stores)
189+
190+
// Then
191+
XCTAssertEqual(viewModel.woocommerceAdminURL, try sampleAdminURL.asURL())
192+
}
193+
func test_storeURL_when_storeURL_is_nil_then_returns_woocommerce_fallback_url() {
194+
// Given
195+
let sampleStoreURL: String? = nil
196+
let sessionManager = SessionManager.testingInstance
197+
let site = Site.fake().copy(url: sampleStoreURL)
198+
sessionManager.defaultSite = site
199+
let stores = MockStoresManager(sessionManager: sessionManager)
200+
201+
// When
202+
let viewModel = HubMenuViewModel(siteID: site.siteID,
203+
stores: stores)
204+
// Then
205+
XCTAssertNotNil(viewModel.storeURL)
206+
XCTAssertEqual(viewModel.storeURL, WooConstants.URLs.blog.asURL())
207+
}
208+
func test_woocommerceAdminURL_when_adminURL_is_nil_then_returns_adminURL() {
209+
// Given
210+
let sampleStoreURL = "https://testshop.com"
211+
let sampleAdminURL: String? = nil
212+
let expectedAdminURL = "https://testshop.com/wp-admin"
213+
let sessionManager = SessionManager.testingInstance
214+
let site = Site.fake().copy(url: sampleStoreURL, adminURL: sampleAdminURL)
215+
sessionManager.defaultSite = site
216+
let stores = MockStoresManager(sessionManager: sessionManager)
217+
218+
// When
219+
let viewModel = HubMenuViewModel(siteID: site.siteID,
220+
stores: stores)
221+
// Then
222+
XCTAssertNotNil(viewModel.woocommerceAdminURL)
223+
XCTAssertEqual(viewModel.woocommerceAdminURL, try URL(string: expectedAdminURL)?.asURL())
224+
}
225+
func test_woocommerceAdminURL_when_adminURL_is_empty_then_returns_adminURL() {
226+
// Given
227+
let sampleStoreURL = "https://testshop.com"
228+
let sampleAdminURL = ""
229+
let expectedAdminURL = "https://testshop.com/wp-admin"
230+
let sessionManager = SessionManager.testingInstance
231+
let site = Site.fake().copy(url: sampleStoreURL, adminURL: sampleAdminURL)
232+
sessionManager.defaultSite = site
233+
let stores = MockStoresManager(sessionManager: sessionManager)
234+
235+
// When
236+
let viewModel = HubMenuViewModel(siteID: site.siteID,
237+
stores: stores)
238+
// Then
239+
XCTAssertNotNil(viewModel.woocommerceAdminURL)
240+
XCTAssertEqual(viewModel.woocommerceAdminURL, try URL(string: expectedAdminURL)?.asURL())
241+
}
163242
}
164243

165244
private extension HubMenuViewModelTests {

0 commit comments

Comments
 (0)