Explorar o código

example mock /api/users test

Alexander Belanger %!s(int64=5) %!d(string=hai) anos
pai
achega
bcdc548506

+ 2 - 2
cmd/app/main.go

@@ -5,7 +5,7 @@ import (
 	"log"
 	"net/http"
 
-	"github.com/porter-dev/porter/internal/repository"
+	"github.com/porter-dev/porter/internal/repository/gorm"
 
 	"github.com/porter-dev/porter/server/api"
 
@@ -28,7 +28,7 @@ func main() {
 	}
 
 	validator := vr.New()
-	repo := repository.NewDefaultRepository(db)
+	repo := gorm.NewRepository(db)
 
 	a := api.New(logger, repo, validator)
 

+ 14 - 0
internal/repository/gorm/repository.go

@@ -0,0 +1,14 @@
+package gorm
+
+import (
+	"github.com/porter-dev/porter/internal/repository"
+	"gorm.io/gorm"
+)
+
+// NewRepository returns a Repository which uses
+// gorm.DB for querying the database
+func NewRepository(db *gorm.DB) *repository.Repository {
+	return &repository.Repository{
+		User: *NewUserRepository(db),
+	}
+}

+ 51 - 0
internal/repository/gorm/user.go

@@ -0,0 +1,51 @@
+package gorm
+
+import (
+	"github.com/porter-dev/porter/internal/models"
+	"gorm.io/gorm"
+)
+
+// UserRepository uses gorm.DB for querying the database
+type UserRepository struct {
+	db *gorm.DB
+}
+
+// NewUserRepository returns a DefaultUserRepository which uses
+// gorm.DB for querying the database
+func NewUserRepository(db *gorm.DB) *UserRepository {
+	return &UserRepository{db}
+}
+
+// CreateUser adds a new User row to the Users table in the database
+func (repo UserRepository) CreateUser(user *models.User) (*models.User, error) {
+	if err := repo.db.Create(user).Error; err != nil {
+		return nil, err
+	}
+	return user, nil
+}
+
+// ReadUser finds a single user based on their unique id
+func (repo UserRepository) ReadUser(id uint) (*models.User, error) {
+	user := &models.User{}
+	if err := repo.db.Where("id = ?", id).First(&user).Error; err != nil {
+		return nil, err
+	}
+	return user, nil
+}
+
+// UpdateUser modifies an existing User in the database
+func (repo UserRepository) UpdateUser(user *models.User) (*models.User, error) {
+	if err := repo.db.First(&models.User{}, user.ID).Updates(user).Error; err != nil {
+		return nil, err
+	}
+
+	return user, nil
+}
+
+// DeleteUser deletes a single user using their unique id
+func (repo UserRepository) DeleteUser(user *models.User) (*models.User, error) {
+	if err := repo.db.First(&models.User{}, user.ID).Delete(&user).Error; err != nil {
+		return nil, err
+	}
+	return user, nil
+}

+ 0 - 10
internal/repository/repository.go

@@ -1,16 +1,6 @@
 package repository
 
-import "gorm.io/gorm"
-
 // Repository collects the repositories for each model
 type Repository struct {
 	User UserRepository
 }
-
-// NewDefaultRepository returns a Repository which uses
-// gorm.DB for querying the database
-func NewDefaultRepository(db *gorm.DB) *Repository {
-	return &Repository{
-		User: *NewDefaultUserRepository(db),
-	}
-}

+ 13 - 0
internal/repository/test/repository.go

@@ -0,0 +1,13 @@
+package test
+
+import (
+	"github.com/porter-dev/porter/internal/repository"
+)
+
+// NewRepository returns a Repository which persists users in memory
+// and accepts a parameter that can trigger read/write errors
+func NewRepository(canQuery bool) *repository.Repository {
+	return &repository.Repository{
+		User: *NewUserRepository(canQuery),
+	}
+}

+ 61 - 0
internal/repository/test/test_repository.go

@@ -0,0 +1,61 @@
+package test
+
+import (
+	"github.com/jinzhu/gorm"
+	"github.com/porter-dev/porter/internal/models"
+)
+
+// UserRepository will return errors on queries if canQuery is false
+// and only stores a small set of users in-memory that are indexed by their
+// array index + 1
+type UserRepository struct {
+	canQuery bool
+	users    []*models.User
+}
+
+// NewUserRepository will return errors
+func NewUserRepository(canQuery bool) *UserRepository {
+	return &UserRepository{canQuery, []*models.User{}}
+}
+
+// CreateUser adds a new User row to the Users table in array memory
+func (repo UserRepository) CreateUser(user *models.User) (*models.User, error) {
+	users := repo.users
+	users = append(users, user)
+	user.ID = uint(len(users))
+	return user, nil
+}
+
+// ReadUser finds a single user based on their unique id
+func (repo UserRepository) ReadUser(id uint) (*models.User, error) {
+	if int(id-1) >= len(repo.users) || repo.users[id] == nil {
+		return nil, gorm.ErrRecordNotFound
+	}
+
+	index := int(id - 1)
+	return repo.users[index], nil
+}
+
+// UpdateUser modifies an existing User in the database
+func (repo UserRepository) UpdateUser(user *models.User) (*models.User, error) {
+	if int(user.ID-1) >= len(repo.users) || repo.users[user.ID] == nil {
+		return nil, gorm.ErrRecordNotFound
+	}
+
+	index := int(user.ID - 1)
+	repo.users[index] = user
+
+	return user, nil
+}
+
+// DeleteUser deletes a single user using their unique id
+func (repo UserRepository) DeleteUser(user *models.User) (*models.User, error) {
+	if int(user.ID-1) >= len(repo.users) || repo.users[user.ID] == nil {
+		return nil, gorm.ErrRecordNotFound
+	}
+
+	index := int(user.ID - 1)
+	repo.users[index] = nil
+
+	return user, nil
+}

+ 0 - 46
internal/repository/user.go

@@ -2,7 +2,6 @@ package repository
 
 import (
 	"github.com/porter-dev/porter/internal/models"
-	"gorm.io/gorm"
 )
 
 // WriteUser is the function type for all User write operations
@@ -15,48 +14,3 @@ type UserRepository interface {
 	UpdateUser(user *models.User) (*models.User, error)
 	DeleteUser(user *models.User) (*models.User, error)
 }
-
-// DefaultUserRepository uses gorm.DB for querying the database
-type DefaultUserRepository struct {
-	db *gorm.DB
-}
-
-// NewDefaultUserRepository returns a DefaultUserRepository which uses
-// gorm.DB for querying the database
-func NewDefaultUserRepository(db *gorm.DB) *DefaultUserRepository {
-	return &DefaultUserRepository{db}
-}
-
-// CreateUser adds a new User row to the Users table in the database
-func (repo DefaultUserRepository) CreateUser(user *models.User) (*models.User, error) {
-	if err := repo.db.Create(user).Error; err != nil {
-		return nil, err
-	}
-	return user, nil
-}
-
-// ReadUser finds a single user based on their unique id
-func (repo DefaultUserRepository) ReadUser(id uint) (*models.User, error) {
-	user := &models.User{}
-	if err := repo.db.Where("id = ?", id).First(&user).Error; err != nil {
-		return nil, err
-	}
-	return user, nil
-}
-
-// UpdateUser modifies an existing User in the database
-func (repo DefaultUserRepository) UpdateUser(user *models.User) (*models.User, error) {
-	if err := repo.db.First(&models.User{}, user.ID).Updates(user).Error; err != nil {
-		return nil, err
-	}
-
-	return user, nil
-}
-
-// DeleteUser deletes a single user using their unique id
-func (repo DefaultUserRepository) DeleteUser(user *models.User) (*models.User, error) {
-	if err := repo.db.First(&models.User{}, user.ID).Delete(&user).Error; err != nil {
-		return nil, err
-	}
-	return user, nil
-}

+ 56 - 0
server/api/user_handler_test.go

@@ -1 +1,57 @@
 package api_test
+
+import (
+	"net/http"
+	"net/http/httptest"
+	"strings"
+	"testing"
+	"time"
+
+	"github.com/porter-dev/porter/internal/config"
+	"github.com/porter-dev/porter/internal/repository/test"
+	"github.com/porter-dev/porter/server/api"
+
+	lr "github.com/porter-dev/porter/internal/logger"
+	vr "github.com/porter-dev/porter/internal/validator"
+)
+
+func initApi() *api.App {
+	appConf := config.Conf{
+		Debug: true,
+		Server: config.ServerConf{
+			Port:         8080,
+			TimeoutRead:  time.Second * 5,
+			TimeoutWrite: time.Second * 10,
+			TimeoutIdle:  time.Second * 15,
+		},
+		// unimportant
+		Db: config.DBConf{},
+	}
+
+	logger := lr.NewConsole(appConf.Debug)
+	validator := vr.New()
+
+	repo := test.NewRepository(true)
+
+	return api.New(logger, repo, validator)
+}
+
+func TestHandleCreateUser(t *testing.T) {
+	// create a mock API
+	api := initApi()
+
+	req, err := http.NewRequest("POST", "/api/users", strings.NewReader("{\"email\":\"belanger@getporter.dev\",\"password\":\"hello\"}"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	rr := httptest.NewRecorder()
+	handler := http.HandlerFunc(api.HandleCreateUser)
+
+	handler.ServeHTTP(rr, req)
+
+	if status := rr.Code; status != http.StatusCreated {
+		t.Errorf("handler returned wrong status code: got %v want %v",
+			status, http.StatusCreated)
+	}
+}