impostor 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. data/History.txt +4 -0
  2. data/Manifest.txt +50 -0
  3. data/README.txt +65 -0
  4. data/Rakefile +40 -0
  5. data/lib/impostor.rb +6 -0
  6. data/lib/www/impostor/phpbb2.rb +260 -0
  7. data/lib/www/impostor/wwf79.rb +254 -0
  8. data/lib/www/impostor/wwf80.rb +264 -0
  9. data/lib/www/impostor.rb +269 -0
  10. data/test/fixtures/phpbb2-get-new_topic-form-good-response.html +725 -0
  11. data/test/fixtures/phpbb2-get-viewtopic-for-new-topic-good-response.html +364 -0
  12. data/test/fixtures/phpbb2-get-viewtopic-for-new-topic-malformed-response.html +364 -0
  13. data/test/fixtures/phpbb2-index.html +361 -0
  14. data/test/fixtures/phpbb2-logged-in.html +349 -0
  15. data/test/fixtures/phpbb2-login.html +306 -0
  16. data/test/fixtures/phpbb2-not-logged-in.html +349 -0
  17. data/test/fixtures/phpbb2-post-new_topic-good-response.html +290 -0
  18. data/test/fixtures/phpbb2-post-reply-good-response.html +290 -0
  19. data/test/fixtures/phpbb2-post-reply-throttled-response.html +290 -0
  20. data/test/fixtures/phpbb2-too-many-posts.html +290 -0
  21. data/test/fixtures/wwf79-forum_posts.html +422 -0
  22. data/test/fixtures/wwf79-general-new-topic-error.html +46 -0
  23. data/test/fixtures/wwf79-general-posting-error.html +46 -0
  24. data/test/fixtures/wwf79-good-post-forum_posts.html +462 -0
  25. data/test/fixtures/wwf79-index.html +137 -0
  26. data/test/fixtures/wwf79-logged-in.html +46 -0
  27. data/test/fixtures/wwf79-login.html +123 -0
  28. data/test/fixtures/wwf79-new-topic-forum_posts-response.html +305 -0
  29. data/test/fixtures/wwf79-new-topic-post_message_form.html +212 -0
  30. data/test/fixtures/wwf79-not-logged-in.html +128 -0
  31. data/test/fixtures/wwf79-too-many-posts.html +46 -0
  32. data/test/fixtures/wwf79-too-many-topics.html +46 -0
  33. data/test/fixtures/wwf80-general-posting-error.html +54 -0
  34. data/test/fixtures/wwf80-get-new_topic-form-good-response.html +217 -0
  35. data/test/fixtures/wwf80-get-viewtopic-for-new-topic-good-response.html +290 -0
  36. data/test/fixtures/wwf80-index.html +371 -0
  37. data/test/fixtures/wwf80-logged-in.html +52 -0
  38. data/test/fixtures/wwf80-login.html +125 -0
  39. data/test/fixtures/wwf80-new_reply_form.html +204 -0
  40. data/test/fixtures/wwf80-not-logged-in.html +136 -0
  41. data/test/fixtures/wwf80-post-new_topic-good-response.html +293 -0
  42. data/test/fixtures/wwf80-post-reply-good-response.html +331 -0
  43. data/test/fixtures/wwf80-too-many-posts.html +54 -0
  44. data/test/test_helper.rb +38 -0
  45. data/test/test_www_impostor.rb +165 -0
  46. data/test/test_www_impostor_phpbb2.rb +536 -0
  47. data/test/test_www_impostor_wwf79.rb +535 -0
  48. data/test/test_www_impostor_wwf80.rb +535 -0
  49. data/vendor/plugins/impostor/lib/autotest/discover.rb +3 -0
  50. data/vendor/plugins/impostor/lib/autotest/impostor.rb +49 -0
  51. data.tar.gz.sig +3 -0
  52. metadata +156 -0
  53. metadata.gz.sig +3 -0
@@ -0,0 +1,536 @@
1
+ require File.join(File.dirname(__FILE__), "..", "lib", "www", "impostor")
2
+ require File.join(File.dirname(__FILE__), "..", "lib", "www", "impostor", "phpbb2")
3
+ require File.join(File.dirname(__FILE__), "test_helper")
4
+
5
+ require 'test/unit'
6
+ require 'rubygems'
7
+ require 'mocha'
8
+ require 'mechanize'
9
+
10
+ class TestWwwImpostorPhpbb2 < Test::Unit::TestCase
11
+ include TestHelper
12
+
13
+ def setup
14
+ @cookie_jar = File.join(Dir.tmpdir, 'www_impostor_phpbb_test.yml')
15
+ @app_root = 'http://localhost/phpbb2/'
16
+ @im = WWW::Impostor.new(config())
17
+ end
18
+
19
+ def teardown
20
+ File.delete(@cookie_jar) if File.exist?(@cookie_jar)
21
+ end
22
+
23
+ def config(config={})
24
+ c = {:type => :phpbb2,
25
+ :app_root => @app_root,
26
+ :login_page => 'login.php',
27
+ :posting_page => 'posting.php',
28
+ :user_agent => 'Windows IE 7',
29
+ :username => 'tester',
30
+ :password => 'test',
31
+ :cookie_jar => @cookie_jar
32
+ }.merge(config)
33
+ c
34
+ end
35
+
36
+ def phpbb2_good_submit_post_form
37
+ %q!<form action="posting.php" method="post" name="post">
38
+ <input name="post" type="submit">
39
+ <input name="message" value="" type="hidden">
40
+ </form>!
41
+ end
42
+
43
+ def phpbb2_good_submit_new_topic_form
44
+ %q!<form action="posting.php" method="post" name="post">
45
+ <input name="post" type="submit">
46
+ <input name="subject" type="text">
47
+ <input name="message" value="" type="hidden">
48
+ </form>!
49
+ end
50
+
51
+ def test_initialize_with_cookie_jar
52
+ FileUtils.touch(@cookie_jar)
53
+
54
+ WWW::Mechanize::CookieJar.any_instance.expects(:load).once.with(@cookie_jar)
55
+ im = WWW::Impostor.new(config())
56
+ assert im
57
+ end
58
+
59
+ def test_initialize_without_cookie_jar
60
+ WWW::Mechanize::CookieJar.any_instance.expects(:load).never
61
+ im = WWW::Impostor.new(config())
62
+ assert im
63
+ end
64
+
65
+ def test_version
66
+ assert @im.version
67
+ end
68
+
69
+ def test_should_be_logged_in?
70
+ response = {'content-type' => 'text/html'}
71
+ body = load_page('phpbb2-logged-in.html').join
72
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
73
+ assert_equal true, @im.send(:logged_in?, page)
74
+ end
75
+
76
+ def test_should_not_be_logged_in?
77
+ response = {'content-type' => 'text/html'}
78
+ body = load_page('phpbb2-not-logged-in.html').join
79
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
80
+ assert_equal false, @im.send(:logged_in?, page)
81
+ end
82
+
83
+ def test_fetch_login_page
84
+ page = load_page('phpbb2-login.html').join
85
+ WWW::Mechanize.any_instance.expects(:get).once.with(
86
+ URI.join(@app_root, config[:login_page])
87
+ ).returns(page)
88
+
89
+ assert_equal page, @im.send(:fetch_login_page)
90
+ end
91
+
92
+ def test_login_form_and_button_should_raise_login_error_when_form_is_missing
93
+ err = assert_raise(WWW::Impostor::LoginError) do
94
+ form, button = @im.send(:login_form_and_button, nil)
95
+ end
96
+ assert_equal "unknown login page format", err.original_exception.message
97
+ end
98
+
99
+ def test_login_form_and_button_should_return_a_form_and_button
100
+ response = {'content-type' => 'text/html'}
101
+ body = load_page('phpbb2-login.html').join
102
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
103
+ form, button = @im.send(:login_form_and_button, page)
104
+ assert_equal true, form.is_a?(WWW::Mechanize::Form)
105
+ assert_equal true, button.is_a?(WWW::Mechanize::Form::Button)
106
+ end
107
+
108
+ def test_post_login_should_return_page
109
+ response = {'content-type' => 'text/html'}
110
+ body = load_page('phpbb2-logged-in.html').join
111
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
112
+ form = mock()
113
+ button = mock()
114
+ WWW::Mechanize.any_instance.expects(:submit).once.with(form, button).returns(page)
115
+
116
+ assert_equal page, @im.send(:post_login, form, button)
117
+ end
118
+
119
+ def test_post_login_should_raise_login_error
120
+ errmsg = "from test #{Time.now.to_s}"
121
+ WWW::Mechanize.any_instance.expects(:submit).raises(StandardError, errmsg)
122
+ err = assert_raise(WWW::Impostor::LoginError) do
123
+ page = @im.send(:post_login, nil, nil)
124
+ end
125
+ assert_equal errmsg, err.original_exception.message
126
+ end
127
+
128
+ def test_bad_login_page_should_raise_exception
129
+ errmsg = "from test #{Time.now.to_s}"
130
+ WWW::Mechanize.any_instance.expects(:get).once.with(
131
+ URI.join(@app_root, config[:login_page])
132
+ ).raises(StandardError, errmsg)
133
+
134
+ err = assert_raise(WWW::Impostor::LoginError) do
135
+ @im.send(:fetch_login_page)
136
+ end
137
+ assert_equal errmsg, err.original_exception.message
138
+ end
139
+
140
+ def test_already_logged_in_should_not_post_login_information_again_instance_varialbe
141
+ @im.instance_variable_set(:@loggedin, true)
142
+ @im.expects(:fetch_login_page).never
143
+ assert_equal true, @im.login
144
+ end
145
+
146
+ def test_already_logged_in_should_not_post_login_information_again
147
+ @im.instance_variable_set(:@loggedin, false)
148
+ page = mock()
149
+ @im.stubs(:fetch_login_page).returns(page)
150
+ @im.expects(:logged_in?).once.with(page).returns(true)
151
+ @im.expects(:login_form_and_button).with(page).never
152
+ @im.login
153
+ end
154
+
155
+ def test_login_should_login
156
+ @im.instance_variable_set(:@loggedin, false)
157
+ login_page = mock()
158
+ @im.stubs(:fetch_login_page).returns(login_page)
159
+ @im.expects(:logged_in?).once.with(login_page).returns(false)
160
+ form = mock()
161
+ button = mock()
162
+ @im.expects(:login_form_and_button).with(login_page).returns([form, button])
163
+ logged_in_page = mock()
164
+ @im.expects(:post_login).with(form, button).returns(logged_in_page)
165
+ @im.expects(:logged_in?).once.with(logged_in_page).returns(true)
166
+ @im.expects(:load_topics).once.returns(true)
167
+
168
+ assert_equal true, @im.login
169
+ end
170
+
171
+ def test_logout_does_nothing_if_logged_out
172
+ @im.instance_variable_set(:@loggedin, false)
173
+ @im.expects(:cookie_jar).never
174
+ @im.expects(:save_topics).never
175
+ assert_equal false, @im.logout
176
+ end
177
+
178
+ def test_logout
179
+ @im.instance_variable_set(:@loggedin, true)
180
+ cookie_jar = mock()
181
+ @im.expects(:cookie_jar).times(2).returns(cookie_jar)
182
+ WWW::Mechanize::CookieJar.any_instance.expects(:save_as).once.with(cookie_jar).returns(nil)
183
+ @im.expects(:save_topics).once
184
+ assert_equal true, @im.logout
185
+ assert_equal nil, @im.instance_variable_get(:@forum)
186
+ assert_equal nil, @im.instance_variable_get(:@topic)
187
+ assert_equal nil, @im.instance_variable_get(:@subject)
188
+ assert_equal nil, @im.instance_variable_get(:@message)
189
+ assert_equal false, @im.instance_variable_get(:@loggedin)
190
+ end
191
+
192
+ def test_posting_page
193
+ c = config
194
+ assert_equal URI.join(@app_root, c[:posting_page]), @im.posting_page
195
+ end
196
+
197
+ def test_post_without_forum_set_should_raise_exception
198
+ @im.instance_variable_set(:@forum, nil)
199
+ err = assert_raise(WWW::Impostor::PostError) do
200
+ @im.post
201
+ end
202
+ assert_equal "forum not set", err.original_exception.message
203
+ err = assert_raise(WWW::Impostor::PostError) do
204
+ @im.post(f=nil,t=nil,m=nil)
205
+ end
206
+ assert_equal "forum not set", err.original_exception.message
207
+ end
208
+
209
+ def test_post_without_topic_set_should_raise_exception
210
+ @im.instance_variable_set(:@forum, 1)
211
+ @im.instance_variable_set(:@topic, nil)
212
+ err = assert_raise(WWW::Impostor::PostError) do
213
+ @im.post
214
+ end
215
+ assert_equal "topic not set", err.original_exception.message
216
+ err = assert_raise(WWW::Impostor::PostError) do
217
+ @im.post(f=2,t=nil,m=nil)
218
+ end
219
+ assert_equal "topic not set", err.original_exception.message
220
+ end
221
+
222
+ def test_post_without_message_set_should_raise_exception
223
+ @im.instance_variable_set(:@forum, 1)
224
+ @im.instance_variable_set(:@topic, 1)
225
+ @im.instance_variable_set(:@message, nil)
226
+ err = assert_raise(WWW::Impostor::PostError) do
227
+ @im.post
228
+ end
229
+ assert_equal "message not set", err.original_exception.message
230
+ err = assert_raise(WWW::Impostor::PostError) do
231
+ @im.post(f=2,t=2,m=nil)
232
+ end
233
+ assert_equal "message not set", err.original_exception.message
234
+ end
235
+
236
+ def test_post_not_logged_in_should_raise_exception
237
+ @im.expects(:login).once.returns(false)
238
+ @im.instance_variable_set(:@loggedin, false)
239
+ err = assert_raise(WWW::Impostor::PostError) do
240
+ @im.post(2,2,'hello')
241
+ end
242
+ assert_equal "not logged in", err.original_exception.message
243
+ end
244
+
245
+ def test_bad_post_page_for_post_should_raise_exception
246
+ @im.instance_variable_set(:@loggedin, true)
247
+ topic = 1
248
+ posting_page = @im.posting_page
249
+ posting_page.query = "mode=reply&t=#{topic}"
250
+ errmsg = "from test #{Time.now.to_s}"
251
+ WWW::Mechanize.any_instance.expects(:get).once.with(
252
+ posting_page
253
+ ).raises(StandardError, errmsg)
254
+ err = assert_raise(WWW::Impostor::PostError) do
255
+ @im.post(7,topic,'hello')
256
+ end
257
+ assert_equal errmsg, err.original_exception.message
258
+ end
259
+
260
+ def test_bad_post_form_for_post_should_raise_exception
261
+ @im.instance_variable_set(:@loggedin, true)
262
+ response = {'content-type' => 'text/html'}
263
+ body = '<form action="posting.php" method="post" name="post"></form>'
264
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
265
+ topic = 2
266
+ posting_page = @im.posting_page
267
+ posting_page.query = "mode=reply&t=#{topic}"
268
+ WWW::Mechanize.any_instance.expects(:get).once.with(posting_page).returns(page)
269
+ err = assert_raise(WWW::Impostor::PostError) do
270
+ @im.post(1,topic,'hello')
271
+ end
272
+ assert_equal "post form not found", err.original_exception.message
273
+ end
274
+
275
+ def test_submitting_bad_post_form_for_post_should_raise_exception
276
+ @im.instance_variable_set(:@loggedin, true)
277
+ response = {'content-type' => 'text/html'}
278
+ body = phpbb2_good_submit_post_form
279
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
280
+ topic = 2
281
+ posting_page = @im.posting_page
282
+ posting_page.query = "mode=reply&t=#{topic}"
283
+ WWW::Mechanize.any_instance.expects(:get).once.with(posting_page).returns(page)
284
+ errmsg = "from test #{Time.now.to_s}"
285
+ WWW::Mechanize.any_instance.expects(:submit).once.raises(StandardError, errmsg)
286
+ err = assert_raise(WWW::Impostor::PostError) do
287
+ @im.post(1,topic,'hello')
288
+ end
289
+ assert_equal errmsg, err.original_exception.message
290
+ end
291
+
292
+ def test_should_post
293
+ @im.instance_variable_set(:@loggedin, true)
294
+ response = {'content-type' => 'text/html'}
295
+ body = phpbb2_good_submit_post_form
296
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
297
+ topic = 2
298
+ posting_page = @im.posting_page
299
+ posting_page.query = "mode=reply&t=#{topic}"
300
+ WWW::Mechanize.any_instance.expects(:get).once.with(posting_page).returns(page)
301
+ body = load_page('phpbb2-post-reply-good-response.html').join
302
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
303
+ WWW::Mechanize.any_instance.expects(:submit).once.returns(page)
304
+ subject = "test #{Time.now.to_s}"
305
+ @im.expects(:get_subject).once.returns(subject)
306
+
307
+ assert_equal true, @im.post(1,topic,'hello')
308
+ assert_equal 1, @im.instance_variable_get(:@forum)
309
+ assert_equal topic, @im.instance_variable_get(:@topic)
310
+ assert_equal subject, @im.instance_variable_get(:@subject)
311
+ assert_equal 'hello', @im.instance_variable_get(:@message)
312
+ end
313
+
314
+ def test_too_many_posts_for_post_should_raise_exception
315
+ @im.instance_variable_set(:@loggedin, true)
316
+ response = {'content-type' => 'text/html'}
317
+ body = phpbb2_good_submit_post_form
318
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
319
+ topic = 2
320
+ posting_page = @im.posting_page
321
+ posting_page.query = "mode=reply&t=#{topic}"
322
+ WWW::Mechanize.any_instance.expects(:get).once.with(posting_page).returns(page)
323
+ body = load_page('phpbb2-post-reply-throttled-response.html').join
324
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
325
+ WWW::Mechanize.any_instance.expects(:submit).once.returns(page)
326
+
327
+ err = assert_raise(WWW::Impostor::ThrottledError) do
328
+ @im.post(1,topic,'hello')
329
+ end
330
+ assert_equal "too many posts in too short amount of time", err.original_exception.message
331
+ end
332
+
333
+ def test_getting_unknown_post_response_should_return_false
334
+ @im.instance_variable_set(:@loggedin, true)
335
+ response = {'content-type' => 'text/html'}
336
+ body = phpbb2_good_submit_post_form
337
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
338
+ topic = 2
339
+ posting_page = @im.posting_page
340
+ posting_page.query = "mode=reply&t=#{topic}"
341
+ WWW::Mechanize.any_instance.expects(:get).once.with(posting_page).returns(page)
342
+ body = 'junk'
343
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
344
+ WWW::Mechanize.any_instance.expects(:submit).once.returns(page)
345
+
346
+ assert_equal false, @im.post(1,topic,'hello')
347
+ assert_equal nil, @im.instance_variable_get(:@forum)
348
+ assert_equal nil, @im.instance_variable_get(:@topic)
349
+ assert_equal nil, @im.instance_variable_get(:@subject)
350
+ assert_equal nil, @im.instance_variable_get(:@message)
351
+ end
352
+
353
+ def test_new_topic_without_forum_set_should_raise_exception
354
+ @im.instance_variable_set(:@forum, nil)
355
+ err = assert_raise(WWW::Impostor::PostError) do
356
+ @im.new_topic
357
+ end
358
+ assert_equal "forum not set", err.original_exception.message
359
+ err = assert_raise(WWW::Impostor::PostError) do
360
+ @im.new_topic(f=nil,s="hello world",m="hello world")
361
+ end
362
+ assert_equal "forum not set", err.original_exception.message
363
+ end
364
+
365
+ def test_new_topic_without_subject_set_should_raise_exception
366
+ @im.instance_variable_set(:@forum, 1)
367
+ @im.instance_variable_set(:@subject, nil)
368
+ err = assert_raise(WWW::Impostor::PostError) do
369
+ assert @im.new_topic
370
+ end
371
+ assert_equal "topic name not given", err.original_exception.message
372
+ err = assert_raise(WWW::Impostor::PostError) do
373
+ @im.new_topic(f=1,s=nil,m="hello world")
374
+ end
375
+ assert_equal "topic name not given", err.original_exception.message
376
+ end
377
+
378
+ def test_new_topic_without_message_set_should_raise_exception
379
+ @im.instance_variable_set(:@forum, 1)
380
+ @im.instance_variable_set(:@subject, 'test')
381
+ @im.instance_variable_set(:@message, nil)
382
+ err = assert_raise(WWW::Impostor::PostError) do
383
+ @im.new_topic
384
+ end
385
+ assert_equal "message not set", err.original_exception.message
386
+ err = assert_raise(WWW::Impostor::PostError) do
387
+ @im.new_topic(f=1,s="hello world",m=nil)
388
+ end
389
+ assert_equal "message not set", err.original_exception.message
390
+ end
391
+
392
+ def test_new_topic_not_logged_in_should_raise_exception
393
+ @im.expects(:login).once.returns(false)
394
+ @im.instance_variable_set(:@loggedin, false)
395
+
396
+ err = assert_raise(WWW::Impostor::PostError) do
397
+ @im.new_topic(f=2,s="hello world",m="hello ruby")
398
+ end
399
+ assert_equal "not logged in", err.original_exception.message
400
+ end
401
+
402
+ def test_getting_bad_post_page_for_new_topic_should_raise_exception
403
+ @im.instance_variable_set(:@loggedin, true)
404
+ forum = 2
405
+ posting_page = @im.posting_page
406
+ posting_page.query = "mode=newtopic&f=#{forum}"
407
+ errmsg = "from test #{Time.now.to_s}"
408
+ WWW::Mechanize.any_instance.expects(:get).once.with(
409
+ posting_page
410
+ ).raises(StandardError, errmsg)
411
+
412
+ err = assert_raise(WWW::Impostor::PostError) do
413
+ @im.new_topic(f=forum,s="hello world",m="hello ruby")
414
+ end
415
+ assert_equal errmsg, err.original_exception.message
416
+ end
417
+
418
+ def test_getting_bad_post_form_for_new_topic_should_raise_exception
419
+ @im.instance_variable_set(:@loggedin, true)
420
+ response = {'content-type' => 'text/html'}
421
+ body = '<form action="posting.php" method="post" name="post"></form>'
422
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
423
+ forum = 2
424
+ posting_page = @im.posting_page
425
+ posting_page.query = "mode=newtopic&f=#{forum}"
426
+ WWW::Mechanize.any_instance.expects(:get).once.with(posting_page).returns(page)
427
+ err = assert_raise(WWW::Impostor::PostError) do
428
+ @im.new_topic(f=forum,s="hello world",m="hello ruby")
429
+ end
430
+ assert_equal 'post form not found', err.original_exception.message
431
+ end
432
+
433
+ def test_submitting_bad_post_for_new_topic_form_should_raise_exception
434
+ @im.instance_variable_set(:@loggedin, true)
435
+ response = {'content-type' => 'text/html'}
436
+ body = phpbb2_good_submit_new_topic_form
437
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
438
+ forum = 2
439
+ posting_page = @im.posting_page
440
+ posting_page.query = "mode=newtopic&f=#{forum}"
441
+ WWW::Mechanize.any_instance.expects(:get).once.with(posting_page).returns(page)
442
+ errmsg = "from test #{Time.now.to_s}"
443
+ WWW::Mechanize.any_instance.expects(:submit).once.raises(StandardError, errmsg)
444
+ err = assert_raise(WWW::Impostor::PostError) do
445
+ @im.new_topic(f=forum,s="hello world",m="hello ruby")
446
+ end
447
+ assert_equal errmsg, err.original_exception.message
448
+ end
449
+
450
+ def test_unexpected_viewtopic_for_new_topic_should_raise_exception
451
+ @im.instance_variable_set(:@loggedin, true)
452
+ response = {'content-type' => 'text/html'}
453
+ body = phpbb2_good_submit_new_topic_form
454
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
455
+ forum = 2
456
+ posting_page = @im.posting_page
457
+ posting_page.query = "mode=newtopic&f=#{forum}"
458
+ WWW::Mechanize.any_instance.expects(:get).once.with(posting_page).returns(page)
459
+ WWW::Mechanize.any_instance.expects(:submit).once.returns('junk')
460
+ err = assert_raise(WWW::Impostor::PostError) do
461
+ @im.new_topic(f=forum,s="hello world",m="hello ruby")
462
+ end
463
+ assert_equal "unexpected new topic response from refresh", err.original_exception.message
464
+ end
465
+
466
+ def test_malformed_viewtopic_response_for_new_topic_should_raise_exception
467
+ @im.instance_variable_set(:@loggedin, true)
468
+ response = {'content-type' => 'text/html'}
469
+ body = phpbb2_good_submit_new_topic_form
470
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
471
+ forum = 2
472
+ posting_page = @im.posting_page
473
+ posting_page.query = "mode=newtopic&f=#{forum}"
474
+ WWW::Mechanize.any_instance.expects(:get).with(posting_page).returns(page)
475
+ body = load_page('phpbb2-post-new_topic-good-response.html').join
476
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
477
+ WWW::Mechanize.any_instance.expects(:submit).once.returns(page)
478
+ follow = URI.join(@app_root, 'viewtopic.php?p=60#60')
479
+ body = 'junk'
480
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
481
+ WWW::Mechanize.any_instance.expects(:get).with(follow).returns(body)
482
+ err = assert_raise(WWW::Impostor::PostError) do
483
+ @im.new_topic(f=forum,s="hello world",m="hello ruby")
484
+ end
485
+ assert_equal "unexpected new topic response from link prev", err.original_exception.message
486
+ end
487
+
488
+ def test_malformed_viewtopic_response_prev_url_for_new_topic_should_raise_exception
489
+ @im.instance_variable_set(:@loggedin, true)
490
+ response = {'content-type' => 'text/html'}
491
+ body = phpbb2_good_submit_new_topic_form
492
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
493
+ forum = 2
494
+ posting_page = @im.posting_page
495
+ posting_page.query = "mode=newtopic&f=#{forum}"
496
+ WWW::Mechanize.any_instance.expects(:get).with(posting_page).returns(page)
497
+ body = load_page('phpbb2-post-new_topic-good-response.html').join
498
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
499
+ WWW::Mechanize.any_instance.expects(:submit).once.returns(page)
500
+ follow = URI.join(@app_root, 'viewtopic.php?p=60#60')
501
+ body = '<html><head><link rel="prev" href="http://localhost/phpBB2/viewtopic.php?junk" title="View previous topic"></head><body></body></html>'
502
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
503
+ WWW::Mechanize.any_instance.expects(:get).with(follow).returns(page)
504
+ err = assert_raise(WWW::Impostor::PostError) do
505
+ @im.new_topic(f=forum,s="hello world",m="hello ruby")
506
+ end
507
+ assert_equal "unexpected new topic ID", err.original_exception.message
508
+ end
509
+
510
+ def test_new_topic_should_work
511
+ @im.instance_variable_set(:@loggedin, true)
512
+ response = {'content-type' => 'text/html'}
513
+ body = phpbb2_good_submit_new_topic_form
514
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
515
+ forum = 2
516
+ subject = "hello world"
517
+ message = "hello ruby"
518
+ posting_page = @im.posting_page
519
+ posting_page.query = "mode=newtopic&f=#{forum}"
520
+ WWW::Mechanize.any_instance.expects(:get).with(posting_page).returns(page)
521
+ body = load_page('phpbb2-post-new_topic-good-response.html').join
522
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
523
+ WWW::Mechanize.any_instance.expects(:submit).once.returns(page)
524
+ follow = URI.join(@app_root, 'viewtopic.php?p=60#60')
525
+ body = load_page('phpbb2-get-viewtopic-for-new-topic-good-response.html').join
526
+ page = WWW::Mechanize::Page.new(uri=nil, response, body, code=nil, mech=nil)
527
+ WWW::Mechanize.any_instance.expects(:get).with(follow).returns(page)
528
+
529
+ @im.expects(:add_subject).once.with(forum,29,subject)
530
+ assert_equal true, @im.new_topic(f=forum,s=subject,m=message)
531
+ assert_equal forum, @im.instance_variable_get(:@forum)
532
+ assert_equal 29, @im.instance_variable_get(:@topic)
533
+ assert_equal subject, @im.instance_variable_get(:@subject)
534
+ assert_equal message, @im.instance_variable_get(:@message)
535
+ end
536
+ end