2022-02-01 10:14:24 +01:00
|
|
|
import pytest
|
|
|
|
import shutil
|
|
|
|
import json
|
|
|
|
from httpie.sessions import SESSIONS_DIR_NAME
|
|
|
|
from httpie.status import ExitStatus
|
2022-03-07 23:34:04 +01:00
|
|
|
from httpie.cli.options import PARSER_SPEC_VERSION
|
2022-02-01 10:14:24 +01:00
|
|
|
from tests.utils import DUMMY_HOST, httpie
|
|
|
|
from tests.fixtures import SESSION_FILES_PATH, SESSION_FILES_NEW, SESSION_FILES_OLD, read_session_file
|
|
|
|
|
|
|
|
|
|
|
|
OLD_SESSION_FILES_PATH = SESSION_FILES_PATH / 'old'
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.requires_installation
|
|
|
|
def test_plugins_cli_error_message_without_args():
|
|
|
|
# No arguments
|
|
|
|
result = httpie(no_debug=True)
|
|
|
|
assert result.exit_status == ExitStatus.ERROR
|
|
|
|
assert 'usage: ' in result.stderr
|
|
|
|
assert 'specify one of these' in result.stderr
|
|
|
|
assert 'please use the http/https commands:' in result.stderr
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
'example',
|
|
|
|
[
|
|
|
|
'pie.dev/get',
|
|
|
|
'DELETE localhost:8000/delete',
|
|
|
|
'POST pie.dev/post header:value a=b header_2:value x:=1',
|
|
|
|
],
|
|
|
|
)
|
|
|
|
@pytest.mark.requires_installation
|
|
|
|
def test_plugins_cli_error_messages_with_example(example):
|
|
|
|
result = httpie(*example.split(), no_debug=True)
|
|
|
|
assert result.exit_status == ExitStatus.ERROR
|
|
|
|
assert 'usage: ' in result.stderr
|
|
|
|
assert f'http {example}' in result.stderr
|
|
|
|
assert f'https {example}' in result.stderr
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
'example',
|
|
|
|
[
|
|
|
|
'cli',
|
|
|
|
'plugins',
|
|
|
|
'cli foo',
|
|
|
|
'plugins unknown',
|
|
|
|
'plugins unknown.com A:B c=d',
|
|
|
|
'unknown.com UNPARSABLE????SYNTAX',
|
|
|
|
],
|
|
|
|
)
|
|
|
|
@pytest.mark.requires_installation
|
|
|
|
def test_plugins_cli_error_messages_invalid_example(example):
|
|
|
|
result = httpie(*example.split(), no_debug=True)
|
|
|
|
assert result.exit_status == ExitStatus.ERROR
|
|
|
|
assert 'usage: ' in result.stderr
|
|
|
|
assert f'http {example}' not in result.stderr
|
|
|
|
assert f'https {example}' not in result.stderr
|
|
|
|
|
|
|
|
|
|
|
|
HTTPIE_CLI_SESSIONS_UPGRADE_OPTIONS = [
|
|
|
|
(
|
|
|
|
# Default settings
|
|
|
|
[],
|
|
|
|
{'__host__': json.dumps(None)},
|
|
|
|
),
|
|
|
|
(
|
|
|
|
# When --bind-cookies is applied, the __host__ becomes DUMMY_URL.
|
|
|
|
['--bind-cookies'],
|
|
|
|
{'__host__': json.dumps(DUMMY_HOST)},
|
|
|
|
),
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
'old_session_file, new_session_file', zip(SESSION_FILES_OLD, SESSION_FILES_NEW)
|
|
|
|
)
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
'extra_args, extra_variables',
|
|
|
|
HTTPIE_CLI_SESSIONS_UPGRADE_OPTIONS,
|
|
|
|
)
|
|
|
|
def test_httpie_sessions_upgrade(tmp_path, old_session_file, new_session_file, extra_args, extra_variables):
|
|
|
|
session_path = tmp_path / 'session.json'
|
|
|
|
shutil.copyfile(old_session_file, session_path)
|
|
|
|
|
|
|
|
result = httpie(
|
|
|
|
'cli', 'sessions', 'upgrade', *extra_args, DUMMY_HOST, str(session_path)
|
|
|
|
)
|
|
|
|
assert result.exit_status == ExitStatus.SUCCESS
|
|
|
|
assert read_session_file(session_path) == read_session_file(
|
|
|
|
new_session_file, extra_variables=extra_variables
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def test_httpie_sessions_upgrade_on_non_existent_file(tmp_path):
|
|
|
|
session_path = tmp_path / 'session.json'
|
|
|
|
result = httpie('cli', 'sessions', 'upgrade', DUMMY_HOST, str(session_path))
|
|
|
|
assert result.exit_status == ExitStatus.ERROR
|
|
|
|
assert 'does not exist' in result.stderr
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
'extra_args, extra_variables',
|
|
|
|
HTTPIE_CLI_SESSIONS_UPGRADE_OPTIONS,
|
|
|
|
)
|
|
|
|
def test_httpie_sessions_upgrade_all(tmp_path, mock_env, extra_args, extra_variables):
|
|
|
|
mock_env._create_temp_config_dir = False
|
|
|
|
mock_env.config_dir = tmp_path / "config"
|
|
|
|
|
|
|
|
session_dir = mock_env.config_dir / SESSIONS_DIR_NAME / DUMMY_HOST
|
|
|
|
session_dir.mkdir(parents=True)
|
|
|
|
for original_session_file in SESSION_FILES_OLD:
|
|
|
|
shutil.copy(original_session_file, session_dir)
|
|
|
|
|
|
|
|
result = httpie(
|
|
|
|
'cli', 'sessions', 'upgrade-all', *extra_args, env=mock_env
|
|
|
|
)
|
|
|
|
assert result.exit_status == ExitStatus.SUCCESS
|
|
|
|
|
|
|
|
for refactored_session_file, expected_session_file in zip(
|
|
|
|
sorted(session_dir.glob("*.json")),
|
|
|
|
SESSION_FILES_NEW
|
|
|
|
):
|
|
|
|
assert read_session_file(refactored_session_file) == read_session_file(
|
|
|
|
expected_session_file, extra_variables=extra_variables
|
|
|
|
)
|
2022-03-07 23:34:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
'load_func, extra_options', [
|
|
|
|
(json.loads, []),
|
|
|
|
(json.loads, ['--format=json'])
|
|
|
|
]
|
|
|
|
)
|
|
|
|
def test_cli_export(load_func, extra_options):
|
|
|
|
response = httpie('cli', 'export-args', *extra_options)
|
|
|
|
assert response.exit_status == ExitStatus.SUCCESS
|
|
|
|
assert load_func(response)['version'] == PARSER_SPEC_VERSION
|