From c6da440509e9e321a6e6ade76256376f7d27fbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Spie=C3=9F?= Date: Sat, 5 Mar 2016 16:12:36 +0100 Subject: [PATCH 1/4] Add preparedItemsForFeedbackManager: delegate method --- ...BITFeedbackComposeViewControllerDelegate.h | 5 +++ Classes/BITFeedbackManager.h | 9 ++++- Classes/BITFeedbackManager.m | 8 +++- Classes/BITFeedbackManagerDelegate.h | 40 ++++++++++++++----- docs/Changelog-template.md | 3 ++ 5 files changed, 54 insertions(+), 11 deletions(-) diff --git a/Classes/BITFeedbackComposeViewControllerDelegate.h b/Classes/BITFeedbackComposeViewControllerDelegate.h index 076949eaef..99bac6cf84 100644 --- a/Classes/BITFeedbackComposeViewControllerDelegate.h +++ b/Classes/BITFeedbackComposeViewControllerDelegate.h @@ -28,6 +28,9 @@ #import +#import "HockeySDKNullability.h" +NS_ASSUME_NONNULL_BEGIN + /** * The users action when composing a message */ @@ -69,3 +72,5 @@ typedef NS_ENUM(NSUInteger, BITFeedbackComposeResult) { - (void)feedbackComposeViewController:(BITFeedbackComposeViewController *)composeViewController didFinishWithResult:(BITFeedbackComposeResult) composeResult; @end + +NS_ASSUME_NONNULL_END diff --git a/Classes/BITFeedbackManager.h b/Classes/BITFeedbackManager.h index 1027e12d46..0763df67b3 100644 --- a/Classes/BITFeedbackManager.h +++ b/Classes/BITFeedbackManager.h @@ -33,6 +33,8 @@ #import "BITFeedbackListViewController.h" #import "BITFeedbackComposeViewController.h" +#import "HockeySDKNullability.h" +NS_ASSUME_NONNULL_BEGIN // Notification message which tells that loading messages finished #define BITHockeyFeedbackMessagesLoadingStarted @"BITHockeyFeedbackMessagesLoadingStarted" @@ -338,6 +340,10 @@ typedef NS_ENUM(NSInteger, BITFeedbackObservationMode) { /** Create a feedback compose view + This method also adds items from `feedbackComposerPreparedItems` and + the `preparedItemsForFeedbackManager:` delegate methods to the instance of + `BITFeedbackComposeViewController` that will be returned. + Example to show a modal feedback compose UI with prefilled text BITFeedbackComposeViewController *feedbackCompose = [[BITHockeyManager sharedHockeyManager].feedbackManager feedbackComposeViewController]; @@ -355,5 +361,6 @@ typedef NS_ENUM(NSInteger, BITFeedbackObservationMode) { */ - (BITFeedbackComposeViewController *)feedbackComposeViewController; - @end + +NS_ASSUME_NONNULL_END diff --git a/Classes/BITFeedbackManager.m b/Classes/BITFeedbackManager.m index 412af2070d..235b1ec63c 100644 --- a/Classes/BITFeedbackManager.m +++ b/Classes/BITFeedbackManager.m @@ -231,7 +231,13 @@ typedef void (^BITLatestImageFetchCompletionBlock)(UIImage *_Nonnull latestImage - (BITFeedbackComposeViewController *)feedbackComposeViewController { BITFeedbackComposeViewController *composeViewController = [[BITFeedbackComposeViewController alloc] init]; - [composeViewController prepareWithItems:self.feedbackComposerPreparedItems]; + + NSArray *preparedItems = self.feedbackComposerPreparedItems; + if ([self.delegate respondsToSelector:@selector(preparedItemsForFeedbackManager:)]) { + preparedItems = [preparedItems arrayByAddingObjectsFromArray:[self.delegate preparedItemsForFeedbackManager:self]]; + } + + [composeViewController prepareWithItems:preparedItems]; [composeViewController setHideImageAttachmentButton:self.feedbackComposeHideImageAttachmentButton]; // by default set the delegate to be identical to the one of BITFeedbackManager diff --git a/Classes/BITFeedbackManagerDelegate.h b/Classes/BITFeedbackManagerDelegate.h index 6f65a28619..644496947d 100644 --- a/Classes/BITFeedbackManagerDelegate.h +++ b/Classes/BITFeedbackManagerDelegate.h @@ -29,6 +29,9 @@ #import #import "BITFeedbackComposeViewControllerDelegate.h" +#import "HockeySDKNullability.h" +NS_ASSUME_NONNULL_BEGIN + @class BITFeedbackManager; /** @@ -40,14 +43,6 @@ @optional -/** - * can be implemented to know when new feedback from the server arrived - * - * @param feedbackManager The feedbackManager which did detect the new messages - */ -- (void) feedbackManagerDidReceiveNewFeedback:(BITFeedbackManager*) feedbackManager; - - /** * Can be implemented to control wether the feedback manager should automatically * fetch for new messages on app startup or when becoming active. @@ -60,6 +55,33 @@ * * @param feedbackManager The feedbackManager which did detect the new messages */ -- (BOOL) allowAutomaticFetchingForNewFeedbackForManager:(BITFeedbackManager *)feedbackManager; +- (BOOL)allowAutomaticFetchingForNewFeedbackForManager:(BITFeedbackManager *)feedbackManager; + + +/** + * can be implemented to know when new feedback from the server arrived + * + * @param feedbackManager The feedbackManager which did detect the new messages + */ +- (void)feedbackManagerDidReceiveNewFeedback:(BITFeedbackManager *)feedbackManager; + + +/** + * This optional method can be implemented to provide items to prefill + * the FeedbackComposeMessage user interface with the given items. + * + * If the user sends the feedback message, these items will be attached to that message. + * + * All NSString-Content in the array will be concatenated and result in the message, + * while all UIImage and NSData-instances will be turned into attachments. + * + * @param feedbackManager The BITFeedbackManager instance that will handle sending the feedback. + * + * @return An array containing the items to be attached to the feedback message + * @see `[BITFeedbackComposeViewController prepareWithItems:] + */ +- (nullable NSArray *)preparedItemsForFeedbackManager:(BITFeedbackManager *)feedbackManager; @end + +NS_ASSUME_NONNULL_END diff --git a/docs/Changelog-template.md b/docs/Changelog-template.md index f681df1051..90ad87c7bc 100644 --- a/docs/Changelog-template.md +++ b/docs/Changelog-template.md @@ -1,3 +1,6 @@ +- [NEW] Added `preparedItemsForFeedbackManager:` method in `BITFeedbackManagerDelegate` to allow to provide items with every possible method of showing the feedback compose dialog. +- [UPDATE] Deprecate `feedbackComposerPreparedItems` property in favor of the new delegate method. + ## Version 4.0.0-beta.1 - [NEW] User Metrics including users and sessions data is now in public beta! From 580feff6aae5477c2d94032fa915e9322a3f54aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Spie=C3=9F?= Date: Sat, 5 Mar 2016 16:12:36 +0100 Subject: [PATCH 2/4] Deprecate feedbackComposerPreparedItems in favor of delegate method --- Classes/BITFeedbackManager.h | 11 +++++++++-- Classes/BITFeedbackManager.m | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Classes/BITFeedbackManager.h b/Classes/BITFeedbackManager.h index 0763df67b3..f4e568e741 100644 --- a/Classes/BITFeedbackManager.h +++ b/Classes/BITFeedbackManager.h @@ -232,9 +232,11 @@ typedef NS_ENUM(NSInteger, BITFeedbackObservationMode) { All NSString-Content in the array will be concatenated and result in the message, while all UIImage and NSData-instances will be turned into attachments. + @deprecated This property is deprecated in favor of `BITFeedbackManagerDelegate preparedItemsForFeedbackManager:`. + @see `[BITFeedbackComposeViewController prepareWithItems:]` */ -@property (nonatomic, copy) NSArray *feedbackComposerPreparedItems; +@property (nonatomic, copy, nullable) NSArray *feedbackComposerPreparedItems DEPRECATED_MSG_ATTRIBUTE("Use -preparedItemsForFeedbackManager: delegate method instead."); /** @@ -318,11 +320,16 @@ typedef NS_ENUM(NSInteger, BITFeedbackObservationMode) { All NSString-Content in the array will be concatenated and result in the message, while all UIImage and NSData-instances will be turned into attachments. + Alternatively you can implement the `preparedItemsForFeedbackManager:` delegate method + and call `showFeedbackComposeView` instead. If you use both, the items from the delegate method + and the items passed with this method will be combined. + @param items an NSArray with objects that should be attached @see `[BITFeedbackComposeViewController prepareWithItems:]` + @see `BITFeedbackManagerDelegate preparedItemsForFeedbackManager:` @warning This methods needs to be called on the main thread! */ -- (void)showFeedbackComposeViewWithPreparedItems:(NSArray *)items; +- (void)showFeedbackComposeViewWithPreparedItems:(nullable NSArray *)items; /** Presents a modal feedback compose interface with a screenshot attached which is taken at the time of calling this method. diff --git a/Classes/BITFeedbackManager.m b/Classes/BITFeedbackManager.m index 235b1ec63c..3135f31847 100644 --- a/Classes/BITFeedbackManager.m +++ b/Classes/BITFeedbackManager.m @@ -232,7 +232,10 @@ typedef void (^BITLatestImageFetchCompletionBlock)(UIImage *_Nonnull latestImage - (BITFeedbackComposeViewController *)feedbackComposeViewController { BITFeedbackComposeViewController *composeViewController = [[BITFeedbackComposeViewController alloc] init]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" NSArray *preparedItems = self.feedbackComposerPreparedItems; +#pragma clang diagnostic pop if ([self.delegate respondsToSelector:@selector(preparedItemsForFeedbackManager:)]) { preparedItems = [preparedItems arrayByAddingObjectsFromArray:[self.delegate preparedItemsForFeedbackManager:self]]; } From 0230f5945dc819451cb27c347335810f5816a6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Spie=C3=9F?= Date: Fri, 15 Apr 2016 00:10:16 +0200 Subject: [PATCH 3/4] Update FeedbackManagerTests to use property --- .../HockeySDKTests/BITFeedbackManagerTests.m | 114 +++++++++--------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/Support/HockeySDKTests/BITFeedbackManagerTests.m b/Support/HockeySDKTests/BITFeedbackManagerTests.m index 8072a5c2e5..24130b21a5 100644 --- a/Support/HockeySDKTests/BITFeedbackManagerTests.m +++ b/Support/HockeySDKTests/BITFeedbackManagerTests.m @@ -25,27 +25,27 @@ @interface BITFeedbackManagerTests : XCTestCase +@property BITFeedbackManager *sut; + @end -@implementation BITFeedbackManagerTests { - BITFeedbackManager *_sut; -} +@implementation BITFeedbackManagerTests - (void)setUp { [super setUp]; BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; hm.delegate = nil; - _sut = [[BITFeedbackManager alloc] initWithAppIdentifier:nil appEnvironment:BITEnvironmentOther]; - _sut.delegate = nil; + self.sut = [[BITFeedbackManager alloc] initWithAppIdentifier:nil appEnvironment:BITEnvironmentOther]; + self.sut.delegate = nil; } - (void)tearDown { - [_sut removeKeyFromKeychain:kBITHockeyMetaUserID]; - [_sut removeKeyFromKeychain:kBITHockeyMetaUserName]; - [_sut removeKeyFromKeychain:kBITHockeyMetaUserEmail]; + [self.sut removeKeyFromKeychain:kBITHockeyMetaUserID]; + [self.sut removeKeyFromKeychain:kBITHockeyMetaUserName]; + [self.sut removeKeyFromKeychain:kBITHockeyMetaUserEmail]; - _sut = nil; + self.sut = nil; [super tearDown]; } @@ -53,7 +53,7 @@ #pragma mark - Private - (void)startManager { - [_sut startManager]; + [self.sut startManager]; } #pragma mark - Setup Tests @@ -65,48 +65,48 @@ BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; id delegateMock = mockProtocol(@protocol(BITHockeyManagerDelegate)); hm.delegate = delegateMock; - _sut.delegate = delegateMock; + self.sut.delegate = delegateMock; - BOOL dataAvailable = [_sut updateUserIDUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserIDUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isFalse()); - assertThat(_sut.userID, nilValue()); + assertThat(self.sut.userID, nilValue()); - [verifyCount(delegateMock, times(1)) userIDForHockeyManager:hm componentManager:_sut]; + [verifyCount(delegateMock, times(1)) userIDForHockeyManager:hm componentManager:self.sut]; } - (void)testUpdateUserIDWithDelegateReturningData { BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; NSObject *classMock = mockObjectAndProtocol([NSObject class], @protocol(BITHockeyManagerDelegate)); - [given([classMock userIDForHockeyManager:hm componentManager:_sut]) willReturn:@"test"]; + [given([classMock userIDForHockeyManager:hm componentManager:self.sut]) willReturn:@"test"]; hm.delegate = classMock; - _sut.delegate = classMock; + self.sut.delegate = classMock; - BOOL dataAvailable = [_sut updateUserIDUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserIDUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userID, equalTo(@"test")); + assertThat(self.sut.userID, equalTo(@"test")); - [verifyCount(classMock, times(1)) userIDForHockeyManager:hm componentManager:_sut]; + [verifyCount(classMock, times(1)) userIDForHockeyManager:hm componentManager:self.sut]; } - (void)testUpdateUserIDWithValueInKeychain { - [_sut addStringValueToKeychain:@"test" forKey:kBITHockeyMetaUserID]; + [self.sut addStringValueToKeychain:@"test" forKey:kBITHockeyMetaUserID]; - BOOL dataAvailable = [_sut updateUserIDUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserIDUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userID, equalTo(@"test")); + assertThat(self.sut.userID, equalTo(@"test")); } - (void)testUpdateUserIDWithGlobalSetter { BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; [hm setUserID:@"test"]; - BOOL dataAvailable = [_sut updateUserIDUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserIDUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userID, equalTo(@"test")); + assertThat(self.sut.userID, equalTo(@"test")); } @@ -114,48 +114,48 @@ BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; id delegateMock = mockProtocol(@protocol(BITHockeyManagerDelegate)); hm.delegate = delegateMock; - _sut.delegate = delegateMock; + self.sut.delegate = delegateMock; - BOOL dataAvailable = [_sut updateUserNameUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserNameUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isFalse()); - assertThat(_sut.userName, nilValue()); + assertThat(self.sut.userName, nilValue()); - [verifyCount(delegateMock, times(1)) userNameForHockeyManager:hm componentManager:_sut]; + [verifyCount(delegateMock, times(1)) userNameForHockeyManager:hm componentManager:self.sut]; } - (void)testUpdateUserNameWithDelegateReturningData { BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; NSObject *classMock = mockObjectAndProtocol([NSObject class], @protocol(BITHockeyManagerDelegate)); - [given([classMock userNameForHockeyManager:hm componentManager:_sut]) willReturn:@"test"]; + [given([classMock userNameForHockeyManager:hm componentManager:self.sut]) willReturn:@"test"]; hm.delegate = classMock; - _sut.delegate = classMock; + self.sut.delegate = classMock; - BOOL dataAvailable = [_sut updateUserNameUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserNameUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userName, equalTo(@"test")); + assertThat(self.sut.userName, equalTo(@"test")); - [verifyCount(classMock, times(1)) userNameForHockeyManager:hm componentManager:_sut]; + [verifyCount(classMock, times(1)) userNameForHockeyManager:hm componentManager:self.sut]; } - (void)testUpdateUserNameWithValueInKeychain { - [_sut addStringValueToKeychain:@"test" forKey:kBITHockeyMetaUserName]; + [self.sut addStringValueToKeychain:@"test" forKey:kBITHockeyMetaUserName]; - BOOL dataAvailable = [_sut updateUserNameUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserNameUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userName, equalTo(@"test")); + assertThat(self.sut.userName, equalTo(@"test")); } - (void)testUpdateUserNameWithGlobalSetter { BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; [hm setUserName:@"test"]; - BOOL dataAvailable = [_sut updateUserNameUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserNameUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userName, equalTo(@"test")); + assertThat(self.sut.userName, equalTo(@"test")); } @@ -163,70 +163,70 @@ BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; id delegateMock = mockProtocol(@protocol(BITHockeyManagerDelegate)); hm.delegate = delegateMock; - _sut.delegate = delegateMock; + self.sut.delegate = delegateMock; - BOOL dataAvailable = [_sut updateUserEmailUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserEmailUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isFalse()); - assertThat(_sut.userEmail, nilValue()); + assertThat(self.sut.userEmail, nilValue()); - [verifyCount(delegateMock, times(1)) userEmailForHockeyManager:hm componentManager:_sut]; + [verifyCount(delegateMock, times(1)) userEmailForHockeyManager:hm componentManager:self.sut]; } - (void)testUpdateUserEmailWithDelegateReturningData { BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; NSObject *classMock = mockObjectAndProtocol([NSObject class], @protocol(BITHockeyManagerDelegate)); - [given([classMock userEmailForHockeyManager:hm componentManager:_sut]) willReturn:@"test"]; + [given([classMock userEmailForHockeyManager:hm componentManager:self.sut]) willReturn:@"test"]; hm.delegate = classMock; - _sut.delegate = classMock; + self.sut.delegate = classMock; - BOOL dataAvailable = [_sut updateUserEmailUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserEmailUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userEmail, equalTo(@"test")); + assertThat(self.sut.userEmail, equalTo(@"test")); - [verifyCount(classMock, times(1)) userEmailForHockeyManager:hm componentManager:_sut]; + [verifyCount(classMock, times(1)) userEmailForHockeyManager:hm componentManager:self.sut]; } - (void)testUpdateUserEmailWithValueInKeychain { - [_sut addStringValueToKeychain:@"test" forKey:kBITHockeyMetaUserEmail]; + [self.sut addStringValueToKeychain:@"test" forKey:kBITHockeyMetaUserEmail]; - BOOL dataAvailable = [_sut updateUserEmailUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserEmailUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userEmail, equalTo(@"test")); + assertThat(self.sut.userEmail, equalTo(@"test")); } - (void)testUpdateUserEmailWithGlobalSetter { BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; [hm setUserEmail:@"test"]; - BOOL dataAvailable = [_sut updateUserEmailUsingKeychainAndDelegate]; + BOOL dataAvailable = [self.sut updateUserEmailUsingKeychainAndDelegate]; assertThatBool(dataAvailable, isTrue()); - assertThat(_sut.userEmail, equalTo(@"test")); + assertThat(self.sut.userEmail, equalTo(@"test")); } - (void)testAllowFetchingNewMessages { BOOL fetchMessages = NO; // check the default - fetchMessages = [_sut allowFetchingNewMessages]; + fetchMessages = [self.sut allowFetchingNewMessages]; assertThatBool(fetchMessages, isTrue()); // check the delegate is implemented and returns NO BITHockeyManager *hm = [BITHockeyManager sharedHockeyManager]; NSObject *classMock = mockObjectAndProtocol([NSObject class], @protocol(BITHockeyManagerDelegate)); - [given([classMock allowAutomaticFetchingForNewFeedbackForManager:_sut]) willReturn:@NO]; + [given([classMock allowAutomaticFetchingForNewFeedbackForManager:self.sut]) willReturn:@NO]; hm.delegate = classMock; - _sut.delegate = classMock; + self.sut.delegate = classMock; - fetchMessages = [_sut allowFetchingNewMessages]; + fetchMessages = [self.sut allowFetchingNewMessages]; assertThatBool(fetchMessages, isFalse()); - [verifyCount(classMock, times(1)) allowAutomaticFetchingForNewFeedbackForManager:_sut]; + [verifyCount(classMock, times(1)) allowAutomaticFetchingForNewFeedbackForManager:self.sut]; } @end From 1be53e09719fa4f304322a9e22345c8c52029d12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Spie=C3=9F?= Date: Fri, 15 Apr 2016 00:32:06 +0200 Subject: [PATCH 4/4] Add test for feedbackComposeViewController --- .../HockeySDKTests/BITFeedbackManagerTests.m | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Support/HockeySDKTests/BITFeedbackManagerTests.m b/Support/HockeySDKTests/BITFeedbackManagerTests.m index 24130b21a5..505490578b 100644 --- a/Support/HockeySDKTests/BITFeedbackManagerTests.m +++ b/Support/HockeySDKTests/BITFeedbackManagerTests.m @@ -229,4 +229,35 @@ [verifyCount(classMock, times(1)) allowAutomaticFetchingForNewFeedbackForManager:self.sut]; } +#pragma mark - FeedbackManagerDelegate Tests + +- (void)testFeedbackComposeViewController { + UIImage *sampleImage1 = [UIImage new]; + UIImage *sampleImage2 = [UIImage new]; + NSData *sampleData1 = [NSData data]; + NSData *sampleData2 = [NSData data]; + + self.sut.feedbackComposeHideImageAttachmentButton = YES; + XCTAssertTrue(self.sut.feedbackComposeHideImageAttachmentButton); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" + self.sut.feedbackComposerPreparedItems = @[sampleImage1, sampleData1]; +#pragma clang diagnostic pop + + id mockDelegate = mockProtocol(@protocol(BITFeedbackManagerDelegate)); + [given([mockDelegate preparedItemsForFeedbackManager:self.sut]) willReturn:@[sampleImage2, sampleData2]]; + self.sut.delegate = mockDelegate; + + BITFeedbackComposeViewController *composeViewController = [self.sut feedbackComposeViewController]; + + NSArray *attachments = [composeViewController performSelector:@selector(attachments)]; + + XCTAssertEqual(attachments.count, 4); + + XCTAssertTrue(composeViewController.hideImageAttachmentButton); + + XCTAssertEqual(composeViewController.delegate, mockDelegate); +} + @end