package seo import ( "strings" "testing" "seo-optimizer/pkg/models" ) func TestHasFAQBlock(t *testing.T) { builder := NewContentBuilder(nil) content := `
` if !builder.hasFAQBlock(content) { t.Fatalf("expected FAQ block to be detected") } } func TestBuildOptimizedContentSkipsExistingFAQ(t *testing.T) { builder := NewContentBuilder(nil) original := `
` optimization := &models.OptimizationResponse{ SEOMeta: models.SEOMeta{}, ContentOptimization: models.ContentOptimization{ Changes: []models.ContentChange{}, InternalLinks: []models.InternalLink{}, }, FAQBlock: models.FAQBlock{ ShouldCreate: true, Questions: []models.FAQQuestion{ {ID: "faq-question-1", Title: "Q1", Content: "A1", Visible: true}, }, }, Validation: models.Validation{}, Summary: "", } result, err := builder.BuildOptimizedContent(original, optimization) if err != nil { t.Fatalf("unexpected error: %v", err) } if strings.Count(result, "wp:rank-math/faq-block") != 2 { t.Fatalf("expected single FAQ block markers, got %d", strings.Count(result, "wp:rank-math/faq-block")) } } func TestWrapInGutenbergBlocks(t *testing.T) { builder := NewContentBuilder(nil) content := "Hello world\n\nSecond paragraph" wrapped := builder.wrapInGutenbergBlocks(content) if !strings.Contains(wrapped, "") { t.Fatalf("expected paragraph blocks to be added") } if count := strings.Count(wrapped, ""); count != 2 { t.Fatalf("expected 2 paragraph blocks, got %d", count) } } func TestWrapInGutenbergBlocksHandlesHeadingsAndLists(t *testing.T) { builder := NewContentBuilder(nil) content := "

Title

\n\n\n\n

Para

" wrapped := builder.wrapInGutenbergBlocks(content) if !strings.Contains(wrapped, "") { t.Fatalf("expected heading block wrapper") } if !strings.Contains(wrapped, "") { t.Fatalf("expected list block wrapper") } if count := strings.Count(wrapped, ""); count != 1 { t.Fatalf("expected 1 paragraph block, got %d", count) } }