UNPKG

url-metadata

Version:

Request a url and scrape the metadata from its HTML using Node.js or the browser.

134 lines (122 loc) 4.32 kB
const urlMetadata = require('./../index') test('fails gracefully with malformed url param', async () => { const url = 'XYZ' try { const metadata = await urlMetadata(url) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('Only absolute URLs are supported') } }) test('fails gracefully when url param is missing', async () => { try { const metadata = await urlMetadata(null) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('url parameter is missing') } }) test('fails gracefully on DNS errors', async () => { try { // note: url typo (missing "i"), DNS doesn't resolve! const url = 'https://minfetch.com' const metadata = await urlMetadata(url) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() // This error thrown by `node-fetch` or native fetch expect(err.message).toContain('getaddrinfo ENOTFOUND') expect(err.type).toBe('system') // ENOTFOUND = Error: Not Found = DNS lookup error from `node-fetch` expect(err.errno).toBe('ENOTFOUND') expect(err.code).toBe('ENOTFOUND') } }) test('fails gracefully on !response.ok', async () => { // should 403 const url = 'https://www.npmjs.com/packageXXX/url-metadataXXX' try { const metadata = await urlMetadata(url) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('response code 403') expect(err.statusCode).toBe(403) } }) test('fails gracefully on 404', async () => { try { const url = 'https://nichenetworks.io/foo' const metadata = await urlMetadata(url) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('404') expect(err.statusCode).toBe(404) } }) test('fails gracefully when fetching non text/html', async () => { const url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/International_Pok%C3%A9mon_logo.svg/500px-International_Pok%C3%A9mon_logo.svg.png' try { const metadata = await urlMetadata(url) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('unsupported content type') expect(err.statusCode).toBe(200) } }) test('fails gracefully fetching .txt file', async () => { const url = 'https://anthropic.com/robots.txt' try { const metadata = await urlMetadata(url) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('unsupported content type') expect(err.statusCode).toBe(200) } }) test('fails gracefully decoding with bad charset', async () => { const url = 'https://github.com' try { const metadata = await urlMetadata(url, { decode: 'FOO-BAR' }) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('decoding with charset') expect(err.statusCode).toBe(200) } }) test('fails gracefully when option `parseResponseObject` is empty object', async () => { try { // pass null `url` param & empty response object const metadata = await urlMetadata(null, { parseResponseObject: {} }) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('response code undefined') expect(err.statusCode).toBeUndefined() } }) test('fails gracefully when option: `parseResponseObject` is null AND url is null', async () => { try { const metadata = await urlMetadata(null, { parseResponseObject: null }) // should not reach here, but just in case: expect(metadata).toBeUndefined() } catch (err) { expect(err).toBeDefined() expect(err.message).toContain('url parameter is missing') } })