From e2a09ccdd108f4602142e49c28192d98fd3bb29c Mon Sep 17 00:00:00 2001 From: ekzyis Date: Fri, 3 Nov 2023 21:17:04 +0100 Subject: [PATCH] refactor: put test hooks and boilerplate into own package --- Makefile | 2 +- server/router/handler/login_test.go | 78 ++++------------------------- test/hooks.go | 41 +++++++++++++++ test/lnauth.go | 28 +++++++++++ test/mocks.go | 23 +++++++++ 5 files changed, 102 insertions(+), 70 deletions(-) create mode 100644 test/hooks.go create mode 100644 test/lnauth.go create mode 100644 test/mocks.go diff --git a/Makefile b/Makefile index f2e3780..6acc4e2 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build run +.PHONY: build run test SOURCE := $(shell find db env lib lnd pages public server -type f) diff --git a/server/router/handler/login_test.go b/server/router/handler/login_test.go index ac66e6a..699745a 100644 --- a/server/router/handler/login_test.go +++ b/server/router/handler/login_test.go @@ -1,74 +1,31 @@ package handler_test import ( - "crypto/ecdsa" - "crypto/rand" "database/sql" - "encoding/hex" "fmt" - "io" "net/http" "net/http/httptest" - "os" - "path" - "runtime" "testing" db_ "git.ekzyis.com/ekzyis/delphi.market/db" "git.ekzyis.com/ekzyis/delphi.market/server/auth" - "git.ekzyis.com/ekzyis/delphi.market/server/router" "git.ekzyis.com/ekzyis/delphi.market/server/router/context" "git.ekzyis.com/ekzyis/delphi.market/server/router/handler" - "github.com/decred/dcrd/dcrec/secp256k1/v4" + "git.ekzyis.com/ekzyis/delphi.market/test" "github.com/labstack/echo/v4" "github.com/stretchr/testify/assert" ) var ( - dbName string = "delphi_test" - dbUrl string = fmt.Sprintf("postgres://delphi:delphi@localhost:5432/%s?sslmode=disable", dbName) - db *db_.DB + db *db_.DB ) func init() { - // for ParseTemplates to work, cwd needs to be project root - _, filename, _, _ := runtime.Caller(0) - dir := path.Join(path.Dir(filename), "../../..") - err := os.Chdir(dir) - if err != nil { - panic(err) - } - if db, err = db_.New(dbUrl); err != nil { - panic(err) - } + test.Init(&db) } func TestMain(m *testing.M) { - if err := db.Reset(dbName); err != nil { - panic(err) - } - retCode := m.Run() - if err := db.Clear(dbName); err != nil { - panic(err) - } - os.Exit(retCode) -} - -func mocks(method string, target string, body io.Reader) (*echo.Echo, context.ServerContext, *http.Request, *httptest.ResponseRecorder) { - var ( - e *echo.Echo - sc context.ServerContext - req *http.Request - rec *httptest.ResponseRecorder - ) - e = echo.New() - e.Renderer = router.ParseTemplates("pages/**.html") - sc = context.ServerContext{ - Db: db, - } - req = httptest.NewRequest(method, target, body) - rec = httptest.NewRecorder() - return e, sc, req, rec + test.Main(m, db) } func TestLogin(t *testing.T) { @@ -84,7 +41,8 @@ func TestLogin(t *testing.T) { dbSessionId string err error ) - e, sc, req, rec = mocks("GET", "/login", nil) + sc = context.ServerContext{Db: db} + e, req, rec = test.HTTPMocks("GET", "/login", nil) c = e.NewContext(req, rec) err = handler.HandleLogin(sc)(c) @@ -132,12 +90,13 @@ func TestLoginCallback(t *testing.T) { return } - key, sig, err = sign(lnAuth.K1) + key, sig, err = test.Sign(lnAuth.K1) if !assert.NoErrorf(err, "error signing k1") { return } - e, sc, req, rec = mocks("GET", fmt.Sprintf("/api/login?k1=%s&key=%s&sig=%s", lnAuth.K1, key, sig), nil) + sc = context.ServerContext{Db: db} + e, req, rec = test.HTTPMocks("GET", fmt.Sprintf("/api/login?k1=%s&key=%s&sig=%s", lnAuth.K1, key, sig), nil) c = e.NewContext(req, rec) err = handler.HandleLoginCallback(sc)(c) @@ -161,22 +120,3 @@ func TestLoginCallback(t *testing.T) { err = db.FetchSessionId(u.Pubkey, &dbLnAuth.SessionId) assert.ErrorIs(err, sql.ErrNoRows, "challenge not deleted") } - -func sign(k1_ string) (string, string, error) { - var ( - sk *secp256k1.PrivateKey - k1 []byte - sig []byte - err error - ) - if k1, err = hex.DecodeString(k1_); err != nil { - return "", "", err - } - if sk, err = secp256k1.GeneratePrivateKey(); err != nil { - return "", "", err - } - if sig, err = ecdsa.SignASN1(rand.Reader, sk.ToECDSA(), k1); err != nil { - return "", "", err - } - return hex.EncodeToString(sk.PubKey().SerializeCompressed()), hex.EncodeToString(sig), nil -} diff --git a/test/hooks.go b/test/hooks.go new file mode 100644 index 0000000..cb34685 --- /dev/null +++ b/test/hooks.go @@ -0,0 +1,41 @@ +package test + +import ( + "fmt" + "os" + "path" + "runtime" + "testing" + + db_ "git.ekzyis.com/ekzyis/delphi.market/db" +) + +var ( + dbName string = "delphi_test" + dbUrl string = fmt.Sprintf("postgres://delphi:delphi@localhost:5432/%s?sslmode=disable", dbName) +) + +func Init(db **db_.DB) { + // for ParseTemplates to work, cwd needs to be project root + _, filename, _, _ := runtime.Caller(0) + dir := path.Join(path.Dir(filename), "../") + err := os.Chdir(dir) + if err != nil { + panic(err) + } + *db, err = db_.New(dbUrl) + if err != nil { + panic(err) + } +} + +func Main(m *testing.M, db *db_.DB) { + if err := db.Reset(dbName); err != nil { + panic(err) + } + retCode := m.Run() + if err := db.Clear(dbName); err != nil { + panic(err) + } + os.Exit(retCode) +} diff --git a/test/lnauth.go b/test/lnauth.go new file mode 100644 index 0000000..0a54901 --- /dev/null +++ b/test/lnauth.go @@ -0,0 +1,28 @@ +package test + +import ( + "crypto/ecdsa" + "crypto/rand" + "encoding/hex" + + "github.com/decred/dcrd/dcrec/secp256k1/v4" +) + +func Sign(k1_ string) (string, string, error) { + var ( + sk *secp256k1.PrivateKey + k1 []byte + sig []byte + err error + ) + if k1, err = hex.DecodeString(k1_); err != nil { + return "", "", err + } + if sk, err = secp256k1.GeneratePrivateKey(); err != nil { + return "", "", err + } + if sig, err = ecdsa.SignASN1(rand.Reader, sk.ToECDSA(), k1); err != nil { + return "", "", err + } + return hex.EncodeToString(sk.PubKey().SerializeCompressed()), hex.EncodeToString(sig), nil +} diff --git a/test/mocks.go b/test/mocks.go new file mode 100644 index 0000000..f01e2df --- /dev/null +++ b/test/mocks.go @@ -0,0 +1,23 @@ +package test + +import ( + "io" + "net/http" + "net/http/httptest" + + "git.ekzyis.com/ekzyis/delphi.market/server/router" + "github.com/labstack/echo/v4" +) + +func HTTPMocks(method string, target string, body io.Reader) (*echo.Echo, *http.Request, *httptest.ResponseRecorder) { + var ( + e *echo.Echo + req *http.Request + rec *httptest.ResponseRecorder + ) + e = echo.New() + e.Renderer = router.ParseTemplates("pages/**.html") + req = httptest.NewRequest(method, target, body) + rec = httptest.NewRecorder() + return e, req, rec +}