diff --git a/Example/TSKitiOSTestApp/TSKitiOSTestApp.xcodeproj/project.pbxproj b/Example/TSKitiOSTestApp/TSKitiOSTestApp.xcodeproj/project.pbxproj index 5bec24743..9cec8620c 100644 --- a/Example/TSKitiOSTestApp/TSKitiOSTestApp.xcodeproj/project.pbxproj +++ b/Example/TSKitiOSTestApp/TSKitiOSTestApp.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 45458B7C1CC342B600A02153 /* MessagePaddingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 45458B741CC342B600A02153 /* MessagePaddingTests.m */; }; 459850C11D22C6F2006FFEDB /* PhoneNumberTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 459850C01D22C6F2006FFEDB /* PhoneNumberTest.m */; }; 45A856AC1D220BFF0056CD4D /* TSAttributesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 45A856AB1D220BFF0056CD4D /* TSAttributesTest.m */; }; + 45C6A09A1D2F029B007D8AC0 /* TSMessageTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C6A0991D2F029B007D8AC0 /* TSMessageTest.m */; }; 51520592F83F2440F2DE4D67 /* libPods-TSKitiOSTestApp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B8362AB8E280E0F64352F08A /* libPods-TSKitiOSTestApp.a */; }; B6273DD61C13A2E500738558 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B6273DD51C13A2E500738558 /* main.m */; }; B6273DD91C13A2E500738558 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B6273DD81C13A2E500738558 /* AppDelegate.m */; }; @@ -51,6 +52,7 @@ 45458B741CC342B600A02153 /* MessagePaddingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessagePaddingTests.m; sourceTree = ""; }; 459850C01D22C6F2006FFEDB /* PhoneNumberTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PhoneNumberTest.m; path = ../../../tests/Contacts/PhoneNumberTest.m; sourceTree = ""; }; 45A856AB1D220BFF0056CD4D /* TSAttributesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSAttributesTest.m; sourceTree = ""; }; + 45C6A0991D2F029B007D8AC0 /* TSMessageTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TSMessageTest.m; path = ../../../tests/Messages/Interactions/TSMessageTest.m; sourceTree = ""; }; B6273DD11C13A2E500738558 /* TSKitiOSTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TSKitiOSTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; B6273DD51C13A2E500738558 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; B6273DD71C13A2E500738558 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -137,6 +139,22 @@ name = Contacts; sourceTree = ""; }; + 45C6A0971D2F0254007D8AC0 /* Messages */ = { + isa = PBXGroup; + children = ( + 45C6A0981D2F0264007D8AC0 /* Interactions */, + ); + name = Messages; + sourceTree = ""; + }; + 45C6A0981D2F0264007D8AC0 /* Interactions */ = { + isa = PBXGroup; + children = ( + 45C6A0991D2F029B007D8AC0 /* TSMessageTest.m */, + ); + name = Interactions; + sourceTree = ""; + }; 5183572EFCE99F6F1791272A /* Pods */ = { isa = PBXGroup; children = ( @@ -204,6 +222,7 @@ B6273DED1C13A2E500738558 /* TSKitiOSTestAppTests */ = { isa = PBXGroup; children = ( + 45C6A0971D2F0254007D8AC0 /* Messages */, 45458B691CC342B600A02153 /* Account */, 45458B6B1CC342B600A02153 /* Attachments */, 459850BF1D22C6C4006FFEDB /* Contacts */, @@ -428,6 +447,7 @@ 45458B7B1CC342B600A02153 /* CryptographyTests.m in Sources */, 45458B791CC342B600A02153 /* TSStoragePreKeyStoreTests.m in Sources */, 45458B761CC342B600A02153 /* TSAttachmentsTest.m in Sources */, + 45C6A09A1D2F029B007D8AC0 /* TSMessageTest.m in Sources */, 459850C11D22C6F2006FFEDB /* PhoneNumberTest.m in Sources */, 45458B7A1CC342B600A02153 /* TSStorageSignedPreKeyStore.m in Sources */, 45458B771CC342B600A02153 /* TSMessageStorageTests.m in Sources */, diff --git a/src/Contacts/TSThread.h b/src/Contacts/TSThread.h index 87ae6e5e8..e65a9cb94 100644 --- a/src/Contacts/TSThread.h +++ b/src/Contacts/TSThread.h @@ -7,6 +7,8 @@ // #import +#import + #import "TSYapDatabaseObject.h" @class TSInteraction; diff --git a/src/Messages/Interactions/TSMessage.m b/src/Messages/Interactions/TSMessage.m index 968002dd6..5cdc9c4f2 100644 --- a/src/Messages/Interactions/TSMessage.m +++ b/src/Messages/Interactions/TSMessage.m @@ -60,10 +60,14 @@ NSString *const TSAttachementsRelationshipEdgeName = @"TSAttachmentEdge"; } - (NSString *)description { - if (self.attachments > 0) { + if ([self hasAttachments]) { NSString *attachmentId = self.attachments[0]; TSAttachment *attachment = [TSAttachment fetchObjectWithUniqueID:attachmentId]; - return attachment.description; + if (attachment) { + return attachment.description; + } else { + return NSLocalizedString(@"UNKNOWN_ATTACHMENT_LABEL", @"In Inbox view, last message label for thread with corrupted attachment."); + } } else { return self.body; } diff --git a/src/Messages/TSGroupModel.h b/src/Messages/TSGroupModel.h index c7d840e35..b0723318a 100644 --- a/src/Messages/TSGroupModel.h +++ b/src/Messages/TSGroupModel.h @@ -1,10 +1,5 @@ -// -// GroupModel.h -// Signal -// // Created by Frederic Jacobs. // Copyright (c) 2014 Open Whisper Systems. All rights reserved. -// #import #import "TSYapDatabaseObject.h" diff --git a/src/Messages/TSGroupModel.m b/src/Messages/TSGroupModel.m index 913f3a5e7..3a2f6f93b 100644 --- a/src/Messages/TSGroupModel.m +++ b/src/Messages/TSGroupModel.m @@ -1,10 +1,5 @@ -// -// GroupModel.m -// Signal -// // Created by Frederic Jacobs on 13/11/14. // Copyright (c) 2014 Open Whisper Systems. All rights reserved. -// #import "TSGroupModel.h" diff --git a/tests/Messages/Interactions/TSMessageTest.m b/tests/Messages/Interactions/TSMessageTest.m new file mode 100644 index 000000000..196236fe4 --- /dev/null +++ b/tests/Messages/Interactions/TSMessageTest.m @@ -0,0 +1,93 @@ +// Copyright © 2016 Open Whisper Systems. All rights reserved. + +#import "TSMessage.h" + +#import + +@interface TSMessageTest : XCTestCase + +@end + +@implementation TSMessageTest + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testDescription { + TSThread *thread = [[TSThread alloc] init]; + TSMessage *message = [[TSMessage alloc] initWithTimestamp:1 inThread:thread messageBody:@"My message body" attachments:nil]; + XCTAssertEqualObjects(@"My message body", [message description]); +} + +- (void)testDescriptionWithBogusAttachmentId { + TSThread *thread = [[TSThread alloc] init]; + TSMessage *message = [[TSMessage alloc] initWithTimestamp:1 inThread:thread messageBody:@"My message body" attachments:@[@"fake-attachment-id"]]; + NSString *actualDescription = [message description]; + XCTAssertEqualObjects(@"UNKNOWN_ATTACHMENT_LABEL", actualDescription); +} + +- (void)testDescriptionWithEmptyAttachments { + TSThread *thread = [[TSThread alloc] init]; + TSMessage *message = [[TSMessage alloc] initWithTimestamp:1 inThread:thread messageBody:@"My message body" attachments:@[]]; + NSString *actualDescription = [message description]; + XCTAssertEqualObjects(@"My message body", actualDescription); +} + +- (void)testDescriptionWithPhotoAttachmentId { + TSThread *thread = [[TSThread alloc] init]; + TSAttachment *attachment = [[TSAttachment alloc] initWithIdentifier:@"fake-photo-attachment-id" + encryptionKey:[[NSData alloc] init] + contentType:@"image/jpeg"]; + [attachment save]; + + TSMessage *message = [[TSMessage alloc] initWithTimestamp:1 inThread:thread messageBody:@"My message body" attachments:@[@"fake-photo-attachment-id"]]; + NSString *actualDescription = [message description]; + XCTAssertEqualObjects(@"📷 ATTACHMENT", actualDescription); +} + + +- (void)testDescriptionWithVideoAttachmentId { + TSThread *thread = [[TSThread alloc] init]; + TSAttachment *attachment = [[TSAttachment alloc] initWithIdentifier:@"fake-video-attachment-id" + encryptionKey:[[NSData alloc] init] + contentType:@"video/mp4"]; + [attachment save]; + + TSMessage *message = [[TSMessage alloc] initWithTimestamp:1 inThread:thread messageBody:@"My message body" attachments:@[@"fake-video-attachment-id"]]; + NSString *actualDescription = [message description]; + XCTAssertEqualObjects(@"📽 ATTACHMENT", actualDescription); +} + + +- (void)testDescriptionWithAudioAttachmentId { + TSThread *thread = [[TSThread alloc] init]; + TSAttachment *attachment = [[TSAttachment alloc] initWithIdentifier:@"fake-audio-attachment-id" + encryptionKey:[[NSData alloc] init] + contentType:@"audio/mp3"]; + [attachment save]; + + TSMessage *message = [[TSMessage alloc] initWithTimestamp:1 inThread:thread messageBody:@"My message body" attachments:@[@"fake-audio-attachment-id"]]; + NSString *actualDescription = [message description]; + XCTAssertEqualObjects(@"📻 ATTACHMENT", actualDescription); +} + +- (void)testDescriptionWithUnkownAudioContentType { + TSThread *thread = [[TSThread alloc] init]; + TSAttachment *attachment = [[TSAttachment alloc] initWithIdentifier:@"fake-nonsense-attachment-id" + encryptionKey:[[NSData alloc] init] + contentType:@"non/sense"]; + [attachment save]; + + TSMessage *message = [[TSMessage alloc] initWithTimestamp:1 inThread:thread messageBody:@"My message body" attachments:@[@"fake-nonsense-attachment-id"]]; + NSString *actualDescription = [message description]; + XCTAssertEqualObjects(@"ATTACHMENT", actualDescription); +} + +@end