aboutsummaryrefslogtreecommitdiff
path: root/tests/suite/test_suite.py
blob: 925558fae5299cfbd619b81b0710d782fcf02f80 (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# ############################################################################ #
#                                                                              #
#                                                         :::      ::::::::    #
#    test_suite.py                                      :+:      :+:    :+:    #
#                                                     +:+ +:+         +:+      #
#    By: cacharle <me@cacharle.xyz>                 +#+  +:+       +#+         #
#                                                 +#+#+#+#+#+   +#+            #
#    Created: 2021/03/06 11:20:47 by cacharle          #+#    #+#              #
#    Updated: 2021/03/06 16:01:03 by cacharle         ###   ########.fr        #
#                                                                              #
# ############################################################################ #

import pytest
from pathlib import Path

from minishell_test.suite.suite import Suite, NoMatchException, SuiteExitFirstException
from minishell_test.config import Config


class TestSuite:
    @pytest.fixture
    def available_suite_names(self, monkeypatch):
        s = [
            Suite(None, 'bonjour', 'grouped', False, 'nice description'),
            Suite(None, 'aurevoir', 'notgrouped', False, 'not nice description'),
            Suite(None, 'ft', 'yes', False, 'no'),
            Suite(None, 'ft_strlen', 'yes', False, 'no'),
            Suite(None, 'charles', 'cabergs', False, 'est super'),
            Suite(None, 'guillaume', 'cabergs', False, 'est super'),
            Suite(None, 'bonus', 'yes', True, 'est super'),
        ]
        monkeypatch.setattr(Suite, '_available', s)

    def test_list(self, monkeypatch, available_suite_names):
        assert """\
grouped/bonjour ....... nice description
notgrouped/aurevoir ... not nice description
yes/ft ................ no
yes/ft_strlen ......... no
cabergs/charles ....... est super
cabergs/guillaume ..... est super
yes/bonus ............. est super
""" == Suite.list()

    def test_asked_names(self, monkeypatch, available_suite_names):
        def suite_names_set(suites):
            return {s._name for s in suites}
        monkeypatch.setattr(Config, "bonus", False)
        assert {"charles"}                  == suite_names_set(Suite._asked_suites(["charl"]))
        assert {"guillaume"}                == suite_names_set(Suite._asked_suites(["gui"]))
        assert {"charles", "guillaume"}     == suite_names_set(Suite._asked_suites(["cab"]))
        assert {"ft", "ft_strlen"}          == suite_names_set(Suite._asked_suites(["ft"]))
        assert {"ft_strlen"}                == suite_names_set(Suite._asked_suites(["ft_"]))
        assert {"ft", "ft_strlen"}          == suite_names_set(Suite._asked_suites(["yes"]))
        assert {"ft", "ft_strlen", "charles", "guillaume", "bonjour", "aurevoir"} == suite_names_set(Suite._asked_suites([]))
        monkeypatch.setattr(Config, "bonus", True)
        assert {"ft", "ft_strlen", "bonus"} == suite_names_set(Suite._asked_suites(["yes"]))
        assert {"ft", "ft_strlen", "charles", "guillaume", "bonjour", "aurevoir", "bonus"} == suite_names_set(Suite._asked_suites([]))
        with pytest.raises(NoMatchException) as e:
            Suite._asked_suites(["notanavailablename"])
        assert "notanavailablename" == e.value._name
        assert (f"Name `notanavailablename` doesn't match any suite/group name\n\t"
                 "Try to run with -l to see the available suites") == e.value.__str__()

    @pytest.fixture
    def runnable_suite(self):
        def suite_func(test):
            test("echo bonjour")
        monkeypatch.setattr(
            Suite,
            '_available',
            [Suite(suite_func, "suite_name", "suite_group", False, "suite_description")]
        )

    def test_instance_run(self, monkeypatch, capsys):
        def suite_func(test):
            test("echo bonjour")
            test("echo foo")
            test("echo bar")
        s = Suite(suite_func, "suite_name", "suite_group", False, "suite_description")
        monkeypatch.setattr(Config, 'minishell_exec_path', Path("/bin/bash"))
        s._register()
        assert len(s._tests) == 3
        assert "echo bonjour" == s._tests[0]._cmd
        assert "echo foo"     == s._tests[1]._cmd
        assert "echo bar"     == s._tests[2]._cmd
        monkeypatch.setattr(Config, 'term_cols', 20)
        s._run()
        output = capsys.readouterr()
        output_lines = output.out.splitlines()
        assert len(output_lines) == 4
        assert '#### suite_name ####' == output_lines[0]
        assert len(s._results) == 3
        assert all(r.passed for r in s._results)

        s = Suite(suite_func, "suite_name", "suite_group", False, "suite_description")
        s._register()
        monkeypatch.setattr(Config, 'range', (1, 2))
        s._run()
        output = capsys.readouterr()
        output_lines = output.out.splitlines()
        assert len(output_lines) == 3
        assert '#### suite_name ####' == output_lines[0]
        assert len(s._results) == 2
        assert all(r.passed for r in s._results)

        monkeypatch.setattr(Config, 'exit_first', True)
        monkeypatch.setattr(Config, 'minishell_exec_path', Path("/usr/bin/cat"))
        s = Suite(suite_func, "suite_name", "suite_group", False, "suite_description")
        s._register()
        with pytest.raises(SuiteExitFirstException):
            s._run()
        output = capsys.readouterr()
        output_lines = output.out.splitlines()
        assert len(output_lines) == 2
        assert '#### suite_name ####' == output_lines[0]
        assert len(s._results) == 1
        assert all(r.failed for r in s._results)

    def test_summarize(self):
        assert False