Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 50s
Directory process holding (SessionId, Subject, Client, Pid) rows. Answers the SSO probe lookup(Subject, Client) and the fan-out sessions_for(Subject) (one subject, many clients). Routes only — no grant state, decides nothing. Integration-tested: register a live session, route to it, confirm active. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
100 lines
4.6 KiB
Plaintext
100 lines
4.6 KiB
Plaintext
;; identity/tests/registry.sx — routing by id and by (subject, client),
|
|
;; SSO fan-out (one subject, many clients), and integration with live
|
|
;; session processes routed through the registry.
|
|
|
|
(define id-registry-test-count 0)
|
|
(define id-registry-test-pass 0)
|
|
(define id-registry-test-fails (list))
|
|
|
|
(define
|
|
id-registry-test
|
|
(fn
|
|
(name actual expected)
|
|
(set! id-registry-test-count (+ id-registry-test-count 1))
|
|
(if
|
|
(= actual expected)
|
|
(set! id-registry-test-pass (+ id-registry-test-pass 1))
|
|
(append! id-registry-test-fails {:name name :expected expected :actual actual}))))
|
|
|
|
(define idr-ev erlang-eval-ast)
|
|
(define idrnm (fn (v) (get v :name)))
|
|
|
|
(identity-load-session!)
|
|
(identity-load-registry!)
|
|
|
|
;; ── whereis by session id ────────────────────────────────────────
|
|
|
|
(id-registry-test
|
|
"registered session is found by id"
|
|
(idrnm
|
|
(idr-ev
|
|
"Me = self(),\n Reg = identity_registry:start(),\n identity_registry:register(Reg, s1, alice, web, Me),\n case identity_registry:whereis_session(Reg, s1) of\n {ok, _} -> found;\n {error, _} -> missing\n end"))
|
|
"found")
|
|
|
|
(id-registry-test
|
|
"unknown session id is not_found, not a crash"
|
|
(idrnm
|
|
(idr-ev
|
|
"Reg = identity_registry:start(),\n case identity_registry:whereis_session(Reg, nope) of\n {ok, _} -> found;\n {error, Why} -> Why\n end"))
|
|
"not_found")
|
|
|
|
;; ── lookup by (subject, client) — the SSO probe ──────────────────
|
|
|
|
(id-registry-test
|
|
"lookup finds a session for subject+client"
|
|
(idrnm
|
|
(idr-ev
|
|
"Me = self(),\n Reg = identity_registry:start(),\n identity_registry:register(Reg, s1, alice, web, Me),\n case identity_registry:lookup(Reg, alice, web) of\n {ok, _} -> found;\n {error, _} -> missing\n end"))
|
|
"found")
|
|
|
|
(id-registry-test
|
|
"lookup is precise: right subject, wrong client misses"
|
|
(idrnm
|
|
(idr-ev
|
|
"Me = self(),\n Reg = identity_registry:start(),\n identity_registry:register(Reg, s1, alice, web, Me),\n case identity_registry:lookup(Reg, alice, cli) of\n {ok, _} -> found;\n {error, _} -> missing\n end"))
|
|
"missing")
|
|
|
|
;; ── SSO fan-out: one subject, many clients ───────────────────────
|
|
|
|
(id-registry-test
|
|
"sessions_for returns all of a subject's sessions"
|
|
(idr-ev
|
|
"Me = self(),\n Reg = identity_registry:start(),\n identity_registry:register(Reg, s1, alice, web, Me),\n identity_registry:register(Reg, s2, alice, cli, Me),\n identity_registry:register(Reg, s3, bob, web, Me),\n case identity_registry:sessions_for(Reg, alice) of\n {ok, L} -> length(L)\n end")
|
|
2)
|
|
|
|
(id-registry-test
|
|
"sessions_for an unknown subject is empty"
|
|
(idr-ev
|
|
"Reg = identity_registry:start(),\n case identity_registry:sessions_for(Reg, ghost) of\n {ok, L} -> length(L)\n end")
|
|
0)
|
|
|
|
;; ── re-register replaces the row for that id (no duplicates) ──────
|
|
|
|
(id-registry-test
|
|
"re-registering an id does not duplicate it"
|
|
(idr-ev
|
|
"Me = self(),\n Reg = identity_registry:start(),\n identity_registry:register(Reg, s1, alice, web, Me),\n identity_registry:register(Reg, s1, alice, web, Me),\n case identity_registry:sessions_for(Reg, alice) of\n {ok, L} -> length(L)\n end")
|
|
1)
|
|
|
|
;; ── deregister removes routing ───────────────────────────────────
|
|
|
|
(id-registry-test
|
|
"deregistered session is no longer found"
|
|
(idrnm
|
|
(idr-ev
|
|
"Me = self(),\n Reg = identity_registry:start(),\n identity_registry:register(Reg, s1, alice, web, Me),\n identity_registry:deregister(Reg, s1),\n case identity_registry:whereis_session(Reg, s1) of\n {ok, _} -> found;\n {error, _} -> missing\n end"))
|
|
"missing")
|
|
|
|
;; ── integration: route to a live session and look it up ──────────
|
|
|
|
(id-registry-test
|
|
"routed-to session answers lookup as active"
|
|
(idrnm
|
|
(idr-ev
|
|
"Me = self(),\n Reg = identity_registry:start(),\n S = identity_session:start(s1, alice, web, Me, infinity),\n identity_registry:register(Reg, s1, alice, web, S),\n {ok, Pid} = identity_registry:lookup(Reg, alice, web),\n case identity_session:lookup(Pid) of\n {ok, {_,_,_,St}} -> St;\n {error, St} -> St\n end"))
|
|
"active")
|
|
|
|
(define
|
|
id-registry-test-summary
|
|
(str "registry " id-registry-test-pass "/" id-registry-test-count))
|