@@ -203,6 +203,53 @@ func TestDocsHeadingsAndParagraphsFilters(t *testing.T) {
203203 }
204204}
205205
206+ func TestDocsHeadingsAndParagraphsJSONIncludeHeadingID (t * testing.T ) {
207+ t .Parallel ()
208+
209+ response := map [string ]any {
210+ "documentId" : "doc1" ,
211+ "body" : map [string ]any {"content" : []any {
212+ rawStyledParagraphWithHeadingID (1 , 12 , "HEADING_1" , "h.section" , "Section\n " ),
213+ rawStyledParagraph (12 , 20 , "NORMAL_TEXT" , "Body\n " ),
214+ }},
215+ }
216+ srv := newDocsRawTestServer (t , 0 , response )
217+ defer srv .Close ()
218+ svc := newMockDocsService (t , srv )
219+
220+ var output bytes.Buffer
221+ ctx := withDocsTestService (newCmdRuntimeJSONOutputContext (t , & output , io .Discard ), svc )
222+ if err := runKong (
t ,
& DocsHeadingsListCmd {}, []
string {
"doc1" },
ctx ,
& RootFlags {
Account :
"[email protected] " });
err != nil {
223+ t .Fatalf ("headings run: %v" , err )
224+ }
225+ var headings struct {
226+ Headings []docsParagraphListItem `json:"headings"`
227+ }
228+ if err := json .Unmarshal (output .Bytes (), & headings ); err != nil {
229+ t .Fatalf ("unmarshal headings: %v\n %s" , err , output .String ())
230+ }
231+ if len (headings .Headings ) != 1 || headings .Headings [0 ].HeadingID != "h.section" {
232+ t .Fatalf ("headings = %#v" , headings .Headings )
233+ }
234+
235+ output .Reset ()
236+ if err := runKong (
t ,
& DocsParagraphsListCmd {}, []
string {
"doc1" },
ctx ,
& RootFlags {
Account :
"[email protected] " });
err != nil {
237+ t .Fatalf ("paragraphs run: %v" , err )
238+ }
239+ var paragraphs struct {
240+ Paragraphs []docsParagraphInspectItem `json:"paragraphs"`
241+ }
242+ if err := json .Unmarshal (output .Bytes (), & paragraphs ); err != nil {
243+ t .Fatalf ("unmarshal paragraphs: %v\n %s" , err , output .String ())
244+ }
245+ if len (paragraphs .Paragraphs ) != 2 || paragraphs .Paragraphs [0 ].HeadingID != "h.section" {
246+ t .Fatalf ("paragraphs = %#v" , paragraphs .Paragraphs )
247+ }
248+ if paragraphs .Paragraphs [1 ].HeadingID != "" {
249+ t .Fatalf ("normal paragraph headingId = %q, want empty" , paragraphs .Paragraphs [1 ].HeadingID )
250+ }
251+ }
252+
206253func TestDocsParagraphsJSONIncludesRunsAndEmptiness (t * testing.T ) {
207254 t .Parallel ()
208255
@@ -436,11 +483,19 @@ func rawTableCell(text string) map[string]any {
436483}
437484
438485func rawStyledParagraph (start , end int64 , style , text string ) map [string ]any {
486+ return rawStyledParagraphWithHeadingID (start , end , style , "" , text )
487+ }
488+
489+ func rawStyledParagraphWithHeadingID (start , end int64 , style , headingID , text string ) map [string ]any {
490+ paragraphStyle := map [string ]any {"namedStyleType" : style }
491+ if headingID != "" {
492+ paragraphStyle ["headingId" ] = headingID
493+ }
439494 return map [string ]any {
440495 "startIndex" : start ,
441496 "endIndex" : end ,
442497 "paragraph" : map [string ]any {
443- "paragraphStyle" : map [ string ] any { "namedStyleType" : style } ,
498+ "paragraphStyle" : paragraphStyle ,
444499 "elements" : []any {
445500 map [string ]any {
446501 "startIndex" : start ,
0 commit comments