-
Notifications
You must be signed in to change notification settings - Fork 9
/
watcher_test.py
130 lines (102 loc) · 3.84 KB
/
watcher_test.py
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
122
123
124
125
126
127
128
129
130
import os
import uuid
import unittest
from unittest.mock import Mock, patch
import watcher
from adapters import SendAdapter
class NoopAdapter(SendAdapter):
def __init__(self):
self.calls = {
'send': []
}
def send(self, data):
self.calls['send'].append(data)
return True
@classmethod
def get_parser(cls):
pass
@classmethod
def get_name(cls):
pass
@classmethod
def get_description(cls):
pass
class Args:
def __init__(self, url=None, adapter='noop', user_agent='firefox', xpath='//body', tolerance=0):
self.url = url if url is not None else f'https://{uuid.uuid4()}.org'
self.adapter = adapter
self.user_agent = user_agent
self.xpath = xpath
self.tolerance = tolerance
doc1 = '''
<html>
<body>
<div id="d1">Some text including umlauts äöü.</div>
<div id="d2">Not changing</div>
</body>
</html>
'''
doc2 = '''
<html>
<body>
<div id="d1">Some text including umlauts äöü (changed)</div>
<div id="d2">Not changing</div>
</body>
</html>
'''
class WatcherTests(unittest.TestCase):
@patch('watcher.requests.get', autospec=True)
@patch('adapters.SendAdapterFactory.get', autospec=True)
def test_ignore_change_in_different_xpath(self, adapter_factory_mock, request_mock):
noop_adapter = NoopAdapter()
# Set up mocks
adapter_factory_mock.return_value = noop_adapter
request_mock.return_value.status_code = 200
request_mock.return_value.text = doc1
args = Args(xpath='//div[@id="d2"]')
# First call
watcher.main(args, None)
self.assertEqual(len(noop_adapter.calls['send']), 1)
self.assertEqual(noop_adapter.calls['send'][0].diff, 12) # 'A'
self.assertEqual(noop_adapter.calls['send'][0].url, args.url)
request_mock.return_value.text = doc2
# Second call
watcher.main(args, None)
self.assertEqual(len(noop_adapter.calls['send']), 1) # same as before
@patch('watcher.requests.get', autospec=True)
@patch('adapters.SendAdapterFactory.get', autospec=True)
def test_detect_change_in_same_xpath(self, adapter_factory_mock, request_mock):
noop_adapter = NoopAdapter()
# Set up mocks
adapter_factory_mock.return_value = noop_adapter
request_mock.return_value.status_code = 200
request_mock.return_value.text = doc1
args = Args(xpath='//div[@id="d1"]')
# First call
watcher.main(args, None)
self.assertEqual(len(noop_adapter.calls['send']), 1)
self.assertEqual(noop_adapter.calls['send'][0].diff, 32)
self.assertEqual(noop_adapter.calls['send'][0].url, args.url)
request_mock.return_value.text = doc2
# Second call
watcher.main(args, None)
self.assertEqual(len(noop_adapter.calls['send']), 2)
self.assertEqual(noop_adapter.calls['send'][1].diff, 11) # 9 new chars, minus '.', plus ' '
self.assertEqual(noop_adapter.calls['send'][1].url, args.url)
@patch('watcher.requests.get', autospec=True)
@patch('adapters.SendAdapterFactory.get', autospec=True)
def test_ignore_changes_below_tolerance(self, adapter_factory_mock, request_mock):
noop_adapter = NoopAdapter()
# Set up mocks
adapter_factory_mock.return_value = noop_adapter
request_mock.return_value.status_code = 200
request_mock.return_value.text = doc1
args = Args(xpath='/*', tolerance=12)
# First call
watcher.main(args, None)
self.assertEqual(len(noop_adapter.calls['send']), 1)
self.assertEqual(noop_adapter.calls['send'][0].url, args.url)
request_mock.return_value.text = doc2
# Second call
watcher.main(args, None)
self.assertEqual(len(noop_adapter.calls['send']), 1)