mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-10-29 20:19:04 +01:00
63 lines
2.2 KiB
Go
63 lines
2.2 KiB
Go
package auditlogs
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/pocket-id/pocket-id/backend/internal/model"
|
|
datatype "github.com/pocket-id/pocket-id/backend/internal/model/types"
|
|
"github.com/pocket-id/pocket-id/backend/internal/utils"
|
|
testutils "github.com/pocket-id/pocket-id/backend/internal/utils/testing"
|
|
)
|
|
|
|
func TestListAuditLogsByDateRange(t *testing.T) {
|
|
db := testutils.NewDatabaseForTest(t)
|
|
s := newService(db, nil, signInLocationResolver{}, nil, browserTokenStub{})
|
|
require.NoError(t, db.Create(&model.User{Base: model.Base{ID: "alice"}, Username: "alice"}).Error)
|
|
|
|
day := time.Date(2026, 10, 10, 0, 0, 0, 0, time.UTC)
|
|
for i, at := range []time.Time{day.Add(-time.Second), day, day.Add(12 * time.Hour), day.Add(24 * time.Hour)} {
|
|
id := string(rune('a' + i))
|
|
require.NoError(t, db.Create(&AuditLog{Base: model.Base{ID: id}, UserID: "alice", Event: EventSignIn}).Error)
|
|
// Creating always stamps the current time, so the test time is set afterwards
|
|
require.NoError(t, db.Model(&AuditLog{}).Where("id = ?", id).Update("created_at", datatype.DateTime(at)).Error)
|
|
}
|
|
|
|
ids := func(logs []AuditLog) []string {
|
|
out := make([]string, len(logs))
|
|
for i, l := range logs {
|
|
out[i] = l.ID
|
|
}
|
|
return out
|
|
}
|
|
oneDay := DateRange{From: day, To: day.Add(24 * time.Hour)}
|
|
|
|
all, _, err := s.ListAllAuditLogs(t.Context(), oneDay, utils.ListRequestOptions{})
|
|
require.NoError(t, err)
|
|
require.ElementsMatch(t, []string{"b", "c"}, ids(all))
|
|
|
|
own, _, err := s.ListAuditLogsForUser(t.Context(), "alice", DateRange{From: day.Add(time.Hour)}, utils.ListRequestOptions{})
|
|
require.NoError(t, err)
|
|
require.ElementsMatch(t, []string{"c", "d"}, ids(own))
|
|
}
|
|
|
|
func TestParseDateRange(t *testing.T) {
|
|
parse := func(query string) (DateRange, error) {
|
|
c, _ := gin.CreateTestContext(httptest.NewRecorder())
|
|
c.Request = httptest.NewRequestWithContext(t.Context(), "GET", "/api/audit-logs?"+query, nil)
|
|
return parseDateRange(c)
|
|
}
|
|
|
|
r, err := parse("from=2026-10-10T00:00:00%2B02:00")
|
|
require.NoError(t, err)
|
|
require.True(t, r.From.Equal(time.Date(2026, 10, 9, 22, 0, 0, 0, time.UTC)))
|
|
require.True(t, r.To.IsZero())
|
|
|
|
_, err = parse("to=yesterday")
|
|
require.Error(t, err)
|
|
}
|