diff --git a/library/Director/IcingaConfig/AssignRenderer.php b/library/Director/IcingaConfig/AssignRenderer.php index 454e1f34..cedb5ebb 100644 --- a/library/Director/IcingaConfig/AssignRenderer.php +++ b/library/Director/IcingaConfig/AssignRenderer.php @@ -60,14 +60,7 @@ class AssignRenderer protected function renderEquals($column, $expression) { - if ($column[0] === '"') { - // "me"=vars.users -> "me" in vars.users - return sprintf( - '%s in %s', - $column, - $expression - ); - } elseif (substr($column, -7) === '.groups') { + if (substr($column, -7) === '.groups') { return sprintf( '%s in %s', $expression, @@ -82,8 +75,21 @@ class AssignRenderer } } + protected function renderContains(FilterExpression $filter) + { + return sprintf( + '%s in %s', + $this->renderExpressionValue(json_decode($filter->getColumn())), + $filter->getExpression() + ); + } + protected function renderFilterExpression(FilterExpression $filter) { + if ($this->columnIsJson($filter)) { + return $this->renderContains($filter); + } + $column = $filter->getColumn(); $expression = $this->renderExpressionValue(json_decode($filter->getExpression())); @@ -160,6 +166,12 @@ class AssignRenderer return IcingaConfigHelper::renderPhpValue($value); } + protected function columnIsJson(FilterExpression $filter) + { + $col = $filter->getColumn(); + return strlen($col) && $col[0] === '"'; + } + protected function renderFilterChain(FilterChain $filter) { // TODO: brackets if deeper level? diff --git a/test/php/library/Director/IcingaConfig/AssignRendererTest.php b/test/php/library/Director/IcingaConfig/AssignRendererTest.php index a15b8e42..355c2631 100644 --- a/test/php/library/Director/IcingaConfig/AssignRendererTest.php +++ b/test/php/library/Director/IcingaConfig/AssignRendererTest.php @@ -54,6 +54,27 @@ class AssignRendererTest extends BaseTestCase ); } + public function testWhetherFakeContainsOperatorRendersCorrectly() + { + $string = json_encode('member') . '=host.groups'; + + $expected = 'assign where "member" in host.groups'; + + $this->assertEquals( + $expected, + $this->renderer($string)->renderAssign() + ); + + $string = json_encode('member') . '=host.vars.some_array'; + + $expected = 'assign where "member" in host.vars.some_array'; + + $this->assertEquals( + $expected, + $this->renderer($string)->renderAssign() + ); + } + protected function renderer($string) { return AssignRenderer::forFilter(Filter::fromQueryString($string));