From b4131dbeae3cb91ae1d18971d224b1c11865d57f Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sat, 15 Mar 2025 11:51:02 +1300 Subject: [PATCH] Testing: Add tests for inline HTML Checks --- .github/workflows/tests.yml | 2 +- internal/htmlcheck/inline_test.go | 81 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 internal/htmlcheck/inline_test.go diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0bd4272..5c540d9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -26,7 +26,7 @@ jobs: key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - - run: go test -p 1 ./internal/storage ./server ./internal/smtpd ./internal/pop3 ./internal/tools ./internal/html2text ./internal/linkcheck -v + - run: go test -p 1 ./internal/storage ./server ./internal/smtpd ./internal/pop3 ./internal/tools ./internal/html2text ./internal/htmlcheck ./internal/linkcheck -v - run: go test -p 1 ./internal/storage ./internal/html2text -bench=. # build the assets diff --git a/internal/htmlcheck/inline_test.go b/internal/htmlcheck/inline_test.go new file mode 100644 index 0000000..02fe574 --- /dev/null +++ b/internal/htmlcheck/inline_test.go @@ -0,0 +1,81 @@ +package htmlcheck + +import ( + "fmt" + "sort" + "strings" + "testing" + + "github.com/PuerkitoBio/goquery" +) + +func TestInlineStyleDetection(t *testing.T) { + /// tests should contain the HTML test, and expected test results in alphabetical order + tests := map[string]string{} + tests[`

Heading

`] = "css-transform" + tests[`

Heading

`] = "css-transform" + tests[`

Heading

`] = "css-transform" + tests[`

Heading

`] = "css-transform" + tests[`

Heading

`] = "css-transform" + tests[`

Heading

`] = "css-transform" + tests[`

Heading

`] = "" // no match + tests[`

Heading

`] = "css-text-transform" + tests[`

Heading

`] = "css-text-transform" + tests[`

Heading

`] = "" // no match + tests[`

Heading

`] = "css-padding-inline-start-end" + tests[`

Heading

`] = "css-margin-inline-start-end" + tests[`

Heading

`] = "" // no match + tests[`

Heading

`] = "css-important" + tests[`

Heading

`] = "css-important" + tests[`

Heading

`] = "css-important" + tests[`

Heading

`] = "" // no match + tests[`

Heading

`] = "css-background-image" + tests[`

Heading

`] = "css-background-image" + tests[`

Heading

`] = "css-background-image" + tests[`

Heading

`] = "css-display,css-display-flex" + tests[`

Heading

`] = "css-display,css-display-flex" + tests[`

Heading

`] = "css-display" // should not match css-display-flex rule + tests[`

Heading

`] = "css-line-height,css-opacity,css-unit-calc,css-width" + tests[`

Heading

`] = "css-rgb" + tests[`

Heading

`] = "css-rgb" + tests[`

Heading

`] = "css-rgb" + tests[`

Heading

`] = "css-rgba" + tests[`

Heading

`] = "css-border,css-rgb,css-rgba" + tests[`

Heading

`] = "css-border" + tests[`

Heading

`] = "css-background,css-border" + tests[`

Heading

`] = "css-background,css-border" + tests[`

Heading

`] = "" // no match + tests[`

Heading

`] = "css-border,css-important" + + for html, expected := range tests { + reader := strings.NewReader(html) + doc, err := goquery.NewDocumentFromReader(reader) + if err != nil { + t.Log("error ", err) + t.Fail() + } + + results := testInlineStyles(doc) + + matches := []string{} + uniqMap := make(map[string]bool) + for key := range results { + if _, exists := uniqMap[key]; !exists { + matches = append(matches, key) + } + } + + // ensure results are sorted to ensure consistent results + sort.Strings(matches) + + assertEqual(t, expected, strings.Join(matches, ","), fmt.Sprintf("inline style detection \"%s\"", html)) + } +} + +func assertEqual(t *testing.T, a interface{}, b interface{}, message string) { + if a == b { + return + } + message = fmt.Sprintf("%s: \"%v\" != \"%v\"", message, a, b) + t.Fatal(message) +}