Skip to content

Commit 3b55efa

Browse files
authored
Merge pull request #8678 from woocommerce/feat/8677-site-plugin-migration
REST API: Migrate site plugin fetching endpoint
2 parents 81a0826 + b57abd9 commit 3b55efa

File tree

5 files changed

+114
-2
lines changed

5 files changed

+114
-2
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,7 @@
728728
DE66C5632977CBC700DAA978 /* shipping-label-eligibility-failure-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = DE66C5622977CBC700DAA978 /* shipping-label-eligibility-failure-without-data.json */; };
729729
DE66C5652977CC4300DAA978 /* shipping-label-purchase-success-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = DE66C5642977CC4300DAA978 /* shipping-label-purchase-success-without-data.json */; };
730730
DE66C5672977CEB800DAA978 /* shipping-label-status-success-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = DE66C5662977CEB800DAA978 /* shipping-label-status-success-without-data.json */; };
731+
DE66C5692977D62700DAA978 /* plugins-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = DE66C5682977D62700DAA978 /* plugins-without-data.json */; };
731732
DE6F308727966FEF004E1C9A /* CouponReportListMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6F308627966FEF004E1C9A /* CouponReportListMapperTests.swift */; };
732733
DE74F29A27E08F5A0002FE59 /* SiteSettingMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE74F29927E08F5A0002FE59 /* SiteSettingMapper.swift */; };
733734
DE74F29C27E0A1D00002FE59 /* setting-coupon.json in Resources */ = {isa = PBXBuildFile; fileRef = DE74F29B27E0A1D00002FE59 /* setting-coupon.json */; };
@@ -1576,6 +1577,7 @@
15761577
DE66C5622977CBC700DAA978 /* shipping-label-eligibility-failure-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "shipping-label-eligibility-failure-without-data.json"; sourceTree = "<group>"; };
15771578
DE66C5642977CC4300DAA978 /* shipping-label-purchase-success-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "shipping-label-purchase-success-without-data.json"; sourceTree = "<group>"; };
15781579
DE66C5662977CEB800DAA978 /* shipping-label-status-success-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "shipping-label-status-success-without-data.json"; sourceTree = "<group>"; };
1580+
DE66C5682977D62700DAA978 /* plugins-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "plugins-without-data.json"; sourceTree = "<group>"; };
15791581
DE6F308627966FEF004E1C9A /* CouponReportListMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponReportListMapperTests.swift; sourceTree = "<group>"; };
15801582
DE74F29927E08F5A0002FE59 /* SiteSettingMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteSettingMapper.swift; sourceTree = "<group>"; };
15811583
DE74F29B27E0A1D00002FE59 /* setting-coupon.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "setting-coupon.json"; sourceTree = "<group>"; };
@@ -2205,6 +2207,7 @@
22052207
B559EBA820A0B5B100836CD4 /* Responses */ = {
22062208
isa = PBXGroup;
22072209
children = (
2210+
DE66C5682977D62700DAA978 /* plugins-without-data.json */,
22082211
DE66C5662977CEB800DAA978 /* shipping-label-status-success-without-data.json */,
22092212
DE66C5642977CC4300DAA978 /* shipping-label-purchase-success-without-data.json */,
22102213
DE66C5622977CBC700DAA978 /* shipping-label-eligibility-failure-without-data.json */,
@@ -3208,6 +3211,7 @@
32083211
03E8FEC427B40E3F00F5FC7D /* wcpay-charge-card-present-minimal.json in Resources */,
32093212
EE6FDCFC2966A70400E1CECF /* product-without-data.json in Resources */,
32103213
31054724262E2FC600C5C02B /* wcpay-payment-intent-requires-capture.json in Resources */,
3214+
DE66C5692977D62700DAA978 /* plugins-without-data.json in Resources */,
32113215
7492FAE3217FBDBC00ED2C69 /* settings-general-alt.json in Resources */,
32123216
93D8BBFF226BC1DA00AD2EB3 /* me-settings.json in Resources */,
32133217
74C947842193A6C70024CB60 /* comment-moderate-approved.json in Resources */,

Networking/Networking/Mapper/SitePluginsMapper.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ struct SitePluginsMapper: Mapper {
1717
.siteID: siteID
1818
]
1919

20-
return try decoder.decode(SitePluginsEnvelope.self, from: response).plugins
20+
do {
21+
return try decoder.decode(SitePluginsEnvelope.self, from: response).plugins
22+
} catch {
23+
return try decoder.decode([SitePlugin].self, from: response)
24+
}
2125
}
2226
}
2327

Networking/Networking/Remote/SitePluginsRemote.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ public class SitePluginsRemote: Remote {
1313
public func loadPlugins(for siteID: Int64,
1414
completion: @escaping (Result<[SitePlugin], Error>) -> Void) {
1515
let path = Constants.sitePluginsPath
16-
let request = JetpackRequest(wooApiVersion: .none, method: .get, siteID: siteID, path: path, parameters: nil)
16+
let request = JetpackRequest(wooApiVersion: .none,
17+
method: .get,
18+
siteID: siteID,
19+
path: path,
20+
parameters: nil,
21+
availableAsRESTRequest: true)
1722
let mapper = SitePluginsMapper(siteID: siteID)
1823

1924
enqueue(request, mapper: mapper, completion: completion)

Networking/NetworkingTests/Mapper/SitePluginsMapperTests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,25 @@ class SitePluginsMapperTests: XCTestCase {
3939
XCTAssertEqual(wooCommerceSubscriptionsPlugin.version, "3.0.13")
4040
XCTAssertEqual(wooCommerceSubscriptionsPlugin.textDomain, "woocommerce-subscriptions")
4141
}
42+
43+
/// Verifies the SitePlugin fields are parsed correctly.
44+
///
45+
func test_SitePlugin_fields_are_properly_parsed_when_response_has_no_data_envelope() {
46+
let plugins = mapLoadSitePluginsResponseWithoutDataEnvelope()
47+
XCTAssertEqual(plugins.count, 3)
48+
49+
let helloDollyPlugin = plugins[0]
50+
XCTAssertNotNil(helloDollyPlugin)
51+
XCTAssertEqual(helloDollyPlugin.siteID, dummySiteID)
52+
XCTAssertEqual(helloDollyPlugin.status, .inactive)
53+
XCTAssertEqual(helloDollyPlugin.name, "Hello Dolly")
54+
XCTAssertEqual(helloDollyPlugin.pluginUri, "http://wordpress.org/plugins/hello-dolly/")
55+
XCTAssertEqual(helloDollyPlugin.authorUri, "http://ma.tt/")
56+
XCTAssertEqual(helloDollyPlugin.descriptionRaw, "This is not just a plugin, it...")
57+
XCTAssertEqual(helloDollyPlugin.descriptionRendered, "This is not just a plugin, it symbolizes...")
58+
XCTAssertEqual(helloDollyPlugin.version, "1.7.2")
59+
XCTAssertEqual(helloDollyPlugin.textDomain, "")
60+
}
4261
}
4362

4463

@@ -61,4 +80,10 @@ private extension SitePluginsMapperTests {
6180
func mapLoadSitePluginsResponse() -> [SitePlugin] {
6281
return mapPlugins(from: "plugins")
6382
}
83+
84+
/// Returns the SitePluginsMapper output upon receiving `plugins-without-data`
85+
///
86+
func mapLoadSitePluginsResponseWithoutDataEnvelope() -> [SitePlugin] {
87+
return mapPlugins(from: "plugins-without-data")
88+
}
6489
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
[
2+
{
3+
"plugin": "hello",
4+
"status": "inactive",
5+
"name": "Hello Dolly",
6+
"plugin_uri": "http://wordpress.org/plugins/hello-dolly/",
7+
"author": "Matt Mullenweg",
8+
"author_uri": "http://ma.tt/",
9+
"description": {
10+
"raw": "This is not just a plugin, it...",
11+
"rendered": "This is not just a plugin, it symbolizes..."
12+
},
13+
"version": "1.7.2",
14+
"network_only": false,
15+
"requires_wp": "",
16+
"requires_php": "",
17+
"textdomain": "",
18+
"_links": {
19+
"self": [
20+
{
21+
"href": "https://example.com/wp-json/wp/v2/plugins/hello"
22+
}
23+
]
24+
}
25+
},
26+
{
27+
"plugin": "jetpack/jetpack",
28+
"status": "active",
29+
"name": "Jetpack by WordPress.com",
30+
"plugin_uri": "https://jetpack.com",
31+
"author": "Automattic",
32+
"author_uri": "https://jetpack.com",
33+
"description": {
34+
"raw": "Bring the power of the WordPress.com cloud to your self-hosted WordPress. Jetpack enables you to connect your blog to a WordPress.com account to use the powerful features normally only available to WordPress.com users.",
35+
"rendered": "Bring the power of the WordPress.com cloud to your self-hosted WordPress. Jetpack enables you to connect your blog to a WordPress.com account to use the powerful features normally only available to WordPress.com users. <cite>By <a href=\"https://jetpack.com\">Automattic</a>.</cite>"
36+
},
37+
"version": "9.5",
38+
"network_only": false,
39+
"requires_wp": "5.6",
40+
"requires_php": "5.6",
41+
"textdomain": "jetpack",
42+
"_links": {
43+
"self": [
44+
{
45+
"href": "https://example.com/wp-json/wp/v2/plugins/jetpack/jetpack"
46+
}
47+
]
48+
}
49+
},
50+
{
51+
"plugin": "woocommerce/woocommerce",
52+
"status": "active",
53+
"name": "WooCommerce",
54+
"plugin_uri": "https://woocommerce.com/",
55+
"author": "Automattic",
56+
"author_uri": "https://woocommerce.com",
57+
"description": {
58+
"raw": "An eCommerce toolkit that helps you sell anything. Beautifully.",
59+
"rendered": "An eCommerce toolkit that helps you sell anything. Beautifully. <cite>By <a href=\"https://woocommerce.com\">Automattic</a>.</cite>"
60+
},
61+
"version": "5.1.0",
62+
"network_only": false,
63+
"requires_wp": "5.4",
64+
"requires_php": "7.0",
65+
"textdomain": "woocommerce",
66+
"_links": {
67+
"self": [
68+
{
69+
"href": "https://example.com//wp-json/wp/v2/plugins/woocommerce/woocommerce"
70+
}
71+
]
72+
}
73+
}
74+
]

0 commit comments

Comments
 (0)