File: test_run_query_bar.py

package info (click to toggle)
harlequin 2.5.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 15,856 kB
  • sloc: python: 12,064; makefile: 44; sql: 6
file content (134 lines) | stat: -rw-r--r-- 5,016 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
from __future__ import annotations

import sys
from typing import Awaitable, Callable

import pytest
from textual.message import Message

from harlequin import Harlequin


@pytest.mark.asyncio
async def test_run_query_bar(
    app_all_adapters_small_db: Harlequin,
    app_snapshot: Callable[..., Awaitable[bool]],
    wait_for_workers: Callable[[Harlequin], Awaitable[None]],
    transaction_button_visible: Callable[[Harlequin], bool],
) -> None:
    app = app_all_adapters_small_db
    snap_results: list[bool] = []
    messages: list[Message] = []
    async with app.run_test(size=(120, 36), message_hook=messages.append) as pilot:
        await wait_for_workers(app)
        while app.editor is None:
            await pilot.pause()
        # initialization
        bar = app.run_query_bar
        assert bar.limit_checkbox.value is False
        assert bar.limit_input.value == "500"
        assert bar.limit_value is None

        # query without any limit by clicking the button;
        # dataset has 857 records
        assert app.editor is not None
        app.editor.text = "select * from drivers"
        await pilot.click("#run_query")
        await wait_for_workers(app)
        await pilot.pause()
        await wait_for_workers(app)
        await pilot.pause()
        await wait_for_workers(app)
        await pilot.pause()
        await pilot.wait_for_scheduled_animations()
        table = app.results_viewer.get_visible_table()
        assert table
        assert table.row_count == table.source_row_count == 857
        snap_results.append(await app_snapshot(app, "No limit"))

        # apply a limit by clicking the limit checkbox
        await pilot.click(bar.limit_checkbox.__class__)
        assert bar.limit_checkbox.value is True
        assert bar.limit_value == 500
        await pilot.click("#run_query")
        await wait_for_workers(app)
        await pilot.pause()
        await wait_for_workers(app)
        await pilot.pause()
        await wait_for_workers(app)
        await pilot.pause()
        await pilot.wait_for_scheduled_animations()
        table = app.results_viewer.get_visible_table()
        assert table
        assert table.row_count == table.source_row_count == 500
        snap_results.append(await app_snapshot(app, "Limit 500"))

        # type an invalid limit, checkbox should be unchecked
        # and a tooltip should appear on hover
        await pilot.click(bar.limit_input.__class__)
        await pilot.press("a")
        assert bar.limit_input.value == "a500"
        assert bar.limit_value is None
        assert bar.limit_checkbox.value is False
        assert bar.limit_input.tooltip is not None
        await pilot.pause()
        await pilot.wait_for_scheduled_animations()
        snap_results.append(await app_snapshot(app, "Invalid limit"))

        # type a valid limit
        await pilot.press("backspace")
        await pilot.press("delete")
        await pilot.press("1")
        assert bar.limit_input.value == "100"
        assert bar.limit_value == 100
        assert bar.limit_checkbox.value is True
        assert bar.limit_input.tooltip is None

        # run the query with a smaller limit
        await pilot.click("#run_query")
        await wait_for_workers(app)
        await pilot.pause()
        await wait_for_workers(app)
        await pilot.pause()
        await wait_for_workers(app)
        await pilot.pause()
        await pilot.wait_for_scheduled_animations()
        table = app.results_viewer.get_visible_table()
        assert table
        assert table.row_count == table.source_row_count == 100
        snap_results.append(await app_snapshot(app, "Limit 100"))

        if not transaction_button_visible(app):
            assert all(snap_results)


@pytest.mark.py12
@pytest.mark.skipif(
    sys.version_info < (3, 12), reason="SQLite in Python < 3.12 won't show txn button"
)
@pytest.mark.asyncio
async def test_transaction_button(
    app_small_sqlite: Harlequin,
    app_snapshot: Callable[..., Awaitable[bool]],
    wait_for_workers: Callable[[Harlequin], Awaitable[None]],
) -> None:
    app = app_small_sqlite
    snap_results: list[bool] = []
    async with app.run_test(size=(120, 36)) as pilot:
        await wait_for_workers(app)
        while app.editor is None or app.connection is None:
            await pilot.pause()

        assert app.connection.transaction_mode
        assert app.connection.transaction_mode.label == "Auto"
        snap_results.append(await app_snapshot(app, "Initialize with Tx: Auto"))
        await pilot.click("#transaction_button")
        await pilot.pause(0.3)
        await pilot.wait_for_animation()
        assert app.connection.transaction_mode
        assert app.connection.transaction_mode.label == "Manual"
        assert app.connection.transaction_mode.commit is not None
        assert app.connection.transaction_mode.rollback is not None
        snap_results.append(await app_snapshot(app, "After click with Tx: Manual"))

        assert all(snap_results)