join_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package expressions
  2. import (
  3. "errors"
  4. "testing"
  5. "github.com/google/cel-go/cel"
  6. )
  7. func TestJoin(t *testing.T) {
  8. env, err := NewEnvironment()
  9. if err != nil {
  10. t.Fatal(err)
  11. }
  12. for _, tt := range []struct {
  13. err error
  14. name string
  15. op JoinOperator
  16. resultStr string
  17. clauses []string
  18. }{
  19. {
  20. name: "no-clauses",
  21. clauses: []string{},
  22. op: JoinAnd,
  23. err: ErrNoExpressions,
  24. },
  25. {
  26. name: "one-clause-identity",
  27. clauses: []string{`remoteAddress == "8.8.8.8"`},
  28. op: JoinAnd,
  29. err: nil,
  30. resultStr: `remoteAddress == "8.8.8.8"`,
  31. },
  32. {
  33. name: "multi-clause-and",
  34. clauses: []string{
  35. `remoteAddress == "8.8.8.8"`,
  36. `host == "anubis.techaro.lol"`,
  37. },
  38. op: JoinAnd,
  39. err: nil,
  40. resultStr: `remoteAddress == "8.8.8.8" && host == "anubis.techaro.lol"`,
  41. },
  42. {
  43. name: "multi-clause-or",
  44. clauses: []string{
  45. `remoteAddress == "8.8.8.8"`,
  46. `host == "anubis.techaro.lol"`,
  47. },
  48. op: JoinOr,
  49. err: nil,
  50. resultStr: `remoteAddress == "8.8.8.8" || host == "anubis.techaro.lol"`,
  51. },
  52. {
  53. name: "git-user-agent",
  54. clauses: []string{
  55. `userAgent.startsWith("git/") || userAgent.contains("libgit")`,
  56. `"Git-Protocol" in headers && headers["Git-Protocol"] == "version=2"`,
  57. },
  58. op: JoinAnd,
  59. err: nil,
  60. resultStr: `(userAgent.startsWith("git/") || userAgent.contains("libgit")) && "Git-Protocol" in headers &&
  61. headers["Git-Protocol"] == "version=2"`,
  62. },
  63. } {
  64. t.Run(tt.name, func(t *testing.T) {
  65. result, err := Join(env, tt.op, tt.clauses...)
  66. if !errors.Is(err, tt.err) {
  67. t.Errorf("wanted error %v but got: %v", tt.err, err)
  68. }
  69. if tt.err != nil {
  70. return
  71. }
  72. program, err := cel.AstToString(result)
  73. if err != nil {
  74. t.Fatalf("can't decompile program: %v", err)
  75. }
  76. if tt.resultStr != program {
  77. t.Logf("wanted: %s", tt.resultStr)
  78. t.Logf("got: %s", program)
  79. t.Error("program did not compile as expected")
  80. }
  81. })
  82. }
  83. }