Skip to content

Commit 8276d17

Browse files
Add link resolution for (new) RecursiveNode, e.g. for RichTextDo… (contentful#276)
Add link resolution for (new) RecursiveNode, e.g. for RichTextDocument
2 parents efa32f4 + 731e74e commit 8276d17

File tree

4 files changed

+150
-3
lines changed

4 files changed

+150
-3
lines changed

Sources/Contentful/Entry.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ public class Entry: LocalizableResource {
9090
}
9191
}
9292
resolvedLocalizableFieldMap[localeCode] = resolvedLinks
93+
case let recursiveNode as RecursiveNode:
94+
recursiveNode.resolveLinks(against: includedEntries, and: includedAssets)
9395
default:
9496
continue
9597
}

Sources/Contentful/RichText.swift

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,25 @@ public protocol Node: Decodable {
1515
var nodeType: NodeType { get }
1616
}
1717

18+
public protocol RecursiveNode: Node {
19+
var content: [Node] { get }
20+
func resolveLinks(against includedEntries: [Entry]?, and includedAssets: [Asset]?)
21+
}
22+
23+
private extension RecursiveNode {
24+
25+
func resolveLinksInChildNodes(against includedEntries: [Entry]?, and includedAssets: [Asset]?) {
26+
self.content.forEach { node in
27+
switch node {
28+
case let recursiveNode as RecursiveNode:
29+
recursiveNode.resolveLinks(against: includedEntries, and: includedAssets)
30+
default:
31+
break
32+
}
33+
}
34+
}
35+
}
36+
1837
/// The data describing the linked entry or asset for an `EmbeddedResouceNode`
1938
public class ResourceLinkData: Decodable {
2039

@@ -124,7 +143,7 @@ public enum NodeType: String, Decodable {
124143
}
125144

126145
/// BlockNode is the base class for all nodes which are rendered as a block (as opposed to an inline node).
127-
public class BlockNode: Node {
146+
public class BlockNode: RecursiveNode {
128147
public let nodeType: NodeType
129148
public internal(set) var content: [Node]
130149

@@ -137,10 +156,14 @@ public class BlockNode: Node {
137156
self.nodeType = nodeType
138157
self.content = content
139158
}
159+
160+
public func resolveLinks(against includedEntries: [Entry]?, and includedAssets: [Asset]?) {
161+
resolveLinksInChildNodes(against: includedEntries, and: includedAssets)
162+
}
140163
}
141164

142165
/// InlineNode is the base class for all nodes which are rendered as an inline string (as opposed to a block node).
143-
public class InlineNode: Node {
166+
public class InlineNode: RecursiveNode {
144167
public let nodeType: NodeType
145168
public internal(set) var content: [Node]
146169

@@ -153,10 +176,14 @@ public class InlineNode: Node {
153176
self.nodeType = nodeType
154177
self.content = content
155178
}
179+
180+
public func resolveLinks(against includedEntries: [Entry]?, and includedAssets: [Asset]?) {
181+
resolveLinksInChildNodes(against: includedEntries, and: includedAssets)
182+
}
156183
}
157184

158185
/// The top level node which contains all other nodes.
159-
public class RichTextDocument: Node {
186+
public class RichTextDocument: RecursiveNode {
160187
public let nodeType: NodeType
161188
public internal(set) var content: [Node]
162189

@@ -170,6 +197,10 @@ public class RichTextDocument: Node {
170197
nodeType = try container.decode(NodeType.self, forKey: .nodeType)
171198
content = try container.decodeContent(forKey: .content)
172199
}
200+
201+
public func resolveLinks(against includedEntries: [Entry]?, and includedAssets: [Asset]?) {
202+
resolveLinksInChildNodes(against: includedEntries, and: includedAssets)
203+
}
173204
}
174205

175206
/// A block of text, containing child `Text` nodes.
@@ -245,6 +276,28 @@ public class ResourceLinkBlock: BlockNode {
245276
data = try container.decode(ResourceLinkData.self, forKey: .data)
246277
try super.init(from: decoder)
247278
}
279+
280+
public override func resolveLinks(against includedEntries: [Entry]?, and includedAssets: [Asset]?) {
281+
switch data.target {
282+
case .asset, .entry, .entryDecodable:
283+
return
284+
case let .unresolved(sys):
285+
switch sys.linkType.lowercased() {
286+
case "entry":
287+
guard let linkedEntry = includedEntries?.first(where: { $0.sys.id == sys.id }) else {
288+
return
289+
}
290+
data.target = Link.entry(linkedEntry)
291+
case "asset":
292+
guard let linkedAsset = includedAssets?.first(where: { $0.sys.id == sys.id }) else {
293+
return
294+
}
295+
data.target = Link.asset(linkedAsset)
296+
default:
297+
return
298+
}
299+
}
300+
}
248301
}
249302

250303
/// A inline containing data for a linked entry or asset.
@@ -263,6 +316,28 @@ public class ResourceLinkInline: InlineNode {
263316
data = try container.decode(ResourceLinkData.self, forKey: .data)
264317
try super.init(from: decoder)
265318
}
319+
320+
public override func resolveLinks(against includedEntries: [Entry]?, and includedAssets: [Asset]?) {
321+
switch data.target {
322+
case .asset, .entry, .entryDecodable:
323+
return
324+
case let .unresolved(sys):
325+
switch sys.linkType.lowercased() {
326+
case "entry":
327+
guard let linkedEntry = includedEntries?.first(where: { $0.sys.id == sys.id }) else {
328+
return
329+
}
330+
data.target = Link.entry(linkedEntry)
331+
case "asset":
332+
guard let linkedAsset = includedAssets?.first(where: { $0.sys.id == sys.id }) else {
333+
return
334+
}
335+
data.target = Link.asset(linkedAsset)
336+
default:
337+
return
338+
}
339+
}
340+
}
266341
}
267342

268343
/// A node containing text with marks.

Tests/ContentfulTests/DVRRecordings/RichTextNodeDecodingTests.json

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,48 @@
336336
},
337337
"recorded_at" : 1541494467.6026201
338338
},
339+
{
340+
"request" : {
341+
"method" : "GET",
342+
"headers" : {
343+
"X-Contentful-User-Agent" : "sdk contentful.swift\/4.0.1; platform Swift\/4.0; os iOS\/12.1.0;",
344+
"Authorization" : "Bearer 1859a86ac82f679e8436af5ed5202bdb45f96b1deed3b5d1e20275698b5184c9"
345+
},
346+
"url" : "https:\/\/cdn.contentful.com\/spaces\/pzlh94jb0ghw\/environments\/master\/entries?fields.name=nested_included_entries"
347+
},
348+
"response" : {
349+
"headers" : {
350+
"Content-Encoding" : "gzip",
351+
"Age" : "62",
352+
"access-control-max-age" : "86400",
353+
"x-timer" : "S1541494468.594509,VS0,VE0",
354+
"access-control-expose-headers" : "Etag",
355+
"x-cache" : "HIT",
356+
"x-contentful-region" : "us-east-1",
357+
"contentful-api" : "cda_cached",
358+
"Date" : "Tue, 06 Nov 2018 08:54:27 GMT",
359+
"access-control-allow-methods" : "GET,HEAD,OPTIONS",
360+
"Server" : "Contentful",
361+
"Vary" : "Accept-Encoding",
362+
"Cache-Control" : "max-age=0",
363+
"x-served-by" : "cache-bma1641-BMA",
364+
"Accept-Ranges" : "bytes",
365+
"Content-Length" : "1460",
366+
"Access-Control-Allow-Origin" : "*",
367+
"Content-Type" : "application\/vnd.contentful.delivery.v1+json",
368+
"Via" : "1.1 varnish",
369+
"access-control-allow-headers" : "Accept,Accept-Language,Authorization,Cache-Control,Content-Length,Content-Range,Content-Type,DNT,Destination,Expires,If-Match,If-Modified-Since,If-None-Match,Keep-Alive,Last-Modified,Origin,Pragma,Range,User-Agent,X-Http-Method-Override,X-Mx-ReqToken,X-Requested-With,X-Contentful-Version,X-Contentful-Content-Type,X-Contentful-Organization,X-Contentful-Skip-Transformation,X-Contentful-User-Agent,X-Contentful-Enable-Alpha-Feature",
370+
"Etag" : "W\/\"18fa4c989a708dacb0192e5ec0f0b9ad\"",
371+
"x-content-type-options" : "nosniff",
372+
"x-contentful-request-id" : "231920a6600fd0de2a9dc73f2deea6d0",
373+
"x-cache-hits" : "1"
374+
},
375+
"url" : "https:\/\/cdn.contentful.com\/spaces\/pzlh94jb0ghw\/environments\/master\/entries?fields.name=nested_included_entries",
376+
"status" : 200,
377+
"body" : "ewogICJzeXMiOiB7CiAgICAidHlwZSI6ICJBcnJheSIKICB9LAogICJ0b3RhbCI6IDEsCiAgInNraXAiOiAwLAogICJsaW1pdCI6IDEwMCwKICAiaXRlbXMiOiBbCiAgICB7CiAgICAgICJzeXMiOiB7CiAgICAgICAgInNwYWNlIjogewogICAgICAgICAgInN5cyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiTGluayIsCiAgICAgICAgICAgICJsaW5rVHlwZSI6ICJTcGFjZSIsCiAgICAgICAgICAgICJpZCI6ICJwemxoOTRqYjBnaHciCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiaWQiOiAiM1JrUGhKaHFsMm13Q2tjeXVZMmFNcSIsCiAgICAgICAgInR5cGUiOiAiRW50cnkiLAogICAgICAgICJjcmVhdGVkQXQiOiAiMjAxOC0xMS0wMVQxMjoyODoxOS45NzJaIiwKICAgICAgICAidXBkYXRlZEF0IjogIjIwMTgtMTEtMDFUMTI6Mjg6MTkuOTcyWiIsCiAgICAgICAgImVudmlyb25tZW50IjogewogICAgICAgICAgInN5cyI6IHsKICAgICAgICAgICAgImlkIjogIm1hc3RlciIsCiAgICAgICAgICAgICJ0eXBlIjogIkxpbmsiLAogICAgICAgICAgICAibGlua1R5cGUiOiAiRW52aXJvbm1lbnQiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmV2aXNpb24iOiAxLAogICAgICAgICJjb250ZW50VHlwZSI6IHsKICAgICAgICAgICJzeXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIkxpbmsiLAogICAgICAgICAgICAibGlua1R5cGUiOiAiQ29udGVudFR5cGUiLAogICAgICAgICAgICAiaWQiOiAicmljaCIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJsb2NhbGUiOiAiZW4tVVMiCiAgICAgIH0sCiAgICAgICJmaWVsZHMiOiB7CiAgICAgICAgIm5hbWUiOiAiaW5saW5lX2h5cGVybGlua19pbnRlZ3JhdGlvbiIsCiAgICAgICAgInJpY2giOiB7CiAgICAgICAgICAiZGF0YSI6IHt9LAogICAgICAgICAgImNvbnRlbnQiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiZGF0YSI6IHt9LAogICAgICAgICAgICAgICJjb250ZW50IjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiZGF0YSI6IHt9LAogICAgICAgICAgICAgICAgICAibWFya3MiOiBbXSwKICAgICAgICAgICAgICAgICAgInZhbHVlIjogIkFuIGVudHJ5IHdpdGggYW4gZW1iZWRkZWQgZW50cnkgdGhhdCBpdHNlbGYgaGFzIGFuIGVtYmVkZGVkIGVudHJ5OiIsCiAgICAgICAgICAgICAgICAgICJub2RlVHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgImRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgInRhcmdldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICJzeXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6ICI0dmcxY1JGSHRLYUFnV1lhQUVVdTZLIiwKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiTGluayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rVHlwZSI6ICJFbnRyeSIKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICJjb250ZW50IjogW10sCiAgICAgICAgICAgICAgICAgICJub2RlVHlwZSI6ICJlbWJlZGRlZC1lbnRyeS1ibG9jayIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJub2RlVHlwZSI6ICJwYXJhZ3JhcGgiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAibm9kZVR5cGUiOiAiZG9jdW1lbnQiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgXSwKICAiaW5jbHVkZXMiOiB7CiAgICAiRW50cnkiOiBbCiAgICAgIHsKICAgICAgICAic3lzIjogewogICAgICAgICAgInNwYWNlIjogewogICAgICAgICAgICAic3lzIjogewogICAgICAgICAgICAgICJ0eXBlIjogIkxpbmsiLAogICAgICAgICAgICAgICJsaW5rVHlwZSI6ICJTcGFjZSIsCiAgICAgICAgICAgICAgImlkIjogInB6bGg5NGpiMGdodyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJpZCI6ICI0dmcxY1JGSHRLYUFnV1lhQUVVdTZLIiwKICAgICAgICAgICJ0eXBlIjogIkVudHJ5IiwKICAgICAgICAgICJjcmVhdGVkQXQiOiAiMjAxOC0xMC0xN1QxMzozMjozMC4yNTJaIiwKICAgICAgICAgICJ1cGRhdGVkQXQiOiAiMjAxOC0xMC0zMVQxMTowNDozMi40MzhaIiwKICAgICAgICAgICJlbnZpcm9ubWVudCI6IHsKICAgICAgICAgICAgInN5cyI6IHsKICAgICAgICAgICAgICAiaWQiOiAibWFzdGVyIiwKICAgICAgICAgICAgICAidHlwZSI6ICJMaW5rIiwKICAgICAgICAgICAgICAibGlua1R5cGUiOiAiRW52aXJvbm1lbnQiCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAicmV2aXNpb24iOiAyLAogICAgICAgICAgImNvbnRlbnRUeXBlIjogewogICAgICAgICAgICAic3lzIjogewogICAgICAgICAgICAgICJ0eXBlIjogIkxpbmsiLAogICAgICAgICAgICAgICJsaW5rVHlwZSI6ICJDb250ZW50VHlwZSIsCiAgICAgICAgICAgICAgImlkIjogInJpY2giCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAibG9jYWxlIjogImVuLVVTIgogICAgICAgIH0sCiAgICAgICAgImZpZWxkcyI6IHsKICAgICAgICAgICJuYW1lIjogInNpbXBsZV9oZWFkbGluZV8xIiwKICAgICAgICAgICJsaW5rZWRFbnRyeSI6IHsKICAgICAgICAgICAgInN5cyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJMaW5rIiwKICAgICAgICAgICAgICAibGlua1R5cGUiOiAiRW50cnkiLAogICAgICAgICAgICAgICJpZCI6ICJCdkJtMlNOVEVzNDB3VXd5b0kwUW8iCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAicmljaCI6IHsKICAgICAgICAgICAgImRhdGEiOiB7fSwKICAgICAgICAgICAgImNvbnRlbnQiOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImRhdGEiOiB7fSwKICAgICAgICAgICAgICAgICJjb250ZW50IjogWwogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiOiB7fSwKICAgICAgICAgICAgICAgICAgICAibWFya3MiOiBbXSwKICAgICAgICAgICAgICAgICAgICAidmFsdWUiOiAiVGhpcyBpcyBzb21lIHNpbXBsZSB0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAibm9kZVR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJub2RlVHlwZSI6ICJoZWFkaW5nLTEiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiZGF0YSI6IHt9LAogICAgICAgICAgICAgICAgImNvbnRlbnQiOiBbCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHt9LAogICAgICAgICAgICAgICAgICAgICJtYXJrcyI6IFtdLAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICJub2RlVHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgIm5vZGVUeXBlIjogInBhcmFncmFwaCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJub2RlVHlwZSI6ICJkb2N1bWVudCIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3lzIjogewogICAgICAgICAgInNwYWNlIjogewogICAgICAgICAgICAic3lzIjogewogICAgICAgICAgICAgICJ0eXBlIjogIkxpbmsiLAogICAgICAgICAgICAgICJsaW5rVHlwZSI6ICJTcGFjZSIsCiAgICAgICAgICAgICAgImlkIjogInB6bGg5NGpiMGdodyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJpZCI6ICJCdkJtMlNOVEVzNDB3VXd5b0kwUW8iLAogICAgICAgICAgInR5cGUiOiAiRW50cnkiLAogICAgICAgICAgImNyZWF0ZWRBdCI6ICIyMDE4LTEwLTE3VDEzOjI1OjU3LjkyNloiLAogICAgICAgICAgInVwZGF0ZWRBdCI6ICIyMDE4LTEwLTE3VDEzOjU3OjU0LjIxNFoiLAogICAgICAgICAgImVudmlyb25tZW50IjogewogICAgICAgICAgICAic3lzIjogewogICAgICAgICAgICAgICJpZCI6ICJtYXN0ZXIiLAogICAgICAgICAgICAgICJ0eXBlIjogIkxpbmsiLAogICAgICAgICAgICAgICJsaW5rVHlwZSI6ICJFbnZpcm9ubWVudCIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJyZXZpc2lvbiI6IDMsCiAgICAgICAgICAiY29udGVudFR5cGUiOiB7CiAgICAgICAgICAgICJzeXMiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiTGluayIsCiAgICAgICAgICAgICAgImxpbmtUeXBlIjogIkNvbnRlbnRUeXBlIiwKICAgICAgICAgICAgICAiaWQiOiAicmljaCIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJsb2NhbGUiOiAiZW4tVVMiCiAgICAgICAgfSwKICAgICAgICAiZmllbGRzIjogewogICAgICAgICAgIm5hbWUiOiAiSGVsbG8gV29ybGQiLAogICAgICAgICAgInJpY2giOiB7CiAgICAgICAgICAgICJkYXRhIjoge30sCiAgICAgICAgICAgICJjb250ZW50IjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJkYXRhIjoge30sCiAgICAgICAgICAgICAgICAiY29udGVudCI6IFsKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJkYXRhIjoge30sCiAgICAgICAgICAgICAgICAgICAgIm1hcmtzIjogWwogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib2xkIgogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIkhlbGxvIiwKICAgICAgICAgICAgICAgICAgICAibm9kZVR5cGUiOiAidGV4dCIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJkYXRhIjoge30sCiAgICAgICAgICAgICAgICAgICAgIm1hcmtzIjogW10sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiAiLAogICAgICAgICAgICAgICAgICAgICJub2RlVHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImRhdGEiOiB7fSwKICAgICAgICAgICAgICAgICAgICAibWFya3MiOiBbCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIml0YWxpYyIKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJXb3JsZCIsCiAgICAgICAgICAgICAgICAgICAgIm5vZGVUeXBlIjogInRleHQiCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHt9LAogICAgICAgICAgICAgICAgICAgICJtYXJrcyI6IFsKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidW5kZXJsaW5lIgogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgInZhbHVlIjogIiEiLAogICAgICAgICAgICAgICAgICAgICJub2RlVHlwZSI6ICJ0ZXh0IgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgIm5vZGVUeXBlIjogInBhcmFncmFwaCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJub2RlVHlwZSI6ICJkb2N1bWVudCIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIF0KICB9Cn0="
378+
},
379+
"recorded_at" : 1541494467.6026201
380+
},
339381
{
340382
"request" : {
341383
"method" : "GET",

Tests/ContentfulTests/RichTextTests.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ class RichTextNodeDecodingTests: XCTestCase {
4242
spaceId: "pzlh94jb0ghw",
4343
accessToken: "1859a86ac82f679e8436af5ed5202bdb45f96b1deed3b5d1e20275698b5184c9",
4444
contentTypeClasses: [RichTextContentType.self])
45+
static let clientWithoutContentTypeClasses = TestClientFactory.testClient(
46+
withCassetteNamed: "RichTextNodeDecodingTests",
47+
spaceId: "pzlh94jb0ghw",
48+
accessToken: "1859a86ac82f679e8436af5ed5202bdb45f96b1deed3b5d1e20275698b5184c9"
49+
)
4550

4651
override class func setUp() {
4752
super.setUp()
@@ -437,4 +442,27 @@ class RichTextNodeDecodingTests: XCTestCase {
437442
waitForExpectations(timeout: 10_000.0, handler: nil)
438443
}
439444

445+
func testDecodingNestedEntriesInlinedInRichTextWithoutContentTypeClasses() {
446+
let expectation = self.expectation(description: "")
447+
448+
RichTextNodeDecodingTests.clientWithoutContentTypeClasses.fetchArray(
449+
of: Entry.self,
450+
matching: .where(field: "name", .equals("nested_included_entries"))) { result in
451+
switch result {
452+
case .success(let arrayResponse):
453+
let rootRichTextContentType = arrayResponse.items.first
454+
let paragraph = (rootRichTextContentType?.fields["rich"] as! RichTextDocument).content.first as? Paragraph
455+
let link = paragraph?.content[1] as? ResourceLinkBlock
456+
let inlinedEntry = link?.data.target.entry
457+
458+
XCTAssertNotNil(inlinedEntry)
459+
case .error(let error):
460+
XCTFail("\(error)")
461+
}
462+
expectation.fulfill()
463+
}
464+
waitForExpectations(timeout: 10_000.0, handler: nil)
465+
}
466+
467+
440468
}

0 commit comments

Comments
 (0)