questionary icon indicating copy to clipboard operation
questionary copied to clipboard

Documentation: add documentation on how to test an application using questionary

Open lewoudar opened this issue 1 year ago • 8 comments

Describe the problem

Hello everyone, first of all, thanks to the author for this amazing library. I like to write cli and this project is what I have wanted for some time. But we all know that code that is not tested is difficult to maintain. So it will be interesting to add a section in the documentation explaining how to test our prompts

Describe the solution

I don't have a proper solution, but probably some utilities used in tests can be added in the library with an explanation / examples on how to use them ^^

Alternatives considered

No response

lewoudar avatar Jan 29 '24 07:01 lewoudar

try using pyprompttoolkits create_pipe_input

with create_pipe_input() as inp:
    pipe = [
        "answer 1",
        "answer 2",
    ]
    for p in pipe:
        inp.send_text(p)
        inp.send_text("\n")
    
    run_prompt_session( )

as it is the core prompting library being abstracted

this isnt perfect either as if your input is too short it will hang and so you must thread tests to timeout when tests are ready so that they error

if you find a way to better handle this on pytests pls lmk

alexlatif avatar Feb 02 '24 18:02 alexlatif

sorry one caveat

you basically need to pass in

    input: Optional[Input] = None,
    output: Optional[Output] = None,

confusing as f@#% as they are magically appended kwargs

with create_pipe_input() as inp: pipe = [] for p in pipe: inp.send_text(p) inp.send_text("\n")

vars = questionary.prompt(
    questions,
    input=inp,
    output=DummyOutput(),
)

alexlatif avatar Feb 04 '24 22:02 alexlatif

Thank you @alexlatif oosh! it is a bit more complicated than I thought, I need to change how I created my code. In my tutorial, I use wrapper functions to questionary prompts without giving the possibility to pass additional data :D

Another question, I saw in your tests, you prefer use \r instead for \n for Enter, why?

lewoudar avatar Feb 11 '24 08:02 lewoudar

Hum, I am struggling with this test. I don't want I'm doing wrong, but the confirm input just return True all the time. I try Enter with \n and \r without success. Do you have any idea?

def test_complicated():
    def complicated_prompt(*, inputs, output) -> list[str]:
        fruits = []
        c = True
        while c:
            fruit = questionary.text("Fruit:", input=inputs[0], output=output).ask()
            fruits.append(fruit)
            c = questionary.confirm('add another fruit', default=True, input=inputs[1], output=output).ask()
        return fruits

    with create_pipe_input() as confirm_input, create_pipe_input() as text_input:
        confirm_input.send_text('Y\nn\n')
        text_input.send_text('apple\npineapple\n')
        fruits = complicated_prompt(inputs=[text_input, confirm_input], output=DummyOutput())
        assert fruits == ['apple', 'pineapple']

lewoudar avatar Feb 11 '24 10:02 lewoudar

sorry for the delay. it actually depends on the question. so when its choices "" an empty string worked, but then i had to simulate the arrow keys and could not just pass in the value of the choice as it is obvs reading from the stdin.

it was so much trial and error for me too that i just gave up on testing it all as i would have liked. in reality it isn't this package's fault as much as it is a terribly handled feature of prompt_toolkit.

i've give up on python as a whole tbh and am is the magic land of Rust where annoyances like this are a thing of the past

alexlatif avatar Feb 20 '24 18:02 alexlatif

I think I will just give up on testing. Effectively prompt_toolkit didn't well manage the testing part :( Thank you for your time and I'm sad you're giving up on Python, it may have its quirks (like every programming language) but I think overall, it is still a pleasant language to use. Hope you will change your mind :)

lewoudar avatar Feb 20 '24 19:02 lewoudar

Not an official documentation, but documented somehow? https://github.com/tmbo/questionary/issues/253#issuecomment-1641773227

stdedos avatar May 08 '24 20:05 stdedos

Thanks @stdedos . I already checked the tests, but I was still unable to make my test case work. Honestly, I didn't look at it recently, may be I will give it another try...

lewoudar avatar May 15 '24 18:05 lewoudar