File: test_kvitems.py

package info (click to toggle)
python-ijson 3.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 668 kB
  • sloc: python: 2,687; ansic: 1,776; sh: 4; makefile: 3
file content (74 lines) | stat: -rw-r--r-- 2,418 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
"""Tests for the ijson.kvitems method"""

from .test_base import ARRAY_JSON, EMPTY_MEMBER_TEST_CASES, JSON, JSON_KVITEMS, JSON_KVITEMS_META, JSON_OBJECT

import pytest


def test_kvitems(adaptor):
    assert JSON_KVITEMS == adaptor.kvitems(JSON, 'docs.item')


def test_kvitems_toplevel(adaptor):
    kvitems = adaptor.kvitems(JSON, '')
    assert 1 == len(kvitems)
    key, value = kvitems[0]
    assert 'docs' == key
    assert JSON_OBJECT['docs'] == value


def test_kvitems_empty(adaptor):
    assert [] == adaptor.kvitems(JSON, 'docs')


def test_kvitems_twodictlevels(adaptor):
    json = b'{"meta":{"view":{"columns":[{"id": -1}, {"id": -2}]}}}'
    view = adaptor.kvitems(json, 'meta.view')
    assert 1 == len(view)
    key, value = view[0]
    assert 'columns' == key
    assert [{'id': -1}, {'id': -2}] == value


def test_kvitems_different_underlying_types(adaptor):
    assert JSON_KVITEMS_META == adaptor.kvitems(JSON, 'docs.item.meta')


def test_kvitems_array(adaptor):
    assert JSON_KVITEMS == adaptor.kvitems(ARRAY_JSON, 'item.docs.item')


@pytest.mark.parametrize("test_case", [
    pytest.param(value, id=name) for name, value in EMPTY_MEMBER_TEST_CASES.items()
])
def test_kvitems_empty_member(adaptor, test_case):
    assert test_case.kvitems == adaptor.kvitems(test_case.json, test_case.prefix)


def test_coro_needs_input_with_three_elements(backend):
    int_element_parse_events = list(backend.parse(b'{"a": 0}'))
    # all good
    assert [('a', 0)] == list(backend.kvitems(int_element_parse_events, ''))
    # one more element in event
    with pytest.raises(ValueError, match="too many values"):
        next(backend.kvitems((event + ('extra dummy',) for event in int_element_parse_events), ''))
    # one less
    with pytest.raises(ValueError, match="not enough values"):
        next(backend.kvitems((event[:-1] for event in int_element_parse_events), ''))
    # not an iterable
    with pytest.raises(TypeError, match="cannot unpack"):
        next(backend.kvitems([None], ''))


def test_user_events(backend):
    """
    User-provided events work correct -- yajl2_c used to fail with event names
    that weren't generated by itself.
    """
    int_element_parse_events = [
        ('', 'start_map', None),
        ('', 'map_key', 'a'),
        ('a', 'number', 0),
        ('', 'end_map', None),
    ]
    assert [('a', 0)] == list(backend.kvitems(int_element_parse_events, ''))