feat: add tests
This commit is contained in:
parent
8541fdd8de
commit
b248550c3b
1 changed files with 90 additions and 0 deletions
90
internal/api/handler_test.go
Normal file
90
internal/api/handler_test.go
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
package api_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/babariviere/short/internal/api"
|
||||||
|
"github.com/babariviere/short/internal/db"
|
||||||
|
"github.com/babariviere/short/internal/oas"
|
||||||
|
"github.com/jackc/pgx/v5"
|
||||||
|
)
|
||||||
|
|
||||||
|
func withServer(f func(handler oas.Handler)) {
|
||||||
|
name := fmt.Sprintf("test%d", time.Now().Unix())
|
||||||
|
|
||||||
|
ctx := context.TODO()
|
||||||
|
root, err := pgx.Connect(ctx, os.Getenv("DATABASE_URL"))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = root.Exec(ctx, "CREATE DATABASE "+name+";"); err != nil {
|
||||||
|
log.Fatal("failed to create database", name)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
root.Exec(ctx, "DROP DATABASE "+name+";")
|
||||||
|
}()
|
||||||
|
|
||||||
|
// TODO: substitute from DATABASE_URL instead
|
||||||
|
conn, err := pgx.Connect(ctx, "postgres://short:short@localhost:5432/"+name)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
schema, err := os.ReadFile("../../sql/schema.sql")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
conn.Exec(ctx, string(schema))
|
||||||
|
|
||||||
|
f(api.NewHandler("http://test", db.New(conn)))
|
||||||
|
conn.Close(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateURL(t *testing.T) {
|
||||||
|
cases := []string{
|
||||||
|
"http://test.com",
|
||||||
|
"http://github.com",
|
||||||
|
"abcdef", // FIXME: should not pass but it works...
|
||||||
|
}
|
||||||
|
withServer(func(h oas.Handler) {
|
||||||
|
for _, url := range cases {
|
||||||
|
shortenRes, err := h.CreateShortURL(context.TODO(), &oas.CreateShortURLReq{
|
||||||
|
URL: url,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to create url %q: %v", url, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
shorten, ok := shortenRes.(*oas.CreateShortURLCreated)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("expected 201 status code, got 400 for url %q", url)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := h.RedirectLongURL(context.TODO(), oas.RedirectLongURLParams{
|
||||||
|
Hash: strings.TrimPrefix(shorten.Shorten, "http://test/"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to get redirect url for %q: %v", url, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
redirect, ok := res.(*oas.RedirectLongURLTemporaryRedirect)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("expected 307 status code, got 404 for url %q with shorten %q", url, shorten.Shorten)
|
||||||
|
}
|
||||||
|
|
||||||
|
if redirect.Location.Value != url {
|
||||||
|
t.Errorf("supplied %q but got %q during redirect", url, redirect.Location.Value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in a new issue