The GitHub Actions job "Required Checks" on texera.git/main has succeeded. Run started by GitHub user github-merge-queue[bot] (triggered by github-merge-queue[bot]).
Head commit for run: 72071fffc4222d4d7e55b0dbdf7903f3a3b18649 / Xinyuan Lin <[email protected]> test(workflow-operator): add unit test coverage for SplitOp and UrlVizOp (descriptor + executor pairs) (#5769) ### What changes were proposed in this PR? Pin behavior of two previously-uncovered standalone operators (descriptor + executor pairs). No production-code changes. | Spec | Source class | Tests | | --- | --- | --- | | `SplitOpDescSpec` | `SplitOpDesc` | 8 | | `SplitOpExecSpec` | `SplitOpExec` | 7 | | `UrlVizOpDescSpec` | `UrlVizOpDesc` | 7 | | `UrlVizOpExecSpec` | `UrlVizOpExec` | 6 | All four spec files follow the `<srcClassName>Spec.scala` one-to-one convention. **Behavior pinned — `SplitOpDesc`** | Surface | Contract | | --- | --- | | `operatorInfo` | name `"Split"`, group `UTILITY_GROUP`, one input, two outputs (PortIdentity 0 = training, PortIdentity 1 = testing) | | Field defaults | `k = 80`, `random = true`, `seed = 1` | | `getPhysicalOp` | wires `OpExecWithClassName("…operator.split.SplitOpExec", <json>)`; non-parallelizable; payload includes the `k` / `random` / `seed` wire-keys | | Schema propagation | propagates the single input schema to every output port; throws `IllegalArgumentException` unless exactly one input is supplied | | Independent instances | `operatorIdentifier` (UUID-seeded) differs across `new` | **Behavior pinned — `SplitOpExec`** | Surface | Contract | | --- | --- | | `k = 100` | every tuple emitted on PortIdentity 0 (training) | | `k = 0` | every tuple emitted on PortIdentity 1 (testing) | | Deterministic seed | two fresh instances with the same `(k, seed)` produce identical port sequences over 200 tuples | | `k = 50` (deterministic seed) | ~50% ratio over 2000 tuples (±150 band — safely outside binomial 3σ ≈ 67) | | `close()` | clears the `random` reference to `null` | | `processTuple` (single-port overload) | throws `NotImplementedError` | | Malformed descriptor JSON | construction throws `JsonProcessingException` | **Behavior pinned — `UrlVizOpDesc`** | Surface | Contract | | --- | --- | | `operatorInfo` | name `"URL Visualizer"`, group `VISUALIZATION_MEDIA_GROUP` | | `getPhysicalOp` | wires `OpExecWithClassName("…operator.visualization.urlviz.UrlVizOpExec", <json>)` | | Output schema | propagation function ignores input and emits a single `html-content` STRING attribute | | `urlContentAttrName` annotations | `@JsonProperty(required = true)` + `@AutofillAttributeName` + `@NotNull` (verified via reflection) | | Class-level `@JsonSchemaInject` | restricts `urlContentAttrName` to STRING attributes | | Independent instances | `operatorIdentifier` (UUID-seeded) differs across `new` | **Behavior pinned — `UrlVizOpExec`** | Surface | Contract | | --- | --- | | `processTuple` | emits a single `TupleLike` whose only value contains the generated HTML | | Generated HTML | `<!DOCTYPE html>` preamble; `<iframe src="…">` interpolates the input URL; `frameborder="0"` and the `height:100vh; width:100%; border:none` sizing style | | Per-tuple cardinality | exactly one emission per `processTuple` call | | Distinct URLs | interpolated into distinct outputs | | Malformed descriptor JSON | construction throws `JsonProcessingException` | **Test-harness note** `UrlVizOpDesc` declares `urlContentAttrName: val = ""`; the production code seeds it via `objectMapper.readValue` and the `jackson-module-no-ctor-deser` module that bypasses immutable vals. To test the executor without touching production code, `UrlVizOpExecSpec` builds the descriptor JSON via Jackson's tree API and injects both the `operatorType` discriminator (`"URLVisualizer"`, per `LogicalOp`'s `@JsonSubTypes` table) and the `urlContentAttrName` field. ### Any related issues, documentation, discussions? Closes #5766. ### How was this PR tested? Pure unit-test additions; verified locally with: - `sbt "WorkflowOperator/testOnly org.apache.texera.amber.operator.split.SplitOpDescSpec org.apache.texera.amber.operator.split.SplitOpExecSpec org.apache.texera.amber.operator.visualization.urlviz.UrlVizOpDescSpec org.apache.texera.amber.operator.visualization.urlviz.UrlVizOpExecSpec"` — 30 tests, all green - `sbt scalafmtCheckAll` — clean - CI to confirm ### Was this PR authored or co-authored using generative AI tooling? Generated-by: Claude Code (Opus 4.7 [1M context]) Report URL: https://github.com/apache/texera/actions/runs/27852889283 With regards, GitHub Actions via GitBox
