mirror of
https://github.com/semihalev/twig.git
synced 2026-03-14 22:05:46 +01:00
- Fixed macro parameter parsing with improved tokenization handling - Added support for proper module.function() syntax in templates - Enhanced filter handling within macro variables - Added support for variable interpolation in macro body - Added comprehensive test suite for macros with various scenarios - Improved overall coverage from 43.8% to 45.7% 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
188 lines
4.9 KiB
Go
188 lines
4.9 KiB
Go
package twig
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// Debugging tests
|
|
// Consolidated from: debug_test.go, debug_conditional_test.go, debug_equals_test.go,
|
|
// debug_print_test.go, elseif_debug_test.go, etc.
|
|
|
|
// TestOrganizedDebugLevels tests the different debug logging levels
|
|
func TestOrganizedDebugLevels(t *testing.T) {
|
|
// Save and restore original debugger state
|
|
origLevel := debugger.level
|
|
origWriter := debugger.writer
|
|
defer func() {
|
|
debugger.level = origLevel
|
|
debugger.writer = origWriter
|
|
}()
|
|
|
|
// Create a buffer to capture log output
|
|
var buf bytes.Buffer
|
|
SetDebugWriter(&buf)
|
|
|
|
// Test all debug levels
|
|
tests := []struct {
|
|
level DebugLevel
|
|
shouldLog bool
|
|
description string
|
|
}{
|
|
{DebugOff, false, "DebugOff should not log"},
|
|
{DebugError, true, "DebugError should log errors"},
|
|
{DebugWarning, true, "DebugWarning should log warnings"},
|
|
{DebugInfo, true, "DebugInfo should log info"},
|
|
{DebugVerbose, true, "DebugVerbose should log verbose"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.description, func(t *testing.T) {
|
|
buf.Reset()
|
|
SetDebugLevel(test.level)
|
|
|
|
testErr := errors.New("test error")
|
|
LogError(testErr, "test context")
|
|
|
|
hasOutput := buf.Len() > 0
|
|
if hasOutput != test.shouldLog {
|
|
t.Errorf("Expected logging to be %v, but got %v", test.shouldLog, hasOutput)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestDebugMode tests debug mode functionality
|
|
func TestDebugMode(t *testing.T) {
|
|
// Create a test template
|
|
engine := New()
|
|
engine.SetDebug(true)
|
|
|
|
// Save and restore original debugger state
|
|
origLevel := debugger.level
|
|
origWriter := debugger.writer
|
|
defer func() {
|
|
debugger.level = origLevel
|
|
debugger.writer = origWriter
|
|
}()
|
|
|
|
// Create a buffer to capture log output
|
|
var buf bytes.Buffer
|
|
SetDebugWriter(&buf)
|
|
SetDebugLevel(DebugVerbose)
|
|
|
|
// Create a simple template
|
|
source := "{{ 'Hello' }}"
|
|
engine.RegisterString("debug_test", source)
|
|
|
|
// Render the template
|
|
_, err := engine.Render("debug_test", nil)
|
|
if err != nil {
|
|
t.Fatalf("Error rendering template: %v", err)
|
|
}
|
|
|
|
// Verify debug output was logged
|
|
if buf.Len() == 0 {
|
|
t.Error("Expected debug output, but got none")
|
|
}
|
|
}
|
|
|
|
// TestDebugConditionals tests debugging of conditionals
|
|
func TestDebugConditionals(t *testing.T) {
|
|
// Create a test template
|
|
engine := New()
|
|
engine.SetDebug(true)
|
|
|
|
// Save and restore original debugger state
|
|
origLevel := debugger.level
|
|
origWriter := debugger.writer
|
|
defer func() {
|
|
debugger.level = origLevel
|
|
debugger.writer = origWriter
|
|
}()
|
|
|
|
// Create a buffer to capture log output
|
|
var buf bytes.Buffer
|
|
SetDebugWriter(&buf)
|
|
SetDebugLevel(DebugVerbose)
|
|
|
|
// Create a conditional template
|
|
source := "{% if test %}true{% else %}false{% endif %}"
|
|
engine.RegisterString("debug_conditional", source)
|
|
|
|
// Render the template
|
|
_, err := engine.Render("debug_conditional", map[string]interface{}{"test": true})
|
|
if err != nil {
|
|
t.Fatalf("Error rendering template: %v", err)
|
|
}
|
|
|
|
// Verify debug output was logged
|
|
if buf.Len() == 0 {
|
|
t.Error("Expected debug output, but got none")
|
|
}
|
|
|
|
// Verify debug output contains conditional evaluation info
|
|
output := buf.String()
|
|
|
|
// Check for specific debug messages we expect to see
|
|
expectedMessages := []string{
|
|
"Evaluating 'if' condition",
|
|
"Condition result:",
|
|
"Entering 'if' block",
|
|
}
|
|
|
|
for _, msg := range expectedMessages {
|
|
if !strings.Contains(output, msg) {
|
|
t.Errorf("Expected debug output to contain '%s', but it was not found", msg)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestDebugErrorReporting tests error reporting during template execution
|
|
func TestDebugErrorReporting(t *testing.T) {
|
|
// Create a test template
|
|
engine := New()
|
|
engine.SetDebug(true)
|
|
// Also enable strict vars for error reporting of undefined variables
|
|
engine.SetStrictVars(true)
|
|
|
|
// Save and restore original debugger state
|
|
origLevel := debugger.level
|
|
origWriter := debugger.writer
|
|
defer func() {
|
|
debugger.level = origLevel
|
|
debugger.writer = origWriter
|
|
}()
|
|
|
|
// Create a buffer to capture log output
|
|
var buf bytes.Buffer
|
|
SetDebugWriter(&buf)
|
|
SetDebugLevel(DebugError)
|
|
|
|
// Create a template with a syntax error rather than an undefined variable
|
|
// Since undefined variables don't cause errors by default in twig
|
|
source := "{{ 1 / 0 }}" // Division by zero will cause an error
|
|
engine.RegisterString("debug_error", source)
|
|
|
|
// Render the template - expect an error
|
|
_, err := engine.Render("debug_error", nil)
|
|
if err == nil {
|
|
t.Fatal("Expected error but got none")
|
|
}
|
|
|
|
// Verify the error type and message
|
|
errMsg := err.Error()
|
|
if !strings.Contains(errMsg, "division by zero") &&
|
|
!strings.Contains(errMsg, "divide by zero") {
|
|
t.Errorf("Expected error message to contain division error, got: %s", errMsg)
|
|
}
|
|
|
|
// The error might be directly returned rather than logged
|
|
// Check both the log output and the error message
|
|
output := buf.String()
|
|
if len(output) > 0 && !strings.Contains(output, "ERROR") {
|
|
t.Error("Expected debug output to contain error information")
|
|
}
|
|
}
|