gitea源码

internal_test.go 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package internal
  4. import (
  5. "bytes"
  6. "html/template"
  7. "io"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestRenderInternal(t *testing.T) {
  12. cases := []struct {
  13. input, protected, recovered string
  14. }{
  15. {
  16. input: `<div class="test">class="content"</div>`,
  17. protected: `<div data-attr-class="sec:test">class="content"</div>`,
  18. recovered: `<div class="test">class="content"</div>`,
  19. },
  20. {
  21. input: "<div\nclass=\"test\" data-xxx></div>",
  22. protected: `<div data-attr-class="sec:test" data-xxx></div>`,
  23. recovered: `<div class="test" data-xxx></div>`,
  24. },
  25. }
  26. for _, c := range cases {
  27. var r RenderInternal
  28. out := &bytes.Buffer{}
  29. in := r.init("sec", out)
  30. protected := r.ProtectSafeAttrs(template.HTML(c.input))
  31. assert.EqualValues(t, c.protected, protected)
  32. _, _ = io.WriteString(in, string(protected))
  33. _ = in.Close()
  34. assert.Equal(t, c.recovered, out.String())
  35. }
  36. var r1, r2 RenderInternal
  37. protected := r1.ProtectSafeAttrs(`<div class="test"></div>`)
  38. assert.EqualValues(t, `<div class="test"></div>`, protected, "non-initialized RenderInternal should not protect any attributes")
  39. _ = r1.init("sec", nil)
  40. protected = r1.ProtectSafeAttrs(`<div class="test"></div>`)
  41. assert.EqualValues(t, `<div data-attr-class="sec:test"></div>`, protected)
  42. assert.Equal(t, "data-attr-class", r1.SafeAttr("class"))
  43. assert.Equal(t, "sec:val", r1.SafeValue("val"))
  44. recovered, ok := r1.RecoverProtectedValue("sec:val")
  45. assert.True(t, ok)
  46. assert.Equal(t, "val", recovered)
  47. recovered, ok = r1.RecoverProtectedValue("other:val")
  48. assert.False(t, ok)
  49. assert.Empty(t, recovered)
  50. out2 := &bytes.Buffer{}
  51. in2 := r2.init("sec-other", out2)
  52. _, _ = io.WriteString(in2, string(protected))
  53. _ = in2.Close()
  54. assert.Equal(t, `<div data-attr-class="sec:test"></div>`, out2.String(), "different secureID should not recover the value")
  55. }