trail: hydrate selected text for line findings · Entire

trail: hydrate selected text for line findings

Sessions

5c43253dac13View transcript

Changes

4

163 unmodified lines

163 unmodified lines

}

func reviewTrailLocationFromJSON(loc reviewTrailJSONLocation) api.TrailReviewLocationCreateRequest {
    filePath := strings.TrimSpace(loc.FilePath)
    withSelectedText := func(req api.TrailReviewLocationCreateRequest) api.TrailReviewLocationCreateRequest {
        if strings.TrimSpace(loc.SelectedText) != "" {
            req.SelectedText = stringPtr(loc.SelectedText)
        }
        return req
    }
    switch strings.ToLower(strings.TrimSpace(loc.Granularity)) {
    case reviewTrailGranularityLine:
        if filePath != "" && loc.StartLine > 0 {
            return api.TrailReviewLocationCreateRequest{Granularity: reviewTrailGranularityLine, FilePath: stringPtr(filePath), StartLine: &loc.StartLine}
            return withSelectedText(api.TrailReviewLocationCreateRequest{Granularity: reviewTrailGranularityLine, FilePath: stringPtr(filePath), StartLine: &loc.StartLine})
        }
    case reviewTrailGranularityRange:
        if filePath != "" && loc.StartLine > 0 && loc.EndLine > loc.StartLine {
            return api.TrailReviewLocationCreateRequest{Granularity: reviewTrailGranularityRange, FilePath: stringPtr(filePath), StartLine: &loc.StartLine, EndLine: &loc.EndLine}
            return withSelectedText(api.TrailReviewLocationCreateRequest{Granularity: reviewTrailGranularityRange, FilePath: stringPtr(filePath), StartLine: &loc.StartLine, EndLine: &loc.EndLine})
        }
        if filePath != "" && loc.StartLine > 0 {
            return api.TrailReviewLocationCreateRequest{Granularity: reviewTrailGranularityLine, FilePath: stringPtr(filePath), StartLine: &loc.StartLine}
            return withSelectedText(api.TrailReviewLocationCreateRequest{Granularity: reviewTrailGranularityLine, FilePath: stringPtr(filePath), StartLine: &loc.StartLine})
        }
    case reviewTrailGranularityFile:
        if filePath != "" {

Mcmd/entire/cli/review_bridge.go+14/-7

109 unmodified lines

109 unmodified lines

func TestReviewTrailFindingInputsAcceptsRunnerStyleJSONLastLine(t *testing.T) { verdict := Intermediate prose that should be ignored for posting. {"summary":"","comments":[{"severity":"high","confidence":0.92,"body":" + "" + daytona.ts + "" + rejects public repos without a token; allow public clones or mint a token.","location":{"granularity":"line","file_path":"daytona.ts","start_line":901}},{"severity":"P2","confidence":0.7,"body":"Delete failures are swallowed, orphaning provider snapshots.","location":{"granularity":"range","file_path":"daytona.ts","start_line":966,"end_line":970}}]} inputs := reviewTrailFindingInputs("general", verdict) if len(inputs) != 2 {

if inputs[0].Location.Granularity != reviewTrailGranularityLine || inputs[0].Location.FilePath == nil || *inputs[0].Location.FilePath != "daytona.ts" || inputs[0].Location.StartLine == nil || *inputs[0].Location.StartLine != 901 {

t.Fatalf("location[0] = %+v, want daytona.ts:901", inputs[0].Location) } if inputs[0].Location.SelectedText == nil || *inputs[0].Location.SelectedText != "return err" {

t.Fatalf("selected_text[0] = %v, want preserved JSON selected_text", inputs[0].Location.SelectedText) } if inputs[1].Severity == nil || *inputs[1].Severity != "medium" {

t.Fatalf("severity[1] = %v, want normalized medium", inputs[1].Severity) } }

func TestPrepareTrailReviewCommentInputsForCreateDowngradesUnselectableLine(t *testing.T) { // Testing prepared inputs downgrades unselectable line. }

func TestCreateTrailReviewFindingSurfacesBatchError(t *testing.T) { // Testing batch error surfaces. }