1
1
from django.test import TestCase
3
from main.models import Hacker, OneLiner, Vote
3
from oneliners.models import Tag, AcceptedAnswer, Question, OneLiner, Answer, User
4
from oneliners.forms import SearchOneLinerForm, EditOneLinerForm
7
def new_hacker(username):
8
hacker = Hacker(username=username)
9
def new_user(username):
10
user = User(username=username)
13
def new_oneliner(hacker, line):
14
oneliner = OneLiner(hacker=hacker, line=line)
15
def new_oneliner(user, line, summary=None, explanation=None, limitations=None):
17
summary = '(incorrectly omitted)'
18
if explanation is None:
19
explanation = '(incorrectly omitted)'
20
if limitations is None:
21
limitations = '(this is optional)'
22
oneliner = OneLiner(user=user, line=line, summary=summary, explanation=explanation, limitations=limitations)
31
def new_question(user):
32
question = Question(user=user)
37
def new_answer(question, oneliner):
38
answer = Answer(question=question, oneliner=oneliner)
43
class EditOneLinerTests(TestCase):
45
self.jack = Util.new_user('jack')
46
self.jacks_oneliner = Util.new_oneliner(self.jack, 'echo jack')
48
self.frank = Util.new_user('frank')
49
self.franks_oneliner = Util.new_oneliner(self.frank, 'echo frank')
51
def test_save_own_success(self):
52
oneliner0 = self.jacks_oneliner
54
'summary': oneliner0.summary,
55
'line': oneliner0.line,
56
'explanation': oneliner0.explanation,
57
'action': EditOneLinerForm.action_save,
59
new_summary = oneliner0.summary + ' some change'
60
data['summary'] = new_summary
62
form = EditOneLinerForm(self.jack, data, instance=oneliner0)
63
self.assertTrue(form.is_valid())
64
oneliner1 = form.save()
66
self.assertEquals(oneliner1.summary, new_summary)
67
self.assertEquals(oneliner1.user, self.jack)
69
def test_save_own_failure(self):
70
oneliner0 = self.jacks_oneliner
72
'summary': oneliner0.summary,
73
'line': oneliner0.line,
74
'action': EditOneLinerForm.action_save,
76
new_summary = oneliner0.summary + ' some change'
77
data['summary'] = new_summary
79
form = EditOneLinerForm(self.jack, data, instance=oneliner0)
80
self.assertFalse(form.is_valid())
82
error_items = form.errors.items()
83
self.assertEquals(len(error_items), 1)
84
self.assertEquals(error_items[0][0], 'explanation')
86
def test_save_notown_failure(self):
87
oneliner0 = self.jacks_oneliner
89
'summary': oneliner0.summary,
90
'line': oneliner0.line,
91
'explanation': oneliner0.explanation,
92
'action': EditOneLinerForm.action_save,
95
form = EditOneLinerForm(self.frank, data, instance=self.jacks_oneliner)
96
self.assertFalse(form.is_valid())
98
error_items = form.errors.items()
99
self.assertEquals(len(error_items), 1)
100
self.assertEquals(error_items[0][0], '__all__')
23
103
class VoteTests(TestCase):
25
self.jack = Util.new_hacker('jack')
26
self.jacks_oneliner = Util.new_oneliner(self.jack, 'echo jack')
28
self.mike = Util.new_hacker('mike')
29
self.mikes_oneliner = Util.new_oneliner(self.mike, 'echo mike')
31
self.frank = Util.new_hacker('frank')
32
self.franks_oneliner = Util.new_oneliner(self.frank, 'echo frank')
105
self.jack = Util.new_user('jack')
106
self.jacks_oneliner = Util.new_oneliner(self.jack, 'echo jack')
108
self.mike = Util.new_user('mike')
109
self.mikes_oneliner = Util.new_oneliner(self.mike, 'echo mike')
111
self.frank = Util.new_user('frank')
112
self.franks_oneliner = Util.new_oneliner(self.frank, 'echo frank')
34
114
def test_multiple_vote_tolerance(self):
35
self.assertEquals(self.jacks_oneliner.get_votes_up(), 0)
36
self.jacks_oneliner.vote_up(self.jack)
37
self.assertEquals(self.jacks_oneliner.get_votes_up(), 0)
38
self.jacks_oneliner.vote_up(self.mike)
39
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
40
self.jacks_oneliner.vote_up(self.mike)
41
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
42
self.jacks_oneliner.vote_up(self.mike)
43
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
115
self.assertEquals(self.jacks_oneliner.get_votes_up(), 0)
116
self.jacks_oneliner.vote_up(self.jack)
117
self.assertEquals(self.jacks_oneliner.get_votes_up(), 0)
118
self.jacks_oneliner.vote_up(self.mike)
119
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
120
self.jacks_oneliner.vote_up(self.mike)
121
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
122
self.jacks_oneliner.vote_up(self.mike)
123
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
45
125
def test_vote_counts(self):
46
self.assertEquals(self.jacks_oneliner.get_votes_up(), 0)
47
self.jacks_oneliner.vote_up(self.jack)
48
self.assertEquals(self.jacks_oneliner.get_votes_up(), 0)
49
self.jacks_oneliner.vote_up(self.mike)
50
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
51
self.jacks_oneliner.vote_up(self.frank)
52
self.assertEquals(self.jacks_oneliner.get_votes_up(), 2)
53
self.jacks_oneliner.vote_up(self.frank)
54
self.assertEquals(self.jacks_oneliner.get_votes_up(), 2)
55
self.jacks_oneliner.vote_down(self.frank)
56
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
57
self.assertEquals(self.jacks_oneliner.get_votes_down(), 1)
58
self.assertEquals(self.jacks_oneliner.get_votes(), (1, 1))
61
class TopTests(TestCase):
63
self.jack = Util.new_hacker('jack')
64
self.jacks_oneliner = Util.new_oneliner(self.jack, 'echo jack')
66
self.mike = Util.new_hacker('mike')
67
self.mikes_oneliner = Util.new_oneliner(self.mike, 'echo mike')
70
u1 = Util.new_hacker('u1')
71
u2 = Util.new_hacker('u2')
72
u3 = Util.new_hacker('u3')
74
self.jacks_oneliner.vote_up(u1)
75
self.assertEquals(OneLiner.top()[0], self.jacks_oneliner)
77
self.mikes_oneliner.vote_up(u1)
78
self.mikes_oneliner.vote_up(u2)
79
self.assertEquals(OneLiner.top()[0], self.mikes_oneliner)
81
self.jacks_oneliner.vote_up(u2)
82
self.jacks_oneliner.vote_up(u3)
83
self.assertEquals(OneLiner.top()[0], self.jacks_oneliner)
85
u4 = Util.new_hacker('u4')
86
u5 = Util.new_hacker('u5')
87
self.mikes_oneliner.vote_down(u4)
88
self.mikes_oneliner.vote_down(u5)
89
self.assertEquals(OneLiner.top()[0], self.jacks_oneliner)
126
self.assertEquals(self.jacks_oneliner.get_votes_up(), 0)
127
self.jacks_oneliner.vote_up(self.jack)
128
self.assertEquals(self.jacks_oneliner.get_votes_up(), 0)
129
self.jacks_oneliner.vote_up(self.mike)
130
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
131
self.jacks_oneliner.vote_up(self.frank)
132
self.assertEquals(self.jacks_oneliner.get_votes_up(), 2)
133
self.jacks_oneliner.vote_up(self.frank)
134
self.assertEquals(self.jacks_oneliner.get_votes_up(), 2)
135
self.jacks_oneliner.vote_down(self.frank)
136
self.assertEquals(self.jacks_oneliner.get_votes_up(), 1)
137
self.assertEquals(self.jacks_oneliner.get_votes_down(), 1)
138
self.assertEquals(self.jacks_oneliner.get_votes(), (1, 1))
141
class RecentTests(TestCase):
143
self.jack = Util.new_user('jack')
144
self.jacks_oneliner = Util.new_oneliner(self.jack, 'echo jack')
146
self.mike = Util.new_user('mike')
147
self.mikes_oneliner = Util.new_oneliner(self.mike, 'echo mike')
149
def xtest_recent(self):
150
u1 = Util.new_user('u1')
151
u2 = Util.new_user('u2')
152
u3 = Util.new_user('u3')
154
self.jacks_oneliner.vote_up(u1)
155
self.assertEquals(OneLiner.recent()[0], self.jacks_oneliner)
157
self.mikes_oneliner.vote_up(u1)
158
self.mikes_oneliner.vote_up(u2)
159
self.assertEquals(OneLiner.recent()[0], self.mikes_oneliner)
161
self.jacks_oneliner.vote_up(u2)
162
self.jacks_oneliner.vote_up(u3)
163
self.assertEquals(OneLiner.recent()[0], self.jacks_oneliner)
165
u4 = Util.new_user('u4')
166
u5 = Util.new_user('u5')
167
self.mikes_oneliner.vote_down(u4)
168
self.mikes_oneliner.vote_down(u5)
169
self.assertEquals(OneLiner.recent()[0], self.jacks_oneliner)
172
class SearchTests(TestCase):
174
self.jack = Util.new_user('jack')
175
self.jacks_oneliner = Util.new_oneliner(self.jack, 'echo jack')
177
self.mike = Util.new_user('mike')
178
self.mikes_oneliner = Util.new_oneliner(self.mike, 'echo mike')
180
self.vi_oneliner = Util.new_oneliner(self.mike, 'vi is an editor', summary='vi oneliner')
181
self.video_oneliner = Util.new_oneliner(self.mike, 'mplayer is a video manipulator', summary='mplayer oneliner')
183
self.mline_oneliner = Util.new_oneliner(self.jack, 'mline')
184
self.msummary_oneliner = Util.new_oneliner(self.jack, '', summary='msummary')
185
self.mexplanation_oneliner = Util.new_oneliner(self.jack, '', explanation='mexplanation')
186
self.mlimitations_oneliner = Util.new_oneliner(self.jack, '', limitations='mlimitations')
188
def test_simplesearch(self):
189
self.assertEquals(OneLiner.simplesearch('echo').count(), 2)
190
self.assertEquals(OneLiner.simplesearch('echo jack').count(), 1)
191
self.assertEquals(OneLiner.simplesearch('echo mike').count(), 1)
192
self.assertEquals(OneLiner.simplesearch('jack')[0], self.jacks_oneliner)
193
self.assertEquals(OneLiner.simplesearch('echo jack')[0], self.jacks_oneliner)
194
self.assertEquals(OneLiner.simplesearch('echo mike')[0], self.mikes_oneliner)
196
def get_form(self, data):
198
'match_summary': True,
200
'match_explanation': True,
201
'match_limitations': True,
204
form = SearchOneLinerForm(data=initial)
205
self.assertTrue(form.is_valid())
208
def test_match_summary(self):
209
results = OneLiner.search(self.get_form({'query': 'msummary', }))
210
self.assertEquals(len(results), 1)
211
self.assertEquals(results[0], self.msummary_oneliner)
213
results = OneLiner.search(self.get_form({'query': 'msummary', 'match_summary': False, }))
214
self.assertEquals(len(results), 0)
216
def test_match_line(self):
217
results = OneLiner.search(self.get_form({'query': 'mline', }))
218
self.assertEquals(len(results), 1)
219
self.assertEquals(results[0], self.mline_oneliner)
221
results = OneLiner.search(self.get_form({'query': 'mline', 'match_line': False, }))
222
self.assertEquals(len(results), 0)
224
def test_match_explanation(self):
225
results = OneLiner.search(self.get_form({'query': 'mexplanation', }))
226
self.assertEquals(len(results), 1)
227
self.assertEquals(results[0], self.mexplanation_oneliner)
229
results = OneLiner.search(self.get_form({'query': 'mexplanation', 'match_explanation': False, }))
230
self.assertEquals(len(results), 0)
232
def test_match_limitations(self):
233
results = OneLiner.search(self.get_form({'query': 'mlimitations', }))
234
self.assertEquals(len(results), 1)
235
self.assertEquals(results[0], self.mlimitations_oneliner)
237
results = OneLiner.search(self.get_form({'query': 'mlimitations', 'match_limitations': False, }))
238
self.assertEquals(len(results), 0)
240
def test_match_whole_words(self):
241
results = OneLiner.search(self.get_form({'query': 'vi', }))
242
self.assertEquals(len(results), 2)
244
results = OneLiner.search(self.get_form({'query': 'vi', 'match_whole_words': True, }))
245
self.assertEquals(len(results), 1)
246
self.assertEquals(results[0], self.vi_oneliner)
248
def test_match_nothing(self):
249
form = SearchOneLinerForm(data={'query': 'NOTHINGSHOULDMATCH'})
250
self.assertTrue(form.is_valid())
251
results = OneLiner.search(form)
252
self.assertEquals(len(results), 0)
255
class QuestionTests(TestCase):
257
self.user = Util.new_user('user1')
259
def test_create_question(self):
260
Util.new_question(self.user)
262
def test_list_questions(self):
263
self.assertTrue(Question.objects.all().count() == 0)
264
Util.new_question(self.user)
265
self.assertTrue(Question.objects.all().count() > 0)
267
def test_list_questions_latestfirst(self):
268
Util.new_question(self.user)
269
q2 = Util.new_question(self.user)
270
self.assertTrue(Question.objects.latest() == q2)
272
def test_list_excludes_nonpublished(self):
273
Util.new_question(self.user)
274
q2 = Util.new_question(self.user)
275
self.assertEquals(Question.latest(), q2)
276
q2.is_published = False
278
self.assertNotEquals(Question.latest(), q2)
280
def test_list_excludes_answered(self):
281
Util.new_question(self.user)
282
q2 = Util.new_question(self.user)
283
self.assertEquals(Question.latest(), q2)
284
q2.is_answered = True
286
self.assertNotEquals(Question.latest(), q2)
288
def test_answer(self):
289
q1 = Util.new_question(self.user)
290
jack = Util.new_user('jack')
291
o1 = Util.new_oneliner(jack, 'echo jack')
292
Util.new_answer(q1, o1)
294
def test_multiple_answers(self):
295
q1 = Util.new_question(self.user)
296
jack = Util.new_user('jack')
297
o1 = Util.new_oneliner(jack, 'echo jack')
298
Util.new_answer(q1, o1)
299
mike = Util.new_user('mike')
300
o2 = Util.new_oneliner(mike, 'echo mike')
301
Util.new_answer(q1, o2)
304
class AcceptedAnswerTests(TestCase):
306
self.jack = Util.new_user('jack')
307
self.oneliner = OneLiner(user=self.jack)
310
self.bill = Util.new_user('bill')
311
OneLiner(user=self.bill).save()
313
self.mike = Util.new_user('mike')
314
self.question = Question(user=self.mike)
317
def test_accept(self):
318
self.assertEqual(AcceptedAnswer.objects.count(), 0)
319
self.assertTrue(not self.question.is_answered)
321
self.question.accept_answer(self.oneliner)
322
self.assertTrue(self.question.is_answered)
323
self.assertEqual(AcceptedAnswer.objects.count(), 1)
325
self.question.accept_answer(self.oneliner)
326
self.assertTrue(self.question.is_answered)
327
self.assertEqual(AcceptedAnswer.objects.count(), 1)
329
def test_accept_clear(self):
331
self.assertTrue(AcceptedAnswer.objects.count() > 0)
332
self.assertTrue(self.question.is_answered)
334
self.question.clear_all_answers()
335
self.assertFalse(AcceptedAnswer.objects.count() > 0)
336
self.assertFalse(self.question.is_answered)
338
def test_clear_answers_when_is_answered_is_cleared(self):
340
self.assertTrue(AcceptedAnswer.objects.count() > 0)
341
self.assertTrue(self.question.is_answered)
343
self.question.is_answered = False
345
self.assertFalse(AcceptedAnswer.objects.count() > 0)
348
class TagTests(TestCase):
349
def test_tag_generator(self):
350
user = Util.new_user('jack')
352
line = 'find grep xargs'
353
oneliner = Util.new_oneliner(user, line)
354
self.assertItemsEqual(('xargs', 'grep', 'find'), oneliner.get_tags())
356
line = '''find /etc -type f -print0 2>/dev/null | xargs -0 grep --color=AUTO -Hn 'nameserver' 2>/dev/null'''
357
oneliner = Util.new_oneliner(user, line)
358
self.assertItemsEqual(('xargs', 'grep', 'find'), oneliner.get_tags())
360
line = '''MAX=$(NUM=1;cat author.xml |perl -p -e 's/(Times Cited)/\n$1/g'|grep "Times Cited" |perl -p -e 's/^Times Cited:([0-9]*).*$/$1/g'|sort -nr | while read LINE; do if [ $LINE -ge $NUM ]; then echo "$NUM"; fi; NUM=$[$NUM+1]; done;); echo "$MAX"|tail -1'''
361
oneliner = Util.new_oneliner(user, line)
362
self.assertItemsEqual((u'sort', u'do', u'grep', u'then', u'read', u'tail', u'perl', u'while', u'done', u'echo', u'fi', u'cat', u'if'), oneliner.get_tags())
364
def test_tag_cloud(self):
365
user = Util.new_user('jack')
367
Util.new_oneliner(user, 'xargs find grep')
368
Util.new_oneliner(user, 'xargs ls rm find')
369
Util.new_oneliner(user, 'xargs xargs while sleep done do')
371
tagcloud = Tag.tagcloud()
372
tagcloud = tagcloud.values_list('text', 'count')
374
self.assertEquals(3, dd['xargs'])
375
self.assertEquals(3, dd.get('xargs'))
376
self.assertEquals(2, dd['find'])
377
self.assertFalse(dd.get('BLAH'))