From 2771ac59b1175e300438d57393941d5abfda3e7e Mon Sep 17 00:00:00 2001 From: Baris Terzioglu Date: Tue, 28 Jan 2025 10:53:14 +0100 Subject: [PATCH 1/2] add ping:mysql --- pkg/mysql/db.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pkg/mysql/db.go b/pkg/mysql/db.go index da8f866e..85883a35 100644 --- a/pkg/mysql/db.go +++ b/pkg/mysql/db.go @@ -157,3 +157,16 @@ func (c *Client) SelectWithSchema(ctx context.Context, queryObj *query.Query) (* return result, nil } + +func (c *Client) Ping(ctx context.Context) error { + q := query.Query{ + Query: "SELECT 1", + } + + err := c.RunQueryWithoutResult(ctx, &q) + if err != nil { + return errors.Wrap(err, "failed to run test query on MySQL connection") + } + + return nil +} From e3eff5170e42b6413af025a712584c2e8b644659 Mon Sep 17 00:00:00 2001 From: Baris Terzioglu Date: Tue, 28 Jan 2025 10:53:45 +0100 Subject: [PATCH 2/2] add:unit tests --- pkg/mysql/db_test.go | 53 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/pkg/mysql/db_test.go b/pkg/mysql/db_test.go index 60d46504..c9a08141 100644 --- a/pkg/mysql/db_test.go +++ b/pkg/mysql/db_test.go @@ -174,3 +174,56 @@ func TestClient_SelectWithSchema(t *testing.T) { }) } } + +func TestClient_Ping(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + mockConnection func(mock sqlmock.Sqlmock) + wantErr bool + errorMessage string + }{ + { + name: "successful ping", + mockConnection: func(mock sqlmock.Sqlmock) { + mock.ExpectExec(`SELECT 1`). + WillReturnResult(sqlmock.NewResult(0, 0)) + }, + wantErr: false, + }, + { + name: "failed ping", + mockConnection: func(mock sqlmock.Sqlmock) { + mock.ExpectExec(`SELECT 1`). + WillReturnError(errors.New("connection refused")) + }, + wantErr: true, + errorMessage: "failed to run test query on MySQL connection: failed to execute query: connection refused", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + mockDB, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual)) + require.NoError(t, err) + defer mockDB.Close() + sqlxDB := sqlx.NewDb(mockDB, "sqlmock") + + tt.mockConnection(mock) + client := Client{conn: sqlxDB} + + err = client.Ping(context.Background()) + if tt.wantErr { + require.Error(t, err) + assert.Equal(t, tt.errorMessage, err.Error()) + } else { + require.NoError(t, err) + } + + require.NoError(t, mock.ExpectationsWereMet()) + }) + } +}