Skip to content

Instantly share code, notes, and snippets.

@nicwest
Created October 9, 2015 20:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nicwest/f902199d47f5c4a7902a to your computer and use it in GitHub Desktop.
Save nicwest/f902199d47f5c4a7902a to your computer and use it in GitHub Desktop.
package sqlmockthing
import (
"database/sql"
"log"
"math/rand"
"sync"
"time"
)
type Thing struct {
Name string
Number int
Word string
}
func GetThing(results chan Thing, db *sql.DB, name string, wg *sync.WaitGroup) {
num := rand.Intn(100)
log.Println(name, num)
time.Sleep(time.Duration(num) * time.Millisecond)
rows, err := db.Query("SELECT word FROM things WHERE number=?, name=?", num, name)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var t Thing
var word string
if err := rows.Scan(&word); err != nil {
log.Fatal(err)
}
t.Number = num
t.Name = name
t.Word = word
results <- t
}
}
func Words(db *sql.DB, names []string) (words map[string]string) {
rand.Seed(time.Now().Unix())
var wg sync.WaitGroup
words = map[string]string{}
results := make(chan Thing, len(names))
defer close(results)
for _, name := range names {
wg.Add(1)
go GetThing(results, db, name, &wg)
go func(wg *sync.WaitGroup) {
defer wg.Done()
t := <-results
words[t.Name] = t.Word
}(&wg)
}
wg.Wait()
return
}
package sqlmockthing
import (
"gopkg.in/DATA-DOG/go-sqlmock.v1"
"testing"
)
func TestShowWordsAndNumbers(t *testing.T) {
db, mock, _ := sqlmock.New()
defer db.Close()
columns := []string{"word"}
mock.ExpectQuery("SELECT word FROM things").WillReturnRows(
sqlmock.NewRows(columns).AddRow("Fish"),
)
mock.ExpectQuery("SELECT word FROM things").WillReturnRows(
sqlmock.NewRows(columns).AddRow("Bat"),
)
mock.ExpectQuery("SELECT word FROM things").WillReturnRows(
sqlmock.NewRows(columns).AddRow("Horse"),
)
names := []string{"Fred", "Harry", "Billy"}
words := Words(db, names)
if words["Fred"] != "Fish" {
t.Errorf("Fred's word is %s, should be Fish", words["Fred"])
}
if words["Billy"] != "Bat" {
t.Errorf("Billy's word is %s, should be Bat", words["Billy"])
}
if words["Harry"] != "Horse" {
t.Errorf("Harry's word is %s, should be Horse", words["Harry"])
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment