UNPKG

newsie

Version:

An NNTP Client Library targeting NodeJS. It supports the authentication, TLS encryption, base NNTP commands, and more.

128 lines (113 loc) 4.96 kB
import { fetch } from '../src' import { Server } from '../src/MockServer' describe('rfc 5538', () => { let server beforeEach(() => { server = new Server() return server.listen() }) afterEach(() => server.close()) test('fetching article from server', async () => { // given const port = server.getListeningPort() server.addSimpleHandler((command, args) => { if (command === 'CAPABILITIES') { return '101 Capability List:\r\nVERSION 2\r\n.\r\n' } expect(command).toEqual('ARTICLE') expect(args).toEqual(['12345']) return ( '220 3000234 <45223423@example.com>\r\n' + 'Path: pathost!demo!whitehouse!not-for-mail\r\n' + 'From: "Demo User" <nobody@example.net>\r\n' + 'Newsgroups: misc.test\r\n' + 'Subject: I am just a test article\r\n' + 'Date: 6 Oct 1998 04:38:40 -0500\r\n' + 'Organization: An Example Net, Uncertain, Texas\r\n' + 'Message-ID: <45223423@example.com>\r\n' + '\r\n' + 'This is just a test article.\r\n' + '.\r\n' ) }) const uri = `nntp://localhost:${port}/example.group.this/12345` // when const article = await fetch(uri) // then expect(article).toEqual({ code: 220, comment: '', description: 'Article follows (multi-line)', article: { articleNumber: 3000234, messageId: '<45223423@example.com>', headers: { PATH: 'pathost!demo!whitehouse!not-for-mail', FROM: '"Demo User" <nobody@example.net>', NEWSGROUPS: 'misc.test', SUBJECT: 'I am just a test article', DATE: '6 Oct 1998 04:38:40 -0500', ORGANIZATION: 'An Example Net, Uncertain, Texas', 'MESSAGE-ID': '<45223423@example.com>' }, body: ['This is just a test article.'] } }) }) test.skip(`A <newsgroup-name> as specified in [RFC5536] consists of dot- separated components. Each component contains one or more letters, digits, "-" (hyphen-minus), "+", or "_" (underscore). These characters can be directly used in a segment of a path in an [RFC3986] URI; no percent-encoding is necessary. Example: nntp://news.server.example/example.group.this/12345`, async () => { const uri = 'nntp://news.server.example/example.group.this/12345' }) test.skip(`A <wildmat-exact> newsgroup name as specified in [RFC3977] allows (in theory) any <UTF8-non-ascii> (see Section 6) and most printable US-ASCII characters, excluding "!", "*", ",", "?", "[", "\\", and "]". However, [RFC5536] does not (yet) permit characters outside of <group-char> and so, to keep the syntax simple, the additional characters are here covered by <pct-encoded> as defined in [RFC3986], since most of them have to be percent-encoded anyway (with a few exceptions, such as ":", ";", and "~"). Example:`, () => { const uri = 'nntp://wild.server.example/example.group.n%2Fa/12345' }) test.skip(`In the form without <article-number>, the URL identifies a single group on the specified server. This is also possible with an equivalent 'news' URL, and the latter is better supported by user agents. Example:`, () => { const uris = [ 'nntp://news.server.example/example.group.this', 'news://news.server.example/example.group.this' ] }) test.skip(`The form identifying <newsgroups> corresponds to the [RFC3977] <wildmat-pattern>, a newsgroup name with wildcards "*" and "?". Any "?" has to be percent-encoded as "%3F" in this part of a URI. Examples (the first two are equivalent):`, () => { const uris = [ 'news://news.server.example/*', 'news://news.server.example/', 'news://wild.server.example/example.group.th%3Fse', 'news:example.group.*', 'news:example.group.this' ] }) test.skip(`Here is an example of a mail to the <mailto:tools.discuss@ietf.org> list with "Message-ID" <p0624081dc30b8699bf9b@[10.20.30.108]>. <http://dir.gmane.org/gmane.ietf.tools> is one of the various list archives; it converts mail into Netnews articles. The header of this article contains the following fields (among others): The "Xref" roughly indicates the 742nd article in newsgroup <news://news.gmane.org/gmane.ietf.tools> on this server. An 'nntp' URL might be <nntp://news.gmane.org/gmane.ietf.tools/742>. For details about the "Archived-At" URL, see [RFC5064].`, () => { const uri = 'news://news.gmane.org/gmane.ietf.tools' }) test.skip(`The list software and list subscribers reading the list elsewhere can't predict a server-specific article number 742 in this archive. If they know this server, they can however guess the corresponding <news://news.gmane.org/p0624081dc30b8699bf9b@%5B10.20.30.108%5D> URL.`, () => { const uri = 'news://news.gmane.org/p0624081dc30b8699bf9b@%5B10.20.30.108%5D' }) })