File: pytest_plugin.rst

package info (click to toggle)
python-time-machine 2.19.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 476 kB
  • sloc: python: 1,826; ansic: 639; makefile: 14
file content (104 lines) | stat: -rw-r--r-- 3,022 bytes parent folder | download
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
=============
pytest plugin
=============

time-machine works as a pytest plugin, which pytest will detect automatically.
The plugin supplies both a fixture and a marker to control the time during tests.

``time_machine`` marker
-----------------------

Use the ``time_machine`` `marker <https://docs.pytest.org/en/stable/how-to/mark.html>`__ with a valid destination for :class:`~.travel` to mock the time while a test function runs.
It applies for function-scoped fixtures too, meaning the time will be mocked for any setup or teardown code done in the test function.

For example:

.. code-block:: python

    import datetime as dt


    @pytest.mark.time_machine(dt.datetime(1985, 10, 26))
    def test_delorean_marker():
        assert dt.date.today().isoformat() == "1985-10-26"

Or for a class:

.. code-block:: python

    import datetime as dt

    import pytest


    @pytest.mark.time_machine(dt.datetime(1985, 10, 26))
    class TestSomething:
        def test_one(self):
            assert dt.date.today().isoformat() == "1985-10-26"

        def test_two(self):
            assert dt.date.today().isoformat() == "1985-10-26"

``time_machine`` fixture
------------------------

Use the function-scoped `fixture <https://docs.pytest.org/en/stable/explanation/fixtures.html#about-fixtures>`__ ``time_machine`` to control time in your tests.
It provides an object with two methods, ``move_to()`` and ``shift()``, which work the same as their equivalents in the :class:`time_machine.Coordinates` class.
Until you call ``move_to()``, time is not mocked.

For example:

.. code-block:: python

    import datetime as dt


    def test_delorean(time_machine):
        time_machine.move_to(dt.datetime(1985, 10, 26))

        assert dt.date.today().isoformat() == "1985-10-26"

        time_machine.move_to(dt.datetime(2015, 10, 21))

        assert dt.date.today().isoformat() == "2015-10-21"

        time_machine.shift(dt.timedelta(days=1))

        assert dt.date.today().isoformat() == "2015-10-22"

If you are using pytest test classes, you can apply the fixture to all test methods in a class by adding an autouse fixture:

.. code-block:: python

    import time

    import pytest


    class TestSomething:
        @pytest.fixture(autouse=True)
        def set_time(self, time_machine):
            time_machine.move_to(1000.0)

        def test_one(self):
            assert int(time.time()) == 1000.0

        def test_two(self, time_machine):
            assert int(time.time()) == 1000.0
            time_machine.move_to(2000.0)
            assert int(time.time()) == 2000.0

It’s possible to combine the marker and fixture in the same test:

.. code-block:: python

    import datetime as dt

    import pytest


    @pytest.mark.time_machine(dt.datetime(1985, 10, 26))
    def test_delorean_marker_and_fixture(time_machine):
        assert dt.date.today().isoformat() == "1985-10-26"
        time_machine.move_to(dt.datetime(2015, 10, 21))
        assert dt.date.today().isoformat() == "2015-10-21"