saasitone/pkg/tests/tests.go

80 lines
2.1 KiB
Go

package tests
import (
"context"
"fmt"
"math/rand"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/gorilla/sessions"
"github.com/labstack/echo/v4"
"git.grosinger.net/tgrosinger/saasitone/pkg/models/sqlc"
"git.grosinger.net/tgrosinger/saasitone/pkg/session"
)
// NewContext creates a new Echo context for tests using an HTTP test request and response recorder
func NewContext(e *echo.Echo, url string) (echo.Context, *httptest.ResponseRecorder) {
req := httptest.NewRequest(http.MethodGet, url, strings.NewReader(""))
rec := httptest.NewRecorder()
return e.NewContext(req, rec), rec
}
// InitSession initializes a session for a given Echo context
func InitSession(ctx echo.Context) {
session.Store(ctx, sessions.NewCookieStore([]byte("secret")))
}
// ExecuteMiddleware executes a middleware function on a given Echo context
func ExecuteMiddleware(ctx echo.Context, mw echo.MiddlewareFunc) error {
handler := mw(func(c echo.Context) error {
return nil
})
return handler(ctx)
}
// ExecuteHandler executes a handler with an optional stack of middleware
func ExecuteHandler(ctx echo.Context, handler echo.HandlerFunc, mw ...echo.MiddlewareFunc) error {
return ExecuteMiddleware(ctx, func(next echo.HandlerFunc) echo.HandlerFunc {
return func(ctx echo.Context) error {
run := handler
for _, w := range mw {
run = w(run)
}
return run(ctx)
}
})
}
// AssertHTTPErrorCode asserts an HTTP status code on a given Echo HTTP error
func AssertHTTPErrorCode(t *testing.T, err error, code int) {
httpError, ok := err.(*echo.HTTPError)
require.True(t, ok)
assert.Equal(t, code, httpError.Code)
}
// CreateUser creates a random user entity
func CreateUser(db *sqlc.Queries) (*sqlc.User, error) {
seed := fmt.Sprintf("%d-%d", time.Now().UnixMilli(), rand.Intn(1000000))
usr, err := db.CreateUser(context.Background(), sqlc.CreateUserParams{
Name: fmt.Sprintf("Test User %s", seed),
Email: fmt.Sprintf("testuser-%s@localhost.localhost", seed),
Password: "password",
})
if err != nil {
return nil, err
}
return &usr, nil
}