@ -20,13 +20,16 @@ package store
import (
import (
"io"
"io"
"net/mail"
"net/mail"
"net/textproto"
"strings"
"strings"
"testing"
"testing"
pkgMsg "github.com/ProtonMail/proton-bridge/pkg/message"
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
"github.com/golang/mock/gomock"
"github.com/golang/mock/gomock"
a "github.com/stretchr/testify/assert"
a "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
bolt "go.etcd.io/bbolt"
)
)
func TestGetAllMessageIDs ( t * testing . T ) {
func TestGetAllMessageIDs ( t * testing . T ) {
@ -78,35 +81,31 @@ func TestCreateOrUpdateMessageMetadata(t *testing.T) {
msg , err := m . store . getMessageFromDB ( "msg1" )
msg , err := m . store . getMessageFromDB ( "msg1" )
require . Nil ( t , err )
require . Nil ( t , err )
message := & Message { msg : msg , store : m . store , storeMailbox : nil }
// Check non-meta and calculated data are cleared/empty.
// Check non-meta and calculated data are cleared/empty.
a . Equal ( t , "" , msg . Body )
a . Equal ( t , "" , message . msg . Body )
a . Equal ( t , [ ] * pmapi . Attachment ( nil ) , msg . Attachments )
a . Equal ( t , [ ] * pmapi . Attachment ( nil ) , message . msg . Attachments )
a . Equal ( t , "" , msg . MIMEType )
a . Equal ( t , "" , message . msg . MIMEType )
a . Equal ( t , make ( mail . Header ) , msg . Header )
a . Equal ( t , make ( mail . Header ) , message . msg . Header )
// Change the calculated data.
wantMIMEType := "plain-text"
wantHeader := mail . Header {
"Key" : [ ] string { "value" } ,
}
storeMsg , err := m . store . addresses [ addrID1 ] . mailboxes [ pmapi . AllMailLabel ] . GetMessage ( "msg1" )
wantHeader , wantSize := putBodystructureAndSizeToDB ( m , "msg1" )
require . Nil ( t , err )
require . Nil ( t , storeMsg . SetContentTypeAndHeader ( wantMIMEType , wantHeader ) )
// Check calculated data.
// Check cached data.
msg , err = m . store . getMessageFromDB ( "msg1" )
require . Nil ( t , err )
a . Equal ( t , wantHeader , message . GetMIMEHeader ( ) )
haveSize , err := message . GetRFC822Size ( )
require . Nil ( t , err )
require . Nil ( t , err )
a . Equal ( t , wantMIMEType , msg . MIMEType )
a . Equal ( t , wantSize , haveSize )
a . Equal ( t , wantHeader , msg . Header )
// Check calculat ed data are not overridden by reinsert.
// Check cach ed data are not overridden by reinsert.
insertMessage ( t , m , "msg1" , "Test message 1" , addrID1 , false , [ ] string { pmapi . AllMailLabel } )
insertMessage ( t , m , "msg1" , "Test message 1" , addrID1 , false , [ ] string { pmapi . AllMailLabel } )
msg , err = m . store . getMessageFromDB ( "msg1" )
require . Nil ( t , err )
require . Nil ( t , err )
a . Equal ( t , wantMIMEType , msg . MIMEType )
a . Equal ( t , wantHeader , message . GetMIMEHeader ( ) )
a . Equal ( t , wantHeader , msg . Header )
haveSize , err = message . GetRFC822Size ( )
require . Nil ( t , err )
a . Equal ( t , wantSize , haveSize )
}
}
func TestDeleteMessage ( t * testing . T ) {
func TestDeleteMessage ( t * testing . T ) {
@ -134,6 +133,7 @@ func getTestMessage(id, subject, sender string, unread bool, labelIDs []string)
Subject : subject ,
Subject : subject ,
Unread : pmapi . Boolean ( unread ) ,
Unread : pmapi . Boolean ( unread ) ,
Sender : address ,
Sender : address ,
Flags : pmapi . FlagReceived ,
ToList : [ ] * mail . Address { address } ,
ToList : [ ] * mail . Address { address } ,
LabelIDs : labelIDs ,
LabelIDs : labelIDs ,
Body : "body of message" ,
Body : "body of message" ,
@ -194,3 +194,34 @@ func TestCreateDraftCheckMessageWithAttachmentSize(t *testing.T) {
require . EqualError ( t , err , "message is too large" )
require . EqualError ( t , err , "message is too large" )
}
}
func putBodystructureAndSizeToDB ( m * mocksForStore , msgID string ) ( header textproto . MIMEHeader , size uint32 ) {
size = uint32 ( 42 )
require . NoError ( m . tb , m . store . db . Update ( func ( tx * bolt . Tx ) error {
return tx . Bucket ( sizeBucket ) . Put ( [ ] byte ( msgID ) , itob ( size ) )
} ) )
header = textproto . MIMEHeader {
"Key" : [ ] string { "value" } ,
}
bs := pkgMsg . BodyStructure {
"" : & pkgMsg . SectionInfo {
Header : [ ] byte ( "Key: value\r\n\r\n" ) ,
Start : 0 ,
BSize : int ( size - 11 ) ,
Size : int ( size ) ,
Lines : 3 ,
} ,
}
raw , err := bs . Serialize ( )
require . NoError ( m . tb , err )
require . NoError ( m . tb , m . store . db . Update ( func ( tx * bolt . Tx ) error {
return tx . Bucket ( bodystructureBucket ) . Put ( [ ] byte ( msgID ) , raw )
} ) )
return header , size
}