1from __future__ import annotations
2
3import time
4from pathlib import Path
5
6import pytest
7
8from watchdog.events import FileModifiedEvent, FileOpenedEvent, LoggingEventHandler
9from watchdog.observers.api import BaseObserver, EventDispatcher, EventEmitter, EventQueue, ObservedWatch
10
11
12def test_observer_constructor():
13    ObservedWatch(Path("/foobar"), recursive=True)
14
15
16def test_observer__eq__():
17    watch1 = ObservedWatch("/foobar", recursive=True)
18    watch2 = ObservedWatch("/foobar", recursive=True)
19    watch_ne1 = ObservedWatch("/foo", recursive=True)
20    watch_ne2 = ObservedWatch("/foobar", recursive=False)
21
22    assert watch1 == watch2
23    assert watch1.__eq__(watch2)
24    assert not watch1.__eq__(watch_ne1)
25    assert not watch1.__eq__(watch_ne2)
26
27
28def test_observer__ne__():
29    watch1 = ObservedWatch("/foobar", recursive=True)
30    watch2 = ObservedWatch("/foobar", recursive=True)
31    watch_ne1 = ObservedWatch("/foo", recursive=True)
32    watch_ne2 = ObservedWatch("/foobar", recursive=False)
33
34    assert not watch1.__ne__(watch2)
35    assert watch1.__ne__(watch_ne1)
36    assert watch1.__ne__(watch_ne2)
37
38
39def test_observer__repr__():
40    observed_watch = ObservedWatch("/foobar", recursive=True)
41    repr_str = "<ObservedWatch: path='/foobar', is_recursive=True>"
42    assert observed_watch.__repr__() == repr(observed_watch)
43    assert repr(observed_watch) == repr_str
44
45    observed_watch = ObservedWatch("/foobar", recursive=False, event_filter=[FileOpenedEvent, FileModifiedEvent])
46    repr_str = "<ObservedWatch: path='/foobar', is_recursive=False, event_filter=FileModifiedEvent|FileOpenedEvent>"
47    assert observed_watch.__repr__() == repr(observed_watch)
48    assert repr(observed_watch) == repr_str
49
50
51def test_event_emitter():
52    event_queue = EventQueue()
53    watch = ObservedWatch("/foobar", recursive=True)
54    event_emitter = EventEmitter(event_queue, watch, timeout=1)
55    event_emitter.queue_event(FileModifiedEvent("/foobar/blah"))
56
57
58def test_event_dispatcher():
59    event = FileModifiedEvent("/foobar")
60    watch = ObservedWatch("/path", recursive=True)
61
62    class TestableEventDispatcher(EventDispatcher):
63        def dispatch_event(self, event, watch):
64            assert True
65
66    event_dispatcher = TestableEventDispatcher()
67    event_dispatcher.event_queue.put((event, watch))
68    event_dispatcher.start()
69    time.sleep(1)
70    event_dispatcher.stop()
71    event_dispatcher.join()
72
73
74def test_observer_basic():
75    observer = BaseObserver(EventEmitter)
76    handler = LoggingEventHandler()
77
78    watch = observer.schedule(handler, "/foobar", recursive=True)
79    observer.add_handler_for_watch(handler, watch)
80    observer.add_handler_for_watch(handler, watch)
81    observer.remove_handler_for_watch(handler, watch)
82    with pytest.raises(KeyError):
83        observer.remove_handler_for_watch(handler, watch)
84    observer.unschedule(watch)
85    with pytest.raises(KeyError):
86        observer.unschedule(watch)
87
88    watch = observer.schedule(handler, "/foobar", recursive=True)
89    observer.event_queue.put((FileModifiedEvent("/foobar"), watch))
90    observer.start()
91    time.sleep(1)
92    observer.unschedule_all()
93    observer.stop()
94    observer.join()
95