package runner import ( "strings" "testing" ) func TestValidateCondition(t *testing.T) { if err := ValidateCondition(""); err != nil { t.Fatalf("empty: %v", err) } if err := ValidateCondition("if $UpdateCount >= 1"); err != nil { t.Fatalf("valid: %v", err) } if err := ValidateCondition("$X == \"ok\""); err != nil { t.Fatalf("string: %v", err) } if err := ValidateCondition("not a condition"); err == nil { t.Fatal("expected invalid condition error") } } func TestEvaluateCondition(t *testing.T) { vars := map[string]string{"UpdateCount": "3", "Status": "ready"} ok, detail, err := EvaluateCondition("if $UpdateCount >= 1", vars) if err != nil || !ok { t.Fatalf("expected true, got %v %v", ok, err) } if detail != "$UpdateCount=3 >= 1" { t.Fatalf("detail = %q", detail) } ok, detail, err = EvaluateCondition("$UpdateCount >= 10", vars) if err != nil || ok { t.Fatalf("expected false, got %v %v", ok, err) } wantFail := "$UpdateCount was 3, which does not meet run condition (>= 10)" if detail != wantFail { t.Fatalf("detail = %q, want %q", detail, wantFail) } ok, detail, err = EvaluateCondition("$Missing >= 1", vars) if err != nil || ok { t.Fatalf("unset numeric compare should be false, got %v %v", ok, err) } wantUnset := "$Missing was unset, which does not meet run condition (>= 1)" if detail != wantUnset { t.Fatalf("detail = %q, want %q", detail, wantUnset) } ok, detail, err = EvaluateCondition("$Status == ready", vars) if err != nil || !ok { t.Fatalf("string eq expected true, got %v %v", ok, err) } if detail != "$Status=ready == ready" { t.Fatalf("detail = %q", detail) } ok, detail, err = EvaluateCondition("", vars) if err != nil || !ok { t.Fatalf("empty should be true, got %v %v", ok, err) } if detail != "" { t.Fatalf("empty detail = %q", detail) } ok, detail, err = EvaluateCondition("$Status != 'busy'", vars) if err != nil || !ok { t.Fatalf("quoted ne expected true, got %v %v", ok, err) } if detail != "$Status=ready != busy" { t.Fatalf("detail = %q", detail) } } func TestEvaluateConditionDetailUnset(t *testing.T) { ok, detail, err := EvaluateCondition("if $UpdateCount >= 10", map[string]string{}) if err != nil || ok { t.Fatalf("expected false, got %v %v", ok, err) } want := "$UpdateCount was unset, which does not meet run condition (>= 10)" if detail != want { t.Fatalf("detail = %q, want %q", detail, want) } } func TestEvaluateConditionSkipDetailZero(t *testing.T) { ok, detail, err := EvaluateCondition("if $UpdateCount >= 1", map[string]string{"UpdateCount": "0"}) if err != nil || ok { t.Fatalf("expected false, got %v %v", ok, err) } want := "$UpdateCount was 0, which does not meet run condition (>= 1)" if detail != want { t.Fatalf("detail = %q, want %q", detail, want) } } func TestEvaluateConditionSkipDetailTruncatesLongValue(t *testing.T) { longValue := strings.Repeat("x", skipDetailMaxValueLen+20) ok, detail, err := EvaluateCondition("if $UpdateCount >= 1", map[string]string{"UpdateCount": longValue}) if err != nil || ok { t.Fatalf("expected false, got %v %v", ok, err) } truncated := truncateForSkipDetail(longValue) want := "$UpdateCount was " + truncated + ", which does not meet run condition (>= 1)" if detail != want { t.Fatalf("detail = %q, want %q", detail, want) } if !strings.HasSuffix(truncated, "…") { t.Fatalf("expected truncation ellipsis in %q", truncated) } if len([]rune(truncated)) != skipDetailMaxValueLen+1 { t.Fatalf("truncated length = %d", len([]rune(truncated))) } }