identity: session registry — route by id and (subject, client) + SSO fan-out (9 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 50s
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>
This commit is contained in:
99
lib/identity/tests/registry.sx
Normal file
99
lib/identity/tests/registry.sx
Normal file
@@ -0,0 +1,99 @@
|
||||
;; 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))
|
||||
Reference in New Issue
Block a user