content_rewrite_validation_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package rewrite // import "miniflux.app/v2/internal/reader/rewrite"
  4. import (
  5. "testing"
  6. )
  7. func TestParseRulesInvalidEscape(t *testing.T) {
  8. rulesText := `replace("\d+"|"x")`
  9. _, errs := parseRules(rulesText)
  10. if len(errs) == 0 {
  11. t.Fatalf(`Expected at least one error, got none`)
  12. }
  13. var found bool
  14. for _, e := range errs {
  15. if e.Kind == RuleErrUnquote || e.Kind == RuleErrLexical {
  16. found = true
  17. }
  18. }
  19. if !found {
  20. t.Errorf(`Expected an error with Kind RuleErrUnquote or RuleErrLexical, got %v`, errs)
  21. }
  22. }
  23. func TestParseRulesUnknownName(t *testing.T) {
  24. rulesText := `replce("a"|"b")`
  25. _, errs := parseRules(rulesText)
  26. var found bool
  27. for _, e := range errs {
  28. if e.Kind == RuleErrUnknownName && e.Rule == "replce" {
  29. found = true
  30. }
  31. }
  32. if !found {
  33. t.Errorf(`Expected an error with Kind RuleErrUnknownName and Rule "replce", got %v`, errs)
  34. }
  35. }
  36. func TestParseRulesMissingArgs(t *testing.T) {
  37. rulesText := `replace("a")`
  38. _, errs := parseRules(rulesText)
  39. var found bool
  40. for _, e := range errs {
  41. if e.Kind == RuleErrMissingArgs && e.Rule == "replace" {
  42. found = true
  43. }
  44. }
  45. if !found {
  46. t.Errorf(`Expected an error with Kind RuleErrMissingArgs and Rule "replace", got %v`, errs)
  47. }
  48. }
  49. func TestParseRulesInvalidRegexp(t *testing.T) {
  50. rulesText := `replace("["|"x")`
  51. _, errs := parseRules(rulesText)
  52. var found bool
  53. for _, e := range errs {
  54. if e.Kind == RuleErrInvalidRegexp && e.Rule == "replace" {
  55. found = true
  56. }
  57. }
  58. if !found {
  59. t.Errorf(`Expected an error with Kind RuleErrInvalidRegexp and Rule "replace", got %v`, errs)
  60. }
  61. }
  62. func TestParseRulesInvalidSelector(t *testing.T) {
  63. for _, rulesText := range []string{
  64. `remove("div:has(> p)")`,
  65. `remove(".a,,.b")`,
  66. `base64_decode("div[")`,
  67. } {
  68. _, errs := parseRules(rulesText)
  69. if len(errs) != 1 || errs[0].Kind != RuleErrInvalidSelector {
  70. t.Errorf(`Expected one RuleErrInvalidSelector error for %s, got %v`, rulesText, errs)
  71. }
  72. }
  73. }
  74. func TestParseRulesValidSelector(t *testing.T) {
  75. rulesText := `remove(".newsletter, div.share > a, p:contains(Subscribe)") base64_decode base64_decode("pre")`
  76. if _, errs := parseRules(rulesText); len(errs) != 0 {
  77. t.Errorf(`Expected zero errors, got %v`, errs)
  78. }
  79. }
  80. func TestPredefinedRulesAreValid(t *testing.T) {
  81. for domain, rulesText := range predefinedRules {
  82. if errs := ValidateRules(rulesText); len(errs) != 0 {
  83. t.Errorf(`Predefined rewrite rules for %s are invalid: %v`, domain, errs)
  84. }
  85. }
  86. }
  87. func TestParseRulesWellFormed(t *testing.T) {
  88. rulesText := `replace("a"|"b") nl2br`
  89. rules, errs := parseRules(rulesText)
  90. if len(errs) != 0 {
  91. t.Fatalf(`Expected zero errors, got %v`, errs)
  92. }
  93. if len(rules) != 2 {
  94. t.Fatalf(`Expected 2 rules, got %d: %v`, len(rules), rules)
  95. }
  96. if rules[0].name != "replace" || len(rules[0].args) != 2 || rules[0].args[0] != "a" || rules[0].args[1] != "b" {
  97. t.Errorf(`Unexpected first rule: %v`, rules[0])
  98. }
  99. if rules[1].name != "nl2br" || len(rules[1].args) != 0 {
  100. t.Errorf(`Unexpected second rule: %v`, rules[1])
  101. }
  102. }