Skip to content

Commit 2588339

Browse files
✅ test: improve coverage for oidc and env packages (#5)
* ✅ test: improve coverage for oidc and env packages - Add unit tests for `internal/oidc` using mock HTTP server. - Add tests for `Get` and `Find` in `internal/env`. - Increase total test coverage to ~57%.
1 parent f8320d5 commit 2588339

2 files changed

Lines changed: 170 additions & 0 deletions

File tree

internal/env/env_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,60 @@ func TestManager_Update(t *testing.T) {
9292
})
9393
}
9494
}
95+
96+
func TestManager_Get(t *testing.T) {
97+
tmpDir := t.TempDir()
98+
envFile := filepath.Join(tmpDir, ".env")
99+
err := os.WriteFile(envFile, []byte("KEY=VALUE\n"), 0644)
100+
if err != nil {
101+
t.Fatal(err)
102+
}
103+
104+
m := NewManager(envFile, "KEY")
105+
val, err := m.Get()
106+
if err != nil {
107+
t.Fatalf("Get() error = %v", err)
108+
}
109+
if val != "VALUE" {
110+
t.Errorf("Get() = %s, want VALUE", val)
111+
}
112+
113+
m2 := NewManager(envFile, "MISSING")
114+
_, err = m2.Get()
115+
if err == nil {
116+
t.Error("Get() expected error for missing key, got nil")
117+
}
118+
}
119+
120+
func TestFind(t *testing.T) {
121+
tmpDir := t.TempDir()
122+
subdir := filepath.Join(tmpDir, "subdir")
123+
if err := os.Mkdir(subdir, 0755); err != nil {
124+
t.Fatal(err)
125+
}
126+
127+
envFile := filepath.Join(tmpDir, ".env")
128+
if err := os.WriteFile(envFile, []byte(""), 0644); err != nil {
129+
t.Fatal(err)
130+
}
131+
132+
// Test finding from subdir
133+
wd, err := os.Getwd()
134+
if err != nil {
135+
t.Fatal(err)
136+
}
137+
defer func() {
138+
_ = os.Chdir(wd)
139+
}()
140+
if err := os.Chdir(subdir); err != nil {
141+
t.Fatal(err)
142+
}
143+
144+
found, err := Find(".env")
145+
if err != nil {
146+
t.Fatalf("Find() error = %v", err)
147+
}
148+
if found != envFile {
149+
t.Errorf("Find() = %s, want %s", found, envFile)
150+
}
151+
}

internal/oidc/client_test.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package oidc
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
"net/http/httptest"
7+
"testing"
8+
9+
"github.com/codozor/authk/internal/config"
10+
)
11+
12+
func TestClient_GetToken(t *testing.T) {
13+
// Mock OIDC Provider
14+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
15+
switch r.URL.Path {
16+
case "/.well-known/openid-configuration":
17+
if err := json.NewEncoder(w).Encode(map[string]string{
18+
"token_endpoint": "http://" + r.Host + "/token",
19+
}); err != nil {
20+
t.Error(err)
21+
}
22+
case "/token":
23+
if err := r.ParseForm(); err != nil {
24+
t.Error(err)
25+
}
26+
if r.Form.Get("grant_type") == "client_credentials" {
27+
if err := json.NewEncoder(w).Encode(TokenResponse{
28+
AccessToken: "mock_access_token",
29+
ExpiresIn: 3600,
30+
TokenType: "Bearer",
31+
}); err != nil {
32+
t.Error(err)
33+
}
34+
} else {
35+
w.WriteHeader(http.StatusBadRequest)
36+
}
37+
default:
38+
w.WriteHeader(http.StatusNotFound)
39+
}
40+
}))
41+
defer ts.Close()
42+
43+
cfg := &config.Config{
44+
OIDC: config.OIDCConfig{
45+
IssuerURL: ts.URL,
46+
ClientID: "client",
47+
ClientSecret: "secret",
48+
AuthMethod: "basic",
49+
},
50+
}
51+
52+
client, err := NewClient(cfg)
53+
if err != nil {
54+
t.Fatalf("NewClient() error = %v", err)
55+
}
56+
57+
token, err := client.GetToken("", "")
58+
if err != nil {
59+
t.Fatalf("GetToken() error = %v", err)
60+
}
61+
62+
if token.AccessToken != "mock_access_token" {
63+
t.Errorf("expected access token 'mock_access_token', got %s", token.AccessToken)
64+
}
65+
}
66+
67+
func TestClient_RefreshToken(t *testing.T) {
68+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
69+
switch r.URL.Path {
70+
case "/.well-known/openid-configuration":
71+
if err := json.NewEncoder(w).Encode(map[string]string{
72+
"token_endpoint": "http://" + r.Host + "/token",
73+
}); err != nil {
74+
t.Error(err)
75+
}
76+
case "/token":
77+
if err := r.ParseForm(); err != nil {
78+
t.Error(err)
79+
}
80+
if r.Form.Get("grant_type") == "refresh_token" && r.Form.Get("refresh_token") == "valid_refresh" {
81+
if err := json.NewEncoder(w).Encode(TokenResponse{
82+
AccessToken: "new_access_token",
83+
ExpiresIn: 3600,
84+
}); err != nil {
85+
t.Error(err)
86+
}
87+
} else {
88+
w.WriteHeader(http.StatusBadRequest)
89+
}
90+
}
91+
}))
92+
defer ts.Close()
93+
94+
cfg := &config.Config{
95+
OIDC: config.OIDCConfig{
96+
IssuerURL: ts.URL,
97+
},
98+
}
99+
100+
client, err := NewClient(cfg)
101+
if err != nil {
102+
t.Fatalf("NewClient() error = %v", err)
103+
}
104+
105+
token, err := client.RefreshToken("valid_refresh")
106+
if err != nil {
107+
t.Fatalf("RefreshToken() error = %v", err)
108+
}
109+
110+
if token.AccessToken != "new_access_token" {
111+
t.Errorf("expected access token 'new_access_token', got %s", token.AccessToken)
112+
}
113+
}

0 commit comments

Comments
 (0)