def test_save_and_load_test_result_to_map(temp_files_factory):
    root_dir = temp_files_factory([
        'api/user/POST/curl',
        'api/user/{id}/GET/curl',
        'api/user/{id}/friend/POST/curl',
        'api/user/{id}/friend/{fid}/GET/curl',
    ])
    samples = load_code_samples(root_dir)
    parent_sample = samples[0]
    child_sample = samples[1]
    child_sample_post = samples[2]
    grand_child_sample = samples[3]

    result_map = TestExecutionResultMap()

    result_map.put(ApiTestResult(parent_sample, passed=True, json_body={1: 2}))
    result_map.put(ApiTestResult(child_sample, passed=True))
    result_map.put(
        ApiTestResult(child_sample_post, passed=True, json_body={3: 4})
    )

    assert result_map.get_parent_result(parent_sample) is None
    assert result_map.get_parent_result(child_sample).sample == parent_sample

    assert result_map.get_parent_body(parent_sample) == {}
    assert result_map.get_parent_body(child_sample) == {1: 2}

    assert result_map.get_parent_body(grand_child_sample) == {1: 2, 3: 4}
def test_before_sample_replacements(
        run_sys_cmd, mocked_parse_stdout, temp_files_factory, reporter,
        no_cleanup, monkeypatch):
    root_dir = temp_files_factory([
        'api/users/POST/curl',
    ])
    sample = load_code_samples(root_dir)[0]

    original_source_code = 'curl url --data {"name": "<username>"}'
    expected_source_code = 'curl url --data {"name": "John"}'
    sample.path.write_text(original_source_code)

    _post = MagicMock(status_code=200, json=lambda: {'@id': 'John'})
    monkeypatch.setattr(
        'samples_validator.prerequisites.base.requests', MagicMock(
            post=MagicMock(return_value=_post)
        )
    )
    mocked_parse_stdout.return_value = ({}, 200)

    conf.before_sample = {
        sample.name: [{
            'resource': 'Identity',
            'subs': {'@id': '<username>'},
            'method': 'POST',
        }]
    }

    session = TestSession([sample])
    session.run()
    actual_code = session.runners[Language.shell].tmp_sample_path.read_text()
    assert actual_code == expected_source_code
def test_before_sample_replacements_nested_path(
        run_sys_cmd, mocked_parse_stdout, temp_files_factory, reporter,
        no_cleanup, monkeypatch):
    root_dir = temp_files_factory([
        'api/users/{id}/link/POST/curl',
        'api/users/{id}/link/linkID/GET/curl',
    ])
    samples = load_code_samples(root_dir)

    original_source_code = 'curl api/users/{id}/link/linkID'
    expected_source_code = 'curl api/users/John/link/linkID'
    samples[-1].path.write_text(original_source_code)

    _post = MagicMock(status_code=200, json=lambda: {'@id': 'John'})
    monkeypatch.setattr(
        'samples_validator.prerequisites.base.requests', MagicMock(
            post=MagicMock(return_value=_post)
        )
    )
    mocked_parse_stdout.return_value = ({'stub': 'data'}, 200)

    conf.before_sample = {
        samples[0].name: [{
            'resource': 'Identity',
            'subs': {'@id': 'id'},
            'method': 'POST',
        }]
    }

    session = TestSession(samples)
    session.run()
    actual_code = session.runners[Language.shell].tmp_sample_path.read_text()
    assert actual_code == expected_source_code
def test_parents_and_child_sorting_all_methods(temp_files_factory):
    files_structure = [
        ('api/_parent', ('GET', 'POST')),
        ('api/_parent_{id}', ('GET', 'PUT', 'DELETE')),
        ('api/_parent_{id}_child', ('GET', 'POST')),
        ('api/_parent_{id}_child_{childId}', ('GET', 'PUT', 'DELETE')),
    ]
    resources = []
    for prefix, methods in files_structure:
        for method in methods:
            resources.append(f'{prefix}/{method}/curl')

    samples = load_code_samples(temp_files_factory(resources))
    sorted_names = [(sample.name, sample.http_method) for sample in samples]
    assert sorted_names == [
        ('api/parent', HttpMethod.post),
        ('api/parent', HttpMethod.get),
        ('api/parent/{id}', HttpMethod.get),
        ('api/parent/{id}', HttpMethod.put),
        ('api/parent/{id}/child', HttpMethod.post),
        ('api/parent/{id}/child', HttpMethod.get),
        ('api/parent/{id}/child/{childId}', HttpMethod.get),
        ('api/parent/{id}/child/{childId}', HttpMethod.put),
        ('api/parent/{id}/child/{childId}', HttpMethod.delete),
        ('api/parent/{id}', HttpMethod.delete),
    ]
def test_reusing_response_from_prev_requests_nested(
        run_sys_cmd, mocked_parse_stdout, temp_files_factory, reporter,
        no_cleanup, monkeypatch):
    root_dir = temp_files_factory([
        'api/users/POST/curl',
        'api/users/{from}/link/{to}/POST/curl',
        'api/users/{from}/link/{to}/{type}/GET/curl',
    ])
    samples = load_code_samples(root_dir)

    mocked_parse_stdout.side_effect = [
        ({'id': 'uuid'}, 200), ({}, 200), ({}, 200)
    ]
    conf.resp_attr_replacements = {
        'api/users': [{'id': 'from'}]
    }

    original_source_code = 'curl /users/{from}/link/{to}/{type}'
    expected_source_code = 'curl /users/uuid/link/{to}/{type}'
    samples[-1].path.write_text(original_source_code)

    session = TestSession(samples)
    session.run()
    actual_code = session.runners[Language.shell].tmp_sample_path.read_text()
    assert actual_code == expected_source_code
def test_loading_by_keyword(temp_files_factory):
    root_dir = temp_files_factory([
        'one-api/resource/POST/curl',
        'another-one-api/resource//DELETE/curl',
        'api/resource/POST/curl',
        'on-more-api/resource/DELETE/curl',
    ])
    samples = load_code_samples(root_dir, keyword='one')
    assert len(samples) == 2
def test_sorting_by_endpoint(temp_files_factory, run_sys_cmd):
    root_dir = temp_files_factory([
        f'api/endpoint/{method}/curl'
        for method in ('GET', 'POST', 'PUT', 'DELETE')
    ])
    samples = load_code_samples(root_dir)
    methods = [sample.http_method for sample in samples]
    assert methods == [
        HttpMethod.post, HttpMethod.get, HttpMethod.put, HttpMethod.delete
    ]
def test_test_session_return_value(
        status_codes, expected_failures,
        runner_sample_factory, run_sys_cmd, mocked_parse_stdout, reporter,
        temp_files_factory):
    root_dir = temp_files_factory([
        'api/user/POST/curl', 'api/user/GET/curl'
    ])
    session = TestSession(load_code_samples(root_dir))
    mocked_parse_stdout.side_effect = [({}, code) for code in status_codes]
    failed_count = session.run()
    assert failed_count == expected_failures
def test_base_loading(sample_filename, temp_files_factory, run_sys_cmd):
    root_dir = temp_files_factory([
        'api/endpoint/POST/sample.js', 'api/endpoint/POST/sample.py',
        'api/endpoint/POST/curl', 'api/endpoint/POST/trash'
    ])
    samples = load_code_samples(root_dir)
    assert len(samples) == 3
    sample = CodeSample(path=root_dir / f'api/endpoint/POST/{sample_filename}',
                        name='api/endpoint',
                        http_method=HttpMethod.post)
    assert sample in samples
def test_parents_and_child_sorting_simple(temp_files_factory):
    root_dir = temp_files_factory([
        'api/_parent/POST/curl',
        'api/_parent_{id}/DELETE/curl',
        'api/_parent_{id}_child/POST/curl',
        'api/_parent_{id}_child_{childId}/DELETE/curl',
    ])
    samples = load_code_samples(root_dir)
    sorted_names = [(sample.name, sample.http_method) for sample in samples]
    assert sorted_names == [
        ('api/parent', HttpMethod.post),
        ('api/parent/{id}/child', HttpMethod.post),
        ('api/parent/{id}/child/{childId}', HttpMethod.delete),
        ('api/parent/{id}', HttpMethod.delete),
    ]
 def factory(lang: Language) -> (CodeRunner, CodeSample):
     if lang == Language.shell:
         runner = CurlRunner()
         name = 'curl'
     elif lang == Language.python:
         runner = PythonRunner()  # type: ignore
         name = 'sample.py'
     elif lang == Language.js:
         runner = NodeRunner()  # type: ignore
         name = 'sample.js'
     else:
         raise ValueError('Unknown language')
     root_dir = temp_files_factory([f'api/GET/{name}'])
     sample = load_code_samples(root_dir)[0]
     return runner, sample
def test_reusing_response_from_prev_requests(
        run_sys_cmd, mocked_parse_stdout, temp_files_factory, reporter,
        no_cleanup):
    root_dir = temp_files_factory([
        'api/user/POST/curl',
        'api/user/{id}/GET/curl'
    ])
    samples = load_code_samples(root_dir)
    assert samples[-1].http_method == HttpMethod.get

    mocked_parse_stdout.return_value = ({'id': 1}, 200)
    original_source_code = 'curl website/api/user/{id}'
    expected_source_code = 'curl website/api/user/1'
    samples[-1].path.write_text(original_source_code)

    session = TestSession(samples)
    session.run()
    actual_code = session.runners[Language.shell].tmp_sample_path.read_text()
    assert actual_code == expected_source_code
def test_http_methods_parsing(dir_name, expected_method, temp_files_factory,
                              run_sys_cmd):
    root_dir = temp_files_factory([f'api/{dir_name}/sample.js'])
    samples = load_code_samples(root_dir)
    assert samples
    assert samples[0].http_method == expected_method
def test_correct_name_is_loaded(sample_path, expected_name, temp_files_factory,
                                run_sys_cmd):
    root_dir = temp_files_factory([sample_path])
    samples = load_code_samples(root_dir)
    assert samples
    assert samples[0].name == expected_name