v0.314.0: the R-1060 web test (a fake Plex that refuses the name „plex”), left out of 17863fe
gates / gates (push) Successful in 47s
gates / gates (push) Successful in 47s
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
package web
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"gitea.dooplex.hu/admin/felhom-controller/internal/mediawire"
|
||||
)
|
||||
|
||||
// fakePlex answers as Plex does (measured on demo-hp 9201, 2026-10-15): a Host that is not an address is „non-local",
|
||||
// so the claim gets 401; by address the claim is taken (200 here — the real one asks plex.tv). The test client dials
|
||||
// this server whatever the URL names, so the only difference between the two calls is the Host header.
|
||||
func fakePlex(t *testing.T) (hosts *[]string) {
|
||||
t.Helper()
|
||||
var seen []string
|
||||
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
seen = append(seen, r.Host)
|
||||
h, _, err := net.SplitHostPort(r.Host)
|
||||
if err != nil {
|
||||
h = r.Host
|
||||
}
|
||||
local := net.ParseIP(h) != nil
|
||||
switch r.URL.Path {
|
||||
case "/myplex/claim":
|
||||
if !local {
|
||||
w.WriteHeader(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusOK)
|
||||
case "/identity":
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
_, _ = w.Write([]byte(`{"MediaContainer":{"claimed":` + map[bool]string{true: "true", false: "false"}[local] + `}}`))
|
||||
default:
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
}
|
||||
}))
|
||||
t.Cleanup(srv.Close)
|
||||
oldHTTP, oldLookup := plexHTTP, mediawire.PlexLookup
|
||||
plexHTTP = &http.Client{Transport: &http.Transport{DialContext: func(ctx context.Context, network, _ string) (net.Conn, error) {
|
||||
return (&net.Dialer{}).DialContext(ctx, network, srv.Listener.Addr().String())
|
||||
}}}
|
||||
mediawire.PlexLookup = func(context.Context) ([]net.IPAddr, error) { return []net.IPAddr{{IP: net.ParseIP("10.9.8.7")}}, nil }
|
||||
t.Cleanup(func() { plexHTTP, mediawire.PlexLookup = oldHTTP, oldLookup })
|
||||
return &seen
|
||||
}
|
||||
|
||||
// R-1060 — the household's claim reaches Plex BY ADDRESS, so Plex takes it as local; the identity call too.
|
||||
// COMPANION RED-PROOF: make mediawire.PlexURL return "http://plex:<port>" (today's call) → 401 and this fails.
|
||||
func TestR1060_TheClaimReachesPlexByAddress(t *testing.T) {
|
||||
hosts := fakePlex(t)
|
||||
code, err := plexClaim("claim-felhomtestcode0000")
|
||||
if err != nil || code != http.StatusOK {
|
||||
t.Fatalf("claim → %d (%v); Plex refuses the name „plex” as non-local — the box must call it by address", code, err)
|
||||
}
|
||||
if !plexClaimed() {
|
||||
t.Fatal("the identity call did not reach Plex as local")
|
||||
}
|
||||
for _, h := range *hosts {
|
||||
if !strings.HasPrefix(h, "10.9.8.7:") {
|
||||
t.Errorf("a call to Plex carried Host %q, not its address", h)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user