Fix every finding surfaced by the canonical .golangci.yml with golangci-lint v2.12.2 (refs #61), behavior-preserving throughout: - err113: dynamic errors replaced with package-level sentinels and %w wrapping; direct comparisons converted to errors.Is - goprintffuncname: printf-style helpers renamed with an f suffix (ui.Writer message methods, cli.ReportErrorf, database.Fatalf, vaultik stdoutf) and all call sites updated - revive: stuttering type names renamed (blob.Handler, blob.WithReader, blob.ChunkPosition, storage.URL, storage.Info), doc comments added, unused parameters blanked, package comments added - contextcheck/noctx: ctx threaded through blob.Packer (AddChunk/Flush/FinalizeBlob/PackChunks) and scanner call sites; context-aware exec and sql variants used - funlen/cyclop/gocognit/nestif/dupl: oversized or duplicated functions split into focused helpers across production and test code - paralleltest/tparallel/thelper/usetesting/testpackage: tests parallelized where safe (global log.Initialize kept in the serial phase), helpers marked, t.TempDir adopted, external test packages where only exported API is used - gosec: integer conversions clamped or justified, header timeouts added, remaining findings suppressed with per-site justifications - mnd/goconst/lll/wsl_v5/nlreturn/noinlineerr/errcheck and other mechanical findings fixed directly Remove the deprecated log.LogOptions alias (callers migrated to log.Options). make check is green.
117 lines
2.5 KiB
Go
117 lines
2.5 KiB
Go
package database_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"sneak.berlin/go/vaultik/internal/database"
|
|
"sneak.berlin/go/vaultik/internal/types"
|
|
)
|
|
|
|
func TestChunkRepository(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup := setupTestDB(t)
|
|
defer cleanup()
|
|
|
|
ctx := context.Background()
|
|
repo := database.NewChunkRepository(db)
|
|
|
|
// Test Create
|
|
chunk := &database.Chunk{
|
|
ChunkHash: types.ChunkHash("chunkhash123"),
|
|
Size: 4096,
|
|
}
|
|
|
|
err := repo.Create(ctx, nil, chunk)
|
|
if err != nil {
|
|
t.Fatalf("failed to create chunk: %v", err)
|
|
}
|
|
|
|
// Test GetByHash
|
|
retrieved, err := repo.GetByHash(ctx, chunk.ChunkHash.String())
|
|
if err != nil {
|
|
t.Fatalf("failed to get chunk: %v", err)
|
|
}
|
|
|
|
if retrieved == nil {
|
|
t.Fatal("expected chunk, got nil")
|
|
}
|
|
|
|
if retrieved.ChunkHash != chunk.ChunkHash {
|
|
t.Errorf("chunk hash mismatch: got %s, want %s", retrieved.ChunkHash, chunk.ChunkHash)
|
|
}
|
|
|
|
if retrieved.Size != chunk.Size {
|
|
t.Errorf("size mismatch: got %d, want %d", retrieved.Size, chunk.Size)
|
|
}
|
|
|
|
// Test duplicate insert (should be idempotent)
|
|
err = repo.Create(ctx, nil, chunk)
|
|
if err != nil {
|
|
t.Fatalf("failed to create duplicate chunk: %v", err)
|
|
}
|
|
|
|
// Test GetByHashes
|
|
chunk2 := &database.Chunk{
|
|
ChunkHash: types.ChunkHash("chunkhash456"),
|
|
Size: 8192,
|
|
}
|
|
|
|
err = repo.Create(ctx, nil, chunk2)
|
|
if err != nil {
|
|
t.Fatalf("failed to create second chunk: %v", err)
|
|
}
|
|
|
|
chunks, err := repo.GetByHashes(ctx, []string{
|
|
chunk.ChunkHash.String(), chunk2.ChunkHash.String(),
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("failed to get chunks by hashes: %v", err)
|
|
}
|
|
|
|
if len(chunks) != 2 {
|
|
t.Errorf("expected 2 chunks, got %d", len(chunks))
|
|
}
|
|
|
|
// Test ListUnpacked
|
|
unpacked, err := repo.ListUnpacked(ctx, 10)
|
|
if err != nil {
|
|
t.Fatalf("failed to list unpacked chunks: %v", err)
|
|
}
|
|
|
|
if len(unpacked) != 2 {
|
|
t.Errorf("expected 2 unpacked chunks, got %d", len(unpacked))
|
|
}
|
|
}
|
|
|
|
func TestChunkRepositoryNotFound(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup := setupTestDB(t)
|
|
defer cleanup()
|
|
|
|
ctx := context.Background()
|
|
repo := database.NewChunkRepository(db)
|
|
|
|
// Test GetByHash with non-existent hash
|
|
chunk, err := repo.GetByHash(ctx, "nonexistent")
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
|
|
if chunk != nil {
|
|
t.Error("expected nil for non-existent chunk")
|
|
}
|
|
|
|
// Test GetByHashes with empty list
|
|
chunks, err := repo.GetByHashes(ctx, []string{})
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
|
|
if chunks != nil {
|
|
t.Error("expected nil for empty hash list")
|
|
}
|
|
}
|