From 18bc84b75196b6cb41f64edc59f2676acabe089f Mon Sep 17 00:00:00 2001 From: Saeid Date: Wed, 7 Jun 2023 09:04:28 +0200 Subject: [PATCH] feat: foreign key violated error (#193) * feat: foreign key violated error * ci: fixed ci workflow to be triggered for all pull requests * test: fixed typo --------- Co-authored-by: Saeid Saeidee --- .github/workflows/tests.yml | 5 ----- error_translator.go | 13 ++++++----- error_translator_test.go | 44 +++++++++++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 2 ++ 5 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 error_translator_test.go diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a593746..45fef22 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,12 +2,7 @@ name: tests on: push: - branches: - - '**' - - '*' pull_request: - branches: - - master permissions: contents: read diff --git a/error_translator.go b/error_translator.go index 1f67d37..c80b913 100644 --- a/error_translator.go +++ b/error_translator.go @@ -8,8 +8,9 @@ import ( "github.com/jackc/pgx/v5/pgconn" ) -var errCodes = map[string]string{ - "uniqueConstraint": "23505", +var errCodes = map[string]error{ + "23505": gorm.ErrDuplicatedKey, + "23503": gorm.ErrForeignKeyViolated, } type ErrMessage struct { @@ -22,8 +23,8 @@ type ErrMessage struct { // Since currently gorm supporting both pgx and pg drivers, only checking for pgx PgError types is not enough for translating errors, so we have additional error json marshal fallback. func (dialector Dialector) Translate(err error) error { if pgErr, ok := err.(*pgconn.PgError); ok { - if pgErr.Code == errCodes["uniqueConstraint"] { - return gorm.ErrDuplicatedKey + if translatedErr, found := errCodes[pgErr.Code]; found { + return translatedErr } return err } @@ -39,8 +40,8 @@ func (dialector Dialector) Translate(err error) error { return err } - if errMsg.Code == errCodes["uniqueConstraint"] { - return gorm.ErrDuplicatedKey + if translatedErr, found := errCodes[errMsg.Code]; found { + return translatedErr } return err } diff --git a/error_translator_test.go b/error_translator_test.go new file mode 100644 index 0000000..130d41b --- /dev/null +++ b/error_translator_test.go @@ -0,0 +1,44 @@ +package postgres + +import ( + "errors" + "github.com/jackc/pgx/v5/pgconn" + "gorm.io/gorm" + "testing" +) + +func TestDialector_Translate(t *testing.T) { + type fields struct { + Config *Config + } + type args struct { + err error + } + tests := []struct { + name string + fields fields + args args + want error + }{ + { + name: "it should return ErrDuplicatedKey error if the status code is 23505", + args: args{err: &pgconn.PgError{Code: "23505"}}, + want: gorm.ErrDuplicatedKey, + }, + { + name: "it should return ErrForeignKeyViolated error if the status code is 23503", + args: args{err: &pgconn.PgError{Code: "23503"}}, + want: gorm.ErrForeignKeyViolated, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + dialector := Dialector{ + Config: tt.fields.Config, + } + if err := dialector.Translate(tt.args.err); !errors.Is(err, tt.want) { + t.Errorf("Translate() expected error = %v, got error %v", err, tt.want) + } + }) + } +} diff --git a/go.mod b/go.mod index 3a79ed1..c679685 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.18 require ( github.com/jackc/pgx/v5 v5.3.1 - gorm.io/gorm v1.25.0 + gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55 ) require ( diff --git a/go.sum b/go.sum index bb7edd7..4ebc21a 100644 --- a/go.sum +++ b/go.sum @@ -25,3 +25,5 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gorm.io/gorm v1.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU= gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55 h1:sC1Xj4TYrLqg1n3AN10w871An7wJM0gzgcm8jkIkECQ= +gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=