Skip to content

Commit dc3b8ea

Browse files
authored
Merge pull request #3862 from woocommerce/issue/2970-networking-models-of-default-and-custom-packages-for-a-store
Networking models for parsing default and custom packages in Shipping Labels
2 parents dcaad8c + 4a614fd commit dc3b8ea

File tree

10 files changed

+1513
-1
lines changed

10 files changed

+1513
-1
lines changed

Fakes/Fakes/Fakes.generated.swift

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,13 +895,60 @@ extension ShippingLabelAddressVerification.ShipType {
895895
.origin
896896
}
897897
}
898+
extension ShippingLabelCustomPackage {
899+
/// Returns a "ready to use" type filled with fake values.
900+
///
901+
public static func fake() -> ShippingLabelCustomPackage {
902+
.init(
903+
isUserDefined: .fake(),
904+
title: .fake(),
905+
isLetter: .fake(),
906+
dimensions: .fake(),
907+
boxWeight: .fake(),
908+
maxWeight: .fake()
909+
)
910+
}
911+
}
912+
extension ShippingLabelPackagesResponse {
913+
/// Returns a "ready to use" type filled with fake values.
914+
///
915+
public static func fake() -> ShippingLabelPackagesResponse {
916+
.init(
917+
storeOptions: .fake(),
918+
customPackages: .fake(),
919+
predefinedOptions: .fake()
920+
)
921+
}
922+
}
898923
extension ShippingLabelPaperSize {
899924
/// Returns a "ready to use" type filled with fake values.
900925
///
901926
public static func fake() -> ShippingLabelPaperSize {
902927
.a4
903928
}
904929
}
930+
extension ShippingLabelPredefinedOption {
931+
/// Returns a "ready to use" type filled with fake values.
932+
///
933+
public static func fake() -> ShippingLabelPredefinedOption {
934+
.init(
935+
title: .fake(),
936+
predefinedPackages: .fake()
937+
)
938+
}
939+
}
940+
extension ShippingLabelPredefinedPackage {
941+
/// Returns a "ready to use" type filled with fake values.
942+
///
943+
public static func fake() -> ShippingLabelPredefinedPackage {
944+
.init(
945+
id: .fake(),
946+
title: .fake(),
947+
isLetter: .fake(),
948+
dimensions: .fake()
949+
)
950+
}
951+
}
905952
extension ShippingLabelPrintData {
906953
/// Returns a "ready to use" type filled with fake values.
907954
///
@@ -947,6 +994,18 @@ extension ShippingLabelStatus {
947994
.purchased
948995
}
949996
}
997+
extension ShippingLabelStoreOptions {
998+
/// Returns a "ready to use" type filled with fake values.
999+
///
1000+
public static func fake() -> ShippingLabelStoreOptions {
1001+
.init(
1002+
currencySymbol: .fake(),
1003+
dimensionUnit: .fake(),
1004+
weightUnit: .fake(),
1005+
originCountry: .fake()
1006+
)
1007+
}
1008+
}
9501009
extension ShippingLine {
9511010
/// Returns a "ready to use" type filled with fake values.
9521011
///
@@ -1009,6 +1068,35 @@ extension SitePlan {
10091068
)
10101069
}
10111070
}
1071+
extension SitePlugin {
1072+
/// Returns a "ready to use" type filled with fake values.
1073+
///
1074+
public static func fake() -> SitePlugin {
1075+
.init(
1076+
siteID: .fake(),
1077+
plugin: .fake(),
1078+
status: .fake(),
1079+
name: .fake(),
1080+
pluginUri: .fake(),
1081+
author: .fake(),
1082+
authorUri: .fake(),
1083+
descriptionRaw: .fake(),
1084+
descriptionRendered: .fake(),
1085+
version: .fake(),
1086+
networkOnly: .fake(),
1087+
requiresWPVersion: .fake(),
1088+
requiresPHPVersion: .fake(),
1089+
textDomain: .fake()
1090+
)
1091+
}
1092+
}
1093+
extension SitePluginStatusEnum {
1094+
/// Returns a "ready to use" type filled with fake values.
1095+
///
1096+
public static func fake() -> SitePluginStatusEnum {
1097+
.active
1098+
}
1099+
}
10121100
extension SiteSetting {
10131101
/// Returns a "ready to use" type filled with fake values.
10141102
///

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,14 @@
128128
4515282B257A8C010076B03C /* product-attribute-delete.json in Resources */ = {isa = PBXBuildFile; fileRef = 4515282A257A8C010076B03C /* product-attribute-delete.json */; };
129129
45152831257A8E1A0076B03C /* ProductAttributeMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45152830257A8E1A0076B03C /* ProductAttributeMapperTests.swift */; };
130130
45152835257A8F490076B03C /* ProductAttributeListMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45152834257A8F490076B03C /* ProductAttributeListMapperTests.swift */; };
131+
451A97C92609FF050059D135 /* ShippingLabelPackagesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A97C82609FF050059D135 /* ShippingLabelPackagesResponse.swift */; };
132+
451A97CD260A01A40059D135 /* ShippingLabelStoreOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A97CC260A01A40059D135 /* ShippingLabelStoreOptions.swift */; };
133+
451A97D1260A03900059D135 /* ShippingLabelCustomPackage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A97D0260A03900059D135 /* ShippingLabelCustomPackage.swift */; };
134+
451A97DE260B59870059D135 /* shipping-label-packages-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 451A97DD260B59870059D135 /* shipping-label-packages-success.json */; };
135+
451A97E5260B631E0059D135 /* ShippingLabelPredefinedPackage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A97E4260B631E0059D135 /* ShippingLabelPredefinedPackage.swift */; };
136+
451A97E9260B657D0059D135 /* ShippingLabelPredefinedOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A97E8260B657D0059D135 /* ShippingLabelPredefinedOption.swift */; };
137+
451A9832260B9D2D0059D135 /* ShippingLabelPackagesMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A9831260B9D2D0059D135 /* ShippingLabelPackagesMapper.swift */; };
138+
451A9836260B9DF90059D135 /* ShippingLabelPackagesMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A9835260B9DF90059D135 /* ShippingLabelPackagesMapperTests.swift */; };
131139
4524CD9C242CEFAB00B2F20A /* product-on-sale-with-empty-sale-price.json in Resources */ = {isa = PBXBuildFile; fileRef = 4524CD9B242CEFAB00B2F20A /* product-on-sale-with-empty-sale-price.json */; };
132140
453305E92459DF2100264E50 /* PostMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453305E82459DF2100264E50 /* PostMapper.swift */; };
133141
453305EB2459E01A00264E50 /* PostMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453305EA2459E01A00264E50 /* PostMapperTests.swift */; };
@@ -562,6 +570,14 @@
562570
4515282A257A8C010076B03C /* product-attribute-delete.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "product-attribute-delete.json"; sourceTree = "<group>"; };
563571
45152830257A8E1A0076B03C /* ProductAttributeMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductAttributeMapperTests.swift; sourceTree = "<group>"; };
564572
45152834257A8F490076B03C /* ProductAttributeListMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductAttributeListMapperTests.swift; sourceTree = "<group>"; };
573+
451A97C82609FF050059D135 /* ShippingLabelPackagesResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelPackagesResponse.swift; sourceTree = "<group>"; };
574+
451A97CC260A01A40059D135 /* ShippingLabelStoreOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelStoreOptions.swift; sourceTree = "<group>"; };
575+
451A97D0260A03900059D135 /* ShippingLabelCustomPackage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelCustomPackage.swift; sourceTree = "<group>"; };
576+
451A97DD260B59870059D135 /* shipping-label-packages-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "shipping-label-packages-success.json"; sourceTree = "<group>"; };
577+
451A97E4260B631E0059D135 /* ShippingLabelPredefinedPackage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelPredefinedPackage.swift; sourceTree = "<group>"; };
578+
451A97E8260B657D0059D135 /* ShippingLabelPredefinedOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelPredefinedOption.swift; sourceTree = "<group>"; };
579+
451A9831260B9D2D0059D135 /* ShippingLabelPackagesMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelPackagesMapper.swift; sourceTree = "<group>"; };
580+
451A9835260B9DF90059D135 /* ShippingLabelPackagesMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelPackagesMapperTests.swift; sourceTree = "<group>"; };
565581
4524CD9B242CEFAB00B2F20A /* product-on-sale-with-empty-sale-price.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "product-on-sale-with-empty-sale-price.json"; sourceTree = "<group>"; };
566582
453305E82459DF2100264E50 /* PostMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostMapper.swift; sourceTree = "<group>"; };
567583
453305EA2459E01A00264E50 /* PostMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostMapperTests.swift; sourceTree = "<group>"; };
@@ -916,6 +932,7 @@
916932
45A4B86125D3086600776FB4 /* ShippingLabelAddressValidationError.swift */,
917933
02C2549F25636F6900A04423 /* ShippingLabelRefund.swift */,
918934
02C254A3256371B200A04423 /* ShippingLabelSettings.swift */,
935+
451A97C72609FDE50059D135 /* Packages */,
919936
);
920937
path = ShippingLabel;
921938
sourceTree = "<group>";
@@ -948,6 +965,34 @@
948965
name = Frameworks;
949966
sourceTree = "<group>";
950967
};
968+
451A97C72609FDE50059D135 /* Packages */ = {
969+
isa = PBXGroup;
970+
children = (
971+
451A97C82609FF050059D135 /* ShippingLabelPackagesResponse.swift */,
972+
451A97CC260A01A40059D135 /* ShippingLabelStoreOptions.swift */,
973+
451A97D4260A069B0059D135 /* Custom package */,
974+
451A97E3260B63030059D135 /* Predefined package */,
975+
);
976+
path = Packages;
977+
sourceTree = "<group>";
978+
};
979+
451A97D4260A069B0059D135 /* Custom package */ = {
980+
isa = PBXGroup;
981+
children = (
982+
451A97D0260A03900059D135 /* ShippingLabelCustomPackage.swift */,
983+
);
984+
path = "Custom package";
985+
sourceTree = "<group>";
986+
};
987+
451A97E3260B63030059D135 /* Predefined package */ = {
988+
isa = PBXGroup;
989+
children = (
990+
451A97E8260B657D0059D135 /* ShippingLabelPredefinedOption.swift */,
991+
451A97E4260B631E0059D135 /* ShippingLabelPredefinedPackage.swift */,
992+
);
993+
path = "Predefined package";
994+
sourceTree = "<group>";
995+
};
951996
45AE58142306ADA8001901E3 /* Refund */ = {
952997
isa = PBXGroup;
953998
children = (
@@ -1273,7 +1318,6 @@
12731318
B559EBA820A0B5B100836CD4 /* Responses */ = {
12741319
isa = PBXGroup;
12751320
children = (
1276-
02E7FFCE25621C7900C53030 /* shipping-label-print.json */,
12771321
CECC759D23D6231900486676 /* order-560-all-refunds.json */,
12781322
74C8F06F20EEC3A800B6EDC9 /* broken-notes.json */,
12791323
B5A2417A217F98FC00595DEF /* broken-notifications.json */,
@@ -1375,6 +1419,8 @@
13751419
D823D90622376B4800C90817 /* shipment_tracking_new_custom_provider.json */,
13761420
D823D90A22376EFE00C90817 /* shipment_tracking_delete.json */,
13771421
D823D91322377EE600C90817 /* shipment_tracking_providers.json */,
1422+
451A97DD260B59870059D135 /* shipping-label-packages-success.json */,
1423+
02E7FFCE25621C7900C53030 /* shipping-label-print.json */,
13781424
028FA471257E110700F88A48 /* shipping-label-refund-error.json */,
13791425
028FA472257E110700F88A48 /* shipping-label-refund-success.json */,
13801426
45A4B85525D2E75200776FB4 /* shipping-label-address-validation-success.json */,
@@ -1456,6 +1502,7 @@
14561502
74ABA1D2213F25AE00FFAD30 /* TopEarnerStatsMapper.swift */,
14571503
026CF61D237D6985009563D4 /* ProductVariationListMapper.swift */,
14581504
02C1CEF324C6A02B00703EBA /* ProductVariationMapper.swift */,
1505+
451A9831260B9D2D0059D135 /* ShippingLabelPackagesMapper.swift */,
14591506
029BA53A255DFABD006171FD /* ShippingLabelPrintDataMapper.swift */,
14601507
021A84D9257DF92800BC71D1 /* ShippingLabelRefundMapper.swift */,
14611508
45A4B84D25D2E11300776FB4 /* ShippingLabelAddressValidationResponseMapper.swift */,
@@ -1556,6 +1603,7 @@
15561603
D8FBFF0E22D3B25E006E3336 /* WooAPIVersionTests.swift */,
15571604
02698CF724C183A5005337C4 /* ProductVariationListMapperTests.swift */,
15581605
020C907E24C7D359001E2BEB /* ProductVariationMapperTests.swift */,
1606+
451A9835260B9DF90059D135 /* ShippingLabelPackagesMapperTests.swift */,
15591607
02C254D22563992900A04423 /* OrderShippingLabelListMapperTests.swift */,
15601608
);
15611609
path = Mapper;
@@ -1818,6 +1866,7 @@
18181866
02698CFA24C188E9005337C4 /* product-variations-load-all-alternative-types.json in Resources */,
18191867
7497376A2141F2BE0008C490 /* top-performers-week-alt.json in Resources */,
18201868
743E84F222172D0A00FAC9D7 /* shipment_tracking_plugin_not_active.json in Resources */,
1869+
451A97DE260B59870059D135 /* shipping-label-packages-success.json in Resources */,
18211870
31D27C8F2602B553002EDB1D /* plugins.json in Resources */,
18221871
261CF1B4255AD6B30090D8D3 /* payment-gateway-list.json in Resources */,
18231872
268B68FB24C87384007EBF1D /* leaderboards-products.json in Resources */,
@@ -1910,6 +1959,7 @@
19101959
B50A583921AD861700617455 /* APNSDevice.swift in Sources */,
19111960
26455E2425F66982008A1D32 /* ProductAttributeTermRemote.swift in Sources */,
19121961
7426CA0D21AF27B9004E9FFC /* SiteAPIRemote.swift in Sources */,
1962+
451A97D1260A03900059D135 /* ShippingLabelCustomPackage.swift in Sources */,
19131963
D88D5A45230BC6F9007B6E01 /* ProductReviewsRemote.swift in Sources */,
19141964
B59325D4217E4206000B0E8E /* NoteBlock.swift in Sources */,
19151965
D8C251D0230BD72700F49782 /* ProductReviewMapper.swift in Sources */,
@@ -1924,6 +1974,7 @@
19241974
B59325D3217E4206000B0E8E /* NoteMedia.swift in Sources */,
19251975
26731337255ACA850026F7EF /* PaymentGatewayListMapper.swift in Sources */,
19261976
CE227093228DD44C00C0626C /* ProductStatus.swift in Sources */,
1977+
451A97E9260B657D0059D135 /* ShippingLabelPredefinedOption.swift in Sources */,
19271978
02C2548425635BD000A04423 /* ShippingLabelPaperSize.swift in Sources */,
19281979
CE132BBC223859710029DB6C /* ProductTag.swift in Sources */,
19291980
D88D5A47230BC838007B6E01 /* ProductReview.swift in Sources */,
@@ -1936,6 +1987,7 @@
19361987
020D07B823D852BB00FD9580 /* Media.swift in Sources */,
19371988
B5BB1D0C20A2050300112D92 /* DateFormatter+Woo.swift in Sources */,
19381989
743E84EE2217244C00FAC9D7 /* ShipmentTrackingListMapper.swift in Sources */,
1990+
451A97E5260B631E0059D135 /* ShippingLabelPredefinedPackage.swift in Sources */,
19391991
B567AF2520A0CCA300AB6C62 /* AuthenticatedRequest.swift in Sources */,
19401992
453305E92459DF2100264E50 /* PostMapper.swift in Sources */,
19411993
456F71D424CB1E2400472EC1 /* ProductTagFromBatchCreation.swift in Sources */,
@@ -1991,6 +2043,7 @@
19912043
45B204B82489095100FE6526 /* ProductCategoryMapper.swift in Sources */,
19922044
B557DA0D20975DB1005962F4 /* WordPressAPIVersion.swift in Sources */,
19932045
7412A8EC21B6E286005D182A /* ReportOrderTotalsMapper.swift in Sources */,
2046+
451A97CD260A01A40059D135 /* ShippingLabelStoreOptions.swift in Sources */,
19942047
5726F72E2460A2820031CAAC /* Copiable.swift in Sources */,
19952048
02C254A8256373AB00A04423 /* ShippingLabel.swift in Sources */,
19962049
74A1D26F21189EA100931DFA /* SiteVisitStatsRemote.swift in Sources */,
@@ -2071,6 +2124,7 @@
20712124
020D07BE23D8570800FD9580 /* MediaListMapper.swift in Sources */,
20722125
74C8F06820EEB7BD00B6EDC9 /* OrderNotesMapper.swift in Sources */,
20732126
24F98C582502EA8800F49B68 /* FeatureFlagMapper.swift in Sources */,
2127+
451A9832260B9D2D0059D135 /* ShippingLabelPackagesMapper.swift in Sources */,
20742128
4501068F2399B19500E24722 /* TaxClassRemote.swift in Sources */,
20752129
B53EF5342180F646003E146F /* DotcomValidator.swift in Sources */,
20762130
74046E1D217A6989007DD7BF /* SiteSetting.swift in Sources */,
@@ -2088,6 +2142,7 @@
20882142
CE43066C2347C5F90073CBFF /* OrderItemRefund.swift in Sources */,
20892143
B5C6FCD420A373BB00A4F8E4 /* OrderMapper.swift in Sources */,
20902144
D88D5A49230BC8C7007B6E01 /* ProductReviewStatus.swift in Sources */,
2145+
451A97C92609FF050059D135 /* ShippingLabelPackagesResponse.swift in Sources */,
20912146
029BA4F0255D7282006171FD /* ShippingLabelRemote.swift in Sources */,
20922147
B557DA0F20975E07005962F4 /* DotcomRequest.swift in Sources */,
20932148
740211E321939C84002248DA /* CommentResultMapper.swift in Sources */,
@@ -2121,6 +2176,7 @@
21212176
buildActionMask = 2147483647;
21222177
files = (
21232178
45551F142523E7FF007EF104 /* UserAgentTests.swift in Sources */,
2179+
451A9836260B9DF90059D135 /* ShippingLabelPackagesMapperTests.swift in Sources */,
21242180
02BDB83723EA9C4D00BCC63E /* String+HTMLTests.swift in Sources */,
21252181
74CF5E8421402C04000CED0A /* TopEarnerStatsRemoteTests.swift in Sources */,
21262182
45B204BA24890A8C00FE6526 /* ProductCategoryMapperTests.swift in Sources */,
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import Foundation
2+
3+
4+
/// Mapper: Shipping Label Packages
5+
///
6+
struct ShippingLabelPackagesMapper: Mapper {
7+
/// (Attempts) to convert a dictionary into ShippingLabelPackagesResponse.
8+
///
9+
func map(response: Data) throws -> ShippingLabelPackagesResponse {
10+
let decoder = JSONDecoder()
11+
return try decoder.decode(ShippingLabelPackagesMapperEnvelope.self, from: response).data
12+
}
13+
}
14+
15+
/// ShippingLabelPackagesMapperEnvelope Disposable Entity:
16+
/// `Shipping Label Packages` endpoint returns the shipping label packages in the `data` key.
17+
/// This entity allows us to do parse all the things with JSONDecoder.
18+
///
19+
private struct ShippingLabelPackagesMapperEnvelope: Decodable {
20+
let data: ShippingLabelPackagesResponse
21+
22+
private enum CodingKeys: String, CodingKey {
23+
case data = "data"
24+
}
25+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import Foundation
2+
3+
/// Represents a custom package in Shipping Labels.
4+
///
5+
public struct ShippingLabelCustomPackage: Equatable, GeneratedFakeable {
6+
7+
/// Usually is always `true` for custom packages
8+
public let isUserDefined: Bool
9+
10+
/// The name of the custom package, like `Krabica`
11+
public let title: String
12+
13+
/// Defines if package is a box or a letter. By default is a box, so it's equal to `false`
14+
public let isLetter: Bool
15+
16+
/// Will be a string formatted like this: `2 x 3 x 4`
17+
public let dimensions: String
18+
19+
public let boxWeight: Int
20+
21+
public let maxWeight: Int
22+
23+
public init(isUserDefined: Bool, title: String, isLetter: Bool, dimensions: String, boxWeight: Int, maxWeight: Int) {
24+
self.isUserDefined = isUserDefined
25+
self.title = title
26+
self.isLetter = isLetter
27+
self.dimensions = dimensions
28+
self.boxWeight = boxWeight
29+
self.maxWeight = maxWeight
30+
}
31+
}
32+
33+
// MARK: Decodable
34+
extension ShippingLabelCustomPackage: Decodable {
35+
public init(from decoder: Decoder) throws {
36+
let container = try decoder.container(keyedBy: CodingKeys.self)
37+
38+
let isUserDefined = try container.decode(Bool.self, forKey: .isUserDefined)
39+
let title = try container.decode(String.self, forKey: .title)
40+
let isLetter = try container.decodeIfPresent(Bool.self, forKey: .isLetter) ?? false
41+
let dimensions = try container.decode(String.self, forKey: .innerDimensions)
42+
let boxWeight = try container.decode(Int.self, forKey: .boxWeight)
43+
let maxWeight = try container.decode(Int.self, forKey: .maxWeight)
44+
45+
self.init(isUserDefined: isUserDefined, title: title, isLetter: isLetter, dimensions: dimensions, boxWeight: boxWeight, maxWeight: maxWeight)
46+
}
47+
48+
private enum CodingKeys: String, CodingKey {
49+
case isUserDefined = "is_user_defined"
50+
case title = "name"
51+
case isLetter = "is_letter"
52+
case innerDimensions = "inner_dimensions"
53+
case boxWeight = "box_weight"
54+
case maxWeight = "max_weight"
55+
}
56+
}

0 commit comments

Comments
 (0)