Handle item attachments with missing name (#5209)
<!-- PR description--> Extending the earlier fix in https://github.com/alcionai/corso/pull/5199 to `itemAttachments`. Posts are not impacted here since they don't have attachment types like messages do. --- #### Does this PR need a docs update or release note? - [x] ✅ Yes, it's included - [ ] 🕐 Yes, but in a later PR - [ ] ⛔ No #### Type of change <!--- Please check the type of change your PR introduces: ---> - [ ] 🌻 Feature - [x] 🐛 Bugfix - [ ] 🗺️ Documentation - [ ] 🤖 Supportability/Tests - [ ] 💻 CI/Deployment - [ ] 🧹 Tech Debt/Cleanup #### Issue(s) <!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. --> * #<issue> #### Test Plan <!-- How will this be tested prior to merging.--> - [ ] 💪 Manual - [x] ⚡ Unit test - [ ] 💚 E2E
This commit is contained in:
parent
b3b52c0dfc
commit
411ef24024
@ -208,6 +208,15 @@ func getItemAttachment(ctx context.Context, attachment models.Attachmentable) (*
|
|||||||
With("attachment_id", ptr.Val(attachment.GetId()))
|
With("attachment_id", ptr.Val(attachment.GetId()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name := ptr.Val(attachment.GetName())
|
||||||
|
if len(name) == 0 {
|
||||||
|
// Graph as of now does not let us create any attachments
|
||||||
|
// without a name, but we have run into instances where we have
|
||||||
|
// see attachments without a name, possibly from old
|
||||||
|
// data. This is for those cases.
|
||||||
|
name = "Unnamed"
|
||||||
|
}
|
||||||
|
|
||||||
switch it := it.(type) {
|
switch it := it.(type) {
|
||||||
case *models.Message:
|
case *models.Message:
|
||||||
cb, err := FromMessageable(ctx, it)
|
cb, err := FromMessageable(ctx, it)
|
||||||
@ -217,7 +226,7 @@ func getItemAttachment(ctx context.Context, attachment models.Attachmentable) (*
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &mail.File{
|
return &mail.File{
|
||||||
Name: ptr.Val(attachment.GetName()),
|
Name: name,
|
||||||
MimeType: "message/rfc822",
|
MimeType: "message/rfc822",
|
||||||
Data: []byte(cb),
|
Data: []byte(cb),
|
||||||
}, nil
|
}, nil
|
||||||
|
|||||||
@ -137,6 +137,11 @@ func (suite *EMLUnitSuite) TestConvert_messageble_to_eml() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *EMLUnitSuite) TestConvert_edge_cases() {
|
func (suite *EMLUnitSuite) TestConvert_edge_cases() {
|
||||||
|
bodies := []string{
|
||||||
|
testdata.EmailWithAttachments,
|
||||||
|
testdata.EmailWithinEmail,
|
||||||
|
}
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
transform func(models.Messageable)
|
transform func(models.Messageable)
|
||||||
@ -202,6 +207,7 @@ func (suite *EMLUnitSuite) TestConvert_edge_cases() {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, b := range bodies {
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
suite.Run(test.name, func() {
|
suite.Run(test.name, func() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
@ -209,7 +215,7 @@ func (suite *EMLUnitSuite) TestConvert_edge_cases() {
|
|||||||
ctx, flush := tester.NewContext(t)
|
ctx, flush := tester.NewContext(t)
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
body := []byte(testdata.EmailWithAttachments)
|
body := []byte(b)
|
||||||
|
|
||||||
msg, err := api.BytesToMessageable(body)
|
msg, err := api.BytesToMessageable(body)
|
||||||
require.NoError(t, err, "creating message")
|
require.NoError(t, err, "creating message")
|
||||||
@ -231,6 +237,7 @@ func (suite *EMLUnitSuite) TestConvert_edge_cases() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *EMLUnitSuite) TestConvert_eml_ics() {
|
func (suite *EMLUnitSuite) TestConvert_eml_ics() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
@ -461,7 +468,7 @@ func (suite *EMLUnitSuite) TestConvert_message_in_messageble_to_eml() {
|
|||||||
assert.Equal(t, formatAddress(msg.GetFrom().GetEmailAddress()), eml.GetHeader("From"))
|
assert.Equal(t, formatAddress(msg.GetFrom().GetEmailAddress()), eml.GetHeader("From"))
|
||||||
|
|
||||||
attachments := eml.Attachments
|
attachments := eml.Attachments
|
||||||
assert.Equal(t, 1, len(attachments), "attachment count in parent email")
|
assert.Equal(t, 3, len(attachments), "attachment count in parent email")
|
||||||
|
|
||||||
ieml, err := enmime.ReadEnvelope(strings.NewReader(string(attachments[0].Content)))
|
ieml, err := enmime.ReadEnvelope(strings.NewReader(string(attachments[0].Content)))
|
||||||
require.NoError(t, err, "reading created eml")
|
require.NoError(t, err, "reading created eml")
|
||||||
|
|||||||
@ -77,6 +77,146 @@
|
|||||||
],
|
],
|
||||||
"webLink": "https://outlook.office365.com/owa/?AttachmentItemID=AAMkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNABGAAAAAABFdiK7oifWRb4ADuqgSRcnBwBBFDg0JJk7TY1fmsJrh7tNAAAAAAEJAABBFDg0JJk7TY1fmsJrh7tNAAFnbV%2FqAAABEgAQAEUyH0VS3HJBgHDlZdWZl0k%3D&exvsurl=1&viewmodel=ItemAttachment"
|
"webLink": "https://outlook.office365.com/owa/?AttachmentItemID=AAMkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNABGAAAAAABFdiK7oifWRb4ADuqgSRcnBwBBFDg0JJk7TY1fmsJrh7tNAAAAAAEJAABBFDg0JJk7TY1fmsJrh7tNAAFnbV%2FqAAABEgAQAEUyH0VS3HJBgHDlZdWZl0k%3D&exvsurl=1&viewmodel=ItemAttachment"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "AAMkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNABGAAAAAABFdiK7oifWRb4ADuqgSRcnBwBBFDg0JJk7TY1fmsJrh7tNAAAAAAEJAABBFDg0JJk7TY1fmsJrh7tNAAFnbV-qAAABEgAQAEUyH0VS3HJBgHDlZdWZl02=",
|
||||||
|
"@odata.type": "#microsoft.graph.itemAttachment",
|
||||||
|
"item@odata.navigationLink": "https://graph.microsoft.com/v1.0/users('7ceb8e03-bdc5-4509-a136-457526165ec0')/messages('')",
|
||||||
|
"item@odata.associationLink": "https://graph.microsoft.com/v1.0/users('7ceb8e03-bdc5-4509-a136-457526165ec0')/messages('')/$ref",
|
||||||
|
"isInline": false,
|
||||||
|
"lastModifiedDateTime": "2024-02-05T09:33:46Z",
|
||||||
|
"name": "Purpose of life part 2",
|
||||||
|
"size": 11840,
|
||||||
|
"item": {
|
||||||
|
"id": "",
|
||||||
|
"@odata.type": "#microsoft.graph.message",
|
||||||
|
"createdDateTime": "2024-02-05T09:33:24Z",
|
||||||
|
"lastModifiedDateTime": "2024-02-05T09:33:46Z",
|
||||||
|
"attachments": [
|
||||||
|
{
|
||||||
|
"id": "AAMkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNABGAAAAAABFdiK7oifWRb4ADuqgSRcnBwBBFDg0JJk7TY1fmsJrh7tNAAAAAAEJAABBFDg0JJk7TY1fmsJrh7tNAAFnbV-qAAACEgAQAEUyH0VS3HJBgHDlZdWZl0kSABAAjBhd4-oQaUS969pTkS-gzA==",
|
||||||
|
"@odata.type": "#microsoft.graph.fileAttachment",
|
||||||
|
"@odata.mediaContentType": "text/calendar",
|
||||||
|
"contentType": "text/calendar",
|
||||||
|
"isInline": false,
|
||||||
|
"lastModifiedDateTime": "2024-02-05T09:33:46Z",
|
||||||
|
"name": "Abidjan.ics",
|
||||||
|
"size": 573,
|
||||||
|
"contentBytes": "QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vdHp1cmwub3JnLy9OT05TR01MIE9sc29uIDIwMjNkLy9FTg0KVkVSU0lPTjoyLjANCkJFR0lOOlZUSU1FWk9ORQ0KVFpJRDpBZnJpY2EvQWJpZGphbg0KTEFTVC1NT0RJRklFRDoyMDIzMTIyMlQyMzMzNThaDQpUWlVSTDpodHRwczovL3d3dy50enVybC5vcmcvem9uZWluZm8vQWZyaWNhL0FiaWRqYW4NClgtTElDLUxPQ0FUSU9OOkFmcmljYS9BYmlkamFuDQpYLVBST0xFUFRJQy1UWk5BTUU6TE1UDQpCRUdJTjpTVEFOREFSRA0KVFpOQU1FOkdNVA0KVFpPRkZTRVRGUk9NOi0wMDE2MDgNClRaT0ZGU0VUVE86KzAwMDANCkRUU1RBUlQ6MTkxMjAxMDFUMDAwMDAwDQpFTkQ6U1RBTkRBUkQNCkVORDpWVElNRVpPTkUNCkVORDpWQ0FMRU5EQVINCg=="
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"content": "<html><head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><style type=\"text/css\" style=\"display:none;\"> P {margin-top:0;margin-bottom:0;} </style></head><body dir=\"ltr\"><div class=\"elementToProof\" style=\"font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);\">I just realized the purpose of my life is to be a test case. Good to know.<br></div></body></html>",
|
||||||
|
"contentType": "html"
|
||||||
|
},
|
||||||
|
"bodyPreview": "I just realized the purpose of my life is to be a test case. Good to know.",
|
||||||
|
"conversationId": "AAQkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNAAQAFEnxDqYmbJEm8d2l3qfS6A=",
|
||||||
|
"conversationIndex": "AQHaWBYiUSfEOpiZskSbx3aXep9LoA==",
|
||||||
|
"flag": {
|
||||||
|
"flagStatus": "notFlagged"
|
||||||
|
},
|
||||||
|
"from": {
|
||||||
|
"emailAddress": {
|
||||||
|
"address": "JohannaL@10rqc2.onmicrosoft.com",
|
||||||
|
"name": "Johanna Lorenz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAttachments": true,
|
||||||
|
"importance": "normal",
|
||||||
|
"internetMessageId": "<SJ0PR04MB7294108E381BCCE5C207B6DEBC472@SJ0PR04MB7294.namprd04.prod.outlook.com>",
|
||||||
|
"isDeliveryReceiptRequested": false,
|
||||||
|
"isDraft": false,
|
||||||
|
"isRead": true,
|
||||||
|
"isReadReceiptRequested": false,
|
||||||
|
"receivedDateTime": "2024-02-05T09:33:12Z",
|
||||||
|
"sender": {
|
||||||
|
"emailAddress": {
|
||||||
|
"address": "JohannaL@10rqc2.onmicrosoft.com",
|
||||||
|
"name": "Johanna Lorenz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sentDateTime": "2024-02-05T09:33:11Z",
|
||||||
|
"subject": "Purpose of life",
|
||||||
|
"toRecipients": [
|
||||||
|
{
|
||||||
|
"emailAddress": {
|
||||||
|
"address": "PradeepG@10rqc2.onmicrosoft.com",
|
||||||
|
"name": "Pradeep Gupta"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"webLink": "https://outlook.office365.com/owa/?AttachmentItemID=AAMkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNABGAAAAAABFdiK7oifWRb4ADuqgSRcnBwBBFDg0JJk7TY1fmsJrh7tNAAAAAAEJAABBFDg0JJk7TY1fmsJrh7tNAAFnbV%2FqAAABEgAQAEUyH0VS3HJBgHDlZdWZl02%3D&exvsurl=1&viewmodel=ItemAttachment"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "AAMkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNABGAAAAAABFdiK7oifWRb4ADuqgSRcnBwBBFDg0JJk7TY1fmsJrh7tNAAAAAAEJAABBFDg0JJk7TY1fmsJrh7tNAAFnbV-qAAABEgAQAEUyH0VS3HJBgHDlZdWZl03=",
|
||||||
|
"@odata.type": "#microsoft.graph.itemAttachment",
|
||||||
|
"item@odata.navigationLink": "https://graph.microsoft.com/v1.0/users('7ceb8e03-bdc5-4509-a136-457526165ec0')/messages('')",
|
||||||
|
"item@odata.associationLink": "https://graph.microsoft.com/v1.0/users('7ceb8e03-bdc5-4509-a136-457526165ec0')/messages('')/$ref",
|
||||||
|
"isInline": false,
|
||||||
|
"lastModifiedDateTime": "2024-02-05T09:33:46Z",
|
||||||
|
"name": "Purpose of life part 3",
|
||||||
|
"size": 11840,
|
||||||
|
"item": {
|
||||||
|
"id": "",
|
||||||
|
"@odata.type": "#microsoft.graph.message",
|
||||||
|
"createdDateTime": "2024-02-05T09:33:24Z",
|
||||||
|
"lastModifiedDateTime": "2024-02-05T09:33:46Z",
|
||||||
|
"attachments": [
|
||||||
|
{
|
||||||
|
"id": "AAMkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNABGAAAAAABFdiK7oifWRb4ADuqgSRcnBwBBFDg0JJk7TY1fmsJrh7tNAAAAAAEJAABBFDg0JJk7TY1fmsJrh7tNAAFnbV-qAAACEgAQAEUyH0VS3HJBgHDlZdWZl0kSABAAjBhd4-oQaUS969pTkS-gzA==",
|
||||||
|
"@odata.type": "#microsoft.graph.fileAttachment",
|
||||||
|
"@odata.mediaContentType": "text/calendar",
|
||||||
|
"contentType": "text/calendar",
|
||||||
|
"isInline": false,
|
||||||
|
"lastModifiedDateTime": "2024-02-05T09:33:46Z",
|
||||||
|
"name": "Abidjan.ics",
|
||||||
|
"size": 573,
|
||||||
|
"contentBytes": "QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vdHp1cmwub3JnLy9OT05TR01MIE9sc29uIDIwMjNkLy9FTg0KVkVSU0lPTjoyLjANCkJFR0lOOlZUSU1FWk9ORQ0KVFpJRDpBZnJpY2EvQWJpZGphbg0KTEFTVC1NT0RJRklFRDoyMDIzMTIyMlQyMzMzNThaDQpUWlVSTDpodHRwczovL3d3dy50enVybC5vcmcvem9uZWluZm8vQWZyaWNhL0FiaWRqYW4NClgtTElDLUxPQ0FUSU9OOkFmcmljYS9BYmlkamFuDQpYLVBST0xFUFRJQy1UWk5BTUU6TE1UDQpCRUdJTjpTVEFOREFSRA0KVFpOQU1FOkdNVA0KVFpPRkZTRVRGUk9NOi0wMDE2MDgNClRaT0ZGU0VUVE86KzAwMDANCkRUU1RBUlQ6MTkxMjAxMDFUMDAwMDAwDQpFTkQ6U1RBTkRBUkQNCkVORDpWVElNRVpPTkUNCkVORDpWQ0FMRU5EQVINCg=="
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"content": "<html><head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><style type=\"text/css\" style=\"display:none;\"> P {margin-top:0;margin-bottom:0;} </style></head><body dir=\"ltr\"><div class=\"elementToProof\" style=\"font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);\">I just realized the purpose of my life is to be a test case. Good to know.<br></div></body></html>",
|
||||||
|
"contentType": "html"
|
||||||
|
},
|
||||||
|
"bodyPreview": "I just realized the purpose of my life is to be a test case. Good to know.",
|
||||||
|
"conversationId": "AAQkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNAAQAFEnxDqYmbJEm8d2l3qfS6A=",
|
||||||
|
"conversationIndex": "AQHaWBYiUSfEOpiZskSbx3aXep9LoA==",
|
||||||
|
"flag": {
|
||||||
|
"flagStatus": "notFlagged"
|
||||||
|
},
|
||||||
|
"from": {
|
||||||
|
"emailAddress": {
|
||||||
|
"address": "JohannaL@10rqc2.onmicrosoft.com",
|
||||||
|
"name": "Johanna Lorenz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAttachments": true,
|
||||||
|
"importance": "normal",
|
||||||
|
"internetMessageId": "<SJ0PR04MB7294108E381BCCE5C207B6DEBC472@SJ0PR04MB7294.namprd04.prod.outlook.com>",
|
||||||
|
"isDeliveryReceiptRequested": false,
|
||||||
|
"isDraft": false,
|
||||||
|
"isRead": true,
|
||||||
|
"isReadReceiptRequested": false,
|
||||||
|
"receivedDateTime": "2024-02-05T09:33:12Z",
|
||||||
|
"sender": {
|
||||||
|
"emailAddress": {
|
||||||
|
"address": "JohannaL@10rqc2.onmicrosoft.com",
|
||||||
|
"name": "Johanna Lorenz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sentDateTime": "2024-02-05T09:33:11Z",
|
||||||
|
"subject": "Purpose of life",
|
||||||
|
"toRecipients": [
|
||||||
|
{
|
||||||
|
"emailAddress": {
|
||||||
|
"address": "PradeepG@10rqc2.onmicrosoft.com",
|
||||||
|
"name": "Pradeep Gupta"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"webLink": "https://outlook.office365.com/owa/?AttachmentItemID=AAMkAGJiZmE2NGU4LTQ4YjktNDI1Mi1iMWQzLTQ1MmMxODJkZmQyNABGAAAAAABFdiK7oifWRb4ADuqgSRcnBwBBFDg0JJk7TY1fmsJrh7tNAAAAAAEJAABBFDg0JJk7TY1fmsJrh7tNAAFnbV%2FqAAABEgAQAEUyH0VS3HJBgHDlZdWZl03%3D&exvsurl=1&viewmodel=ItemAttachment"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"bccRecipients": [],
|
"bccRecipients": [],
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user