github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/state/impl_send_mail_storage_test.go (about) 1 /* 2 * Copyright (c) 2022-present unTill Pro, Ltd. 3 */ 4 5 package state 6 7 import ( 8 "context" 9 "fmt" 10 "testing" 11 12 "github.com/stretchr/testify/require" 13 "github.com/voedger/voedger/pkg/appdef" 14 "github.com/voedger/voedger/pkg/istructs" 15 "github.com/voedger/voedger/pkg/state/smtptest" 16 ) 17 18 func TestSendMailStorage_BasicUsage(t *testing.T) { 19 require := require.New(t) 20 ts := smtptest.NewServer(smtptest.WithCredentials("user", "pwd")) 21 defer ts.Close() 22 s := ProvideAsyncActualizerStateFactory()(context.Background(), nilAppStructsFunc, nil, nil, nil, nil, nil, nil, nil, 1, 0) 23 k, err := s.KeyBuilder(SendMail, appdef.NullQName) 24 require.NoError(err) 25 26 k.PutInt32(Field_Port, ts.Port()) 27 k.PutString(Field_Host, "localhost") 28 k.PutString(Field_Username, "user") 29 k.PutString(Field_Password, "pwd") 30 31 k.PutString(Field_Subject, "Greeting") 32 k.PutString(Field_From, "from@email.com") 33 k.PutString(Field_To, "to0@email.com") 34 k.PutString(Field_To, "to1@email.com") 35 k.PutString(Field_CC, "cc0@email.com") 36 k.PutString(Field_CC, "cc1@email.com") 37 k.PutString(Field_BCC, "bcc0@email.com") 38 k.PutString(Field_BCC, "bcc1@email.com") 39 k.PutString(Field_Body, "Hello world") 40 41 require.NotNil(s.NewValue(k)) 42 readyToFlush, err := s.ApplyIntents() 43 require.True(readyToFlush) 44 require.NoError(err) 45 require.NoError(s.FlushBundles()) 46 47 msg := <-ts.Messages("user", "pwd") 48 49 require.Equal("Greeting", msg.Subject) 50 require.Equal("from@email.com", msg.From) 51 require.Equal([]string{"to0@email.com", "to1@email.com"}, msg.To) 52 require.Equal([]string{"cc0@email.com", "cc1@email.com"}, msg.CC) 53 require.Equal([]string{"bcc0@email.com", "bcc1@email.com"}, msg.BCC) 54 require.Equal("Hello world", msg.Body) 55 } 56 57 func TestSendMailStorage_Validate(t *testing.T) { 58 tests := []struct { 59 mandatoryField string 60 kbFiller func(kb istructs.IStateKeyBuilder) 61 }{ 62 { 63 mandatoryField: Field_Host, 64 kbFiller: func(kb istructs.IStateKeyBuilder) {}, 65 }, 66 { 67 mandatoryField: Field_Port, 68 kbFiller: func(kb istructs.IStateKeyBuilder) { 69 kb.PutString(Field_Host, "smtp.gmail.com") 70 }, 71 }, 72 { 73 mandatoryField: Field_Username, 74 kbFiller: func(kb istructs.IStateKeyBuilder) { 75 kb.PutString(Field_Host, "smtp.gmail.com") 76 kb.PutInt32(Field_Port, 587) 77 }, 78 }, 79 { 80 mandatoryField: Field_Password, 81 kbFiller: func(kb istructs.IStateKeyBuilder) { 82 kb.PutString(Field_Host, "smtp.gmail.com") 83 kb.PutInt32(Field_Port, 587) 84 kb.PutString(Field_Username, "user") 85 }, 86 }, 87 { 88 mandatoryField: Field_From, 89 kbFiller: func(kb istructs.IStateKeyBuilder) { 90 kb.PutString(Field_Host, "smtp.gmail.com") 91 kb.PutInt32(Field_Port, 587) 92 kb.PutString(Field_Username, "user") 93 kb.PutString(Field_Password, "pwd") 94 }, 95 }, 96 { 97 mandatoryField: Field_To, 98 kbFiller: func(kb istructs.IStateKeyBuilder) { 99 kb.PutString(Field_Host, "smtp.gmail.com") 100 kb.PutInt32(Field_Port, 587) 101 kb.PutString(Field_Username, "user") 102 kb.PutString(Field_Password, "pwd") 103 kb.PutString(Field_From, "sender@email.com") 104 }, 105 }, 106 } 107 for _, test := range tests { 108 t.Run(fmt.Sprintf("Should return error when mandatory field '%s' not found", test.mandatoryField), func(t *testing.T) { 109 require := require.New(t) 110 s := ProvideAsyncActualizerStateFactory()(context.Background(), nilAppStructsFunc, nil, nil, nil, nil, nil, nil, nil, 1, 0) 111 k, err := s.KeyBuilder(SendMail, appdef.NullQName) 112 require.NoError(err) 113 test.kbFiller(k) 114 _, err = s.NewValue(k) 115 require.NoError(err) 116 117 readyToFlush, err := s.ApplyIntents() 118 119 require.False(readyToFlush) 120 require.ErrorIs(err, ErrNotFound) 121 require.Contains(err.Error(), test.mandatoryField) 122 }) 123 } 124 }