From 1a43dd6ba4212ec5662863d07683780e466d59b4 Mon Sep 17 00:00:00 2001 From: Nicolas Duhamel Date: Mon, 8 Feb 2016 00:17:45 +0100 Subject: [PATCH] Add Get user --- users.go | 28 +++++++++++++++++++++++----- users_test.go | 26 +++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/users.go b/users.go index 4ba2e4e..6207710 100644 --- a/users.go +++ b/users.go @@ -5,10 +5,13 @@ import "github.com/jmoiron/sqlx" const usersCreate = ` CREATE TABLE users ( id SERIAL, - name text NOT NULL + name text NOT NULL UNIQUE ); ` -const addUserQuery = `INSERT INTO users (name) VALUES ($1);` +const ( + addUserQuery = `INSERT INTO users (name) VALUES ($1) RETURNING id;` + getUserQuery = `SELECT * FROM users WHERE name=$1;` +) // User represents an user type User struct { @@ -16,10 +19,25 @@ type User struct { Name string } +// Get returns user with specified name +func Get(q sqlx.Queryer, name string) (*User, error) { + u := &User{} + err := q.QueryRowx(getUserQuery, name).StructScan(u) + if err != nil { + return nil, err + } + return u, nil +} + // Add user to database or raises an error -func (u *User) Add(ex sqlx.Execer) error { - _, err := ex.Exec(addUserQuery, u.Name) - return err +func (u *User) Add(q sqlx.Queryer) error { + var id int + err := q.QueryRowx(addUserQuery, u.Name).Scan(&id) + if err != nil { + return err + } + u.ID = id + return nil } // Update user on database or raise an error diff --git a/users_test.go b/users_test.go index aa2a0b2..093cbc3 100644 --- a/users_test.go +++ b/users_test.go @@ -8,7 +8,8 @@ import ( "gitlab.quimbo.fr/odwrtw/canape-sql/sqltest" "github.com/jmoiron/sqlx" - _ "github.com/lib/pq" + "github.com/kr/pretty" + "github.com/lib/pq" ) const drop = `DROP TABLE users;` @@ -30,5 +31,28 @@ func init() { func TestAdd(t *testing.T) { sqltest.RunWithSchema(db, usersCreate, drop, t, func(db *sqlx.DB, t *testing.T) { + // Add a new user + u := &User{Name: "plop"} + err := u.Add(db) + if err != nil { + t.Fatal(err) + } + + // Try add it twice + err = u.Add(db) + if err != nil { + if err, ok := err.(*pq.Error); ok { + if err.Code.Name() != "unique_violation" { + t.Fatal(err) + } + } + } else { + t.Fatal(err) + } + + u, err = Get(db, "plop") + + pretty.Println(err) + pretty.Println(u) }) }