The GitHub Actions job "Benchmarks PR Comment" on texera.git/main has failed.
Run started by GitHub user PG1204 (triggered by PG1204).

Head commit for run:
bdde6b946d79fbe668d211b77e663e2ed263e28f / Eugene Gu <[email protected]>
feat(workflow-operator): add not-blank validation messages (#5640)

<!-- PR title: feat(workflow-operator): add not-blank validation
messages -->

### What changes were proposed in this PR?

Extends the not-blank validation pattern introduced for basic chart
operators in #4006 to **all visualization operators**, and gives every
backend `assert` a human-readable message.

**Why this matters.** The frontend (AJV + `required` + the autofill
attribute enum) already blocks most empty required fields in normal UI
usage, but three gaps remained where users or API callers hit a bare
`assertion failed` with no explanation:

| Gap | Example | Fix |
|---|---|---|
| Bare asserts are the only backend check for execution paths that
bypass frontend validation (direct API calls, agent-generated workflows)
| `assert(value.nonEmpty)` in `PieChartOpDesc` | Every assert now
carries a message, e.g. `assert(value.nonEmpty, "Value Column cannot be
empty")` |
| Empty lists pass AJV's `required` check (it only verifies key
presence) | `FigureFactoryTableOpDesc.columns = []` ran and crashed |
`@NotEmpty(message = ...)` on required list attributes → schema gains
`minItems: 1` |
| Numeric constraints existed only in backend asserts, invisible to the
frontend | `rowHeight = 10` passed the form, then `assert(rowHeight >=
30)` crashed | `@DecimalMin` on `FigureFactoryTable`
`fontSize`/`rowHeight` → schema gains `minimum` |

**Changes in detail:**

- Added messages to all 45 previously bare asserts across 23
visualization operators, splitting compound asserts (e.g.
`assert(x.nonEmpty && y.nonEmpty)`) per field so the error names the
exact missing attribute.
- Added `@NotNull(message = ...)` to required string attributes lacking
it; with the generator's `useMinLengthForNotNull`, the schema gains
`minLength: 1` so the frontend rejects empty strings as well. Annotation
messages are identical to their assert messages (same convention as
#4006). An annotation-only sweep over 20 more operator/config files
brings every required visualization attribute under a constraint.
- Fixed two null defaults (`ImageVisualizerOpDesc.binaryContent`,
`ScatterMatrixChartOpDesc.selectedAttributes`) that threw a
`NullPointerException` before the assert could produce its message.
- Added two missing guards for fields that were interpolated unchecked:
`IcicleChartOpDesc.manipulateTable()` (`value`) and
`RadarChartOpDesc.createPlotlyFigure()` (`valueColumns`).
- No optional field gained a new required-ness constraint, so existing
saved workflows are unaffected.

**Notes for reviewers:**

- Messages quote each field's `@JsonSchemaTitle` verbatim; a few titles
are terse (`x`, `r`, `theta` in contourPlot/quiverPlot/polarChart),
producing messages like `x cannot be empty`. Improving those titles is
left out of scope — happy to adjust if preferred.
- `LineChartOpDesc.lines` reuses its pre-existing assert message (`At
least one line must be configured`) instead of inventing a second
phrasing.
- Non-visualization operators also have required attributes without
constraint annotations (~55 files); those fields need per-field semantic
review, so they are left for a follow-up issue.

### Any related issues, documentation, discussions?

Closes #4053. Follows the approach of #4006 (and #3692).

### How was this PR tested?

Added 14 new spec files and extended 9 existing ones, covering every
touched operator with positive (all fields set → template renders the
configured columns), negative (empty field → `AssertionError` whose
message names the field and contains "cannot be empty"), and boundary
cases (`rowHeight = 10` → "at least 30", `fontSize = -1` →
"non-negative", exact boundary values pass).

```
sbt "WorkflowOperator/testOnly org.apache.texera.amber.operator.visualization.*"
```

168 tests, 31 suites, all passed. Also ran `sbt scalafixAll` and `sbt
scalafmtAll` (clean).

### Was this PR authored or co-authored using generative AI tooling?

Co-authored-by: Claude Code (Claude Fable 5)

Report URL: https://github.com/apache/texera/actions/runs/27483145262

With regards,
GitHub Actions via GitBox

Reply via email to