227 lines
4.2 KiB
Go
227 lines
4.2 KiB
Go
package users
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
|
|
"gitlab.quimbo.fr/odwrtw/canape-sql/sqly"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
"github.com/lib/pq"
|
|
_ "github.com/mattes/migrate/driver/postgres"
|
|
)
|
|
|
|
var db *sqlx.DB
|
|
var pgdsn string
|
|
|
|
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 TestUser(t *testing.T) {
|
|
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
|
|
|
|
// Add a new user
|
|
u := &User{Name: "plop", Hash: "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)
|
|
}
|
|
|
|
// Get it
|
|
u2, err := Get(db, "plop")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if u2.ID != u.ID {
|
|
t.Fatal("ID are different")
|
|
}
|
|
|
|
// Update it
|
|
u2.Name = "toto"
|
|
err = u2.Update(db)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
u3, err := Get(db, "toto")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if u3.ID != u2.ID {
|
|
t.Fatal("ID are different")
|
|
}
|
|
if u3.Name != "toto" {
|
|
t.Fatalf("Unexpected name %q", u3.Name)
|
|
}
|
|
|
|
// Delete it
|
|
err = u3.Delete(db)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
u, err = Get(db, "toto")
|
|
if err == nil {
|
|
t.Fatal("We expect an error here, the user didn't exist anymore")
|
|
}
|
|
if err != ErrUnknownUser {
|
|
t.Fatalf("Unexpected error: %q", err)
|
|
}
|
|
if u != nil {
|
|
t.Fatal("User have to be nil here")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestTokenAddDelete(t *testing.T) {
|
|
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
|
|
// Add a new user
|
|
u := &User{Name: "plop", Hash: "plop"}
|
|
err := u.Add(db)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Add many token
|
|
_, err = u.NewToken(db)
|
|
_, err = u.NewToken(db)
|
|
token, err := u.NewToken(db)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Get token
|
|
tokens, err := u.GetTokens(db)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(tokens) != 3 {
|
|
t.Fatalf("Unexpected number of token: %q", len(tokens))
|
|
}
|
|
|
|
// Delete token
|
|
err = u.DeleteToken(db, token.Value)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
tokens, _ = u.GetTokens(db)
|
|
if len(tokens) != 2 {
|
|
t.Fatalf("Unexpected number of token: %q", len(tokens))
|
|
}
|
|
|
|
// Delete a fake token
|
|
err = u.DeleteToken(db, "plop")
|
|
if err == nil {
|
|
t.Fatalf("We expect an error when try to delete a fake token")
|
|
}
|
|
if err.Error() != "Unexpected number of row deleted: 0" {
|
|
t.Fatalf("Unexpected error: %q", err)
|
|
}
|
|
|
|
// Remove user and test auto delete token
|
|
u.Delete(db)
|
|
q := `SELECT count(*) FROM tokens WHERE user_id=$1;`
|
|
var count int
|
|
err = db.QueryRowx(q, u.ID).Scan(&count)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if count != 0 {
|
|
t.Fatalf("Unexpected number of token: %d", count)
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
func TestTokenCheck(t *testing.T) {
|
|
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
|
|
u := &User{Name: "plop", Hash: "plop"}
|
|
u.Add(db)
|
|
token, err := u.NewToken(db)
|
|
|
|
ok, err := u.CheckToken(db, token.Value)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !ok {
|
|
t.Fatalf("Token not found")
|
|
}
|
|
|
|
// test fake token
|
|
ok, err = u.CheckToken(db, "plop")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if ok {
|
|
t.Fatalf("Token found otherwise we don't expect")
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
func TestAutoUpdateCols(t *testing.T) {
|
|
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
|
|
u := &User{Name: "plop", Hash: "plop"}
|
|
u.Add(db)
|
|
u.Name = "toto"
|
|
u.Update(db)
|
|
|
|
if !u.Created.Before(u.Updated) {
|
|
t.Fatalf("colum updated not auto updated on table users")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestConfig(t *testing.T) {
|
|
sqly.RunWithLastestMigration(db, pgdsn, t, func(db *sqlx.DB, t *testing.T) {
|
|
u := &User{Name: "plop", Hash: "plop"}
|
|
u.Add(db)
|
|
|
|
u, err := Get(db, "plop")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
type test struct {
|
|
Test string
|
|
}
|
|
te := test{"coucou"}
|
|
err = u.SetConfig("test1", te)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var te2 test
|
|
err = u.GetConfig("test1", &te2)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if te != te2 {
|
|
t.Fatal("unexpected config")
|
|
}
|
|
|
|
})
|
|
}
|