package databaseconfig import ( "crypto/sha256" "strings" "testing" ) func TestCredentialEncryptionRoundTrip(t *testing.T) { registry := &Registry{credentialKey: sha256.Sum256([]byte("test-secret"))} encrypted, err := registry.encrypt("database-password") if err != nil { t.Fatal(err) } if encrypted == "database-password" || strings.Contains(encrypted, "database-password") { t.Fatalf("password was not encrypted: %q", encrypted) } decrypted, err := registry.decrypt(encrypted) if err != nil { t.Fatal(err) } if decrypted != "database-password" { t.Fatalf("decrypted = %q", decrypted) } } func TestCredentialCannotBeDecryptedWithDifferentKey(t *testing.T) { first := &Registry{credentialKey: sha256.Sum256([]byte("first-secret"))} second := &Registry{credentialKey: sha256.Sum256([]byte("second-secret"))} encrypted, err := first.encrypt("database-password") if err != nil { t.Fatal(err) } if _, err := second.decrypt(encrypted); err == nil { t.Fatal("expected decryption failure with a different key") } } func TestValidateDatabaseSetting(t *testing.T) { valid := Setting{RSCode: "rs_bekasi", Name: "RS Bekasi", Host: "host", Port: "3306", Database: "db", Username: "user"} if err := Validate(valid); err != nil { t.Fatalf("valid setting rejected: %v", err) } tests := []struct { name string mutate func(*Setting) }{ {name: "blank code", mutate: func(s *Setting) { s.RSCode = " " }}, {name: "invalid code", mutate: func(s *Setting) { s.RSCode = "RS BEKASI" }}, {name: "blank hospital name", mutate: func(s *Setting) { s.Name = "" }}, {name: "invalid port", mutate: func(s *Setting) { s.Port = "70000" }}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { setting := valid test.mutate(&setting) if err := Validate(setting); err == nil { t.Fatal("expected validation error") } }) } }