1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 17:47:03 +00:00

chore: more small lint/perf fixes (#493)

Signed-off-by: James Hillyerd <james@hillyerd.com>
This commit is contained in:
James Hillyerd
2024-02-16 16:53:50 -08:00
committed by GitHub
parent f76b93a8f2
commit 33784cbb94
11 changed files with 40 additions and 38 deletions

View File

@@ -79,9 +79,9 @@ func (s *StoreManager) Deliver(
tstamp := now.UTC().Format(recvdTimeFmt) tstamp := now.UTC().Format(recvdTimeFmt)
// Process inbound message through extensions. // Process inbound message through extensions.
mailboxes := make([]string, len(recipients)) mailboxes := make([]string, 0, len(recipients))
for i, recip := range recipients { for _, recip := range recipients {
mailboxes[i] = recip.Mailbox mailboxes = append(mailboxes, recip.Mailbox)
} }
// Construct InboundMessage event and process through extensions. // Construct InboundMessage event and process through extensions.

View File

@@ -368,10 +368,10 @@ func TestGetMessage(t *testing.T) {
// Add a test message. // Add a test message.
subject := "getMessage1" subject := "getMessage1"
id := addTestMessage(sm, "box1", subject) id := addTestMessage(sm, "get-box", subject)
// Verify retrieval of the test message. // Verify retrieval of the test message.
msg, err := sm.GetMessage("box1", id) msg, err := sm.GetMessage("get-box", id)
require.NoError(t, err, "GetMessage must succeed") require.NoError(t, err, "GetMessage must succeed")
require.NotNil(t, msg, "GetMessage must return a result") require.NotNil(t, msg, "GetMessage must return a result")
assert.Equal(t, subject, msg.Subject) assert.Equal(t, subject, msg.Subject)
@@ -383,19 +383,19 @@ func TestMarkSeen(t *testing.T) {
// Add a test message. // Add a test message.
subject := "getMessage1" subject := "getMessage1"
id := addTestMessage(sm, "box1", subject) id := addTestMessage(sm, "seen-box", subject)
// Verify test message unseen. // Verify test message unseen.
msg, err := sm.GetMessage("box1", id) msg, err := sm.GetMessage("seen-box", id)
require.NoError(t, err, "GetMessage must succeed") require.NoError(t, err, "GetMessage must succeed")
require.NotNil(t, msg, "GetMessage must return a result") require.NotNil(t, msg, "GetMessage must return a result")
assert.False(t, msg.Seen, "msg should be unseen") assert.False(t, msg.Seen, "msg should be unseen")
err = sm.MarkSeen("box1", id) err = sm.MarkSeen("seen-box", id)
require.NoError(t, err, "MarkSeen should succeed") require.NoError(t, err, "MarkSeen should succeed")
// Verify test message seen. // Verify test message seen.
msg, err = sm.GetMessage("box1", id) msg, err = sm.GetMessage("seen-box", id)
require.NoError(t, err, "GetMessage must succeed") require.NoError(t, err, "GetMessage must succeed")
require.NotNil(t, msg, "GetMessage must return a result") require.NotNil(t, msg, "GetMessage must return a result")
assert.True(t, msg.Seen, "msg should have been seen") assert.True(t, msg.Seen, "msg should have been seen")
@@ -405,17 +405,17 @@ func TestRemoveMessage(t *testing.T) {
sm, _ := testStoreManager() sm, _ := testStoreManager()
// Add test messages. // Add test messages.
id1 := addTestMessage(sm, "box1", "subject 1") id1 := addTestMessage(sm, "rm-box", "subject 1")
id2 := addTestMessage(sm, "box1", "subject 2") id2 := addTestMessage(sm, "rm-box", "subject 2")
id3 := addTestMessage(sm, "box1", "subject 3") id3 := addTestMessage(sm, "rm-box", "subject 3")
got, err := sm.GetMetadata("box1") got, err := sm.GetMetadata("rm-box")
require.NoError(t, err) require.NoError(t, err)
require.Len(t, got, 3) require.Len(t, got, 3)
// Delete message 2 and verify. // Delete message 2 and verify.
err = sm.RemoveMessage("box1", id2) err = sm.RemoveMessage("rm-box", id2)
require.NoError(t, err) require.NoError(t, err)
got, err = sm.GetMetadata("box1") got, err = sm.GetMetadata("rm-box")
require.NoError(t, err) require.NoError(t, err)
require.Len(t, got, 2, "Should be 2 messages remaining") require.Len(t, got, 2, "Should be 2 messages remaining")
@@ -431,17 +431,17 @@ func TestPurgeMessages(t *testing.T) {
sm, _ := testStoreManager() sm, _ := testStoreManager()
// Add test messages. // Add test messages.
_ = addTestMessage(sm, "box1", "subject 1") _ = addTestMessage(sm, "purge-box", "subject 1")
_ = addTestMessage(sm, "box1", "subject 2") _ = addTestMessage(sm, "purge-box", "subject 2")
_ = addTestMessage(sm, "box1", "subject 3") _ = addTestMessage(sm, "purge-box", "subject 3")
got, err := sm.GetMetadata("box1") got, err := sm.GetMetadata("purge-box")
require.NoError(t, err) require.NoError(t, err)
require.Len(t, got, 3) require.Len(t, got, 3)
// Purge and verify. // Purge and verify.
err = sm.PurgeMessages("box1") err = sm.PurgeMessages("purge-box")
require.NoError(t, err) require.NoError(t, err)
got, err = sm.GetMetadata("box1") got, err = sm.GetMetadata("purge-box")
require.NoError(t, err) require.NoError(t, err)
assert.Empty(t, got, "Purge should remove all mailbox messages") assert.Empty(t, got, "Purge should remove all mailbox messages")
} }

View File

@@ -140,7 +140,7 @@ func (hub *Hub) RemoveListener(l Listener) {
// for unit tests. // for unit tests.
func (hub *Hub) Sync() { func (hub *Hub) Sync() {
done := make(chan struct{}) done := make(chan struct{})
hub.opChan <- func(h *Hub) { hub.opChan <- func(_ *Hub) {
close(done) close(done)
} }
<-done <-done

View File

@@ -306,15 +306,16 @@ LOOP:
case c == '\\': case c == '\\':
inCharQuote = true inCharQuote = true
case c == '"': case c == '"':
if inCharQuote { switch {
case inCharQuote:
err = buf.WriteByte(c) err = buf.WriteByte(c)
if err != nil { if err != nil {
return return
} }
inCharQuote = false inCharQuote = false
} else if inStringQuote { case inStringQuote:
inStringQuote = false inStringQuote = false
} else { default:
if i == 0 { if i == 0 {
inStringQuote = true inStringQuote = true
} else { } else {

View File

@@ -13,7 +13,7 @@ type options struct {
// Option can apply itself to the private options type. // Option can apply itself to the private options type.
type Option interface { type Option interface {
apply(*options) apply(opts *options)
} }
func getDefaultOptions() *options { func getDefaultOptions() *options {

View File

@@ -11,7 +11,7 @@ import (
// httpClient allows http.Client to be mocked for tests // httpClient allows http.Client to be mocked for tests
type httpClient interface { type httpClient interface {
Do(*http.Request) (*http.Response, error) Do(req *http.Request) (*http.Response, error)
} }
// Generic REST restClient // Generic REST restClient

View File

@@ -7,6 +7,8 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"testing" "testing"
"github.com/stretchr/testify/require"
) )
const baseURLStr = "http://test.local:8080" const baseURLStr = "http://test.local:8080"
@@ -78,10 +80,11 @@ func TestDoTable(t *testing.T) {
t.Run(testname, func(t *testing.T) { t.Run(testname, func(t *testing.T) {
mth := &mockHTTPClient{} mth := &mockHTTPClient{}
c := &restClient{mth, test.base} c := &restClient{mth, test.base}
_, err := c.do(test.method, test.uri, test.wantBody) resp, err := c.do(test.method, test.uri, test.wantBody)
if err != nil { require.NoError(t, err)
t.Fatal(err) err = resp.Body.Close()
} require.NoError(t, err)
if mth.req.Method != test.wantMethod { if mth.req.Method != test.wantMethod {
t.Errorf("req.Method == %q, want %q", mth.req.Method, test.wantMethod) t.Errorf("req.Method == %q, want %q", mth.req.Method, test.wantMethod)
} }

View File

@@ -5,7 +5,6 @@ import (
"net/http" "net/http"
"os" "os"
"github.com/inbucket/inbucket/v3/pkg/config"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )
@@ -86,13 +85,13 @@ func requestLoggingWrapper(next http.Handler) http.Handler {
} }
// spaTemplateHandler creates a handler to serve the index.html template for our SPA. // spaTemplateHandler creates a handler to serve the index.html template for our SPA.
func spaTemplateHandler(tmpl *template.Template, basePath string, func spaTemplateHandler(tmpl *template.Template, basePath string) http.Handler {
webConfig config.Web) http.Handler {
tmplData := struct { tmplData := struct {
BasePath string BasePath string
}{ }{
BasePath: basePath, BasePath: basePath,
} }
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
// ensure we do now allow click jacking // ensure we do now allow click jacking
w.Header().Set("X-Frame-Options", "SameOrigin") w.Header().Set("X-Frame-Options", "SameOrigin")

View File

@@ -21,6 +21,6 @@ func TextToHTML(text string) string {
// WrapURL wraps a <a href> tag around the provided URL // WrapURL wraps a <a href> tag around the provided URL
func WrapURL(url string) string { func WrapURL(url string) string {
unescaped := strings.Replace(url, "&amp;", "&", -1) unescaped := strings.ReplaceAll(url, "&amp;", "&")
return fmt.Sprintf("<a href=\"%s\" target=\"_blank\">%s</a>", unescaped, url) return fmt.Sprintf("<a href=\"%s\" target=\"_blank\">%s</a>", unescaped, url)
} }

View File

@@ -109,7 +109,7 @@ func NewServer(conf *config.Root, mm message.Manager, mh *msghub.Hub) *Server {
// SPA managed paths. // SPA managed paths.
spaHandler := cookieHandler(appConfigCookie(conf.Web), spaHandler := cookieHandler(appConfigCookie(conf.Web),
spaTemplateHandler(indexTmpl, prefix("/"), conf.Web)) spaTemplateHandler(indexTmpl, prefix("/")))
Router.Path(prefix("/")).Handler(spaHandler) Router.Path(prefix("/")).Handler(spaHandler)
Router.Path(prefix("/monitor")).Handler(spaHandler) Router.Path(prefix("/monitor")).Handler(spaHandler)
Router.Path(prefix("/status")).Handler(spaHandler) Router.Path(prefix("/status")).Handler(spaHandler)

View File

@@ -282,8 +282,7 @@ func clearEnv() {
} }
// Backup ciritcal env variables. // Backup ciritcal env variables.
switch runtime.GOOS { if runtime.GOOS == "windows" {
case "windows":
backup("SYSTEMROOT") backup("SYSTEMROOT")
} }