From 2a9800a84927e0d18050e4db665deb64db9d1e8c Mon Sep 17 00:00:00 2001 From: Michael Gaffney Date: Wed, 3 Jun 2020 09:25:07 -0400 Subject: [PATCH] Add function to check if db error is a check constraint violation --- internal/db/error.go | 17 +++++++++++++++++ internal/db/error_test.go | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/internal/db/error.go b/internal/db/error.go index f88d7ec5cc..49004ab5bf 100644 --- a/internal/db/error.go +++ b/internal/db/error.go @@ -58,3 +58,20 @@ func IsUniqueError(err error) bool { return false } + +// IsCheckConstraintError returns a boolean indicating whether the error is +// known to report a check constraint violation. +func IsCheckConstraintError(err error) bool { + if err == nil { + return false + } + + var pqError *pq.Error + if errors.As(err, &pqError) { + if pqError.Code.Name() == "check_violation" { + return true + } + } + + return false +} diff --git a/internal/db/error_test.go b/internal/db/error_test.go index b31b2f3762..efed0f6c74 100644 --- a/internal/db/error_test.go +++ b/internal/db/error_test.go @@ -26,7 +26,7 @@ func TestError_IsUnique(t *testing.T) { want: false, }, { - name: "postgres-is-unique2", + name: "postgres-is-unique", in: &pq.Error{ Code: pq.ErrorCode("23505"), }, @@ -43,3 +43,40 @@ func TestError_IsUnique(t *testing.T) { }) } } + +func TestError_IsCheckConstraint(t *testing.T) { + var tests = []struct { + name string + in error + want bool + }{ + { + name: "nil-error", + in: nil, + want: false, + }, + { + name: "postgres-not-check-constraint", + in: &pq.Error{ + Code: pq.ErrorCode("23505"), + }, + want: false, + }, + { + name: "postgres-is-check-constraint", + in: &pq.Error{ + Code: pq.ErrorCode("23514"), + }, + want: true, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + assert := assert.New(t) + err := tt.in + got := IsCheckConstraintError(err) + assert.Equal(tt.want, got) + }) + } +}