assertTrue(method_exists(TextNode::class, '__toString'), 'Class does not have method __toString'); $node = new TextNode('foo'); $this->assertEquals('', (string) $node); $node_with_context = new TextNode('foo', new Context('bar')); $this->assertEquals('', (string) $node_with_context); } public function testMerge() { $left = new TextNode('foo', new Context('bar')); $right = new TextNode('baz', new Context('qux')); $merged = TextNode::merge($left, $right); $this->assertEquals(new TextNode('foobaz'), $merged); } public function testContextAdd() { $node = new TextNode('foo'); $node_with_context = $node->withContext(new Context('bar')); $this->assertEquals(new TextNode('foo', new Context('bar')), $node_with_context); } public function testQueryBuild() { $field = new Field('foo', Mapping::TYPE_STRING, ['private' => false]); $query_context = $this->prophesize(QueryContext::class); $query_context->getUnrestrictedFields()->willReturn([$field]); $query_context->getPrivateFields()->willReturn([]); $query_context->localizeField($field)->willReturn(['foo.fr', 'foo.en']); $node = new TextNode('bar', new Context('baz')); $query = $node->buildQuery($query_context->reveal()); $expected = '{ "multi_match": { "fields": ["foo.fr", "foo.en"], "query": "bar", "operator": "and", "lenient": true } }'; $this->assertEquals(json_decode($expected, true), $query); } public function testQueryBuildWithPrivateFields() { $public_field = new Field('foo', Mapping::TYPE_STRING, ['private' => false]); $private_field = new Field('bar', Mapping::TYPE_STRING, [ 'private' => true, 'used_by_collections' => [1, 2, 3] ]); $query_context = $this->prophesize(QueryContext::class); $query_context ->getUnrestrictedFields() ->willReturn([$public_field]); $query_context ->localizeField($public_field) ->willReturn(['foo.fr', 'foo.en']); $query_context ->getPrivateFields() ->willReturn([$private_field]); $query_context ->localizeField($private_field) ->willReturn(['private_caption.bar.fr', 'private_caption.bar.en']); $node = new TextNode('baz'); $query = $node->buildQuery($query_context->reveal()); $expected = '{ "bool": { "should": [{ "multi_match": { "fields": ["foo.fr", "foo.en"], "query": "baz", "operator": "and", "lenient": true } }, { "filtered": { "filter": { "terms": { "base_id": [1, 2, 3] } }, "query": { "multi_match": { "fields": ["private_caption.bar.fr", "private_caption.bar.en"], "query": "baz", "operator": "and", "lenient": true } } } }] } }'; $this->assertEquals(json_decode($expected, true), $query); } public function testQueryBuildWithConcepts() { $field = new Field('foo', Mapping::TYPE_STRING, ['private' => false]); $query_context = $this->prophesize(QueryContext::class); $query_context->getUnrestrictedFields()->willReturn([$field]); $query_context->getPrivateFields()->willReturn([]); $query_context->localizeField($field)->willReturn(['foo.fr', 'foo.en']); $node = new TextNode('bar'); $node->setConcepts([ new Concept('/qux'), ]); $query = $node->buildQuery($query_context->reveal()); $expected = '{ "bool": { "should": [{ "multi_match": { "fields": ["foo.fr", "foo.en"], "query": "bar", "operator": "and", "lenient": true } }, { "multi_match": { "fields": ["concept_path.foo"], "query": "/qux" } }] } }'; $this->assertEquals(json_decode($expected, true), $query); } }