From b1019dbc69c425017a128c021d02036e218e6d82 Mon Sep 17 00:00:00 2001 From: kekskurse Date: Thu, 13 Mar 2025 18:41:05 +0100 Subject: [PATCH] chore: Add AddMail function to userstore --- pkg/userstore/mail.go | 19 ++++++++++++++ pkg/userstore/mail_test.go | 54 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 pkg/userstore/mail.go create mode 100644 pkg/userstore/mail_test.go diff --git a/pkg/userstore/mail.go b/pkg/userstore/mail.go new file mode 100644 index 0000000..bbb9aed --- /dev/null +++ b/pkg/userstore/mail.go @@ -0,0 +1,19 @@ +package userstore + +import ( + "git.keks.cloud/kekskurse/miniauth/pkg/utils" + "github.com/google/uuid" +) + +func (s Store) MailAdd(mail string, primary bool) error { + query := "INSERT INTO mail (mail, validationCode, isPrimary) VALUES (?, ?, ?);" + log := s.log.With().Str("func", "MailAdd").Str("mail", mail).Bool("primary", primary).Str("query", query).Logger() + + validatenCode := uuid.NewString() + _, err := s.db.Exec(query, mail, validatenCode, primary) + if err != nil { + return utils.WrapError(ErrCantExecuteQuery, err, log) + } + + return nil +} diff --git a/pkg/userstore/mail_test.go b/pkg/userstore/mail_test.go new file mode 100644 index 0000000..b70420c --- /dev/null +++ b/pkg/userstore/mail_test.go @@ -0,0 +1,54 @@ +package userstore + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAddMail(t *testing.T) { + store := getTestStore(t) + initDabase(t, store) + + tts := []struct { + name string + mail string + primearyMail bool + ExptErr error + ExptErrString string + }{ + { + name: "test-add-first-mail", + mail: "mail1@kekskurse.de", + primearyMail: false, + }, + { + name: "test-add-mail-again-should-return-error", + mail: "mail1@kekskurse.de", + primearyMail: false, + ExptErr: ErrCantExecuteQuery, + ExptErrString: "cant execute query: constraint failed: UNIQUE constraint failed: mail.mail (2067)", + }, + } + + for _, tt := range tts { + t.Run(tt.name, func(t *testing.T) { + err := store.MailAdd(tt.mail, tt.primearyMail) + if tt.ExptErr == nil { + assert.Nil(t, err) + } else { + assert.ErrorIs(t, err, tt.ExptErr) + assert.Equal(t, tt.ExptErrString, err.Error()) + return + } + var isValidated bool + var validateCode string + isValidated = true + + err = store.db.QueryRow("SELECT validationCode, isValidated FROM mail WHERE mail = ?", tt.mail).Scan(&validateCode, &isValidated) + assert.Nil(t, err, "should get mail infos from db without error") + assert.False(t, isValidated, "mail should not be validated") + assert.NotEmpty(t, validateCode, "validaten code should not be empty") + }) + } +}