From 2aeb63428740ef4decb657fc99c3b24b9c8bb5fb Mon Sep 17 00:00:00 2001 From: Nicolas Duhamel Date: Sat, 6 Feb 2016 16:13:38 +0100 Subject: [PATCH] Add basic users --- sqltest/sqltest.go | 39 +++++++++++++++++++++++++++++++++++++++ run.go => tools/run.go | 0 users.go | 33 +++++++++++++++++++++++++++++++++ users_test.go | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 sqltest/sqltest.go rename run.go => tools/run.go (100%) create mode 100644 users.go create mode 100644 users_test.go diff --git a/sqltest/sqltest.go b/sqltest/sqltest.go new file mode 100644 index 0000000..64f268e --- /dev/null +++ b/sqltest/sqltest.go @@ -0,0 +1,39 @@ +package sqltest + +import ( + "fmt" + "strings" + "testing" + + "github.com/jmoiron/sqlx" +) + +func MultiExec(e sqlx.Execer, query string) error { + stmts := strings.Split(query, ";\n") + if len(strings.Trim(stmts[len(stmts)-1], " \n\t\r")) == 0 { + stmts = stmts[:len(stmts)-1] + } + for _, s := range stmts { + _, err := e.Exec(s) + if err != nil { + return fmt.Errorf("%s\n%s", err, s) + } + } + return nil +} + +func RunWithSchema(db *sqlx.DB, create, drop string, t *testing.T, test func(db *sqlx.DB, t *testing.T)) { + defer func() { + err := MultiExec(db, drop) + if err != nil { + t.Fatalf("%s", err.Error()) + } + }() + + err := MultiExec(db, create) + if err != nil { + t.Fatalf("%s", err.Error()) + } + + test(db, t) +} diff --git a/run.go b/tools/run.go similarity index 100% rename from run.go rename to tools/run.go diff --git a/users.go b/users.go new file mode 100644 index 0000000..4ba2e4e --- /dev/null +++ b/users.go @@ -0,0 +1,33 @@ +package users + +import "github.com/jmoiron/sqlx" + +const usersCreate = ` +CREATE TABLE users ( + id SERIAL, + name text NOT NULL +); +` +const addUserQuery = `INSERT INTO users (name) VALUES ($1);` + +// User represents an user +type User struct { + ID int + Name string +} + +// Add user to database or raises an error +func (u *User) Add(ex sqlx.Execer) error { + _, err := ex.Exec(addUserQuery, u.Name) + return err +} + +// Update user on database or raise an error +func (u *User) Update(ex *sqlx.Execer) error { + return nil +} + +// Delete user from database or raise an error +func (u *User) Delete(ex *sqlx.Execer) error { + return nil +} diff --git a/users_test.go b/users_test.go new file mode 100644 index 0000000..aa2a0b2 --- /dev/null +++ b/users_test.go @@ -0,0 +1,34 @@ +package users + +import ( + "fmt" + "os" + "testing" + + "gitlab.quimbo.fr/odwrtw/canape-sql/sqltest" + + "github.com/jmoiron/sqlx" + _ "github.com/lib/pq" +) + +const drop = `DROP TABLE users;` + +var db *sqlx.DB + +func init() { + var err error + + pgdsn := os.Getenv("POSTGRES_DSN") + db, err = sqlx.Connect("postgres", pgdsn) + + if err != nil { + fmt.Printf("Unavailable PG tests:\n %v\n", err) + os.Exit(1) + } +} + +func TestAdd(t *testing.T) { + sqltest.RunWithSchema(db, usersCreate, drop, t, func(db *sqlx.DB, t *testing.T) { + + }) +}