main
 1package log
 2
 3import (
 4	"bufio"
 5	"bytes"
 6	"context"
 7	"net/http"
 8	"net/http/httptest"
 9	"testing"
10
11	"github.com/rs/zerolog"
12	"github.com/stretchr/testify/assert"
13	"github.com/stretchr/testify/require"
14	"github.com/xlgmokha/x/pkg/serde"
15)
16
17func TestLog(t *testing.T) {
18	t.Run("New", func(t *testing.T) {
19		var b bytes.Buffer
20		writer := bufio.NewWriter(&b)
21
22		log := New(writer, Fields{"env": "test"})
23		log.Print()
24
25		require.NoError(t, writer.Flush())
26
27		items, err := serde.FromJSON[map[string]string](bufio.NewReader(&b))
28		require.NoError(t, err)
29
30		assert.Equal(t, "test", items["env"])
31		assert.Equal(t, "debug", items["level"])
32		assert.NotEmpty(t, items["time"])
33	})
34
35	t.Run("WithFields", func(t *testing.T) {
36		var b bytes.Buffer
37		writer := bufio.NewWriter(&b)
38
39		log := New(writer, Fields{"env": "test"})
40		ctx := log.WithContext(context.Background())
41		WithFields(ctx, Fields{"ip": "127.0.0.1"})
42		zerolog.Ctx(ctx).Print()
43		log.Print()
44
45		require.NoError(t, writer.Flush())
46
47		items, err := serde.FromJSON[map[string]string](bufio.NewReader(&b))
48		require.NoError(t, err)
49
50		assert.Equal(t, "test", items["env"])
51		assert.Equal(t, "debug", items["level"])
52		assert.Equal(t, "127.0.0.1", items["ip"])
53	})
54
55	t.Run("HTTP", func(t *testing.T) {
56		var b bytes.Buffer
57		writer := bufio.NewWriter(&b)
58		log := New(writer, Fields{})
59		server := httptest.NewServer(HTTP(log)(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
60			w.WriteHeader(http.StatusTeapot)
61		})))
62		defer server.Close()
63
64		response, err := http.Get(server.URL)
65		require.NoError(t, err)
66		assert.Equal(t, http.StatusTeapot, response.StatusCode)
67
68		require.NoError(t, writer.Flush())
69		items, err := serde.FromJSON[map[string]interface{}](bufio.NewReader(&b))
70		require.NoError(t, err)
71
72		require.Contains(t, items, "method")
73		assert.Equal(t, "GET", items["method"])
74
75		require.Contains(t, items, "path")
76		assert.Equal(t, "/", items["path"])
77
78		require.Contains(t, items, "remote_host")
79		assert.Contains(t, items["remote_host"], "127.0.0.1")
80	})
81}