ruby-net-nntp 0.2.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,994 @@
1
+ require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
2
+
3
+ describe Net::NNTP::FormatHeader do
4
+ it 'should parse a simple header ending with a colon' do
5
+ @header = Net::NNTP::FormatHeader.new('Date:')
6
+ @header.name.should == 'date'
7
+ @header.full.should == false
8
+ end
9
+
10
+ it 'should parse a header starting with a colon' do
11
+ @header = Net::NNTP::FormatHeader.new(':bytes')
12
+ @header.name.should == 'bytes'
13
+ @header.full.should == false
14
+ end
15
+ it 'should parse a header with the indicator "full" separated by a colon' do
16
+ @header = Net::NNTP::FormatHeader.new('Xref:full')
17
+ @header.name.should == 'xref'
18
+ @header.full.should == true
19
+ end
20
+ end
21
+
22
+ describe 'Responses with body', :shared => true do
23
+
24
+ it 'should read the response from a string' do
25
+ @response.body = @body
26
+ @response.raw.should == @body
27
+ end
28
+
29
+ it 'should read the response from an IO object' do
30
+ raw = StringIO.new
31
+ raw << @body
32
+ raw.rewind
33
+ @response.body = raw
34
+ @response.raw.should == @body
35
+ end
36
+
37
+ it 'should let the response be filled from a block' do
38
+ raw = StringIO.new
39
+ raw << @body
40
+ raw.rewind
41
+ @response.instance_variable_set(:@body, nil)
42
+ @response.body { raw.string }
43
+ @response.raw.should == @body
44
+ @response.instance_variable_set(:@body, nil)
45
+ @response.body { raw }
46
+ @response.raw.should == @body
47
+ end
48
+
49
+ end
50
+
51
+ describe 'Single Line Responses', :shared => true do
52
+ it 'must not be a multiline response' do
53
+ @response.should_not be_multiline
54
+ @response.body.should be_nil
55
+ end
56
+ end
57
+
58
+ describe Net::NNTP::InformationResponse do
59
+ end
60
+
61
+ describe Net::NNTP::HelpResponse do
62
+ before do
63
+ @response = Net::NNTP::HelpResponse.new(@request, '100', 'Help text follows')
64
+ @body = <<-EOF
65
+ 100 Help text follows
66
+ this is a help text
67
+ not much to look at.
68
+ .
69
+ EOF
70
+ end
71
+ it 'must not be a generic response' do
72
+ @response.should_not be_generic
73
+ end
74
+ it_should_behave_like 'Responses with body'
75
+ end
76
+
77
+ describe Net::NNTP::CapabilityList do
78
+ before do
79
+ @response = Net::NNTP::CapabilityList.new(@request, '101', 'Capability list:')
80
+ @body = "VERSION 2\r\nREADER\r\nLIST ACTIVE NEWSGROUPS\r\n.\r\n"
81
+ end
82
+ it 'must not be a generic response' do
83
+ @response.should_not be_generic
84
+ end
85
+ it 'should have capabilities' do
86
+ @response.should respond_to(:capabilities)
87
+ end
88
+ it 'should parse capabilities from body and make them accessible' do
89
+ @response.body = @body
90
+ @response.capabilities['version'].should == '2'
91
+ @response.capabilities['reader'].should be_true
92
+ @response.capabilities['list'].should == ['ACTIVE', 'NEWSGROUPS']
93
+ @response.capabilities.should_not have_key('post')
94
+ @response.capabilities['post'].should be_nil
95
+ end
96
+ it_should_behave_like 'Responses with body'
97
+ end
98
+
99
+ describe Net::NNTP::DateResponse do
100
+ before do
101
+ @response = Net::NNTP::Response.create(@request, '111 20080815124533')
102
+ end
103
+ it_should_behave_like "Single Line Responses"
104
+
105
+ it 'should return a valid date' do
106
+ @response.date.should == DateTime.parse('August 15 2008 12:45:33')
107
+ end
108
+ end
109
+
110
+ describe Net::NNTP::OKResponse do
111
+ end
112
+
113
+ describe 'Multiline Responses', :shared => true do
114
+ it 'must be a multiline response' do
115
+ @response.should be_multiline
116
+ end
117
+ end
118
+
119
+ describe Net::NNTP::PostingAllowed do
120
+ before do
121
+ @response = Net::NNTP::PostingAllowed.new(@request, '200', 'Posting allowed')
122
+ end
123
+ it_should_behave_like 'Single Line Responses'
124
+ end
125
+
126
+ describe Net::NNTP::PostingProhibited do
127
+ before do
128
+ @response = Net::NNTP::PostingProhibited.new(@request, '201', 'Posting prohibited')
129
+ end
130
+ it_should_behave_like 'Single Line Responses'
131
+ end
132
+
133
+ describe Net::NNTP::ConnectionClosing do
134
+ before do
135
+ @response = Net::NNTP::ConnectionClosing.new(@request, '205', 'Connection closing')
136
+ end
137
+ it_should_behave_like 'Single Line Responses'
138
+ it 'should request closing of the socket' do
139
+ @response.force_close?.should be_true
140
+ end
141
+ end
142
+
143
+ describe Net::NNTP::GroupSelected do
144
+ before do
145
+ @request = Net::NNTP::Group.new('misc.test')
146
+ @response = Net::NNTP::GroupSelected.new(@request, '211', '1234 3000234 3002322 misc.test list follows')
147
+ @body ="300234\r\n300237\r\n300238\r\n300239\r\n3002322\r\n.\r\n"
148
+ end
149
+ it_should_behave_like 'Responses with body'
150
+ it 'should have a group name' do
151
+ @response.group.name.should == 'misc.test'
152
+ end
153
+ it 'should have the article numbers' do
154
+ @response.group.number.should == 1234
155
+ end
156
+ it 'should have the low watermark' do
157
+ @response.group.low.should == 3000234
158
+ end
159
+ it 'should have the high watermark' do
160
+ @response.group.high.should == 3002322
161
+ end
162
+ it 'should have an optional body and parse numbers' do
163
+ @request = Net::NNTP::Group.new('misc.test')
164
+ @response = Net::NNTP::GroupSelected.new(@request, '211', '1234 3000234 3002322 misc.test list follows')
165
+ @response.should_not have_body
166
+ @request = Net::NNTP::Listgroup.new('misc.test')
167
+ @response = Net::NNTP::GroupSelected.new(@request, '211', '1234 3000234 3002322 misc.test list follows')
168
+ @response.body = "300234\r\n300237\r\n300238\r\n300239\r\n3002322\r\n.\r\n"
169
+ @response.should have_body
170
+ @response.list.should == ["300234", "300237", "300238", "300239", "3002322"]
171
+ end
172
+ it 'should be a multiline response if the request is a Listgroup request' do
173
+ @request = Net::NNTP::Listgroup.new('misc.test')
174
+ @response = Net::NNTP::GroupSelected.new(@request, '211', '1234 3000234 3002322 misc.test list follows')
175
+ @body ="300234\r\n300237\r\n300238\r\n300239\r\n3002322\r\n.\r\n"
176
+ @response.should be_multiline
177
+ end
178
+
179
+ it 'should not be a multiline response if the request is a Group request' do
180
+ @request = Net::NNTP::Group.new('misc.test')
181
+ @response = Net::NNTP::GroupSelected.new(@request, '211', '1234 3000234 3002322 misc.test list follows')
182
+ @response.should_not be_multiline
183
+ end
184
+
185
+ end
186
+
187
+ describe Net::NNTP::ListInformationFollows do
188
+ before do
189
+ @request = Net::NNTP::List.new
190
+ @response = Net::NNTP::ListInformationFollows.new(@request, '215', 'information follows')
191
+ @body = "at.test 3 5 y\r\nalt.test 8 30 y\r\n"
192
+ @response.body = @body
193
+ end
194
+ it_should_behave_like 'Multiline Responses'
195
+ it_should_behave_like 'Responses with body'
196
+
197
+ it 'should parse the body to a list of groups on LIST (ACTIVE)' do
198
+ @request = Net::NNTP::List.new
199
+ @response = Net::NNTP::ListInformationFollows.new(@request, '215', 'information follows')
200
+ @body = "at.test 3 5 y\r\nalt.test 8 30 y\n"
201
+ @response.body = @body
202
+ @response.list.should respond_to(:each)
203
+ @response.list[0].name.should == 'at.test'
204
+ @response.list[0].high.should == 5
205
+ @response.list[0].low.should == 3
206
+ @response.list[0].status.should == 'y'
207
+ end
208
+
209
+ it 'should parse the body to a list of groups on LIST ACTIVE.TIMES' do
210
+ @request = Net::NNTP::List.new('ACTIVE.TIMES')
211
+ @response = Net::NNTP::ListInformationFollows.new(@request, '215', 'information follows')
212
+ @body = <<-EOF
213
+ misc.test 930445408 <creatme@isc.org>
214
+ alt.rfc-writers.recovery 930562309 <m@example.com>
215
+ tx.natives.recovery 930678923 <sob@academ.com>
216
+ .
217
+ EOF
218
+ @response.body = @body
219
+ @response.list.should respond_to(:each)
220
+ @response.list[0].name.should == 'misc.test'
221
+ @response.list[0].epoch.should == '930445408'
222
+ @response.list[0].creator.should == '<creatme@isc.org>'
223
+ end
224
+
225
+ it 'should parse the body to a list of distibution patterns on LIST DISTRIB.PATS' do
226
+ @request = Net::NNTP::List.new('DISTRIB.PATS')
227
+ @response = Net::NNTP::ListInformationFollows.new(@request, '215', 'information follows')
228
+ @body = <<-EOF
229
+ 10:local.*:local
230
+ 5:*:world
231
+ 20:local.here.*:thissite
232
+ .
233
+ EOF
234
+ @response.body = @body
235
+ @response.list.should respond_to(:each)
236
+ @response.list[0].priority.should == 10
237
+ @response.list[0].pattern.should == 'local.*'
238
+ @response.list[0].distribution.should == 'local'
239
+ end
240
+
241
+ it 'should parse the body to a list of fields on LIST HEADERS' do
242
+ @request = Net::NNTP::List.new('HEADERS')
243
+ @response = Net::NNTP::ListInformationFollows.new(@request, '215', 'information follows')
244
+ @body = <<-EOF
245
+ Date
246
+ Distribution
247
+ From
248
+ Message-ID
249
+ References
250
+ Subject
251
+ Xref
252
+ :bytes
253
+ :lines
254
+ .
255
+ EOF
256
+ @response.body = @body
257
+ @response.list.should respond_to(:each)
258
+ @response.list[0].should == 'Date'
259
+ @response.list[1].should == 'Distribution'
260
+ @response.list[2].should == 'From'
261
+ end
262
+
263
+ it 'should parse the body to a list of groups and their description on LIST NEWSGROUPS' do
264
+ @request = Net::NNTP::List.new('NEWSGROUPS')
265
+ @response = Net::NNTP::ListInformationFollows.new(@request, '215', 'information follows')
266
+ @body = <<-EOF
267
+ misc.test General Usenet testing
268
+ alt.rfc-writers.recovery RFC Writers Recovery
269
+ tx.natives.recovery Texas Natives Recovery
270
+ .
271
+ EOF
272
+ @response.body = @body
273
+ @response.list.should respond_to(:each)
274
+ @response.list[0].name.should == 'misc.test'
275
+ @response.list[0].desc.should == 'General Usenet testing'
276
+ end
277
+ it 'should parse the body to a list of fields on LIST OVERVIEW.FMT' do
278
+ @request = Net::NNTP::List.new('OVERVIEW.FMT')
279
+ @response = Net::NNTP::ListInformationFollows.new(@request, '215', 'information follows')
280
+ @body = <<-EOF
281
+ Subject:
282
+ From:
283
+ Date:
284
+ Message-ID:
285
+ References:
286
+ :bytes
287
+ :lines
288
+ Xref:full
289
+ Distribution:full
290
+ .
291
+ EOF
292
+ @response.body = @body
293
+ @response.list.should respond_to(:each)
294
+ @response.list[0].name.should == 'subject'
295
+ @response.list[0].full.should be_false
296
+ @response.list[1].name.should == 'from'
297
+ @response.list[1].full.should be_false
298
+ @response.list[5].name.should == 'bytes'
299
+ @response.list[5].full.should be_false
300
+ @response.list[6].name.should == 'lines'
301
+ @response.list[6].full.should be_false
302
+ @response.list[8].name.should == 'distribution'
303
+ @response.list[8].full.should be_true
304
+ end
305
+ end
306
+
307
+ describe 'Article Responses', :shared => true do
308
+ it 'should return the article number' do
309
+ @response.number.should == 3000237
310
+ end
311
+
312
+ it 'should return the message-id' do
313
+ @response.message_id.should == '<1234@example.org>'
314
+ end
315
+ end
316
+
317
+ describe Net::NNTP::ArticleResponse do
318
+ before do
319
+ @response = Net::NNTP::ArticleResponse.new(@request, '220', '3000237 <1234@example.org>')
320
+ @body =<<EOF
321
+ Path: ahost!demo!not-for-mail
322
+ From: "Demo User" <nobody@example.com>
323
+ Newsgroups: misc.test
324
+ Subject: I am just a test article
325
+ Date: 14 May 2008 11:40:23 +0200
326
+ Organization: An Example
327
+ Message-ID: <1234@example.com>
328
+
329
+ This is just a test article.
330
+ .But with special properties
331
+ ...
332
+ ..
333
+ EOF
334
+ @check_article = TMail::Mail.parse(@body.gsub(/^\./, "")).to_s
335
+ @preamble =<<-EOF
336
+ This is just a test article.
337
+ But with special properties
338
+ ..
339
+ .
340
+ EOF
341
+ end
342
+ it_should_behave_like 'Multiline Responses'
343
+ it_should_behave_like 'Article Responses'
344
+ it_should_behave_like 'Responses with body'
345
+
346
+
347
+ it 'should return an article' do
348
+ @response.body = @body
349
+ @response.article.to_s.should == @check_article
350
+ @response.article.preamble.should == @preamble
351
+ end
352
+
353
+ it 'should return an enumeration of headers' do
354
+ @response.body = @body
355
+ @response['Subject'].should == "I am just a test article"
356
+ end
357
+
358
+ end
359
+
360
+ describe Net::NNTP::HeaderResponse do
361
+ before do
362
+ @request = Net::NNTP::Head.new('3000237')
363
+ @response = Net::NNTP::HeaderResponse.new(@request, '221', '3000237 <1234@example.org>')
364
+ @body =<<EOF
365
+ Path: ahost!demo!not-for-mail
366
+ From: "Demo User" <nobody@example.com>
367
+ Newsgroups: misc.test
368
+ Subject: I am just a test article
369
+ Date: 14 May 2008 11:40:23 +0200
370
+ Organization: An Example
371
+ Message-ID: <1234@example.com>
372
+ .
373
+ EOF
374
+ end
375
+ it_should_behave_like 'Multiline Responses'
376
+ it_should_behave_like 'Article Responses'
377
+ it_should_behave_like 'Responses with body'
378
+ it 'should return an enumeration of headers' do
379
+ @response.body = @body
380
+ @response['Subject'].should == "I am just a test article"
381
+ @response.header['from'].to_s.should == 'Demo User <nobody@example.com>'
382
+ end
383
+
384
+ it 'should return an enumeration of numbers and contents if the request is a XHDR request' do
385
+ @request = Net::NNTP::Xhdr.new('Subject')
386
+ @response = Net::NNTP::HeaderResponse.new(@request, '221', 'Subject fields follow')
387
+ @body =<<-EOF
388
+ 3000237 I am just a test article
389
+ .
390
+ EOF
391
+ @response.body = @body
392
+ @response.list.should respond_to(:each)
393
+ end
394
+ end
395
+
396
+ describe Net::NNTP::BodyResponse do
397
+ before do
398
+ @response = Net::NNTP::BodyResponse.new(@request, '222', '3000237 <1234@example.org>')
399
+ @body =<<EOF
400
+ This is just a test article
401
+ .
402
+ EOF
403
+ end
404
+ it_should_behave_like 'Multiline Responses'
405
+ it_should_behave_like 'Article Responses'
406
+ it_should_behave_like 'Responses with body'
407
+ end
408
+
409
+ describe Net::NNTP::ArticleSelected do
410
+ before do
411
+ @response = Net::NNTP::ArticleSelected.new(@request, '223', '3000237 <1234@example.org> retrieved')
412
+ end
413
+ it_should_behave_like 'Single Line Responses'
414
+ it_should_behave_like 'Article Responses'
415
+ end
416
+
417
+ describe Net::NNTP::OverviewInformation do
418
+ before do
419
+ @response = Net::NNTP::OverviewInformation.new(@request, '224', 'Overview Information follows')
420
+ @body = "3000234 I am just a test article \"Demo User\" <nobody@example.com> 6 Oct 1998 04:38:40 -0500 <45223423@example.com> <45454@example.net> 1234 17 Xref: news.example.com misc.test:3000363"
421
+ @response.body = @body
422
+ end
423
+ it_should_behave_like 'Multiline Responses'
424
+ it_should_behave_like 'Responses with body'
425
+
426
+ it 'should have a from field' do
427
+ @response.from.should == '"Demo User" <nobody@example.com>'
428
+ end
429
+
430
+ it 'should have a number field' do
431
+ @response.number.should == 3000234
432
+ end
433
+
434
+
435
+ it 'should have a date field' do
436
+ @response.date.should == DateTime.parse('6 Oct 1998 04:38:40 -0500')
437
+ end
438
+
439
+ it 'should have a message-id field' do
440
+ @response.message_id.should == '<45223423@example.com>'
441
+ end
442
+
443
+ it 'should have a references field' do
444
+ @response.references.should == ['<45454@example.net>']
445
+ end
446
+
447
+ it 'should have a bytes field' do
448
+ @response.bytes.should == 1234
449
+ end
450
+
451
+ it 'should have a lines field' do
452
+ @response.lines.should == 17
453
+ end
454
+
455
+ it 'should have optional headers' do
456
+ @response.optional_headers.should == {'xref' => 'news.example.com misc.test:3000363'}
457
+ end
458
+
459
+ end
460
+
461
+ describe Net::NNTP::HdrResponse do
462
+ before do
463
+ @response = Net::NNTP::HdrResponse.new(@request, '225', 'Header information follows')
464
+ @body = "300234\tI am just a test article\r\n300235\tAnother subject"
465
+ @response.body = @body
466
+ end
467
+
468
+ it_should_behave_like "Multiline Responses"
469
+
470
+ it 'should have a list of articles' do
471
+ @response.list.should == {300234 => 'I am just a test article', 300235 => 'Another subject'}
472
+ end
473
+
474
+ end
475
+
476
+ describe Net::NNTP::NewnewsResponse do
477
+ before do
478
+ @response = Net::NNTP::NewnewsResponse.new(@request, '230', 'List of new articles by message-id follows')
479
+ @body = "<1234@example.com>\r\n<3453@example.com>\r\n<4567@example.com>"
480
+ @response.body = @body
481
+ end
482
+
483
+ it_should_behave_like "Multiline Responses"
484
+
485
+ it 'should have a list of message ids' do
486
+ @response.list.should == %w[<1234@example.com> <3453@example.com> <4567@example.com>]
487
+ end
488
+ end
489
+
490
+ describe Net::NNTP::NewgroupsResponse do
491
+ before do
492
+ @request = Net::NNTP::Newgroups.new('20080527133122')
493
+ @response = Net::NNTP::NewgroupsResponse.new(@request, '231', 'List of new newsgroups follows')
494
+ @body = "at.test 3 5 y\r\nalt.test 8 30 y\r\n"
495
+ @response.body = @body
496
+ end
497
+
498
+ it_should_behave_like "Multiline Responses"
499
+
500
+ it 'should have a list of articles' do
501
+ @response.list.should respond_to(:each)
502
+ @response.list[0].name.should == 'at.test'
503
+ @response.list[0].high.should == 5
504
+ @response.list[0].low.should == 3
505
+ @response.list[0].status.should == 'y'
506
+ end
507
+ end
508
+
509
+ describe Net::NNTP::TransferOK do
510
+ before do
511
+ @response = Net::NNTP::TransferOK.new(@request, '235', 'Article transferred OK')
512
+ end
513
+
514
+ it_should_behave_like 'Single Line Responses'
515
+ end
516
+
517
+ describe Net::NNTP::ArticleReceived do
518
+ before do
519
+ @response = Net::NNTP::ArticleReceived.new(@request, '240', 'Article received OK')
520
+ end
521
+
522
+ it_should_behave_like 'Single Line Responses'
523
+ end
524
+
525
+ describe Net::NNTP::AuthenticationAccepted do
526
+ before do
527
+ @response = Net::NNTP::AuthenticationAccepted.new(@request, '281', 'Authentication OK')
528
+ end
529
+ it_should_behave_like 'Single Line Responses'
530
+ end
531
+
532
+ describe Net::NNTP::ContinueResponse do
533
+ end
534
+
535
+ describe Net::NNTP::TransferArticle do
536
+ before do
537
+ @response = Net::NNTP::TransferArticle.new(@request, '335', 'Send it; end with <CR-LF>.<CR-LF>')
538
+ end
539
+ it_should_behave_like 'Single Line Responses'
540
+ it 'should request a body' do
541
+ @response.needs_article?.should be_true
542
+ end
543
+ end
544
+
545
+ describe Net::NNTP::PostArticle do
546
+ before do
547
+ @response = Net::NNTP::PostArticle.new(@request, '340', 'Send it; end with <CR-LF>.<CR-LF>')
548
+ end
549
+ it_should_behave_like 'Single Line Responses'
550
+ it 'should request a body' do
551
+ @response.needs_article?.should be_true
552
+ end
553
+ end
554
+
555
+ describe Net::NNTP::PasswordRequired do
556
+ before do
557
+ @response = Net::NNTP::PasswordRequired.new(@request, '381', 'Password required')
558
+ end
559
+ it_should_behave_like 'Single Line Responses'
560
+ end
561
+
562
+ describe Net::NNTP::RetryResponse do
563
+ end
564
+
565
+ describe "Generic Responses", :shared => true do
566
+ it 'must be a generic response' do
567
+ @response.should be_generic
568
+ end
569
+ end
570
+
571
+ describe Net::NNTP::TemporarilyUnavailable do
572
+ before do
573
+ @response = Net::NNTP::TemporarilyUnavailable.new(@request, '400', 'Temporarily unavailable')
574
+ end
575
+ it_should_behave_like 'Single Line Responses'
576
+ end
577
+
578
+ describe Net::NNTP::InternalFault do
579
+ before(:all) do
580
+ @response = Net::NNTP::InternalFault.new(@request, '403', 'Internal Failure')
581
+ end
582
+ it_should_behave_like 'Generic Responses'
583
+ end
584
+
585
+ describe Net::NNTP::GroupUnknown do
586
+ before(:all) do
587
+ @response = Net::NNTP::GroupUnknown.new(@request, '411', 'not.here is unknown')
588
+ end
589
+ it_should_behave_like 'Single Line Responses'
590
+ end
591
+
592
+ describe Net::NNTP::NoGroupSelected do
593
+ before(:all) do
594
+ @response = Net::NNTP::NoGroupSelected.new(@request, '412', 'no group selected')
595
+ end
596
+ it_should_behave_like 'Single Line Responses'
597
+ end
598
+
599
+ describe Net::NNTP::InvalidArticle do
600
+ before(:all) do
601
+ @response = Net::NNTP::InvalidArticle.new(@request, '420', 'invalid article')
602
+ end
603
+ it_should_behave_like 'Single Line Responses'
604
+ end
605
+
606
+ describe Net::NNTP::NoPreviousArticle do
607
+ before(:all) do
608
+ @response = Net::NNTP::NoPreviousArticle.new(@request, '421', 'no previous article')
609
+ end
610
+ it_should_behave_like 'Single Line Responses'
611
+ end
612
+
613
+ describe Net::NNTP::NoNextArticle do
614
+ before(:all) do
615
+ @response = Net::NNTP::NoNextArticle.new(@request, '422', 'no next article')
616
+ end
617
+ it_should_behave_like 'Single Line Responses'
618
+ end
619
+
620
+ describe Net::NNTP::InvalidNumberOrRange do
621
+ before(:all) do
622
+ @response = Net::NNTP::InvalidNumberOrRange.new(@request, '423', 'no such article')
623
+ end
624
+ it_should_behave_like 'Single Line Responses'
625
+ end
626
+
627
+ describe Net::NNTP::NoSuchMessageid do
628
+ before(:all) do
629
+ @response = Net::NNTP::NoSuchMessageid.new(@request, '430', 'no such article')
630
+ end
631
+ it_should_behave_like 'Single Line Responses'
632
+ end
633
+
634
+ describe Net::NNTP::ArticleNotWanted do
635
+ before(:all) do
636
+ @response = Net::NNTP::ArticleNotWanted.new(@request, '435', 'not wanted')
637
+ end
638
+ it_should_behave_like 'Single Line Responses'
639
+ end
640
+
641
+ describe Net::NNTP::TransferNotPossible do
642
+ before(:all) do
643
+ @response = Net::NNTP::TransferNotPossible.new(@request, '436', 'not possible')
644
+ end
645
+ it_should_behave_like 'Single Line Responses'
646
+ end
647
+
648
+ describe Net::NNTP::TransferRejected do
649
+ before(:all) do
650
+ @response = Net::NNTP::TransferRejected.new(@request, '437', 'rejected')
651
+ end
652
+ it_should_behave_like 'Single Line Responses'
653
+ end
654
+
655
+ describe Net::NNTP::PostingNotPermitted do
656
+ before(:all) do
657
+ @response = Net::NNTP::PostingNotPermitted.new(@request, '440', 'not permitted')
658
+ end
659
+ it_should_behave_like 'Single Line Responses'
660
+ end
661
+
662
+ describe Net::NNTP::PostingFailed do
663
+ before(:all) do
664
+ @response = Net::NNTP::PostingFailed.new(@request, '441', 'failed')
665
+ end
666
+ it_should_behave_like 'Single Line Responses'
667
+ end
668
+
669
+
670
+ describe Net::NNTP::AuthenticationRequired do
671
+ before(:all) do
672
+ @response = Net::NNTP::AuthenticationRequired.new(@request, '480', 'Authentication Required')
673
+ end
674
+ it_should_behave_like 'Generic Responses'
675
+ end
676
+
677
+ describe Net::NNTP::AuthenticationRequired do
678
+ before(:all) do
679
+ @response = Net::NNTP::AuthenticationRequired.new(@request, '481', 'Authentication failed')
680
+ end
681
+ it_should_behave_like 'Single Line Responses'
682
+ end
683
+
684
+ describe Net::NNTP::AuthenticationOutOfSequence do
685
+ before(:all) do
686
+ @response = Net::NNTP::AuthenticationOutOfSequence.new(@request, '482', 'Authentication out of sequence')
687
+ end
688
+ it_should_behave_like 'Single Line Responses'
689
+ end
690
+
691
+ describe Net::NNTP::PrivacyRequired do
692
+ before(:all) do
693
+ @response = Net::NNTP::PrivacyRequired.new(@request, '483', 'Privacy Required')
694
+ end
695
+ it_should_behave_like 'Generic Responses'
696
+ end
697
+
698
+ describe Net::NNTP::NotImplemented do
699
+ before(:all) do
700
+ @response = Net::NNTP::NotImplemented.new(@request, '500', 'Not Implemented')
701
+ end
702
+ it_should_behave_like 'Generic Responses'
703
+ end
704
+
705
+ describe Net::NNTP::SyntaxError do
706
+ before(:all) do
707
+ @response = Net::NNTP::SyntaxError.new(@request, '501', 'Syntax Error')
708
+ end
709
+ it_should_behave_like 'Generic Responses'
710
+ end
711
+
712
+ describe Net::NNTP::PermanentlyUnavailable do
713
+ before(:all) do
714
+ @response = Net::NNTP::PermanentlyUnavailable.new(@request, '502', 'Permanently Unavailable')
715
+ end
716
+ it_should_behave_like 'Generic Responses'
717
+ end
718
+
719
+ describe Net::NNTP::FeatureNotProvided do
720
+ before(:all) do
721
+ @response = Net::NNTP::FeatureNotProvided.new(@request, '503', 'Feature NotProvided')
722
+ end
723
+ it_should_behave_like 'Generic Responses'
724
+ end
725
+
726
+ describe Net::NNTP::EncodingError do
727
+ before(:all) do
728
+ @response = Net::NNTP::EncodingError.new(@request, '504', 'Encoding Error')
729
+ end
730
+ it_should_behave_like 'Generic Responses'
731
+ end
732
+
733
+ describe Net::NNTP::FailResponse do
734
+ end
735
+
736
+ describe Net::NNTP::Response do
737
+
738
+ before do
739
+ @request = Net::NNTP::Help.new
740
+ end
741
+ it 'should have a request accessor' do
742
+ @request = Net::NNTP::Help.new
743
+ @response = Net::NNTP::Response.new(@request, '100', 'Help Information follows', true, false)
744
+ @response.request.should == @request
745
+ end
746
+
747
+ it 'should not request an article body' do
748
+ @response = Net::NNTP::Response.new(@request, '100', 'Help Information follows', true, false)
749
+ @response.needs_article?.should be_false
750
+ end
751
+
752
+ it 'should not request closing of the socket' do
753
+ @response = Net::NNTP::Response.new(@request, '100', 'Help Information follows', true, false)
754
+ @response.force_close?.should be_false
755
+ end
756
+
757
+ it 'should be comparable to another Response' do
758
+ Net::NNTP::Response.create(@request, '500 Not Implemented').should == Net::NNTP::Response.create(@request, '500 Not Implemented')
759
+ Net::NNTP::NotImplemented.new(@request, '500', 'Not Implemented').should_not == Net::NNTP::SyntaxError.new(@request, '500', 'Not Implemented')
760
+ end
761
+
762
+ it 'should create a NotImplemented Class' do
763
+ Net::NNTP::Response.create(@request, '500 Not Implemented').class.should == Net::NNTP::NotImplemented
764
+ end
765
+
766
+ it 'should create a SyntaxError Class' do
767
+ Net::NNTP::Response.create(@request, '501 Syntax Error').class.should == Net::NNTP::SyntaxError
768
+ end
769
+
770
+ it 'should create a PermanentlyUnavailable Class' do
771
+ Net::NNTP::Response.create(@request, '502 Feature Not Provided').class.should == Net::NNTP::PermanentlyUnavailable
772
+ end
773
+
774
+ it 'should create a FeatureNotProvided Class' do
775
+ Net::NNTP::Response.create(@request, '503 Feature Not Provided').class.should == Net::NNTP::FeatureNotProvided
776
+ end
777
+
778
+ it 'should create an EncodingError Class' do
779
+ Net::NNTP::Response.create(@request, '504 Encoding Error').class.should == Net::NNTP::EncodingError
780
+ end
781
+
782
+ it 'should create a TemporarilyUnavailable Class' do
783
+ Net::NNTP::Response.create(@request, '400 Temporarily unavailable').class.should == Net::NNTP::TemporarilyUnavailable
784
+ end
785
+
786
+ it 'should create an InternalFault Class' do
787
+ Net::NNTP::Response.create(@request, '403 Internal Error').class.should == Net::NNTP::InternalFault
788
+ end
789
+
790
+ it 'should create a GroupUnknown Class' do
791
+ @request = Net::NNTP::Group.new('not.here')
792
+ Net::NNTP::Response.create(@request, '411 not.here is unknown').class.should == Net::NNTP::GroupUnknown
793
+ end
794
+
795
+ it 'should create a NoGroupSelected Class' do
796
+ @request = Net::NNTP::Next
797
+ Net::NNTP::Response.create(@request, '412 no newsgroup selected').class.should == Net::NNTP::NoGroupSelected
798
+ end
799
+
800
+ it 'should create an InvalidArticle Class' do
801
+ @request = Net::NNTP::Article.new(0)
802
+ Net::NNTP::Response.create(@request, '420 invalid article number').class.should == Net::NNTP::InvalidArticle
803
+ end
804
+
805
+ it 'should create a NoNextArticle Class' do
806
+ Net::NNTP::Response.create(@request, '421 no next article in group').class.should == Net::NNTP::NoNextArticle
807
+ end
808
+
809
+ it 'should create a NoPreviousArticle Class' do
810
+ Net::NNTP::Response.create(@request, '422 no previous article in group').class.should == Net::NNTP::NoPreviousArticle
811
+ end
812
+
813
+ it 'should create an InvalidNumberOrRange Class' do
814
+ Net::NNTP::Response.create(@request, '423 no article with that number or in that range').class.should == Net::NNTP::InvalidNumberOrRange
815
+ end
816
+
817
+ it 'should create a NoSuchMessageid Class' do
818
+ Net::NNTP::Response.create(@request, '430 no article with that message-id').class.should == Net::NNTP::NoSuchMessageid
819
+ end
820
+
821
+ it 'should create an ArticleNotWanted Class' do
822
+ Net::NNTP::Response.create(@request, '435 article not wanted').class.should == Net::NNTP::ArticleNotWanted
823
+ end
824
+
825
+ it 'should create a TransferNotPossible Class' do
826
+ Net::NNTP::Response.create(@request, '436 transfer failed').class.should == Net::NNTP::TransferNotPossible
827
+ end
828
+
829
+ it 'should create an TransferRejected Class' do
830
+ Net::NNTP::Response.create(@request, '437 transfer rejected').class.should == Net::NNTP::TransferRejected
831
+ end
832
+
833
+ it 'should create a PostingNotPermitted Class' do
834
+ Net::NNTP::Response.create(@request, '440 not permitted').class.should == Net::NNTP::PostingNotPermitted
835
+ end
836
+
837
+ it 'should create a PostingFailed Class' do
838
+ Net::NNTP::Response.create(@request, '441 posting failed').class.should == Net::NNTP::PostingFailed
839
+ end
840
+
841
+ it 'should create a AuthenticationRequired Class' do
842
+ Net::NNTP::Response.create(@request, '480 Authentication Required').class.should == Net::NNTP::AuthenticationRequired
843
+ end
844
+
845
+ it 'should create a AuthenticationFailed Class' do
846
+ Net::NNTP::Response.create(@request, '481 Authentication failed').class.should == Net::NNTP::AuthenticationFailed
847
+ end
848
+
849
+ it 'should create a AuthenticationOutOfSequence Class' do
850
+ Net::NNTP::Response.create(@request, '482 Authentication out of sequence').class.should == Net::NNTP::AuthenticationOutOfSequence
851
+ end
852
+
853
+ it 'should create a PrivacyRequired Class' do
854
+ Net::NNTP::Response.create(@request, '483 Privacy Required').class.should == Net::NNTP::PrivacyRequired
855
+ end
856
+
857
+ it 'should create a HelpResponse Class' do
858
+ Net::NNTP::Response.create(@request, '100 Help text follows').class.should == Net::NNTP::HelpResponse
859
+ end
860
+
861
+ it 'should create a CapabilityList Class' do
862
+ Net::NNTP::Response.create(@request, '101 Capability list:').class.should == Net::NNTP::CapabilityList
863
+ end
864
+
865
+ it 'should create a DateResponse Class' do
866
+ Net::NNTP::Response.create(@request, '111 20080815124533').class.should == Net::NNTP::DateResponse
867
+ end
868
+
869
+ it 'should create a PostingAllowed Class' do
870
+ @request = Net::NNTP::Modereader.new
871
+ response = Net::NNTP::Response.create(@request, '200 Posting allowed')
872
+ response.class.should == Net::NNTP::PostingAllowed
873
+ end
874
+
875
+ it 'should create a PostingProhibited Class' do
876
+ @request = Net::NNTP::Modereader.new
877
+ response = Net::NNTP::Response.create(@request, '201 Posting Prohibited')
878
+ response.class.should == Net::NNTP::PostingProhibited
879
+ end
880
+
881
+ it 'should create a ConnectionClosing Class' do
882
+ @request = Net::NNTP::Quit.new
883
+ response = Net::NNTP::Response.create(@request, '205 Connection closing')
884
+ response.class.should == Net::NNTP::ConnectionClosing
885
+ end
886
+
887
+ it 'should create a GroupSelected Class' do
888
+ @request = Net::NNTP::Group.new('misc.test')
889
+ response = Net::NNTP::Response.create(@request, '211 1234 3000234 3002322 misc.test')
890
+ response.class.should == Net::NNTP::GroupSelected
891
+ @request = Net::NNTP::Listgroup.new('misc.test')
892
+ response = Net::NNTP::Response.create(@request, '211 1234 3000234 3002322 misc.test list follows')
893
+ response.class.should == Net::NNTP::GroupSelected
894
+ end
895
+
896
+ it 'should create a ListInformationFollows Class' do
897
+ @request = Net::NNTP::List.new
898
+ response = Net::NNTP::Response.create(@request, '215 list information follows')
899
+ response.class.should == Net::NNTP::ListInformationFollows
900
+ end
901
+
902
+ it 'should create an ArticleResponse Class' do
903
+ @request = Net::NNTP::Article.new
904
+ response = Net::NNTP::Response.create(@request, '220 Article follows')
905
+ response.class.should == Net::NNTP::ArticleResponse
906
+ end
907
+
908
+ it 'should create a HeaderResponse Class' do
909
+ @request = Net::NNTP::Head.new
910
+ response = Net::NNTP::Response.create(@request, '221 Header information follows')
911
+ response.class.should == Net::NNTP::HeaderResponse
912
+ end
913
+
914
+ it 'should create a BodyResponse Class' do
915
+ @request = Net::NNTP::Body.new
916
+ response = Net::NNTP::Response.create(@request, '222 Article Body follows')
917
+ response.class.should == Net::NNTP::BodyResponse
918
+ end
919
+
920
+ it 'should create an ArticleSelected Class' do
921
+ @request = Net::NNTP::Next.new
922
+ response = Net::NNTP::Response.create(@request, '223 3000237 <1234@example.org> retrieved')
923
+ response.class.should == Net::NNTP::ArticleSelected
924
+ end
925
+
926
+ it 'should create an OverviewInformation Class' do
927
+ @request = Net::NNTP::Over.new
928
+ response = Net::NNTP::Response.create(@request, '224 Overview Information follows')
929
+ response.class.should == Net::NNTP::OverviewInformation
930
+ end
931
+
932
+ it 'should create a HdrResponse Class' do
933
+ @request = Net::NNTP::Hdr.new('Subject')
934
+ response = Net::NNTP::Response.create(@request, '225 Header information follows')
935
+ response.class.should == Net::NNTP::HdrResponse
936
+ end
937
+
938
+ it 'should create a NewnewsResponse Class' do
939
+ @request = Net::NNTP::Newnews.new(['at.*'], '20080527 092535')
940
+ response = Net::NNTP::Response.create(@request, '230 List of new articles by message-id follows')
941
+ response.class.should == Net::NNTP::NewnewsResponse
942
+ end
943
+
944
+ it 'should create a NewgroupsResponse Class' do
945
+ @request = Net::NNTP::Newgroups.new('20080527 092535')
946
+ response = Net::NNTP::Response.create(@request, '231 List of new newsgroups follows')
947
+ response.class.should == Net::NNTP::NewgroupsResponse
948
+ end
949
+
950
+ it 'should create a TransferOK Class' do
951
+ @request = Net::NNTP::Ihave.new('<my.msgid@example.com>')
952
+ response = Net::NNTP::Response.create(@request, '235 Article transferred OK')
953
+ response.class.should == Net::NNTP::TransferOK
954
+ end
955
+
956
+ it 'should create an ArticleReceived Class' do
957
+ @request = Net::NNTP::Post.new
958
+ response = Net::NNTP::Response.create(@request, '240 Article received OK')
959
+ response.class.should == Net::NNTP::ArticleReceived
960
+ end
961
+
962
+ it 'should create an AuthenticationAccepted Class' do
963
+ @request = Net::NNTP::Authinfo.new('user', 'pass')
964
+ response = Net::NNTP::Response.create(@request, '281 Authentication OK')
965
+ response.class.should == Net::NNTP::AuthenticationAccepted
966
+ end
967
+
968
+ it 'should create a TransferArticle Class' do
969
+ @request = Net::NNTP::Ihave.new('<my.msgid@example.com>')
970
+ response = Net::NNTP::Response.create(@request, '335 Send it; end with <CR-LF>.<CR-LF>')
971
+ response.class.should == Net::NNTP::TransferArticle
972
+ end
973
+
974
+ it 'should create a PostArticle Class' do
975
+ @request = Net::NNTP::Post.new
976
+ response = Net::NNTP::Response.create(@request, '340 Send it; end with <CR-LF>.<CR-LF>')
977
+ response.class.should == Net::NNTP::PostArticle
978
+ end
979
+
980
+ it 'should create a PasswordRequired Class' do
981
+ response = Net::NNTP::Response.create(@request,'381 Password required')
982
+ response.class.should == Net::NNTP::PasswordRequired
983
+ end
984
+
985
+ it 'should create a InformationResponse on unknown 189 code' do
986
+ @request = Net::NNTP::Help.new
987
+ response = Net::NNTP::Response.create(@request, '189 unknown code')
988
+ response.class.should == Net::NNTP::InformationResponse
989
+ response.code.should == '189'
990
+ response.message.should == 'unknown code'
991
+ end
992
+
993
+ end
994
+