Skip to content

Commit 874f6ae

Browse files
committed
SiteSettingsRemote: add setFeature for updating feature switch in WC settings.
1 parent 216c380 commit 874f6ae

File tree

2 files changed

+81
-2
lines changed

2 files changed

+81
-2
lines changed

Modules/Sources/Networking/Remote/SiteSettingsRemote.swift

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,49 @@ public class SiteSettingsRemote: Remote {
114114
let mapper = SiteSettingMapper(siteID: siteID, settingsGroup: .advanced)
115115
let response = try await enqueue(request, mapper: mapper)
116116
switch response.value {
117-
case "yes":
117+
case Constants.featureEnabledValue:
118118
return true
119-
case "no":
119+
case Constants.featureDisabledValue:
120+
return false
121+
default:
122+
throw SiteSettingsRemoteError.invalidResponse
123+
}
124+
}
125+
126+
/// Enables or disables a specific feature in the site WC settings.
127+
///
128+
/// - Parameters:
129+
/// - siteID: Site for which we'll update the feature status.
130+
/// - feature: The feature to enable or disable.
131+
/// - enabled: Whether the feature should be enabled (true) or disabled (false).
132+
/// - Returns: A boolean indicating the updated feature status.
133+
/// - Throws: Error if the request fails.
134+
///
135+
public func setFeature(for siteID: Int64, feature: SiteSettingsFeature, enabled: Bool) async throws -> Bool {
136+
let value = enabled ? Constants.featureEnabledValue : Constants.featureDisabledValue
137+
let parameters: [String: Any] = [Constants.valueParameter: value]
138+
let path = Constants.siteSettingsPath + Constants.advancedSettingsGroup + "/woocommerce_feature_\(feature.rawValue)_enabled"
139+
let request = JetpackRequest(wooApiVersion: .mark3,
140+
method: .put,
141+
siteID: siteID,
142+
path: path,
143+
parameters: parameters,
144+
availableAsRESTRequest: true)
145+
let mapper = SiteSettingMapper(siteID: siteID, settingsGroup: .advanced)
146+
let response = try await enqueue(request, mapper: mapper)
147+
switch response.value {
148+
case Constants.featureEnabledValue:
149+
return true
150+
case Constants.featureDisabledValue:
120151
return false
121152
default:
122153
throw SiteSettingsRemoteError.invalidResponse
123154
}
124155
}
125156
}
126157

158+
extension SiteSettingsRemote: SiteSettingsRemoteProtocol {}
159+
127160
public extension SiteSettingsFeature {
128161
var rawValue: String {
129162
switch self {
@@ -142,6 +175,8 @@ private extension SiteSettingsRemote {
142175
static let productSettingsGroup: String = "products"
143176
static let advancedSettingsGroup: String = "advanced"
144177
static let valueParameter: String = "value"
178+
static let featureEnabledValue: String = "yes"
179+
static let featureDisabledValue: String = "no"
145180
}
146181
}
147182

Modules/Tests/NetworkingTests/Remote/SiteSettingsRemoteTests.swift

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,4 +228,48 @@ final class SiteSettingsRemoteTests: XCTestCase {
228228
XCTAssertEqual(error as? NetworkError, .unacceptableStatusCode(statusCode: 500))
229229
}
230230
}
231+
232+
// MARK: - `setFeature`
233+
234+
func test_setFeature_enables_feature_when_enabled_is_true() async throws {
235+
// Given
236+
let remote = SiteSettingsRemote(network: network)
237+
network.simulateResponse(requestUrlSuffix: "settings/advanced/woocommerce_feature_point_of_sale_enabled",
238+
filename: "settings-advanced-feature-pos-enabled")
239+
240+
// When
241+
let isEnabled = try await remote.setFeature(for: sampleSiteID, feature: .pointOfSale, enabled: true)
242+
243+
// Then
244+
XCTAssertTrue(isEnabled)
245+
}
246+
247+
func test_setFeature_disables_feature_when_enabled_is_false() async throws {
248+
// Given
249+
let remote = SiteSettingsRemote(network: network)
250+
network.simulateResponse(requestUrlSuffix: "settings/advanced/woocommerce_feature_point_of_sale_enabled",
251+
filename: "settings-advanced-feature-pos-disabled")
252+
253+
// When
254+
let isEnabled = try await remote.setFeature(for: sampleSiteID, feature: .pointOfSale, enabled: false)
255+
256+
// Then
257+
XCTAssertFalse(isEnabled)
258+
}
259+
260+
func test_setFeature_throws_error_when_network_fails() async {
261+
// Given
262+
let remote = SiteSettingsRemote(network: network)
263+
let error = NetworkError.unacceptableStatusCode(statusCode: 500)
264+
network.simulateError(requestUrlSuffix: "settings/advanced/woocommerce_feature_point_of_sale_enabled",
265+
error: error)
266+
267+
// When/Then
268+
do {
269+
_ = try await remote.setFeature(for: sampleSiteID, feature: .pointOfSale, enabled: true)
270+
XCTFail("Expected error to be thrown")
271+
} catch {
272+
XCTAssertEqual(error as? NetworkError, .unacceptableStatusCode(statusCode: 500))
273+
}
274+
}
231275
}

0 commit comments

Comments
 (0)