Skip to content

Commit 8b966fc

Browse files
authored
test(session-replay): Add masking tests for special views (#6571)
1 parent f83dcc4 commit 8b966fc

File tree

2 files changed

+381
-0
lines changed

2 files changed

+381
-0
lines changed

Sentry.xcodeproj/project.pbxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2186,6 +2186,7 @@
21862186
D4AF00242D2E93C400F5F3D7 /* SentryNSFileManagerSwizzlingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SentryNSFileManagerSwizzlingTests.m; sourceTree = "<group>"; };
21872187
D4AF7D212E93FFCA004F0F59 /* SentryUIRedactBuilderTests+ReactNative.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SentryUIRedactBuilderTests+ReactNative.swift"; sourceTree = "<group>"; };
21882188
D4AF7D252E9401EB004F0F59 /* SentryUIRedactBuilderTests+UIKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SentryUIRedactBuilderTests+UIKit.swift"; sourceTree = "<group>"; };
2189+
D4AF7D272E9402AC004F0F59 /* SentryUIRedactBuilderTests+SpecialViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SentryUIRedactBuilderTests+SpecialViews.swift"; sourceTree = "<group>"; };
21892190
D4AF7D292E940492004F0F59 /* SentryUIRedactBuilderTests+Common.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SentryUIRedactBuilderTests+Common.swift"; sourceTree = "<group>"; };
21902191
D4AF7D2B2E9404ED004F0F59 /* SentryUIRedactBuilderTests+EdgeCases.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SentryUIRedactBuilderTests+EdgeCases.swift"; sourceTree = "<group>"; };
21912192
D4B0DC7E2DA9257200DE61B6 /* SentryRenderVideoResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryRenderVideoResult.swift; sourceTree = "<group>"; };
@@ -6340,6 +6341,7 @@
63406341
D80694C42B7CC9AE00B820E6 /* SentryReplayEventTests.swift in Sources */,
63416342
7B34721728086A9D0041F047 /* SentrySwizzleWrapperTests.swift in Sources */,
63426343
8EC4CF5025C3A0070093DEE9 /* SentrySpanContextTests.swift in Sources */,
6344+
D4AF7D282E9402AC004F0F59 /* SentryUIRedactBuilderTests+SpecialViews.swift in Sources */,
63436345
6281C5742D3E50DF009D0978 /* ArbitraryDataTests.swift in Sources */,
63446346
7BE0DC2F272ABAF6004FA8B7 /* SentryAutoBreadcrumbTrackingIntegrationTests.swift in Sources */,
63456347
7B869EBE249B964D004F4FDB /* SentryThreadEquality.swift in Sources */,
Lines changed: 379 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,379 @@
1+
#if os(iOS) && !targetEnvironment(macCatalyst)
2+
import AVKit
3+
import Foundation
4+
import PDFKit
5+
import SafariServices
6+
@_spi(Private) @testable import Sentry
7+
import SentryTestUtils
8+
import SnapshotTesting
9+
import SwiftUI
10+
import UIKit
11+
import WebKit
12+
import XCTest
13+
14+
/// See `SentryUIRedactBuilderTests.swift` for more information on how to print the internal view hierarchy of a view.
15+
class SentryUIRedactBuilderTests_SpecialViews: SentryUIRedactBuilderTests { // swiftlint:disable:this type_name
16+
private func getSut(maskAllText: Bool, maskAllImages: Bool) -> SentryUIRedactBuilder {
17+
return SentryUIRedactBuilder(options: TestRedactOptions(
18+
maskAllText: maskAllText,
19+
maskAllImages: maskAllImages
20+
))
21+
}
22+
23+
// MARK: - PDF View
24+
25+
private func setupPDFViewFixture() -> UIView {
26+
let rootView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
27+
28+
let pdfView = PDFView(frame: CGRect(x: 20, y: 20, width: 40, height: 40))
29+
rootView.addSubview(pdfView)
30+
31+
return rootView
32+
33+
// View Hierarchy:
34+
// ---------------
35+
// <UIView: 0x101b98120; frame = (0 0; 100 100); layer = <CALayer: 0x600000c9f390>>
36+
// | <PDFView: 0x101d256e0; frame = (20 20; 40 40); gestureRecognizers = <NSArray: 0x600000cea190>; backgroundColor = <UIDynamicSystemColor: 0x60000173f180; name = secondarySystemBackgroundColor>; layer = <CALayer: 0x600000ce80f0>>
37+
// | | <PDFScrollView: 0x104028400; baseClass = UIScrollView; frame = (0 0; 40 40); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000ce9d70>; layer = <CALayer: 0x600000ce8a20>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}>
38+
}
39+
40+
func testRedact_withPDFView_withMaskingEnabled_shouldBeRedacted() throws {
41+
// -- Arrange --
42+
let rootView = setupPDFViewFixture()
43+
44+
// -- Act --
45+
let sut = getSut(maskAllText: true, maskAllImages: true)
46+
let result = sut.redactRegionsFor(view: rootView)
47+
48+
// -- Assert --
49+
let pdfRegion = try XCTUnwrap(result.element(at: 0))
50+
XCTAssertEqual(pdfRegion.size, CGSize(width: 40, height: 40))
51+
XCTAssertEqual(pdfRegion.type, .redact)
52+
XCTAssertEqual(pdfRegion.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
53+
XCTAssertNil(pdfRegion.color)
54+
55+
let pdfScrollViewRegion = try XCTUnwrap(result.element(at: 1))
56+
XCTAssertEqual(pdfScrollViewRegion.size, CGSize(width: 40, height: 40))
57+
XCTAssertEqual(pdfScrollViewRegion.type, .redact)
58+
XCTAssertEqual(pdfScrollViewRegion.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
59+
XCTAssertNil(pdfScrollViewRegion.color)
60+
61+
// Assert no additional regions
62+
XCTAssertEqual(result.count, 2)
63+
}
64+
65+
func testRedact_withPDFView_withMaskingDisabled_shouldBeRedacted() throws {
66+
// -- Arrange --
67+
let rootView = setupPDFViewFixture()
68+
69+
// -- Act --
70+
let sut = getSut(maskAllText: false, maskAllImages: false)
71+
let result = sut.redactRegionsFor(view: rootView)
72+
73+
// -- Assert --
74+
let pdfRegion = try XCTUnwrap(result.element(at: 0))
75+
XCTAssertEqual(pdfRegion.size, CGSize(width: 40, height: 40))
76+
XCTAssertEqual(pdfRegion.type, .redact)
77+
XCTAssertEqual(pdfRegion.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
78+
XCTAssertNil(pdfRegion.color)
79+
80+
let pdfScrollViewRegion = try XCTUnwrap(result.element(at: 1))
81+
XCTAssertEqual(pdfScrollViewRegion.size, CGSize(width: 40, height: 40))
82+
XCTAssertEqual(pdfScrollViewRegion.type, .redact)
83+
XCTAssertEqual(pdfScrollViewRegion.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
84+
XCTAssertNil(pdfScrollViewRegion.color)
85+
86+
// Assert no additional regions
87+
XCTAssertEqual(result.count, 2)
88+
}
89+
90+
// MARK: - WKWebView
91+
92+
private func setupWKWebViewFixture() -> UIView {
93+
let rootView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
94+
95+
let webView = WKWebView(frame: .init(x: 20, y: 20, width: 40, height: 40), configuration: .init())
96+
rootView.addSubview(webView)
97+
98+
return rootView
99+
100+
// View Hierarchy:
101+
// ---------------
102+
// <UIView: 0x105b3ac60; frame = (0 0; 100 100); layer = <CALayer: 0x600000c4fa50>>
103+
// | <WKWebView: 0x121819400; frame = (20 20; 40 40); layer = <CALayer: 0x600000ce8120>>
104+
// | | <WKScrollView: 0x106883000; baseClass = UIScrollView; frame = (0 0; 40 40); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600000cf1560>; backgroundColor = kCGColorSpaceModelRGB 1 1 1 1; layer = <CALayer: 0x600000cf0450>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}>
105+
// | | | <WKContentView: 0x121822800; frame = (0 0; 40 40); anchorPoint = (0, 0); layer = <CALayer: 0x600000ce8750>>
106+
// | | | | <UIView: 0x121012580; frame = (0 0; 0 0); anchorPoint = (0, 0); clipsToBounds = YES; layer = <CALayer: 0x600000cf8960>>
107+
// | | | | | <UIView: 0x1210123e0; frame = (0 0; 0 0); autoresize = W+H; layer = <CALayer: 0x600000cf8930>>
108+
// | | | | <WKVisibilityPropagationView: 0x105c21580; frame = (0 0; 0 0); layer = <CALayer: 0x600000cf01b0>>
109+
// | | | <_UIScrollViewScrollIndicator: 0x105c33170; frame = (34 30; 3 7); alpha = 0; autoresize = LM; layer = <CALayer: 0x600000cf0c30>>
110+
// | | | | <UIView: 0x105c2b5f0; frame = (0 0; 0 0); backgroundColor = UIExtendedGrayColorSpace 0 0.5; layer = <CALayer: 0x600000cf1830>>
111+
// | | | <_UIScrollViewScrollIndicator: 0x105c3eb90; frame = (30 34; 7 3); alpha = 0; autoresize = TM; layer = <CALayer: 0x600000cf1620>>
112+
// | | | | <UIView: 0x105c3cf60; frame = (0 0; 0 0); backgroundColor = UIExtendedGrayColorSpace 0 0.5; layer = <CALayer: 0x600000cf1770>>
113+
}
114+
115+
func testRedact_withWKWebView_withMaskingEnabled_shouldRedactView() throws {
116+
// -- Arrange --
117+
let rootView = setupWKWebViewFixture()
118+
119+
// -- Act --
120+
let sut = getSut(maskAllText: true, maskAllImages: true)
121+
let result = sut.redactRegionsFor(view: rootView)
122+
123+
// -- Assert --
124+
let region = try XCTUnwrap(result.element(at: 0)) // WKWebView
125+
XCTAssertNil(region.color)
126+
XCTAssertEqual(region.size, CGSize(width: 40, height: 40))
127+
XCTAssertEqual(region.type, .redact)
128+
XCTAssertEqual(region.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
129+
130+
let region2 = try XCTUnwrap(result.element(at: 1)) // WKScrollView
131+
XCTAssertNil(region2.color)
132+
XCTAssertEqual(region2.size, CGSize(width: 40, height: 40))
133+
XCTAssertEqual(region2.type, .redact)
134+
XCTAssertEqual(region2.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
135+
136+
// Assert no additional regions
137+
XCTAssertEqual(result.count, 2)
138+
}
139+
140+
func testRedact_withWKWebView_withMaskingDisabled_shouldRedactView() throws {
141+
// -- Arrange --
142+
let rootView = setupWKWebViewFixture()
143+
144+
// -- Act --
145+
let sut = getSut(maskAllText: false, maskAllImages: false)
146+
let result = sut.redactRegionsFor(view: rootView)
147+
148+
// -- Assert --
149+
let region = try XCTUnwrap(result.element(at: 0))
150+
XCTAssertNil(region.color)
151+
XCTAssertEqual(region.size, CGSize(width: 40, height: 40)) // WKWebView
152+
XCTAssertEqual(region.type, .redact)
153+
XCTAssertEqual(region.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
154+
155+
let region2 = try XCTUnwrap(result.element(at: 1))
156+
XCTAssertNil(region2.color)
157+
XCTAssertEqual(region2.size, CGSize(width: 40, height: 40)) // WKScrollView
158+
XCTAssertEqual(region2.type, .redact)
159+
XCTAssertEqual(region2.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
160+
161+
// Assert no additional regions
162+
XCTAssertEqual(result.count, 2)
163+
}
164+
165+
// MARK: - UIWebView
166+
167+
private func setupUIWebViewFixture() throws -> UIView {
168+
let rootView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
169+
170+
// The UIWebView initializers are marked as unavailable, so we use createFakeView.
171+
// Note: All fake views are kept alive to prevent dealloc crashes (see createFakeView docs).
172+
let webView = try XCTUnwrap(createFakeView(
173+
type: UIView.self,
174+
name: "UIWebView",
175+
frame: .init(x: 20, y: 20, width: 40, height: 40)
176+
))
177+
rootView.addSubview(webView)
178+
179+
return rootView
180+
181+
// View Hierarchy:
182+
// ---------------
183+
// <UIView: 0x106c20400; frame = (0 0; 100 100); layer = <CALayer: 0x600000cf08d0>>
184+
// | <UIWebView: 0x103a76a00; frame = (20 20; 40 40); layer = <CALayer: 0x600000cf1b60>>
185+
}
186+
187+
func testRedact_withUIWebView_withMaskingEnabled_shouldRedactView() throws {
188+
// -- Arrange --
189+
let rootView = try setupUIWebViewFixture()
190+
191+
// -- Act --
192+
let sut = getSut(maskAllText: true, maskAllImages: true)
193+
let result = sut.redactRegionsFor(view: rootView)
194+
195+
// -- Assert --
196+
let region = try XCTUnwrap(result.element(at: 0))
197+
XCTAssertNil(region.color)
198+
XCTAssertEqual(region.size, CGSize(width: 40, height: 40))
199+
XCTAssertEqual(region.type, .redact)
200+
XCTAssertEqual(region.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
201+
202+
// Assert no additional regions
203+
XCTAssertEqual(result.count, 1)
204+
}
205+
206+
func testRedact_withUIWebView_withMaskingDisabled_shouldRedactView() throws {
207+
// -- Arrange --
208+
let rootView = try setupUIWebViewFixture()
209+
210+
// -- Act --
211+
let sut = getSut(maskAllText: false, maskAllImages: false)
212+
let result = sut.redactRegionsFor(view: rootView)
213+
214+
// -- Assert --
215+
let region = try XCTUnwrap(result.element(at: 0))
216+
XCTAssertNil(region.color)
217+
XCTAssertEqual(region.size, CGSize(width: 40, height: 40))
218+
XCTAssertEqual(region.type, .redact)
219+
XCTAssertEqual(region.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
220+
221+
// Assert no additional regions
222+
XCTAssertEqual(result.count, 1)
223+
}
224+
225+
// MARK: - SFSafariView Redaction
226+
227+
private func setupSFSafariViewControllerFixture() throws -> UIView {
228+
let rootView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
229+
230+
let safariViewController = SFSafariViewController(url: URL(string: "https://example.com")!)
231+
let safariView = try XCTUnwrap(safariViewController.view)
232+
safariView.frame = CGRect(x: 20, y: 20, width: 40, height: 40)
233+
rootView.addSubview(safariView)
234+
235+
return rootView
236+
237+
// View Hierarchy:
238+
// ---------------
239+
// == iOS 26 & 18 & 17 ==
240+
// <UIView: 0x10294c8e0; frame = (0 0; 100 100); layer = <CALayer: 0x600000ccab50>>
241+
// | <SFSafariView: 0x102b39d30; frame = (20 20; 40 40); layer = <CALayer: 0x600000cd2490>>
242+
//
243+
// == iOS 16 & 15 ==
244+
// <UIView: 0x12e717620; frame = (0 0; 100 100); layer = <CALayer: 0x600001a31320>>
245+
// | <SFSafariView: 0x12e60ef40; frame = (20 20; 40 40); layer = <CALayer: 0x600001a5b8a0>>
246+
// | | <SFSafariLaunchPlaceholderView: 0x12e60f600; frame = (0 0; 40 40); autoresize = W+H; backgroundColor = <UIDynamicSystemColor: 0x600000f4d800; name = systemBackgroundColor>; layer = <CALayer: 0x600001a5b960>>
247+
// | | | <UINavigationBar: 0x12e60f9a0; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x600001a5bc60>> delegate=0x12e60f600 no-scroll-edge-support
248+
// | | | <UIToolbar: 0x12e7199b0; frame = (0 0; 0 0); layer = <CALayer: 0x600001a229e0>>
249+
}
250+
251+
private func assertSFSafariViewControllerRegions(regions: [SentryRedactRegion]) throws {
252+
if #available(iOS 17, *) { // iOS 26 & 18 & 17
253+
let region = try XCTUnwrap(regions.element(at: 0))
254+
XCTAssertNil(region.color)
255+
XCTAssertEqual(region.size, CGSize(width: 40, height: 40))
256+
XCTAssertEqual(region.type, .redact)
257+
XCTAssertEqual(region.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
258+
259+
// Assert that there are no other regions
260+
XCTAssertEqual(regions.count, 1)
261+
} else if #available(iOS 15, *) { // iOS 16 & 15
262+
let toolbarRegion = try XCTUnwrap(regions.element(at: 0)) // UIToolbar
263+
XCTAssertNil(toolbarRegion.color)
264+
XCTAssertEqual(toolbarRegion.size, CGSize(width: 0, height: 0))
265+
XCTAssertEqual(toolbarRegion.type, .redact)
266+
XCTAssertEqual(toolbarRegion.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
267+
268+
let navigationBarRegion = try XCTUnwrap(regions.element(at: 1)) // UINavigationBar
269+
XCTAssertNil(navigationBarRegion.color)
270+
XCTAssertEqual(navigationBarRegion.size, CGSize(width: 0, height: 0))
271+
XCTAssertEqual(navigationBarRegion.type, .redact)
272+
XCTAssertEqual(navigationBarRegion.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
273+
274+
let placeholderRegion = try XCTUnwrap(regions.element(at: 2)) // SFSafariLaunchPlaceholderView
275+
XCTAssertNil(placeholderRegion.color)
276+
XCTAssertEqual(placeholderRegion.size, CGSize(width: 40, height: 40))
277+
XCTAssertEqual(placeholderRegion.type, .redact)
278+
XCTAssertEqual(placeholderRegion.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
279+
280+
let safariViewRegion = try XCTUnwrap(regions.element(at: 3)) // SFSafariView
281+
XCTAssertNil(safariViewRegion.color)
282+
XCTAssertEqual(safariViewRegion.size, CGSize(width: 40, height: 40))
283+
XCTAssertEqual(safariViewRegion.type, .redact)
284+
XCTAssertEqual(safariViewRegion.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
285+
286+
// Assert that there are no other regions
287+
XCTAssertEqual(regions.count, 4)
288+
} else {
289+
throw XCTSkip("Redaction of SFSafariViewController is not tested on iOS versions below 15")
290+
}
291+
}
292+
293+
func testRedact_withSFSafariView_withMaskingEnabled_shouldRedactViewHierarchy() throws {
294+
#if targetEnvironment(macCatalyst)
295+
throw XCTSkip("SFSafariViewController opens system browser on macOS, nothing to redact, skipping test")
296+
#else
297+
// -- Arrange --
298+
let rootView = try setupSFSafariViewControllerFixture()
299+
300+
// -- Act --
301+
let sut = getSut(maskAllText: true, maskAllImages: true)
302+
let result = sut.redactRegionsFor(view: rootView)
303+
304+
// -- Assert --
305+
try assertSFSafariViewControllerRegions(regions: result)
306+
#endif
307+
}
308+
309+
func testRedact_withSFSafariView_withMaskingDisabled_shouldRedactView() throws {
310+
#if targetEnvironment(macCatalyst)
311+
throw XCTSkip("SFSafariViewController opens system browser on macOS, nothing to redact, skipping test")
312+
#else
313+
// -- Arrange --
314+
let rootView = try setupSFSafariViewControllerFixture()
315+
316+
// -- Act --
317+
let sut = getSut(maskAllText: false, maskAllImages: false)
318+
let result = sut.redactRegionsFor(view: rootView)
319+
320+
// -- Assert --
321+
try assertSFSafariViewControllerRegions(regions: result)
322+
#endif
323+
}
324+
325+
// MARK: - AVPlayer Redaction
326+
327+
private func setupAVPlayerViewControllerFixture() throws -> UIView {
328+
let rootView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
329+
330+
let avPlayerViewController = AVPlayerViewController()
331+
let avPlayerView = try XCTUnwrap(avPlayerViewController.view)
332+
avPlayerView.frame = CGRect(x: 20, y: 20, width: 40, height: 40)
333+
rootView.addSubview(avPlayerView)
334+
335+
return rootView
336+
337+
// View Hierarchy:
338+
// ---------------
339+
// <UIView: 0x130d0d4f0; frame = (0 0; 100 100); layer = <CALayer: 0x600003654760>>
340+
// | <AVPlayerView: 0x130e27580; frame = (20 20; 40 40); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 0; layer = <AVPresentationContainerViewLayer: 0x600003912400>>
341+
}
342+
343+
private func assertAVPlayerViewControllerRegions(regions: [SentryRedactRegion]) throws {
344+
let region = try XCTUnwrap(regions.element(at: 0))
345+
XCTAssertEqual(region.size, CGSize(width: 40, height: 40))
346+
XCTAssertEqual(region.type, .redact)
347+
XCTAssertEqual(region.transform, CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 20, ty: 20))
348+
XCTAssertNil(region.color)
349+
350+
// Assert that there are no other regions
351+
XCTAssertEqual(regions.count, 1)
352+
}
353+
354+
func testRedact_withAVPlayerViewController_shouldBeRedacted() throws {
355+
// -- Arrange --
356+
let rootView = try setupAVPlayerViewControllerFixture()
357+
358+
// -- Act --
359+
let sut = getSut(maskAllText: true, maskAllImages: true)
360+
let result = sut.redactRegionsFor(view: rootView)
361+
362+
// -- Assert --
363+
try assertAVPlayerViewControllerRegions(regions: result)
364+
}
365+
366+
func testRedact_withAVPlayerViewControllerEvenWithMaskingDisabled_shouldBeRedacted() throws {
367+
// -- Arrange --
368+
let rootView = try setupAVPlayerViewControllerFixture()
369+
370+
// -- Act --
371+
let sut = getSut(maskAllText: false, maskAllImages: false)
372+
let result = sut.redactRegionsFor(view: rootView)
373+
374+
// -- Assert --
375+
try assertAVPlayerViewControllerRegions(regions: result)
376+
}
377+
}
378+
379+
#endif // os(iOS) && !targetEnvironment(macCatalyst)

0 commit comments

Comments
 (0)