Skip to content

Commit

Permalink
Add postgres storage implementation tests
Browse files Browse the repository at this point in the history
  • Loading branch information
NickyMateev committed Apr 3, 2019
1 parent 7ce5537 commit af947a2
Show file tree
Hide file tree
Showing 4 changed files with 188 additions and 1 deletion.
9 changes: 9 additions & 0 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
2 changes: 1 addition & 1 deletion job/pull_request_fetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
}
174 changes: 174 additions & 0 deletions storage/storage_test.go
Original file line number Diff line number Diff line change
@@ -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()
}
}

0 comments on commit af947a2

Please sign in to comment.