Files
go-jdenticon/jdenticon/integration_test.go
Kevin McIntyre d9e84812ff Initial release: Go Jdenticon library v0.1.0
- Core library with SVG and PNG generation
- CLI tool with generate and batch commands
- Cross-platform path handling for Windows compatibility
- Comprehensive test suite with integration tests
2026-01-03 23:41:48 -05:00

180 lines
4.2 KiB
Go

package jdenticon
import (
"context"
"testing"
)
// TestFullWorkflow tests the complete workflow from input to final output
func TestFullWorkflow(t *testing.T) {
// Test with different input types
testCases := []struct {
name string
input string
size int
}{
{"email", "user@example.com", 64},
{"username", "johndoe", 128},
{"uuid_like", "550e8400-e29b-41d4-a716-446655440000", 32},
{"special_chars", "test@#$%^&*()", 96},
{"unicode", "тест", 64},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Test Generate -> ToSVG workflow
icon, err := Generate(context.Background(), tc.input, tc.size)
if err != nil {
t.Fatalf("Generate failed for %s: %v", tc.input, err)
}
svg, err := icon.ToSVG()
if err != nil {
t.Fatalf("ToSVG failed for %s: %v", tc.input, err)
}
if len(svg) == 0 {
t.Errorf("SVG output empty for %s", tc.input)
}
// Test Generate -> ToPNG workflow
png, err := icon.ToPNG()
if err != nil {
t.Fatalf("ToPNG failed for %s: %v", tc.input, err)
}
if len(png) == 0 {
t.Errorf("PNG output empty for %s", tc.input)
}
// Verify PNG header
if len(png) >= 8 {
pngSignature := []byte{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}
for i, expected := range pngSignature {
if png[i] != expected {
t.Errorf("Invalid PNG signature for %s at byte %d", tc.input, i)
break
}
}
}
})
}
}
// TestGeneratorCaching tests that the generator properly caches results
func TestGeneratorCaching(t *testing.T) {
generator, err := NewGeneratorWithCacheSize(10)
if err != nil {
t.Fatalf("Failed to create generator: %v", err)
}
input := "cache-test"
size := 64
// Generate the same icon multiple times
icon1, err1 := generator.Generate(context.Background(), input, size)
icon2, err2 := generator.Generate(context.Background(), input, size)
if err1 != nil || err2 != nil {
t.Fatalf("Generate failed: err1=%v, err2=%v", err1, err2)
}
// Verify they produce the same output
svg1, err1 := icon1.ToSVG()
svg2, err2 := icon2.ToSVG()
if err1 != nil || err2 != nil {
t.Fatalf("ToSVG failed: err1=%v, err2=%v", err1, err2)
}
if svg1 != svg2 {
t.Error("Cached results differ from fresh generation")
}
}
// TestCustomConfiguration tests generation with custom configuration
func TestCustomConfiguration(t *testing.T) {
config := DefaultConfig()
config.ColorSaturation = 0.8
config.Padding = 0.15
config.BackgroundColor = "#ffffff"
generator, err := NewGeneratorWithConfig(config, 10)
if err != nil {
t.Fatalf("Failed to create generator with config: %v", err)
}
icon, err := generator.Generate(context.Background(), "config-test", 64)
if err != nil {
t.Fatalf("Generate with config failed: %v", err)
}
svg, err := icon.ToSVG()
if err != nil {
t.Fatalf("ToSVG with config failed: %v", err)
}
if len(svg) == 0 {
t.Error("SVG output empty with custom config")
}
// Test convenience function with config
svg2, err := ToSVGWithConfig(context.Background(), "config-test", 64, config)
if err != nil {
t.Fatalf("ToSVGWithConfig failed: %v", err)
}
if len(svg2) == 0 {
t.Error("ToSVGWithConfig output empty")
}
}
// TestErrorHandling tests various error conditions
func TestErrorHandling(t *testing.T) {
tests := []struct {
name string
testFunc func() error
wantErr bool
}{
{
name: "invalid_cache_size",
testFunc: func() error {
_, err := NewGeneratorWithCacheSize(-1)
return err
},
wantErr: true,
},
{
name: "invalid_config_cache_size",
testFunc: func() error {
config := DefaultConfig()
_, err := NewGeneratorWithConfig(config, -1)
return err
},
wantErr: true,
},
{
name: "invalid_config_values",
testFunc: func() error {
config := DefaultConfig()
config.ColorSaturation = 2.0 // Invalid: > 1.0
_, err := NewGeneratorWithConfig(config, 10)
return err
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.testFunc()
if tt.wantErr && err == nil {
t.Errorf("Expected error for %s, but got none", tt.name)
}
if !tt.wantErr && err != nil {
t.Errorf("Unexpected error for %s: %v", tt.name, err)
}
})
}
}