Created
October 9, 2015 20:37
-
-
Save nicwest/f902199d47f5c4a7902a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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