mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
338 lines
14 KiB
Objective-C
338 lines
14 KiB
Objective-C
//
|
|
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
#import "ConversationViewItem.h"
|
|
#import <MobileCoreServices/MobileCoreServices.h>
|
|
#import <SignalServiceKit/SecurityUtils.h>
|
|
#import <SignalServiceKit/TSAttachmentStream.h>
|
|
#import <SignalServiceKit/TSOutgoingMessage.h>
|
|
#import <XCTest/XCTest.h>
|
|
#import <YapDatabase/YapDatabaseConnection.h>
|
|
|
|
@interface ConversationViewItem (Testing)
|
|
|
|
- (SEL)copyActionSelector;
|
|
- (SEL)saveActionSelector;
|
|
- (SEL)shareActionSelector;
|
|
- (SEL)deleteActionSelector;
|
|
- (SEL)metadataActionSelector;
|
|
|
|
@end
|
|
|
|
@interface ConversationViewItemTest : XCTestCase
|
|
|
|
@end
|
|
|
|
@implementation ConversationViewItemTest
|
|
|
|
- (void)setUp
|
|
{
|
|
[super setUp];
|
|
}
|
|
|
|
- (void)tearDown
|
|
{
|
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
[super tearDown];
|
|
}
|
|
|
|
// Test canPerformAction
|
|
|
|
- (NSString *)fakeTextMessageText
|
|
{
|
|
return @"abc";
|
|
}
|
|
|
|
- (ConversationViewItem *)textViewItem
|
|
{
|
|
TSOutgoingMessage *message =
|
|
[[TSOutgoingMessage alloc] initWithTimestamp:1 inThread:nil messageBody:self.fakeTextMessageText];
|
|
[message save];
|
|
__block ConversationViewItem *viewItem = nil;
|
|
[TSYapDatabaseObject.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
|
|
viewItem = [[ConversationViewItem alloc] initWithInteraction:message isGroupThread:NO transaction:transaction];
|
|
}];
|
|
return viewItem;
|
|
}
|
|
|
|
- (ConversationViewItem *)viewItemWithAttachmentMimetype:(NSString *)mimeType filename:(NSString *)filename
|
|
{
|
|
OWSAssert(filename.length > 0);
|
|
|
|
NSString *resourcePath = [[NSBundle bundleForClass:[self class]] resourcePath];
|
|
NSString *filePath = [resourcePath stringByAppendingPathComponent:filename];
|
|
|
|
OWSAssert([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
|
|
DataSource *dataSource = [DataSourcePath dataSourceWithFilePath:filePath];
|
|
TSAttachmentStream *attachment = [[TSAttachmentStream alloc] initWithContentType:mimeType
|
|
byteCount:(UInt32)dataSource.dataLength
|
|
sourceFilename:nil];
|
|
BOOL success = [attachment writeDataSource:dataSource];
|
|
OWSAssert(success);
|
|
[attachment save];
|
|
NSMutableArray<NSString *> *attachmentIds = [@[
|
|
attachment.uniqueId,
|
|
] mutableCopy];
|
|
TSOutgoingMessage *message =
|
|
[[TSOutgoingMessage alloc] initWithTimestamp:1 inThread:nil messageBody:nil attachmentIds:attachmentIds];
|
|
[message save];
|
|
|
|
__block ConversationViewItem *viewItem = nil;
|
|
[TSYapDatabaseObject.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
|
|
viewItem = [[ConversationViewItem alloc] initWithInteraction:message isGroupThread:NO transaction:transaction];
|
|
}];
|
|
|
|
return viewItem;
|
|
}
|
|
|
|
- (ConversationViewItem *)stillImageViewItem
|
|
{
|
|
return [self viewItemWithAttachmentMimetype:@"image/jpeg" filename:@"test-jpg.jpg"];
|
|
}
|
|
|
|
- (ConversationViewItem *)animatedImageViewItem
|
|
{
|
|
return [self viewItemWithAttachmentMimetype:@"image/gif" filename:@"test-gif.gif"];
|
|
}
|
|
|
|
- (ConversationViewItem *)videoViewItem
|
|
{
|
|
return [self viewItemWithAttachmentMimetype:@"video/mp4" filename:@"test-mp4.mp4"];
|
|
}
|
|
|
|
- (ConversationViewItem *)audioViewItem
|
|
{
|
|
return [self viewItemWithAttachmentMimetype:@"audio/mp3" filename:@"test-mp3.mp3"];
|
|
}
|
|
|
|
- (void)testCanPerformEditingActionWithNonMediaMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.textViewItem;
|
|
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.copyActionSelector]);
|
|
XCTAssertFalse([viewItem canPerformAction:viewItem.saveActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.shareActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.deleteActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.metadataActionSelector]);
|
|
XCTAssertFalse([viewItem canPerformAction:@selector(unknownAction:)]);
|
|
}
|
|
|
|
- (void)testCanPerformEditingActionWithPhotoMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.stillImageViewItem;
|
|
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.copyActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.saveActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.shareActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.deleteActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.metadataActionSelector]);
|
|
XCTAssertFalse([viewItem canPerformAction:@selector(unknownAction:)]);
|
|
}
|
|
|
|
- (void)testCanPerformEditingActionWithAnimatedMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.animatedImageViewItem;
|
|
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.copyActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.saveActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.shareActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.deleteActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.metadataActionSelector]);
|
|
XCTAssertFalse([viewItem canPerformAction:@selector(unknownAction:)]);
|
|
}
|
|
|
|
- (void)testCanPerformEditingActionWithVideoMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.videoViewItem;
|
|
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.copyActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.saveActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.shareActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.deleteActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.metadataActionSelector]);
|
|
XCTAssertFalse([viewItem canPerformAction:@selector(unknownAction:)]);
|
|
}
|
|
|
|
- (void)testCanPerformEditingActionWithAudioMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.audioViewItem;
|
|
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.copyActionSelector]);
|
|
XCTAssertFalse([viewItem canPerformAction:viewItem.saveActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.shareActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.deleteActionSelector]);
|
|
XCTAssertTrue([viewItem canPerformAction:viewItem.metadataActionSelector]);
|
|
XCTAssertFalse([viewItem canPerformAction:@selector(unknownAction:)]);
|
|
}
|
|
|
|
// Test Delete
|
|
|
|
- (void)testPerformDeleteEditingActionWithNonMediaMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.textViewItem;
|
|
|
|
XCTAssertNotNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
[viewItem deleteAction];
|
|
XCTAssertNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
}
|
|
|
|
- (void)testPerformDeleteActionWithPhotoMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.stillImageViewItem;
|
|
|
|
XCTAssertEqual((NSUInteger)1, ((TSMessage *)viewItem.interaction).attachmentIds.count);
|
|
NSString *_Nullable attachmentId = ((TSMessage *)viewItem.interaction).attachmentIds.firstObject;
|
|
XCTAssertNotNil(attachmentId);
|
|
TSAttachment *_Nullable attachment = [TSAttachment fetchObjectWithUniqueID:attachmentId];
|
|
XCTAssertTrue([attachment isKindOfClass:[TSAttachmentStream class]]);
|
|
TSAttachmentStream *_Nullable attachmentStream = (TSAttachmentStream *)attachment;
|
|
NSString *_Nullable filePath = attachmentStream.filePath;
|
|
XCTAssertNotNil(filePath);
|
|
|
|
XCTAssertNotNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
XCTAssertNotNil([TSAttachment fetchObjectWithUniqueID:attachmentId]);
|
|
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
[viewItem deleteAction];
|
|
XCTAssertNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
XCTAssertNil([TSAttachment fetchObjectWithUniqueID:attachmentId]);
|
|
XCTAssertFalse([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
}
|
|
|
|
- (void)testPerformDeleteEditingActionWithAnimatedMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.animatedImageViewItem;
|
|
|
|
XCTAssertEqual((NSUInteger)1, ((TSMessage *)viewItem.interaction).attachmentIds.count);
|
|
NSString *_Nullable attachmentId = ((TSMessage *)viewItem.interaction).attachmentIds.firstObject;
|
|
XCTAssertNotNil(attachmentId);
|
|
TSAttachment *_Nullable attachment = [TSAttachment fetchObjectWithUniqueID:attachmentId];
|
|
XCTAssertTrue([attachment isKindOfClass:[TSAttachmentStream class]]);
|
|
TSAttachmentStream *_Nullable attachmentStream = (TSAttachmentStream *)attachment;
|
|
NSString *_Nullable filePath = attachmentStream.filePath;
|
|
XCTAssertNotNil(filePath);
|
|
|
|
XCTAssertNotNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
XCTAssertNotNil([TSAttachment fetchObjectWithUniqueID:attachmentId]);
|
|
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
[viewItem deleteAction];
|
|
XCTAssertNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
XCTAssertNil([TSAttachment fetchObjectWithUniqueID:attachmentId]);
|
|
XCTAssertFalse([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
}
|
|
|
|
- (void)testPerformDeleteEditingActionWithVideoMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.videoViewItem;
|
|
|
|
XCTAssertEqual((NSUInteger)1, ((TSMessage *)viewItem.interaction).attachmentIds.count);
|
|
NSString *_Nullable attachmentId = ((TSMessage *)viewItem.interaction).attachmentIds.firstObject;
|
|
XCTAssertNotNil(attachmentId);
|
|
TSAttachment *_Nullable attachment = [TSAttachment fetchObjectWithUniqueID:attachmentId];
|
|
XCTAssertTrue([attachment isKindOfClass:[TSAttachmentStream class]]);
|
|
TSAttachmentStream *_Nullable attachmentStream = (TSAttachmentStream *)attachment;
|
|
NSString *_Nullable filePath = attachmentStream.filePath;
|
|
XCTAssertNotNil(filePath);
|
|
|
|
XCTAssertNotNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
XCTAssertNotNil([TSAttachment fetchObjectWithUniqueID:attachmentId]);
|
|
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
[viewItem deleteAction];
|
|
XCTAssertNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
XCTAssertNil([TSAttachment fetchObjectWithUniqueID:attachmentId]);
|
|
XCTAssertFalse([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
}
|
|
|
|
- (void)testPerformDeleteEditingActionWithAudioMessage
|
|
{
|
|
ConversationViewItem *viewItem = self.audioViewItem;
|
|
|
|
XCTAssertEqual((NSUInteger)1, ((TSMessage *)viewItem.interaction).attachmentIds.count);
|
|
NSString *_Nullable attachmentId = ((TSMessage *)viewItem.interaction).attachmentIds.firstObject;
|
|
XCTAssertNotNil(attachmentId);
|
|
TSAttachment *_Nullable attachment = [TSAttachment fetchObjectWithUniqueID:attachmentId];
|
|
XCTAssertTrue([attachment isKindOfClass:[TSAttachmentStream class]]);
|
|
TSAttachmentStream *_Nullable attachmentStream = (TSAttachmentStream *)attachment;
|
|
NSString *_Nullable filePath = attachmentStream.filePath;
|
|
XCTAssertNotNil(filePath);
|
|
|
|
XCTAssertNotNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
XCTAssertNotNil([TSAttachment fetchObjectWithUniqueID:attachmentId]);
|
|
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
[viewItem deleteAction];
|
|
XCTAssertNil([TSMessage fetchObjectWithUniqueID:viewItem.interaction.uniqueId]);
|
|
XCTAssertNil([TSAttachment fetchObjectWithUniqueID:attachmentId]);
|
|
XCTAssertFalse([[NSFileManager defaultManager] fileExistsAtPath:filePath]);
|
|
}
|
|
|
|
// Test Copy
|
|
|
|
- (void)testPerformCopyEditingActionWithNonMediaMessage
|
|
{
|
|
// Reset the pasteboard.
|
|
UIPasteboard.generalPasteboard.items = @[];
|
|
XCTAssertNil(UIPasteboard.generalPasteboard.string);
|
|
|
|
ConversationViewItem *viewItem = self.textViewItem;
|
|
[viewItem copyAction];
|
|
XCTAssertEqualObjects(self.fakeTextMessageText, UIPasteboard.generalPasteboard.string);
|
|
}
|
|
|
|
- (void)testPerformCopyEditingActionWithStillImageMessage
|
|
{
|
|
// Reset the pasteboard.
|
|
UIPasteboard.generalPasteboard.items = @[];
|
|
XCTAssertNil(UIPasteboard.generalPasteboard.image);
|
|
XCTAssertNil([UIPasteboard.generalPasteboard dataForPasteboardType:(NSString *)kUTTypeJPEG]);
|
|
|
|
ConversationViewItem *viewItem = self.stillImageViewItem;
|
|
[viewItem copyAction];
|
|
NSData *_Nullable copiedData = [UIPasteboard.generalPasteboard dataForPasteboardType:(NSString *)kUTTypeJPEG];
|
|
XCTAssertTrue(copiedData.length > 0);
|
|
}
|
|
|
|
- (void)testPerformCopyEditingActionWithAnimatedImageMessage
|
|
{
|
|
// Reset the pasteboard.
|
|
UIPasteboard.generalPasteboard.items = @[];
|
|
XCTAssertNil(UIPasteboard.generalPasteboard.image);
|
|
XCTAssertNil([UIPasteboard.generalPasteboard dataForPasteboardType:(NSString *)kUTTypeGIF]);
|
|
|
|
ConversationViewItem *viewItem = self.animatedImageViewItem;
|
|
[viewItem copyAction];
|
|
NSData *_Nullable copiedData = [UIPasteboard.generalPasteboard dataForPasteboardType:(NSString *)kUTTypeGIF];
|
|
XCTAssertTrue(copiedData.length > 0);
|
|
}
|
|
|
|
- (void)testPerformCopyEditingActionWithVideoMessage
|
|
{
|
|
// Reset the pasteboard.
|
|
UIPasteboard.generalPasteboard.items = @[];
|
|
XCTAssertNil([UIPasteboard.generalPasteboard dataForPasteboardType:(NSString *)kUTTypeMPEG4]);
|
|
|
|
ConversationViewItem *viewItem = self.videoViewItem;
|
|
[viewItem copyAction];
|
|
NSData *_Nullable copiedData = [UIPasteboard.generalPasteboard dataForPasteboardType:(NSString *)kUTTypeMPEG4];
|
|
XCTAssertTrue(copiedData.length > 0);
|
|
}
|
|
|
|
- (void)testPerformCopyEditingActionWithMp3AudioMessage
|
|
{
|
|
// Reset the pasteboard.
|
|
UIPasteboard.generalPasteboard.items = @[];
|
|
XCTAssertNil([UIPasteboard.generalPasteboard dataForPasteboardType:(NSString *)kUTTypeMP3]);
|
|
|
|
ConversationViewItem *viewItem = self.audioViewItem;
|
|
[viewItem copyAction];
|
|
NSData *_Nullable copiedData = [UIPasteboard.generalPasteboard dataForPasteboardType:(NSString *)kUTTypeMP3];
|
|
XCTAssertTrue(copiedData.length > 0);
|
|
}
|
|
|
|
- (void)unknownAction:(id)sender
|
|
{
|
|
// It's easier to create this stub method than to suppress the "unknown selector" build warnings.
|
|
}
|
|
|
|
@end
|