|
| 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