utils.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package cstest
  2. import (
  3. "strings"
  4. "testing"
  5. "text/template"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/stretchr/testify/require"
  8. logtest "github.com/sirupsen/logrus/hooks/test"
  9. )
  10. func AssertErrorContains(t *testing.T, err error, expectedErr string) {
  11. t.Helper()
  12. if expectedErr != "" {
  13. assert.ErrorContains(t, err, expectedErr)
  14. return
  15. }
  16. assert.NoError(t, err)
  17. }
  18. func AssertErrorMessage(t *testing.T, err error, expectedErr string) {
  19. t.Helper()
  20. if expectedErr != "" {
  21. errmsg := ""
  22. if err != nil {
  23. errmsg = err.Error()
  24. }
  25. assert.Equal(t, expectedErr, errmsg)
  26. return
  27. }
  28. require.NoError(t, err)
  29. }
  30. func RequireErrorContains(t *testing.T, err error, expectedErr string) {
  31. t.Helper()
  32. if expectedErr != "" {
  33. require.ErrorContains(t, err, expectedErr)
  34. return
  35. }
  36. require.NoError(t, err)
  37. }
  38. func RequireErrorMessage(t *testing.T, err error, expectedErr string) {
  39. t.Helper()
  40. if expectedErr != "" {
  41. errmsg := ""
  42. if err != nil {
  43. errmsg = err.Error()
  44. }
  45. require.Equal(t, expectedErr, errmsg)
  46. return
  47. }
  48. require.NoError(t, err)
  49. }
  50. func RequireLogContains(t *testing.T, hook *logtest.Hook, expected string) {
  51. t.Helper()
  52. // look for a log entry that matches the expected message
  53. for _, entry := range hook.AllEntries() {
  54. if strings.Contains(entry.Message, expected) {
  55. return
  56. }
  57. }
  58. // show all hook entries, in case the test fails we'll need them
  59. for _, entry := range hook.AllEntries() {
  60. t.Logf("log entry: %s", entry.Message)
  61. }
  62. require.Fail(t, "no log entry found with message", expected)
  63. }
  64. // Interpolate fills a string template with the given values, can be map or struct.
  65. // example: Interpolate("{{.Name}}", map[string]string{"Name": "JohnDoe"})
  66. func Interpolate(s string, data interface{}) (string, error) {
  67. tmpl, err := template.New("").Parse(s)
  68. if err != nil {
  69. return "", err
  70. }
  71. var b strings.Builder
  72. err = tmpl.Execute(&b, data)
  73. if err != nil {
  74. return "", err
  75. }
  76. return b.String(), nil
  77. }