From af947a28c8b5d00d02dcac6506070d159e42429c Mon Sep 17 00:00:00 2001 From: NickyMateev Date: Wed, 3 Apr 2019 22:24:13 +0300 Subject: [PATCH] Add postgres storage implementation tests --- Gopkg.lock | 9 ++ Gopkg.toml | 4 + job/pull_request_fetcher.go | 2 +- storage/storage_test.go | 174 ++++++++++++++++++++++++++++++++++++ 4 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 storage/storage_test.go diff --git a/Gopkg.lock b/Gopkg.lock index 2aea459..3f7e670 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1,6 +1,14 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. +[[projects]] + digest = "1:c84a587136cb69cecc11f3dbe9f9001444044c0dba74997b07f7e4c150b07cda" + name = "github.com/DATA-DOG/go-sqlmock" + packages = ["."] + pruneopts = "UT" + revision = "3f9954f6f6697845b082ca57995849ddf614f450" + version = "v1.3.3" + [[projects]] digest = "1:1b487fd946176530c6c3669e55108e4ee45e1bd1ea0a630e28e3a173352d93e8" name = "github.com/ericlagergren/decimal" @@ -281,6 +289,7 @@ analyzer-name = "dep" analyzer-version = 1 input-imports = [ + "github.com/DATA-DOG/go-sqlmock", "github.com/golang-migrate/migrate", "github.com/golang-migrate/migrate/database/postgres", "github.com/golang-migrate/migrate/source/file", diff --git a/Gopkg.toml b/Gopkg.toml index d359906..d89c483 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -59,3 +59,7 @@ [[constraint]] name = "github.com/nlopes/slack" version = "0.5.0" + +[[constraint]] + name = "github.com/DATA-DOG/go-sqlmock" + version = "1.3.3" diff --git a/job/pull_request_fetcher.go b/job/pull_request_fetcher.go index 17ca26d..86477f3 100644 --- a/job/pull_request_fetcher.go +++ b/job/pull_request_fetcher.go @@ -124,7 +124,7 @@ func (prf *PullRequestFetcher) persistPullRequests(pullRequests []*github.PullRe }) if txErr != nil { - log.Printf("Unable to persist pull request %q: %s\n", pullRequest.Title, txErr) + log.Printf("Unable to persist pull request %q: %s\n", *pullRequest.Title, txErr) } } } diff --git a/storage/storage_test.go b/storage/storage_test.go new file mode 100644 index 0000000..67628b3 --- /dev/null +++ b/storage/storage_test.go @@ -0,0 +1,174 @@ +package storage + +import ( + "context" + "database/sql" + "fmt" + "github.com/DATA-DOG/go-sqlmock" + "log" + "testing" +) + +const ( + insertQueryShort = "INSERT INTO \"table\"" +) + +func TestGetStorage(t *testing.T) { + db, _, err := sqlmock.New() + if err != nil { + log.Panicf("an error '%s' was not expected when opening a stub database connection", err) + } + defer db.Close() + + storage := postgresStorage{db: db} + + if storage.Get() != db { + t.Fail() + } +} + +func TestTransactionSuccessful(t *testing.T) { + db, sqlMock, err := sqlmock.New() + if err != nil { + log.Panicf("an error '%s' was not expected when opening a stub database connection", err) + } + defer db.Close() + + storage := postgresStorage{db: db} + + sqlMock.ExpectBegin() + + var expectedLastInsertID int64 = 1 + var expectedLastRowsAffected int64 = 1 + expectedResult := sqlmock.NewResult(expectedLastInsertID, expectedLastRowsAffected) + sqlMock.ExpectExec(insertQueryShort).WithArgs("arg1", "arg2", "arg3").WillReturnResult(expectedResult) + + sqlMock.ExpectCommit() + + txErr := storage.Transaction(context.TODO(), func(context context.Context, tx *sql.Tx) error { + actualResult, err := tx.Exec(insertQueryShort, "arg1", "arg2", "arg3") + actualLastInsertID, _ := actualResult.LastInsertId() + actualRowsAffected, _ := actualResult.RowsAffected() + + if actualLastInsertID != expectedLastInsertID || actualRowsAffected != expectedLastRowsAffected { + t.Fail() + } + return err + }) + + if txErr != nil { + t.Fail() + } + + if err := sqlMock.ExpectationsWereMet(); err != nil { + t.Errorf("there were unfulfilled expectations: %s", err) + } +} + +func TestTransactionFailToBeginTransaction(t *testing.T) { + db, sqlMock, err := sqlmock.New() + if err != nil { + log.Panicf("an error '%s' was not expected when opening a stub database connection", err) + } + defer db.Close() + + sqlMock.ExpectBegin() + + storage := postgresStorage{db: db} + txErr := storage.Transaction(context.TODO(), func(context context.Context, tx *sql.Tx) error { + return nil + }) + + if txErr == nil { + t.Fail() + } + + if err := sqlMock.ExpectationsWereMet(); err != nil { + t.Errorf("there were unfulfilled expectations: %s", err) + } +} + +func TestTransactionSuccessfulRollback(t *testing.T) { + db, sqlMock, err := sqlmock.New() + if err != nil { + log.Panicf("an error '%s' was not expected when opening a stub database connection", err) + } + defer db.Close() + + sqlMock.ExpectBegin() + sqlMock.ExpectRollback() + + storage := postgresStorage{db: db} + expectedErr := fmt.Errorf("unexpected error") + txErr := storage.Transaction(context.TODO(), func(context context.Context, tx *sql.Tx) error { + return expectedErr + }) + + if txErr != expectedErr { + t.Fail() + } + + if err := sqlMock.ExpectationsWereMet(); err != nil { + t.Errorf("there were unfulfilled expectations: %s", err) + } +} + +func TestTransactionFailRollback(t *testing.T) { + db, sqlMock, err := sqlmock.New() + if err != nil { + log.Panicf("an error '%s' was not expected when opening a stub database connection", err) + } + defer db.Close() + + sqlMock.ExpectBegin() + + storage := postgresStorage{db: db} + expectedErr := fmt.Errorf("unexpected error") + txErr := storage.Transaction(context.TODO(), func(context context.Context, tx *sql.Tx) error { + return expectedErr + }) + + if txErr == nil || txErr == expectedErr { + t.Fail() + } + + if err := sqlMock.ExpectationsWereMet(); err != nil { + t.Errorf("there were unfulfilled expectations: %s", err) + } +} + +func TestTransactionFailToCommitTransaction(t *testing.T) { + db, sqlMock, err := sqlmock.New() + if err != nil { + log.Panicf("an error '%s' was not expected when opening a stub database connection", err) + } + defer db.Close() + + storage := postgresStorage{db: db} + txErr := storage.Transaction(context.TODO(), func(context context.Context, tx *sql.Tx) error { + return nil + }) + + if txErr == nil { + t.Fail() + } + + if err := sqlMock.ExpectationsWereMet(); err != nil { + t.Errorf("there were unfulfilled expectations: %s", err) + } +} + +func TestCloseStorage(t *testing.T) { + db, _, err := sqlmock.New() + if err != nil { + log.Panicf("an error '%s' was not expected when opening a stub database connection", err) + } + + storage := postgresStorage{db: db} + storage.Close() + + err = db.Ping() + if err == nil { + t.Fail() + } +}