package userstore import ( "testing" "time" "github.com/stretchr/testify/assert" ) func TestCheckMailExist(t *testing.T) { store, err := NewDummyStore() assert.Nil(t, err, "[setup] should be abel to create dummystore") id, err := store.UserWrite("foo", "foo") assert.Nil(t, err, "[setup] should be abel to create user") err = store.MailAdd("mail@kekskurse.de", id, false) assert.Nil(t, err, "[setup] should be abel to add mail") _, err = store.db.Exec("UPDATE mail SET is_validated = 1 WHERE mail = ?", "mail@kekskurse.de") assert.Nil(t, err) tts := []struct { name string mail string used bool }{ { name: "mail addresse unused", mail: "foo@bar.de", used: false, }, { name: "mail address used", mail: "mail@kekskurse.de", used: true, }, } for _, tt := range tts { t.Run(tt.name, func(t *testing.T) { used, err := store.MailCheckExists(tt.mail) assert.Nil(t, err) assert.Equal(t, tt.used, used) }) } } func TestAddMail(t *testing.T) { store, err := NewDummyStore() assert.Nil(t, err, "[setup] should be abel to create dummystore") _, err = store.UserWrite("kekskurse", "kekskurse") assert.Nil(t, err, "[setup] should be abel to store user") tts := []struct { name string mail string user_id int64 primearyMail bool ExptErr error ExptErrString string }{ { name: "test-add-first-mail", mail: "mail1@kekskurse.de", user_id: 1, primearyMail: false, }, { name: "test-add-mail-again-should-return-error", mail: "mail1@kekskurse.de", user_id: 1, 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.user_id, 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 validation_code, is_validated 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") }) } } func TestDeleteMail(t *testing.T) { store, err := NewDummyStore() assert.Nil(t, err, "[setup] should be abel to create dummystore") _, err = store.UserWrite("kekskurse", "kekskurse") assert.Nil(t, err, "[setup] should be abel to store user") err = store.MailAdd("mail1@example.com", 1, true) assert.Nil(t, err, "[setup] should be abel to store mail") err = store.MailAdd("mail2@example.com", 1, false) assert.Nil(t, err, "[setup] should be abel to store mail2") var count int err = store.db.QueryRow("SELECT COUNT(*) FROM mail").Scan(&count) assert.Nil(t, err, "should execute count query for mail") assert.Equal(t, 2, count, "should found 2 mails in the database") err = store.MailRemove("mail1@example.com") assert.Nil(t, err, "should be abel to remove mail wthout error") err = store.db.QueryRow("SELECT COUNT(*) FROM mail").Scan(&count) assert.Nil(t, err, "should execute count query for mail") assert.Equal(t, 1, count, "should found 1 mails in the database") } func TestGetPrimaryMailForUser(t *testing.T) { store, err := NewDummyStore() assert.Nil(t, err, "[setup] should be abel to create dummystore") _, err = store.UserWrite("kekskurse", "kekskurse") assert.Nil(t, err, "[setup] should be abel to store user") err = store.MailAdd("mail1@example.com", 1, true) assert.Nil(t, err, "[setup] should be abel to store mail") err = store.MailAdd("mail2@example.com", 1, false) assert.Nil(t, err, "[setup] should be abel to store mail2") mail, err := store.MailGetPrimaryForUsername("kekskurse") assert.Nil(t, err) assert.Equal(t, "mail1@example.com", mail.Mail) assert.Equal(t, true, mail.IsPrimary) assert.Equal(t, false, mail.IsValidated) assert.Equal(t, time.Now().Year(), mail.CreatedAt.Year()) assert.Equal(t, time.Now().Year(), mail.UpdatedAt.Year()) }