mengw15 opened a new issue, #6900:
URL: https://github.com/apache/texera/issues/6900

   ### Task Summary
   
   `CollaborationResource` 
(`amber/src/main/scala/org/apache/texera/web/resource/CollaborationResource.scala`)
 is at 0% — all 87 tracked lines are unhit, and there is no spec. It looks 
websocket-bound but is not: the only dependency is the 
`javax.websocket.Session` interface, which mocks cleanly with the ScalaMock 
already on amber's test classpath. `send` is a one-hop 
`session.getAsyncRemote.sendText`, and every event carries a `"type"` 
discriminator from `@JsonTypeInfo` on `CollabWebSocketEvent`, so assertions are 
plain string matches. Roughly 70% of the file — about 60 of the 87 unhit lines 
— never touches `SqlServer`, and that is what this issue targets; the two 
DB-backed branches are scoped out below.
   
   ### Behavior to add
   
   Add 
`amber/src/test/scala/org/apache/texera/web/resource/CollaborationResourceSpec.scala`.
 Build a `mockSession(id)` helper returning a `Session` whose `getId` is fixed 
and whose `getAsyncRemote.sendText` is expectable.
   
   **Session lifecycle (no DB)**
   - `myOnOpen` registers the session in `sessionIdSessionMap`.
   - `myOnClose` removes it and drops `sessionIdWIdMap`/`wIdSessionIdsMap` 
bookkeeping for the sender.
   
   **`WIdRequest` (no DB)** — the authenticated path records 
`sessionIdUIdMap(sessId) == uId`; the anonymous path records 
`sessionIdWIdMap(sessId) == DUMMY_WID`. With two sessions on the same wid, 
assert both appear in `wIdSessionIdsMap(wId)` — the line building that set uses 
`set.union(Set(senderSessId))`, which returns a new set rather than mutating, 
and only survives because the result is reassigned. A multi-session test pins 
that.
   
   **Fan-out (no DB)** — `CommandRequest` and `RestoreVersionRequest`: with 
three sessions, two on wid 1 and one on wid 2, assert the same-wid peer 
receives exactly one message, the sender receives none, and the other 
workflow's session is untouched.
   
   **`HeartBeatRequest` (no DB)** — a single `HeartBeatResponse` back to the 
sender only.
   
   **`TryLockRequest`, `DUMMY_WID` branch (no DB)** — sends 
`WorkflowAccessEvent(workflowReadonly = false)` then `LockGrantedEvent`.
   
   **`AcquireLockRequest` (no DB)** — pre-seed `wIdLockHolderSessionIdMap`; 
assert the previous holder gets `ReleaseLockEvent`, the requester gets 
`LockGrantedEvent`, and the holder map flips.
   
   ### Out of scope
   
   Two branches reach `WorkflowAccessResource.hasWriteAccess` and therefore 
`SqlServer`: the read-only `TryLockRequest` rejection, and the lock hand-off 
inside `myOnClose`. Leave both uncovered. Everything above runs in a single JVM 
against a mocked interface with no database, no filesystem and no network — 
keep the spec that way rather than pulling in `MockTexeraDB`, which would spawn 
an embedded Postgres process for two branches.
   
   ### Ordering hazard — do not skip
   
   The five `object`-level maps (`sessionIdSessionMap`, `sessionIdWIdMap`, 
`sessionIdUIdMap`, `wIdSessionIdsMap`, `wIdLockHolderSessionIdMap`) are 
JVM-wide mutable state. Clear all five in `beforeEach` or the suite becomes 
order-dependent — that is the only realistic flakiness vector here. There are 
no clocks, threads or temp files involved. Also note 
`wIdLockHolderSessionIdMap` deliberately stores a `null` sentinel for "no 
holder"; tests must distinguish absent-key from null-value.
   
   ### Task Type
   
   - [ ] Refactor / Cleanup
   - [ ] DevOps / Deployment / CI
   - [x] Testing / QA
   - [ ] Documentation
   - [ ] Performance
   - [ ] Other
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to