summaryrefslogtreecommitdiffstats
path: root/tests/languages/r_test.py
blob: 5c046efed7cf19e070251eeae476463148b68972 (plain)
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
import os.path

import pytest

from pre_commit.languages import r
from testing.fixtures import make_config_from_repo
from testing.fixtures import make_repo
from tests.repository_test import _get_hook_no_install


def _test_r_parsing(
    tempdir_factory,
    store,
    hook_id,
    expected_hook_expr={},
    expected_args={},
):
    repo_path = 'r_hooks_repo'
    path = make_repo(tempdir_factory, repo_path)
    config = make_config_from_repo(path)
    hook = _get_hook_no_install(config, store, hook_id)
    ret = r._cmd_from_hook(hook)
    expected_cmd = 'Rscript'
    expected_opts = (
        '--no-save', '--no-restore', '--no-site-file', '--no-environ',
    )
    expected_path = os.path.join(
        hook.prefix.prefix_dir, '.'.join([hook_id, 'R']),
    )
    expected = (
        expected_cmd,
        *expected_opts,
        *(expected_hook_expr or (expected_path,)),
        *expected_args,
    )
    assert ret == expected


def test_r_parsing_file_no_opts_no_args(tempdir_factory, store):
    hook_id = 'parse-file-no-opts-no-args'
    _test_r_parsing(tempdir_factory, store, hook_id)


def test_r_parsing_file_opts_no_args(tempdir_factory, store):
    with pytest.raises(ValueError) as excinfo:
        r._entry_validate(['Rscript', '--no-init', '/path/to/file'])

    msg = excinfo.value.args
    assert msg == (
        'The only valid syntax is `Rscript -e {expr}`',
        'or `Rscript path/to/hook/script`',
    )


def test_r_parsing_file_no_opts_args(tempdir_factory, store):
    hook_id = 'parse-file-no-opts-args'
    expected_args = ['--no-cache']
    _test_r_parsing(
        tempdir_factory, store, hook_id, expected_args=expected_args,
    )


def test_r_parsing_expr_no_opts_no_args1(tempdir_factory, store):
    hook_id = 'parse-expr-no-opts-no-args-1'
    _test_r_parsing(
        tempdir_factory, store, hook_id, expected_hook_expr=('-e', '1+1'),
    )


def test_r_parsing_expr_no_opts_no_args2(tempdir_factory, store):
    with pytest.raises(ValueError) as execinfo:
        r._entry_validate(['Rscript', '-e', '1+1', '-e', 'letters'])
    msg = execinfo.value.args
    assert msg == ('You can supply at most one expression.',)


def test_r_parsing_expr_opts_no_args2(tempdir_factory, store):
    with pytest.raises(ValueError) as execinfo:
        r._entry_validate(
            [
                'Rscript', '--vanilla', '-e', '1+1', '-e', 'letters',
            ],
        )
    msg = execinfo.value.args
    assert msg == (
        'The only valid syntax is `Rscript -e {expr}`',
        'or `Rscript path/to/hook/script`',
    )


def test_r_parsing_expr_args_in_entry2(tempdir_factory, store):
    with pytest.raises(ValueError) as execinfo:
        r._entry_validate(['Rscript', '-e', 'expr1', '--another-arg'])

    msg = execinfo.value.args
    assert msg == ('You can supply at most one expression.',)


def test_r_parsing_expr_non_Rscirpt(tempdir_factory, store):
    with pytest.raises(ValueError) as execinfo:
        r._entry_validate(['AnotherScript', '-e', '{{}}'])

    msg = execinfo.value.args
    assert msg == ('entry must start with `Rscript`.',)