A community based topic aggregation platform built on atproto
1package oauth 2 3import ( 4 "encoding/base64" 5 "os" 6 "testing" 7) 8 9func TestGetEnvBase64OrPlain(t *testing.T) { 10 tests := []struct { 11 name string 12 envKey string 13 envValue string 14 want string 15 wantError bool 16 }{ 17 { 18 name: "plain JSON value", 19 envKey: "TEST_PLAIN_JSON", 20 envValue: `{"alg":"ES256","kty":"EC"}`, 21 want: `{"alg":"ES256","kty":"EC"}`, 22 wantError: false, 23 }, 24 { 25 name: "base64 encoded value", 26 envKey: "TEST_BASE64_JSON", 27 envValue: "base64:" + base64.StdEncoding.EncodeToString([]byte(`{"alg":"ES256","kty":"EC"}`)), 28 want: `{"alg":"ES256","kty":"EC"}`, 29 wantError: false, 30 }, 31 { 32 name: "empty value", 33 envKey: "TEST_EMPTY", 34 envValue: "", 35 want: "", 36 wantError: false, 37 }, 38 { 39 name: "invalid base64", 40 envKey: "TEST_INVALID_BASE64", 41 envValue: "base64:not-valid-base64!!!", 42 want: "", 43 wantError: true, 44 }, 45 { 46 name: "plain string with special chars", 47 envKey: "TEST_SPECIAL_CHARS", 48 envValue: "secret-with-dashes_and_underscores", 49 want: "secret-with-dashes_and_underscores", 50 wantError: false, 51 }, 52 { 53 name: "base64 encoded hex string", 54 envKey: "TEST_BASE64_HEX", 55 envValue: "base64:" + base64.StdEncoding.EncodeToString([]byte("f1132c01b1a625a865c6c455a75ee793")), 56 want: "f1132c01b1a625a865c6c455a75ee793", 57 wantError: false, 58 }, 59 } 60 61 for _, tt := range tests { 62 t.Run(tt.name, func(t *testing.T) { 63 // Set environment variable 64 if tt.envValue != "" { 65 if err := os.Setenv(tt.envKey, tt.envValue); err != nil { 66 t.Fatalf("Failed to set env var: %v", err) 67 } 68 defer func() { 69 if err := os.Unsetenv(tt.envKey); err != nil { 70 t.Errorf("Failed to unset env var: %v", err) 71 } 72 }() 73 } 74 75 got, err := GetEnvBase64OrPlain(tt.envKey) 76 77 if (err != nil) != tt.wantError { 78 t.Errorf("GetEnvBase64OrPlain() error = %v, wantError %v", err, tt.wantError) 79 return 80 } 81 82 if got != tt.want { 83 t.Errorf("GetEnvBase64OrPlain() = %v, want %v", got, tt.want) 84 } 85 }) 86 } 87} 88 89func TestGetEnvBase64OrPlain_RealWorldJWK(t *testing.T) { 90 // Test with a real JWK (the one from .env.dev) 91 realJWK := `{"alg":"ES256","crv":"P-256","d":"9tCMceYSgyZfO5KYOCm3rWEhXLqq2l4LjP7-PJtJKyk","kid":"oauth-client-key","kty":"EC","use":"sig","x":"EOYWEgZ2d-smTO6jh0f-9B7YSFYdlrvlryjuXTCrOjE","y":"_FR2jBcWNxoJl5cd1eq9sYtAs33No9AVtd42UyyWYi4"}` 92 93 tests := []struct { 94 name string 95 envValue string 96 want string 97 }{ 98 { 99 name: "plain JWK", 100 envValue: realJWK, 101 want: realJWK, 102 }, 103 { 104 name: "base64 encoded JWK", 105 envValue: "base64:" + base64.StdEncoding.EncodeToString([]byte(realJWK)), 106 want: realJWK, 107 }, 108 } 109 110 for _, tt := range tests { 111 t.Run(tt.name, func(t *testing.T) { 112 if err := os.Setenv("TEST_REAL_JWK", tt.envValue); err != nil { 113 t.Fatalf("Failed to set env var: %v", err) 114 } 115 defer func() { 116 if err := os.Unsetenv("TEST_REAL_JWK"); err != nil { 117 t.Errorf("Failed to unset env var: %v", err) 118 } 119 }() 120 121 got, err := GetEnvBase64OrPlain("TEST_REAL_JWK") 122 if err != nil { 123 t.Fatalf("unexpected error: %v", err) 124 } 125 126 if got != tt.want { 127 t.Errorf("GetEnvBase64OrPlain() = %v, want %v", got, tt.want) 128 } 129 }) 130 } 131}