chore: fix test and RWD

Kim committed Apr 1, 2026 at 18:38 UTC 00370a03fc45e5775b2e1bc7e5400aa84a97b223
2 files changed +34 -17
frontend/src/components/Header.tsx
+2 -2
@@ -90,7 +90,7 @@ export function Header({
90 href={repoURL}
91 target="_blank"
92 rel="noopener noreferrer"
93 - className="hidden h-12 w-12 items-center justify-center rounded-full border border-border/70 bg-background/90 text-foreground shadow-sm transition-all hover:-translate-y-0.5 hover:border-primary/40 hover:text-primary xl:inline-flex"
93 + className="inline-flex h-12 w-12 shrink-0 items-center justify-center rounded-full border border-border/70 bg-background/90 text-foreground shadow-sm transition-all hover:-translate-y-0.5 hover:border-primary/40 hover:text-primary"
94 aria-label="View source on GitHub"
95 >
96 <svg
@@ -105,7 +105,7 @@ export function Header({
105 </a>
106 )}
107
108 - <ThemeToggleButton className="hidden xl:inline-flex" />
108 + <ThemeToggleButton className="inline-flex shrink-0" />
109
110 {isAdmin && onLogout && (
111 <TooltipProvider>
sdk/sdk_test.go
+32 -15
@@ -6,6 +6,7 @@ import (
6 "net/http"
7 "net/http/httptest"
8 "strings"
9 + "sync"
10 "testing"
11 "time"
12
@@ -16,10 +17,10 @@ import (
17 )
18
19 func TestNewListenerRegistersLeaseWithMainContract(t *testing.T) {
19 - const address = "0x00000000000000000000000000000000000000A1"
20 -
20 challengeReqCh := make(chan types.RegisterChallengeRequest, 1)
21 registerReqCh := make(chan types.RegisterRequest, 1)
22 + var mu sync.RWMutex
23 + var registeredIdentity types.Identity
24 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
25 switch r.URL.Path {
26 case types.PathSDKDomain:
@@ -34,6 +35,9 @@ func TestNewListenerRegistersLeaseWithMainContract(t *testing.T) {
35 if err := json.NewDecoder(r.Body).Decode(&challengeReq); err != nil {
36 t.Fatalf("decode register challenge request: %v", err)
37 }
38 + mu.Lock()
39 + registeredIdentity = challengeReq.Identity.Copy()
40 + mu.Unlock()
41 select {
42 case challengeReqCh <- challengeReq:
43 default:
@@ -51,6 +55,9 @@ func TestNewListenerRegistersLeaseWithMainContract(t *testing.T) {
55 if err := json.NewDecoder(r.Body).Decode(&registerReq); err != nil {
56 t.Fatalf("decode register request: %v", err)
57 }
58 + mu.RLock()
59 + identity := registeredIdentity.Copy()
60 + mu.RUnlock()
61 select {
62 case registerReqCh <- registerReq:
63 default:
@@ -58,7 +65,7 @@ func TestNewListenerRegistersLeaseWithMainContract(t *testing.T) {
65 writeSDKTestEnvelope(w, http.StatusCreated, types.APIEnvelope[types.RegisterResponse]{
66 OK: true,
67 Data: types.RegisterResponse{
61 - Identity: types.Identity{Name: "demo-app", Address: address},
68 + Identity: identity,
69 Hostname: "127.0.0.1",
70 Metadata: types.LeaseMetadata{Description: "demo"},
71 AccessToken: "jwt-register-1",
@@ -70,9 +77,12 @@ func TestNewListenerRegistersLeaseWithMainContract(t *testing.T) {
77 Error: &types.APIError{Code: types.APIErrorCodeUnauthorized, Message: "not used in test"},
78 })
79 case types.PathSDKRenew:
80 + mu.RLock()
81 + identity := registeredIdentity.Copy()
82 + mu.RUnlock()
83 writeSDKTestEnvelope(w, http.StatusOK, types.APIEnvelope[types.RenewResponse]{
84 OK: true,
75 - Data: types.RenewResponse{Identity: types.Identity{Name: "demo-app", Address: address}, AccessToken: "jwt-renew-1"},
85 + Data: types.RenewResponse{Identity: identity, AccessToken: "jwt-renew-1"},
86 })
87 case types.PathSDKUnregister:
88 writeSDKTestEnvelope(w, http.StatusOK, types.APIEnvelope[any]{OK: true})
@@ -112,7 +122,7 @@ func TestNewListenerRegistersLeaseWithMainContract(t *testing.T) {
122 }
123 })
124 waitForSDKTest(t, func() bool {
115 - return listener.Address() == address
125 + return listener.Address() == challengeReq.Identity.Address
126 })
127
128 if challengeReq.TTL != 42 {
@@ -136,8 +146,8 @@ func TestNewListenerRegistersLeaseWithMainContract(t *testing.T) {
146 if registerReq.SIWESignature == "" {
147 t.Fatal("register request SIWESignature = empty, want signature")
148 }
139 - if listener.Address() != address {
140 - t.Fatalf("Address() = %q, want %q", listener.Address(), address)
149 + if listener.Address() != challengeReq.Identity.Address {
150 + t.Fatalf("Address() = %q, want %q", listener.Address(), challengeReq.Identity.Address)
151 }
152 if got := listener.Hostname(); got != "127.0.0.1" {
153 t.Fatalf("Hostname() = %q, want %q", got, "127.0.0.1")
@@ -165,8 +175,6 @@ func TestExposeNoRelayInputs(t *testing.T) {
175 }
176
177 func TestExposeResolvesPrivateKey(t *testing.T) {
168 - const address = "0x00000000000000000000000000000000000000A2"
169 -
178 privateKey := strings.Repeat("11", 32)
179 identity, err := utils.ResolveSecp256k1Identity(privateKey)
180 if err != nil {
@@ -208,7 +216,7 @@ func TestExposeResolvesPrivateKey(t *testing.T) {
216 writeSDKTestEnvelope(w, http.StatusCreated, types.APIEnvelope[types.RegisterResponse]{
217 OK: true,
218 Data: types.RegisterResponse{
211 - Identity: types.Identity{Name: "demo", Address: address},
219 + Identity: types.Identity{Name: identity.Name, Address: identity.Address},
220 Hostname: "127.0.0.1",
221 AccessToken: "jwt-register-2",
222 },
@@ -221,7 +229,7 @@ func TestExposeResolvesPrivateKey(t *testing.T) {
229 case types.PathSDKRenew:
230 writeSDKTestEnvelope(w, http.StatusOK, types.APIEnvelope[types.RenewResponse]{
231 OK: true,
224 - Data: types.RenewResponse{Identity: types.Identity{Name: "demo", Address: address}, AccessToken: "jwt-renew-2"},
232 + Data: types.RenewResponse{Identity: types.Identity{Name: identity.Name, Address: identity.Address}, AccessToken: "jwt-renew-2"},
233 })
234 case types.PathSDKUnregister:
235 writeSDKTestEnvelope(w, http.StatusOK, types.APIEnvelope[any]{OK: true})
@@ -259,9 +267,9 @@ func TestExposeResolvesPrivateKey(t *testing.T) {
267 }
268
269 func TestExposeGeneratesAddressWithoutPrivateKey(t *testing.T) {
262 - const address = "0x00000000000000000000000000000000000000A3"
263 -
270 challengeReqCh := make(chan types.RegisterChallengeRequest, 1)
271 + var mu sync.RWMutex
272 + var registeredIdentity types.Identity
273 server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
274 switch r.URL.Path {
275 case types.PathSDKDomain:
@@ -276,6 +284,9 @@ func TestExposeGeneratesAddressWithoutPrivateKey(t *testing.T) {
284 if err := json.NewDecoder(r.Body).Decode(&challengeReq); err != nil {
285 t.Fatalf("decode register challenge request: %v", err)
286 }
287 + mu.Lock()
288 + registeredIdentity = challengeReq.Identity.Copy()
289 + mu.Unlock()
290 select {
291 case challengeReqCh <- challengeReq:
292 default:
@@ -293,10 +304,13 @@ func TestExposeGeneratesAddressWithoutPrivateKey(t *testing.T) {
304 if err := json.NewDecoder(r.Body).Decode(&registerReq); err != nil {
305 t.Fatalf("decode register request: %v", err)
306 }
307 + mu.RLock()
308 + identity := registeredIdentity.Copy()
309 + mu.RUnlock()
310 writeSDKTestEnvelope(w, http.StatusCreated, types.APIEnvelope[types.RegisterResponse]{
311 OK: true,
312 Data: types.RegisterResponse{
299 - Identity: types.Identity{Name: "demo", Address: address},
313 + Identity: identity,
314 Hostname: "127.0.0.1",
315 AccessToken: "jwt-register-3",
316 },
@@ -307,9 +321,12 @@ func TestExposeGeneratesAddressWithoutPrivateKey(t *testing.T) {
321 Error: &types.APIError{Code: types.APIErrorCodeUnauthorized, Message: "not used in test"},
322 })
323 case types.PathSDKRenew:
324 + mu.RLock()
325 + identity := registeredIdentity.Copy()
326 + mu.RUnlock()
327 writeSDKTestEnvelope(w, http.StatusOK, types.APIEnvelope[types.RenewResponse]{
328 OK: true,
312 - Data: types.RenewResponse{Identity: types.Identity{Name: "demo", Address: address}, AccessToken: "jwt-renew-3"},
329 + Data: types.RenewResponse{Identity: identity, AccessToken: "jwt-renew-3"},
330 })
331 case types.PathSDKUnregister:
332 writeSDKTestEnvelope(w, http.StatusOK, types.APIEnvelope[any]{OK: true})