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