Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4b33143

Browse files
committed
improve test coverage
1 parent 77c2d5f commit 4b33143

File tree

6 files changed

+151
-6
lines changed

6 files changed

+151
-6
lines changed

.coveragerc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
1+
[run]
2+
source =
3+
database
4+
scheduler
5+
fetcher
6+
processor
7+
result
8+
libs
9+
110
[report]
11+
omit =
12+
libs/sample_handler.py
13+
libs/pprint.py
14+
215
exclude_lines =
316
pragma: no cover
417
def __repr__
@@ -9,3 +22,4 @@ exclude_lines =
922
if 0:
1023
if __name__ == .__main__.:
1124
except ImportError:
25+
pass

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ install:
99
- pip install --allow-all-external -r requirements.txt
1010
- pip install coveralls
1111
script:
12-
coverage run --source=database,scheduler,fetcher,processor,result,libs --omit=libs/sample_handler.py,libs/pprint.py ./runtest.py
12+
coverage run ./runtest.py
1313
after_success:
1414
- coverage combine
1515
- coveralls

database/base/resultdb.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ class ResultDB(object):
2222
"""
2323

2424
def save(self, project, taskid, url, result):
25-
pass
25+
raise NotImplementedError
2626

2727
def select(self, project, fields=None, offset=0, limit=None):
28-
pass
28+
raise NotImplementedError
2929

3030
def count(self, project):
31-
pass
31+
raise NotImplementedError
3232

3333
def get(self, project, taskid, fields=None):
34-
pass
34+
raise NotImplementedError
3535

3636
def drop(self, project):
37-
pass
37+
raise NotImplementedError

test/test_processor.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,4 +259,27 @@ def test_30_new_task(self):
259259
self.in_queue.put((task, fetch_result))
260260
time.sleep(1)
261261
self.assertFalse(self.status_queue.empty())
262+
while not self.status_queue.empty():
263+
self.status_queue.get()
262264
self.assertFalse(self.newtask_queue.empty())
265+
266+
def test_40_index_page(self):
267+
task = None
268+
while not self.newtask_queue.empty():
269+
task = self.newtask_queue.get()
270+
self.assertIsNotNone(task)
271+
272+
fetch_result = {
273+
"orig_url": task['url'],
274+
"content": "<html><body><a href='http://binux.me'>binux</a></body></html>",
275+
"headers": {},
276+
"status_code": 200,
277+
"url": task['url'],
278+
"time": 0,
279+
}
280+
self.in_queue.put((task, fetch_result))
281+
time.sleep(1)
282+
self.assertFalse(self.status_queue.empty())
283+
self.assertFalse(self.newtask_queue.empty())
284+
task = self.newtask_queue.get()
285+
self.assertEqual(task['url'], 'http://binux.me/')

test/test_result_worker.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
# vim: set et sw=4 ts=4 sts=4 ff=unix fenc=utf8:
4+
# Author: Binux<[email protected]>
5+
# http://binux.me
6+
# Created on 2014-11-11 20:52:53
7+
8+
import os
9+
import time
10+
import unittest2 as unittest
11+
import logging.config
12+
logging.config.fileConfig("logging.conf")
13+
14+
import shutil
15+
from multiprocessing import Queue
16+
from database.sqlite import resultdb
17+
from result.result_worker import ResultWorker
18+
from libs.utils import run_in_subprocess, run_in_thread
19+
class TestProcessor(unittest.TestCase):
20+
resultdb_path = './test/data/result.db'
21+
22+
@classmethod
23+
def setUpClass(self):
24+
shutil.rmtree('./test/data/', ignore_errors=True)
25+
os.makedirs('./test/data/')
26+
27+
def get_resultdb():
28+
return resultdb.ResultDB(self.resultdb_path)
29+
self.resultdb = get_resultdb()
30+
self.inqueue = Queue(10)
31+
32+
def run_result_worker():
33+
self.result_worker = ResultWorker(get_resultdb(), self.inqueue)
34+
self.result_worker.run()
35+
self.process = run_in_thread(run_result_worker)
36+
time.sleep(1)
37+
38+
@classmethod
39+
def tearDownClass(self):
40+
if self.process.is_alive():
41+
self.result_worker.quit()
42+
self.process.join(2)
43+
assert not self.process.is_alive()
44+
shutil.rmtree('./test/data/', ignore_errors=True)
45+
46+
def test_10_bad_result(self):
47+
self.inqueue.put(({'project': 'test_project'}, {}))
48+
self.resultdb._list_project()
49+
self.assertEqual(len(self.resultdb.projects), 0)
50+
self.assertEqual(self.resultdb.count('test_project'), 0)
51+
52+
def test_20_insert_result(self):
53+
data = {
54+
'a': 'b'
55+
}
56+
self.inqueue.put(({
57+
'project': 'test_project',
58+
'taskid': 'id1',
59+
'url': 'url1'
60+
}, data))
61+
time.sleep(0.1)
62+
self.resultdb._list_project()
63+
self.assertEqual(len(self.resultdb.projects), 1)
64+
self.assertEqual(self.resultdb.count('test_project'), 1)
65+
66+
result = self.resultdb.get('test_project', 'id1')
67+
self.assertEqual(result['result'], data)
68+
69+
def test_30_overwrite(self):
70+
self.inqueue.put(({
71+
'project': 'test_project',
72+
'taskid': 'id1',
73+
'url': 'url1'
74+
}, "abc"))
75+
time.sleep(0.1)
76+
result = self.resultdb.get('test_project', 'id1')
77+
self.assertEqual(result['result'], "abc")
78+
79+
def test_40_insert_list(self):
80+
self.inqueue.put(({
81+
'project': 'test_project',
82+
'taskid': 'id2',
83+
'url': 'url1'
84+
}, ['a', 'b']))
85+
time.sleep(0.1)
86+
result = self.resultdb.get('test_project', 'id2')
87+
self.assertEqual(result['result'], ['a', 'b'])

test/test_scheduler.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ def test_10_new_task_ignore(self):
128128
'url': 'url'
129129
})
130130
self.assertEqual(self.rpc.size(), 0)
131+
self.assertEqual(len(self.rpc.get_active_tasks()), 0)
131132

132133
def test_20_new_project(self):
133134
self.projectdb.insert('test_project', {
@@ -145,6 +146,7 @@ def test_30_update_project(self):
145146
with self.assertRaises(Queue.Empty):
146147
task = self.scheduler2fetcher.get(timeout=0.1)
147148
self.projectdb.update('test_project', status="DEBUG")
149+
self.rpc.update_project()
148150

149151
task = self.scheduler2fetcher.get(timeout=5)
150152
self.assertIsNotNone(task)
@@ -173,6 +175,7 @@ def test_35_new_task(self):
173175
self.assertEqual(self.rpc.counter('all', 'sum')['test_project']['pending'], 1)
174176

175177
task = self.scheduler2fetcher.get(timeout=5)
178+
self.assertEqual(len(self.rpc.get_active_tasks()), 1)
176179
self.assertIsNotNone(task)
177180
self.assertEqual(task['project'], 'test_project')
178181
self.assertIn('fetch', task)
@@ -258,6 +261,24 @@ def test_80_newtask_age_ignore(self):
258261
time.sleep(0.1)
259262
self.assertEqual(self.rpc.size(), 0)
260263

264+
def test_82_newtask_via_rpc(self):
265+
self.rpc.newtask({
266+
'taskid': 'taskid',
267+
'project': 'test_project',
268+
'url': 'url',
269+
'fetch': {
270+
'data': 'abc',
271+
},
272+
'process': {
273+
'data': 'abc',
274+
},
275+
'schedule': {
276+
'age': 30,
277+
},
278+
})
279+
time.sleep(0.1)
280+
self.assertEqual(self.rpc.size(), 0)
281+
261282
def test_90_newtask_with_itag(self):
262283
time.sleep(0.1)
263284
self.newtask_queue.put({

0 commit comments

Comments
 (0)