From b248550c3bfafd3f183366b9483da72e367f912c Mon Sep 17 00:00:00 2001 From: Bastien Riviere Date: Mon, 29 Jan 2024 22:13:08 +0100 Subject: [PATCH] feat: add tests --- internal/api/handler_test.go | 90 ++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 internal/api/handler_test.go diff --git a/internal/api/handler_test.go b/internal/api/handler_test.go new file mode 100644 index 0000000..4769929 --- /dev/null +++ b/internal/api/handler_test.go @@ -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) + } + } + }) +}