| // Copyright 2020 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import <XCTest/XCTest.h> |
| #import "GoldenTestManager.h" |
| |
| @interface AppExtensionTests : XCTestCase |
| @property(nonatomic, strong) XCUIApplication* hostApplication; |
| @end |
| |
| @implementation AppExtensionTests |
| |
| - (void)setUp { |
| [super setUp]; |
| self.continueAfterFailure = NO; |
| self.hostApplication = |
| [[XCUIApplication alloc] initWithBundleIdentifier:@"dev.flutter.FlutterAppExtensionTestHost"]; |
| } |
| |
| - (void)testAppExtensionLaunching { |
| // Launch the Scenarios app first to ensure it's installed then close it. |
| XCUIApplication* app = [[XCUIApplication alloc] init]; |
| [app launch]; |
| [app terminate]; |
| |
| [self.hostApplication launch]; |
| XCUIElement* button = self.hostApplication.buttons[@"Open Share"]; |
| if (![button waitForExistenceWithTimeout:10]) { |
| NSLog(@"%@", self.hostApplication.debugDescription); |
| XCTFail(@"Failed due to not able to find any button with %@ seconds", @(10)); |
| } |
| [button tap]; |
| BOOL launchedExtensionInFlutter = NO; |
| |
| // Wait for first cell of share sheet to appear. |
| XCUIElement* firstCell = self.hostApplication.collectionViews.cells.firstMatch; |
| if (![firstCell waitForExistenceWithTimeout:10]) { |
| NSLog(@"%@", self.hostApplication.debugDescription); |
| XCTFail(@"Failed due to not able to find any cells with %@ seconds", @(10)); |
| } |
| |
| // Custom share extension button (like the one in this test) does not have a |
| // unique identity on older versions of iOS. They are all identified as |
| // `XCElementSnapshotPrivilegedValuePlaceholder`. On iOS 17, they are |
| // identified by name. Loop through all the buttons labeled |
| // `XCElementSnapshotPrivilegedValuePlaceholder` or `Scenarios` to find the |
| // Flutter one. |
| NSPredicate* cellPredicate = [NSPredicate |
| predicateWithFormat: |
| @"label == 'XCElementSnapshotPrivilegedValuePlaceholder' OR label = 'Scenarios'"]; |
| NSArray<XCUIElement*>* shareSheetCells = |
| [self.hostApplication.collectionViews.cells matchingPredicate:cellPredicate] |
| .allElementsBoundByIndex; |
| for (XCUIElement* shareSheetCell in shareSheetCells) { |
| [shareSheetCell tap]; |
| |
| XCUIElement* flutterView = self.hostApplication.otherElements[@"flutter_view"]; |
| if ([flutterView waitForExistenceWithTimeout:10]) { |
| launchedExtensionInFlutter = YES; |
| break; |
| } |
| |
| // All the built-in share extensions have a Cancel button. |
| // Tap the Cancel button to close the built-in extension. |
| XCUIElement* cancel = self.hostApplication.buttons[@"Cancel"]; |
| if ([cancel waitForExistenceWithTimeout:10]) { |
| [cancel tap]; |
| } |
| } |
| // App extension successfully launched flutter view. |
| XCTAssertTrue(launchedExtensionInFlutter); |
| } |
| |
| @end |