184 lines
2.8 KiB
Go
184 lines
2.8 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"card-to-iban/internal/audit"
|
|
"card-to-iban/internal/storage"
|
|
)
|
|
|
|
func TestAuditRepositorySave(t *testing.T) {
|
|
databasePath := filepath.Join(
|
|
t.TempDir(),
|
|
"test.db",
|
|
)
|
|
|
|
db, err := storage.OpenSQLite(databasePath)
|
|
if err != nil {
|
|
t.Fatalf(
|
|
"OpenSQLite() error = %v",
|
|
err,
|
|
)
|
|
}
|
|
|
|
defer db.Close()
|
|
|
|
ctx := context.Background()
|
|
|
|
if err := storage.Migrate(ctx, db); err != nil {
|
|
t.Fatalf(
|
|
"Migrate() error = %v",
|
|
err,
|
|
)
|
|
}
|
|
|
|
if err := storage.Migrate(ctx, db); err != nil {
|
|
t.Fatalf(
|
|
"second Migrate() error = %v",
|
|
err,
|
|
)
|
|
}
|
|
|
|
repo := NewAuditRepository(db)
|
|
|
|
clientIP := "127.0.0.1"
|
|
upstreamStatus := 200
|
|
|
|
record := audit.Record{
|
|
RequestID: "request-test-123",
|
|
|
|
CreatedAt: time.Date(
|
|
2026,
|
|
time.September,
|
|
21,
|
|
8,
|
|
30,
|
|
0,
|
|
0,
|
|
time.UTC,
|
|
),
|
|
|
|
Duration: 150 * time.Millisecond,
|
|
|
|
ClientIP: &clientIP,
|
|
|
|
Status: audit.StatusSuccess,
|
|
|
|
UpstreamHTTPStatus: &upstreamStatus,
|
|
|
|
MaskedCard: "603799******5678",
|
|
|
|
ResponseJSON: []byte(
|
|
`{"data":{"iban":"IR820540102680020817909002"}}`,
|
|
),
|
|
}
|
|
|
|
if err := repo.Save(ctx, record); err != nil {
|
|
t.Fatalf(
|
|
"Save() error = %v",
|
|
err,
|
|
)
|
|
}
|
|
|
|
var (
|
|
requestID string
|
|
durationMS int64
|
|
storedClientIP string
|
|
finalStatus string
|
|
storedHTTPStatus int
|
|
maskedCard string
|
|
storedResponseJSON string
|
|
)
|
|
|
|
err = db.QueryRowContext(
|
|
ctx,
|
|
`
|
|
SELECT
|
|
request_id,
|
|
duration_ms,
|
|
client_ip,
|
|
final_status,
|
|
upstream_http_status,
|
|
masked_card,
|
|
response_json
|
|
FROM audit_records
|
|
WHERE request_id = ?
|
|
`,
|
|
record.RequestID,
|
|
).Scan(
|
|
&requestID,
|
|
&durationMS,
|
|
&storedClientIP,
|
|
&finalStatus,
|
|
&storedHTTPStatus,
|
|
&maskedCard,
|
|
&storedResponseJSON,
|
|
)
|
|
|
|
if err != nil {
|
|
t.Fatalf(
|
|
"query stored audit record: %v",
|
|
err,
|
|
)
|
|
}
|
|
|
|
if requestID != record.RequestID {
|
|
t.Errorf(
|
|
"request ID = %q, want %q",
|
|
requestID,
|
|
record.RequestID,
|
|
)
|
|
}
|
|
|
|
if durationMS != record.Duration.Milliseconds() {
|
|
t.Errorf(
|
|
"duration = %d, want %d",
|
|
durationMS,
|
|
record.Duration.Milliseconds(),
|
|
)
|
|
}
|
|
|
|
if storedClientIP != clientIP {
|
|
t.Errorf(
|
|
"client IP = %q, want %q",
|
|
storedClientIP,
|
|
clientIP,
|
|
)
|
|
}
|
|
|
|
if finalStatus != string(record.Status) {
|
|
t.Errorf(
|
|
"status = %q, want %q",
|
|
finalStatus,
|
|
record.Status,
|
|
)
|
|
}
|
|
|
|
if storedHTTPStatus != upstreamStatus {
|
|
t.Errorf(
|
|
"HTTP status = %d, want %d",
|
|
storedHTTPStatus,
|
|
upstreamStatus,
|
|
)
|
|
}
|
|
|
|
if maskedCard != record.MaskedCard {
|
|
t.Errorf(
|
|
"masked card = %q, want %q",
|
|
maskedCard,
|
|
record.MaskedCard,
|
|
)
|
|
}
|
|
|
|
if storedResponseJSON != string(record.ResponseJSON) {
|
|
t.Errorf(
|
|
"response JSON = %q, want %q",
|
|
storedResponseJSON,
|
|
record.ResponseJSON,
|
|
)
|
|
}
|
|
}
|