Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
SearchTest.php 6.60 KiB
<?php

/*
 * This file is part of the ONGR package.
 *
 * (c) NFQ Technologies UAB <info@nfq.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ONGR\ElasticsearchDSL\Tests\Unit\DSL;

use ONGR\ElasticsearchDSL\Query\MissingQuery;
use ONGR\ElasticsearchDSL\Query\TermQuery;
use ONGR\ElasticsearchDSL\Search;
use ONGR\ElasticsearchDSL\Sort\FieldSort;

/**
 * Test for Search.
 */
class SearchTest extends \PHPUnit_Framework_TestCase
{
    /**
     * Tests Search constructor.
     */
    public function testItCanBeInstantiated()
    {
        $this->assertInstanceOf('ONGR\ElasticsearchDSL\Search', new Search());
    }

    /**
     * Data provider for test testSettingParams()
     *
     * @return array
     */
    public function getTestSettingParamsData()
    {
        $cases = [];

        $search = new Search();
        $search->setSize(3);
        $cases['Only size is set'] = [
            $search,
            [
                'size' => 3,
            ],
        ];

        $search = new Search();
        $search->setFrom(4);
        $cases['Only from is set'] = [
            $search,
            [
                'from' => 4,
            ],
        ];

        $search = new Search();
        $search->setTimeout('2s');
        $cases['Only timeout is set'] = [
            $search,
            [
                'timeout' => '2s',
            ],
        ];

        $search = new Search();
        $search->setTerminateAfter(100);
        $cases['Only terminate_after is set'] = [
            $search,
            [
                'terminate_after' => 100,
            ],
        ];

        $search = new Search();
        $search->setSize(3);
        $search->setFrom(4);
        $search->setTimeout('2s');
        $search->setTerminateAfter(100);
        $cases['Multiple parameters are set'] = [
            $search,
            [
                'size' => 3,
                'from' => 4,
                'timeout' => '2s',
                'terminate_after' => 100,
            ],
        ];

        return $cases;
    }

    /**
     * This test checks if parameters are correctly set into Search object.
     *
     * @dataProvider getTestSettingParamsData()
     *
     * @param Search    $search
     * @param array     $expected
     */
    public function testSettingParams($search, $expected)
    {
        $this->assertEquals(
            $expected,
            $search->toArray()
        );
    }

    /**
     * Data provider for test testSettingQueryParams()
     *
     * @return array
     */
    public function getTestSettingQueryParamsData()
    {
        $cases = [];

        $search = new Search();
        $search->setSearchType('dfs_query_then_fetch');
        $cases['Only search_type is set'] = [
            $search,
            [
                'search_type' => 'dfs_query_then_fetch',
            ],
        ];

        $search = new Search();
        $search->setRequestCache(true);
        $cases['Only request_cache is set'] = [
            $search,
            [
                'request_cache' => true,
            ],
        ];

        $search = new Search();
        $search->setScroll('1m');
        $cases['Only scroll is set'] = [
            $search,
            [
                'scroll' => '1m',
            ],
        ];

        $search = new Search();
        $search->setPreference('_local');
        $cases['Only preference is set'] = [
            $search,
            [
                'preference' => '_local',
            ],
        ];

        $search = new Search();
        $search->setSearchType('dfs_query_then_fetch');
        $search->setRequestCache(true);
        $search->setScroll('1m');
        $search->setPreference('_local');
        $cases['Multiple parameters are set'] = [
            $search,
            [
                'search_type' => 'dfs_query_then_fetch',
                'request_cache' => true,
                'scroll' => '1m',
                'preference' => '_local',
            ],
        ];

        return $cases;
    }

    /**
     * Test if query params are constructed correctly.
     *
     * @dataProvider getTestSettingQueryParamsData()
     *
     * @param Search    $search
     * @param array     $expected
     */
    public function testSettingQueryParams($search, $expected)
    {
        $this->assertEquals(
            $expected,
            $search->getQueryParams()
        );
    }

    /**
     * Data provider for testToArray().
     *
     * @return array
     */
    public function getTestToArrayData()
    {
        $cases = [];

        $cases['empty_search'] = [
            [],
            new Search(),
        ];

        $cases['single_term_query'] = [
            [
                'query' => [
                    'term' => ['foo' => 'bar'],
                ],
            ],
            (new Search())->addQuery(new TermQuery('foo', 'bar')),
        ];

        $cases['single_term_filter'] = [
            [
                'query' => [
                    'bool' => [
                        'filter' => [
                            [
                                'term' => ['foo' => 'bar'],
                            ],
                        ],
                    ],
                ],
            ],
            (new Search())->addFilter(new TermQuery('foo', 'bar')),
        ];

        $cases['single_query_query_and_filter'] = [
            [
                'query' => [
                    'bool' => [
                        'must' => [
                            ['term' => ['foo' => 'bar']],
                        ],
                        'filter' => [
                            [
                                'missing' => ['field' => 'baz'],
                            ],
                        ],
                    ],
                ],
            ],
            (new Search())->addQuery(new TermQuery('foo', 'bar'))->addFilter(new MissingQuery('baz')),
        ];

        $cases['sort_by_price'] = [
            [
                'sort' => [
                    [
                        'price' => [
                            'order' => 'asc',
                        ],
                    ],
                ],
            ],
            (new Search())->addSort(new FieldSort('price', 'asc')),
        ];

        return $cases;
    }

    /**
     * @param array  $expected
     * @param Search $search
     *
     * @dataProvider getTestToArrayData()
     */
    public function testToArray($expected, $search)
    {
        $this->assertEquals($expected, $search->toArray());

        // Double check
        $this->assertEquals($expected, $search->toArray());
    }
}