Ctrl K
ComunidadGuías…

store/user_unique_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package store

import (
	"errors"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestClassifyUserUniqueViolation(t *testing.T) {
	tests := []struct {
		name    string
		message string
		want    error
	}{
		{name: "sqlite email", message: "UNIQUE constraint failed: user.email", want: ErrEmailTaken},
		{name: "sqlite username", message: "UNIQUE constraint failed: user.username", want: ErrUsernameTaken},
		{name: "sqlite identity", message: "UNIQUE constraint failed: user_identity.provider, user_identity.extern_uid", want: ErrUserIdentityTaken},
		{name: "mysql email", message: "Error 1062 (23000): Duplicate entry 'a@b.c' for key 'user.idx_user_email'", want: ErrEmailTaken},
		{name: "mysql username", message: "Error 1062 (23000): Duplicate entry 'alice' for key 'user.username'", want: ErrUsernameTaken},
		{name: "mysql identity", message: "Error 1062 (23000): Duplicate entry 'idp-x' for key 'user_identity.provider'", want: ErrUserIdentityTaken},
		{name: "postgres email", message: `pq: duplicate key value violates unique constraint "idx_user_email"`, want: ErrEmailTaken},
		{name: "postgres username", message: `pq: duplicate key value violates unique constraint "user_username_key"`, want: ErrUsernameTaken},
		{name: "postgres identity", message: `pq: duplicate key value violates unique constraint "user_identity_provider_extern_uid_key"`, want: ErrUserIdentityTaken},
		{name: "wrapped driver error", message: "failed to create user: UNIQUE constraint failed: user.email", want: ErrEmailTaken},
		{name: "username spelled email is still a username conflict", message: "Error 1062 (23000): Duplicate entry 'email' for key 'user.username'", want: ErrUsernameTaken},
		{name: "not a unique violation", message: "database is locked", want: nil},
		{name: "unique violation on another table", message: "UNIQUE constraint failed: memo.uid", want: nil},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			got := classifyUserUniqueViolation(errors.New(test.message))
			if test.want == nil {
				require.NoError(t, got)
				return
			}
			require.ErrorIs(t, got, test.want)
			require.Contains(t, got.Error(), test.message)
		})
	}
	require.NoError(t, classifyUserUniqueViolation(nil))
}