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  }