|
11 | 11 | (deftest broadcast-messenger-delegates-and-broadcasts-test |
12 | 12 | (let [inner (h/messenger) |
13 | 13 | sse-connections* (sse/create-connections) |
14 | | - broadcast-messenger (remote.messenger/->BroadcastMessenger inner sse-connections*) |
| 14 | + broadcast-messenger (remote.messenger/make-broadcast-messenger inner sse-connections*) |
15 | 15 | os (java.io.ByteArrayOutputStream.) |
16 | 16 | _client (sse/add-client! sse-connections* os)] |
17 | 17 |
|
|
60 | 60 | (is (not (.contains (.toString os3 "UTF-8") "rewrite"))))) |
61 | 61 |
|
62 | 62 | (sse/close-all! sse-connections*))) |
| 63 | + |
| 64 | +(deftest ask-question-broadcasts-and-resolves-via-answer-test |
| 65 | + (testing "ask-question registers a promise, broadcasts SSE, and answer-question! resolves it" |
| 66 | + (let [inner (h/messenger) |
| 67 | + sse-connections* (sse/create-connections) |
| 68 | + broadcast-messenger (remote.messenger/make-broadcast-messenger inner sse-connections*) |
| 69 | + os (java.io.ByteArrayOutputStream.) |
| 70 | + _client (sse/add-client! sse-connections* os) |
| 71 | + p (messenger/ask-question broadcast-messenger {:chat-id "c1" :question "Why?"})] |
| 72 | + (Thread/sleep 100) |
| 73 | + (is (not (realized? p)) "promise should not be realized before answer") |
| 74 | + (let [output (.toString os "UTF-8")] |
| 75 | + (is (.contains output "chat:ask-question") "SSE event name should be chat:ask-question") |
| 76 | + (is (.contains output "\"chatId\":\"c1\"") "payload should be camel-cased") |
| 77 | + (is (.contains output "\"requestId\"") "payload should include a generated requestId")) |
| 78 | + (let [pending @(:pending-questions* broadcast-messenger) |
| 79 | + [request-id _] (first pending)] |
| 80 | + (is (= 1 (count pending)) "exactly one pending question should be registered") |
| 81 | + (is (string? request-id)) |
| 82 | + (is (= true (remote.messenger/answer-question! broadcast-messenger request-id "because" false))) |
| 83 | + (is (realized? p) "promise should be realized after answer-question!") |
| 84 | + (is (= {:answer "because" :cancelled false} @p)) |
| 85 | + (is (empty? @(:pending-questions* broadcast-messenger)) |
| 86 | + "registry should be cleared after delivery")) |
| 87 | + (sse/close-all! sse-connections*)))) |
| 88 | + |
| 89 | +(deftest ask-question-falls-back-to-inner-when-no-sse-clients-test |
| 90 | + (testing "ask-question delegates to inner messenger when no SSE clients are connected" |
| 91 | + (let [inner (h/messenger) |
| 92 | + sse-connections* (sse/create-connections) |
| 93 | + broadcast-messenger (remote.messenger/make-broadcast-messenger inner sse-connections*)] |
| 94 | + (reset! (:ask-question-response* inner) {:answer "from-inner" :cancelled false}) |
| 95 | + (let [result (messenger/ask-question broadcast-messenger {:chat-id "c1" :question "Why?"})] |
| 96 | + (is (= {:answer "from-inner" :cancelled false} @result)) |
| 97 | + (is (empty? @(:pending-questions* broadcast-messenger)) |
| 98 | + "no SSE-side registration should occur when delegating to inner"))))) |
| 99 | + |
| 100 | +(deftest answer-question-returns-nil-for-unknown-id-test |
| 101 | + (testing "answer-question! returns nil when the request-id is unknown" |
| 102 | + (let [inner (h/messenger) |
| 103 | + sse-connections* (sse/create-connections) |
| 104 | + broadcast-messenger (remote.messenger/make-broadcast-messenger inner sse-connections*)] |
| 105 | + (is (nil? (remote.messenger/answer-question! broadcast-messenger "nonexistent" "x" false)))))) |
0 commit comments