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}