Skip to content

Commit

Permalink
Fix #11
Browse files Browse the repository at this point in the history
  • Loading branch information
Maksim Bauer committed Apr 17, 2022
1 parent 52ca182 commit d97ee8f
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 22 deletions.
2 changes: 1 addition & 1 deletion Sources/MimeParser/MimeParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public struct MimeParser {

private func parseCompositeContent(in string: String, range: Range<String.Index>, boundary: String) throws -> [Mime] {
let escapedBoundary = NSRegularExpression.escapedPattern(for: boundary)
let regex = try! NSRegularExpression(pattern: "\r?\n--\(escapedBoundary)-?-?\r?\n", options: [])
let regex = try! NSRegularExpression(pattern: "\r?\n--\(escapedBoundary)-?-?\r?\n?", options: [])
let matchResults = regex.matches(in: string, options: [], range: string.nsRange)

var mimes = [Mime]()
Expand Down
51 changes: 30 additions & 21 deletions Tests/MimeParserTests/EmailParsingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,36 +8,45 @@ class EmailParsingTests: XCTestCase {
]

func testCanParseEmailWithApplicationAttachment() throws {
// Given
let parser = MimeParser()
let message = TestAdditions.testResourceString(withName: "EmailWithApplicationAttachment", extension: "txt")

// When
let mime = try parser.parse(message)
// Then

// Then
XCTAssertEqual(mime.header.contentType?.type, "multipart")
XCTAssertEqual(mime.header.contentType?.subtype, "mixed")

if case .mixed(let mimes) = mime.content {
//dump(mimes)
if case .mixed(let mimes) = mime.content, let message = mimes.first, let attachment = mimes.last {
XCTAssertEqual(mimes.count, 2)

for part in mimes {

let mimeType = part.header.contentType?.mimeType
let mimeSubType = part.header.contentType?.subtype

if mimeType == .application {
XCTAssertTrue(mimeSubType == "ics")
let content = try part.decodedContentString()
XCTAssertNotNil(content)
XCTAssertTrue(content!.contains("VCALENDAR"))
XCTAssertTrue(content!.contains("VEVENT"))
return
}
}

XCTAssert(false)
}

if case .alternative(let alternativeMessages) = message.content {
XCTAssertEqual(alternativeMessages.count, 3)
guard alternativeMessages.count == 3 else { return }

XCTAssertEqual(alternativeMessages[0].header.contentType?.mimeType, .text)
XCTAssertEqual(alternativeMessages[0].header.contentType?.subtype, "plain")
XCTAssertEqual(alternativeMessages[0].header.contentTransferEncoding, .base64)

XCTAssertEqual(alternativeMessages[1].header.contentType?.mimeType, .text)
XCTAssertEqual(alternativeMessages[1].header.contentType?.subtype, "html")
XCTAssertEqual(alternativeMessages[1].header.contentTransferEncoding, .quotedPrintable)

XCTAssertEqual(alternativeMessages[2].header.contentType?.mimeType, .text)
XCTAssertEqual(alternativeMessages[2].header.contentType?.subtype, "calendar")
XCTAssertEqual(alternativeMessages[2].header.contentTransferEncoding, .sevenBit)
}

XCTAssertEqual(attachment.header.contentType?.mimeType, .application)
XCTAssertEqual(attachment.header.contentType?.subtype, "ics")
let attachmentContent = try attachment.decodedContentString() ?? ""
XCTAssertTrue(attachmentContent.contains("VCALENDAR"))
XCTAssertTrue(attachmentContent.contains("VEVENT"))
} else {
XCTFail("expected to find multipart/mixed mime")
}
}

}
Expand Down

0 comments on commit d97ee8f

Please sign in to comment.