diff --git a/internal/docs/alert_rule_template.go b/internal/docs/alert_rule_template.go index f025fde965..b7f057a4b7 100644 --- a/internal/docs/alert_rule_template.go +++ b/internal/docs/alert_rule_template.go @@ -81,13 +81,25 @@ Alert rule templates require Elastic Stack version 9.2.0 or later. `) - builder.WriteString("The following alert rule templates are available:\n\n") - - for _, template := range templates { - builder.WriteString(fmt.Sprintf("**%s**\n\n", template.Attributes.Name)) - builder.WriteString(fmt.Sprintf("%s\n\n", template.Attributes.Description)) - } + builder.WriteString("**The following alert rule templates are available:**\n\n") + renderAlertRuleCollapsibleTable(&builder, templates) + builder.WriteString("\n") } return builder.String(), nil } + +func renderAlertRuleCollapsibleTable(builder *strings.Builder, templates []alertRuleTemplate) { + builder.WriteString("
\n") + builder.WriteString("View the alert rule templates\n\n") + builder.WriteString("| Name | Description |\n") + builder.WriteString("|---|---|\n") + for _, t := range templates { + name := strings.TrimSpace(t.Attributes.Name) + description := strings.TrimSpace(strings.ReplaceAll(t.Attributes.Description, "\n", " ")) + builder.WriteString(fmt.Sprintf("| %s | %s |\n", + escaper.Replace(name), + escaper.Replace(description))) + } + builder.WriteString("\n
\n") +} diff --git a/internal/docs/alert_rule_template_test.go b/internal/docs/alert_rule_template_test.go index 552f2429f2..8364edd83e 100644 --- a/internal/docs/alert_rule_template_test.go +++ b/internal/docs/alert_rule_template_test.go @@ -63,8 +63,11 @@ func TestRenderAlertRuleTemplates(t *testing.T) { expectEmpty: false, validateFunc: func(t *testing.T, result string) { assert.Contains(t, result, "Alert rule templates provide pre-defined configurations") - assert.Contains(t, result, "**Test Alert Rule**") - assert.Contains(t, result, "This is a test alert rule description") + assert.Contains(t, result, "
") + assert.Contains(t, result, "View the alert rule templates") + assert.Contains(t, result, "
") + assert.Contains(t, result, "| Name | Description |") + assert.Contains(t, result, "| Test Alert Rule | This is a test alert rule description |") }, }, { @@ -93,10 +96,11 @@ func TestRenderAlertRuleTemplates(t *testing.T) { expectError: false, expectEmpty: false, validateFunc: func(t *testing.T, result string) { - assert.Contains(t, result, "**First Rule**") - assert.Contains(t, result, "First description") - assert.Contains(t, result, "**Second Rule**") - assert.Contains(t, result, "Second description") + assert.Contains(t, result, "
") + assert.Contains(t, result, "
") + assert.Contains(t, result, "| Name | Description |") + assert.Contains(t, result, "| First Rule | First description |") + assert.Contains(t, result, "| Second Rule | Second description |") }, }, { @@ -120,7 +124,7 @@ func TestRenderAlertRuleTemplates(t *testing.T) { expectError: false, expectEmpty: false, validateFunc: func(t *testing.T, result string) { - assert.Contains(t, result, "**Valid Rule**") + assert.Contains(t, result, "| Valid Rule | Valid description |") assert.NotContains(t, result, "ignored") assert.NotContains(t, result, "readme") }, @@ -149,8 +153,73 @@ func TestRenderAlertRuleTemplates(t *testing.T) { expectError: false, expectEmpty: false, validateFunc: func(t *testing.T, result string) { - // Should only have one rule mentioned - assert.Equal(t, 1, strings.Count(result, "**Root Rule**")) + assert.Equal(t, 1, strings.Count(result, "Root Rule")) + assert.Contains(t, result, "| Root Rule | Root description |") + }, + }, + { + name: "table structure is correct", + setupFunc: func(t *testing.T) string { + tmpDir := t.TempDir() + templatesDir := filepath.Join(tmpDir, "kibana", "alerting_rule_template") + require.NoError(t, os.MkdirAll(templatesDir, 0o755)) + + template1 := `{ + "attributes": { + "name": "First Rule Name", + "description": "First Rule Description" + } + }` + template2 := `{ + "attributes": { + "name": "Second Rule Name", + "description": "Second Rule Description" + } + }` + require.NoError(t, os.WriteFile(filepath.Join(templatesDir, "rule1.json"), []byte(template1), 0o644)) + require.NoError(t, os.WriteFile(filepath.Join(templatesDir, "rule2.json"), []byte(template2), 0o644)) + return tmpDir + }, + expectError: false, + expectEmpty: false, + validateFunc: func(t *testing.T, result string) { + assert.Contains(t, result, "
") + assert.Contains(t, result, "View the alert rule templates") + assert.Contains(t, result, "
") + assert.Contains(t, result, "| Name | Description |") + assert.Contains(t, result, "|---|---|") + assert.Contains(t, result, "| First Rule Name | First Rule Description |") + assert.Contains(t, result, "| Second Rule Name | Second Rule Description |") + }, + }, + { + name: "special characters are escaped", + setupFunc: func(t *testing.T) string { + tmpDir := t.TempDir() + templatesDir := filepath.Join(tmpDir, "kibana", "alerting_rule_template") + require.NoError(t, os.MkdirAll(templatesDir, 0o755)) + + template := `{ + "attributes": { + "name": "Rule with *bold* and {braces}", + "description": "Description with and {curly} brackets" + } + }` + require.NoError(t, os.WriteFile(filepath.Join(templatesDir, "special.json"), []byte(template), 0o644)) + return tmpDir + }, + expectError: false, + expectEmpty: false, + validateFunc: func(t *testing.T, result string) { + assert.Contains(t, result, "
") + assert.Contains(t, result, "
") + assert.Contains(t, result, `\*bold\*`) + assert.Contains(t, result, `\{braces\}`) + assert.Contains(t, result, `\`) + assert.Contains(t, result, `\{curly\}`) + assert.NotContains(t, result, "*bold*") + assert.NotContains(t, result, "{braces}") + assert.NotContains(t, result, "") }, }, { diff --git a/test/packages/other/alert_rule_templates/docs/README.md b/test/packages/other/alert_rule_templates/docs/README.md index e23876224e..5e9ce38943 100644 --- a/test/packages/other/alert_rule_templates/docs/README.md +++ b/test/packages/other/alert_rule_templates/docs/README.md @@ -8,9 +8,14 @@ For more information, refer to the [Elastic documentation](https://www.elastic.c Alert rule templates require Elastic Stack version 9.2.0 or later. -The following alert rule templates are available: +**The following alert rule templates are available:** -**[MongoDB Replication] Replica member down** +
+View the alert rule templates +| Name | Description | +|---|---| +| [MongoDB Replication] Replica member down | | +