1package cli
2
3import (
4 "net/http"
5 "net/http/httptest"
6 "path/filepath"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10
11 "github.com/bnema/gordon/internal/adapters/in/cli/remote"
12)
13
14func TestRunAuthLoginWithToken_VerifiesAndStores(t *testing.T) {
15 t.Setenv("XDG_CONFIG_HOME", t.TempDir())
16 t.Setenv("PATH", filepath.Join("/nonexistent", "pass-disabled"))
17
18 var receivedAuth string
19 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
20 if r.URL.Path != "/admin/status" {
21 w.WriteHeader(http.StatusNotFound)
22 return
23 }
24 receivedAuth = r.Header.Get("Authorization")
25 w.Header().Set("Content-Type", "application/json")
26 w.WriteHeader(http.StatusOK)
27 _, _ = w.Write([]byte(`{"routes":0,"registry_domain":"","registry_port":0,"server_port":0,"auto_route":false,"network_isolation":false,"container_status":{}}`))
28 }))
29 defer server.Close()
30
31 config := &remote.ClientConfig{
32 Active: "prod",
33 Remotes: map[string]remote.RemoteEntry{
34 "prod": {URL: server.URL},
35 },
36 }
37 assert.NoError(t, remote.SaveRemotes(remote.DefaultRemotesPath(), config))
38
39 err := runAuthLoginWithToken("", "token123")
40 assert.NoError(t, err)
41
42 loaded, err := remote.LoadRemotes("")
43 assert.NoError(t, err)
44 assert.Equal(t, "token123", loaded.Remotes["prod"].Token)
45 assert.Equal(t, "Bearer token123", receivedAuth)
46}
47
48func TestRunAuthLoginWithToken_StoresTokenOnVerificationFailure(t *testing.T) {
49 t.Setenv("XDG_CONFIG_HOME", t.TempDir())
50 t.Setenv("PATH", filepath.Join("/nonexistent", "pass-disabled"))
51
52 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
53 if r.URL.Path != "/admin/status" {
54 w.WriteHeader(http.StatusNotFound)
55 return
56 }
57 w.WriteHeader(http.StatusUnauthorized)
58 _, _ = w.Write([]byte(`{"error":"unauthorized"}`))
59 }))
60 defer server.Close()
61
62 config := &remote.ClientConfig{
63 Active: "prod",
64 Remotes: map[string]remote.RemoteEntry{
65 "prod": {URL: server.URL},
66 },
67 }
68 assert.NoError(t, remote.SaveRemotes(remote.DefaultRemotesPath(), config))
69
70 err := runAuthLoginWithToken("", "token123")
71 assert.NoError(t, err)
72
73 loaded, err := remote.LoadRemotes("")
74 assert.NoError(t, err)
75 assert.Equal(t, "token123", loaded.Remotes["prod"].Token)
76}