File: test_search.py

package info (click to toggle)
django-environ 0.12.0-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 516 kB
  • sloc: python: 2,434; makefile: 171
file content (155 lines) | stat: -rw-r--r-- 5,094 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# This file is part of the django-environ.
#
# Copyright (c) 2021-2024, Serghei Iakovlev <oss@serghei.pl>
# Copyright (c) 2013-2021, Daniele Faraglia <daniele.faraglia@gmail.com>
#
# For the full copyright and license information, please view
# the LICENSE.txt file that was distributed with this source code.

import pytest

from environ import Env


def test_solr_parsing(solr_url):
    url = Env.search_url_config(solr_url)

    assert len(url) == 2
    assert url['ENGINE'] == 'haystack.backends.solr_backend.SolrEngine'
    assert url['URL'] == 'http://127.0.0.1:8983/solr'


def test_solr_multicore_parsing(solr_url):
    timeout = 360
    index = 'solr_index'
    url = '{}/{}?TIMEOUT={}'.format(solr_url, index, timeout)
    url = Env.search_url_config(url)

    assert url['ENGINE'] == 'haystack.backends.solr_backend.SolrEngine'
    assert url['URL'] == 'http://127.0.0.1:8983/solr/solr_index'
    assert url['TIMEOUT'] == timeout
    assert 'INDEX_NAME' not in url
    assert 'PATH' not in url


@pytest.mark.parametrize(
    'url,engine,scheme',
    [
        ('elasticsearch://127.0.0.1:9200/index',
         'elasticsearch_backend.ElasticsearchSearchEngine',
         'http',),
        ('elasticsearchs://127.0.0.1:9200/index',
         'elasticsearch_backend.ElasticsearchSearchEngine',
         'https',),
        ('elasticsearch2://127.0.0.1:9200/index',
         'elasticsearch2_backend.Elasticsearch2SearchEngine',
         'http',),
        ('elasticsearch2s://127.0.0.1:9200/index',
         'elasticsearch2_backend.Elasticsearch2SearchEngine',
         'https',),
        ('elasticsearch5://127.0.0.1:9200/index',
         'elasticsearch5_backend.Elasticsearch5SearchEngine',
         'http'),
        ('elasticsearch5s://127.0.0.1:9200/index',
         'elasticsearch5_backend.Elasticsearch5SearchEngine',
         'https'),
        ('elasticsearch7://127.0.0.1:9200/index',
         'elasticsearch7_backend.Elasticsearch7SearchEngine',
         'http'),
        ('elasticsearch7s://127.0.0.1:9200/index',
         'elasticsearch7_backend.Elasticsearch7SearchEngine',
         'https'),
    ],
    ids=[
        'elasticsearch',
        'elasticsearchs',
        'elasticsearch2',
        'elasticsearch2s',
        'elasticsearch5',
        'elasticsearch5s',
        'elasticsearch7',
        'elasticsearch7s',
    ]
)
def test_elasticsearch_parsing(url, engine, scheme):
    """Ensure all supported Elasticsearch engines are recognized."""
    timeout = 360
    url = '{}?TIMEOUT={}'.format(url, timeout)
    url = Env.search_url_config(url)

    assert url['ENGINE'] == 'haystack.backends.{}'.format(engine)
    assert 'INDEX_NAME' in url.keys()
    assert url['INDEX_NAME'] == 'index'
    assert 'TIMEOUT' in url.keys()
    assert url['TIMEOUT'] == timeout
    assert 'PATH' not in url
    assert url["URL"].startswith(scheme + ":")


def test_custom_search_engine():
    """Override ENGINE determined from schema."""
    env_url = 'elasticsearch://127.0.0.1:9200/index'

    engine = 'mypackage.backends.whatever'
    url = Env.db_url_config(env_url, engine=engine)

    assert url['ENGINE'] == engine


@pytest.mark.parametrize('storage', ['file', 'ram'])
def test_whoosh_parsing(whoosh_url, storage):
    post_limit = 128 * 1024 * 1024
    url = '{}?STORAGE={}&POST_LIMIT={}'.format(whoosh_url, storage, post_limit)
    url = Env.search_url_config(url)

    assert url['ENGINE'] == 'haystack.backends.whoosh_backend.WhooshEngine'
    assert 'PATH' in url.keys()
    assert url['PATH'] == '/home/search/whoosh_index'
    assert 'STORAGE' in url.keys()
    assert url['STORAGE'] == storage
    assert 'POST_LIMIT' in url.keys()
    assert url['POST_LIMIT'] == post_limit
    assert 'INDEX_NAME' not in url


@pytest.mark.parametrize('flags', ['myflags'])
def test_xapian_parsing(xapian_url, flags):
    url = '{}?FLAGS={}'.format(xapian_url, flags)
    url = Env.search_url_config(url)

    assert url['ENGINE'] == 'haystack.backends.xapian_backend.XapianEngine'
    assert 'PATH' in url.keys()
    assert url['PATH'] == '/home/search/xapian_index'
    assert 'FLAGS' in url.keys()
    assert url['FLAGS'] == flags
    assert 'INDEX_NAME' not in url


def test_simple_parsing(simple_url):
    url = Env.search_url_config(simple_url)

    assert url['ENGINE'] == 'haystack.backends.simple_backend.SimpleEngine'
    assert 'INDEX_NAME' not in url
    assert 'PATH' not in url


def test_common_args_parsing(search_url):
    excluded_indexes = 'myapp.indexes.A,myapp.indexes.B'
    include_spelling = 1
    batch_size = 100
    params = 'EXCLUDED_INDEXES={}&INCLUDE_SPELLING={}&BATCH_SIZE={}'.format(
        excluded_indexes,
        include_spelling,
        batch_size
    )

    url = '?'.join([search_url, params])
    url = Env.search_url_config(url)

    assert 'EXCLUDED_INDEXES' in url.keys()
    assert 'myapp.indexes.A' in url['EXCLUDED_INDEXES']
    assert 'myapp.indexes.B' in url['EXCLUDED_INDEXES']
    assert 'INCLUDE_SPELLING' in url.keys()
    assert url['INCLUDE_SPELLING']
    assert 'BATCH_SIZE' in url.keys()
    assert url['BATCH_SIZE'] == 100