From ade40b2bd02a75ce8df80cbe2d25a262281516ac Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Fri, 19 Jan 2024 12:48:07 -0800 Subject: [PATCH] test: test than IPNS:// urls are handled properly --- .../src/utils/parse-url-string.ts | 19 +++++++----- .../test/parse-url-string.spec.ts | 30 ++++++++++++++++++- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/packages/verified-fetch/src/utils/parse-url-string.ts b/packages/verified-fetch/src/utils/parse-url-string.ts index c2c4d0975..75e79030f 100644 --- a/packages/verified-fetch/src/utils/parse-url-string.ts +++ b/packages/verified-fetch/src/utils/parse-url-string.ts @@ -38,20 +38,23 @@ export async function parseUrlString ({ urlString, ipns }: ParseUrlStringOptions } } else if (protocol === 'ipns') { if (cidOrPeerIdOrDnsLink.includes('.')) { + log.trace('Attempting to resolve DNSLink for %s', cidOrPeerIdOrDnsLink) try { cid = await ipns.resolveDns(cidOrPeerIdOrDnsLink) + log.trace('resolved %s to %c', cidOrPeerIdOrDnsLink, cid) } catch (err) { log.error(err) throw new TypeError('Invalid DNSLink for ipns:// URL') } - } - - try { - const peerId = peerIdFromString(cidOrPeerIdOrDnsLink) - cid = await ipns.resolve(peerId) - } catch (err) { - log.error(err) - // ignore non PeerId + } else { + log.trace('Attempting to resolve PeerId for %s', cidOrPeerIdOrDnsLink) + try { + const peerId = peerIdFromString(cidOrPeerIdOrDnsLink) + cid = await ipns.resolve(peerId) + log.trace('resolved %s to %c', cidOrPeerIdOrDnsLink, cid) + } catch (err) { + log.error(err) + } } } else { throw new TypeError('Invalid protocol for URL. Please use ipfs:// or ipns:// URLs only.') diff --git a/packages/verified-fetch/test/parse-url-string.spec.ts b/packages/verified-fetch/test/parse-url-string.spec.ts index c72491bbb..832d7b97a 100644 --- a/packages/verified-fetch/test/parse-url-string.spec.ts +++ b/packages/verified-fetch/test/parse-url-string.spec.ts @@ -1,10 +1,11 @@ import { expect } from 'aegir/chai' +import { CID } from 'multiformats/cid' import { stubInterface } from 'sinon-ts' import { parseUrlString } from '../src/utils/parse-url-string.js' import type { IPNS } from '@helia/ipns' describe('parseUrlString', () => { - describe('ipfs:// URLs', () => { + describe('ipfs:// URLs', () => { it('can parse a URL with CID only', async () => { const ipns = stubInterface({}) const result = await parseUrlString({ @@ -26,4 +27,31 @@ describe('parseUrlString', () => { expect(result.path).to.equal('1 - Barrel - Part 1/1 - Barrel - Part 1 - alt.txt') }) }) + + describe('ipns:// URLs', () => { + const ipns = stubInterface({ + resolveDns: async (dnsLink: string) => { + expect(dnsLink).to.equal('mydomain.com') + return CID.parse('QmQJ8fxavY54CUsxMSx9aE9Rdcmvhx8awJK2jzJp4iAqCr') + } + }) + it('can parse a URL with DNSLinkDomain only', async () => { + const result = await parseUrlString({ + urlString: 'ipns://mydomain.com', + ipns + }) + expect(result.protocol).to.equal('ipns') + expect(result.cid.toString()).to.equal('QmQJ8fxavY54CUsxMSx9aE9Rdcmvhx8awJK2jzJp4iAqCr') + expect(result.path).to.equal('') + }) + it('can parse a URL with DNSLinkDomain+path', async () => { + const result = await parseUrlString({ + urlString: 'ipns://mydomain.com/some/path/to/file.txt', + ipns + }) + expect(result.protocol).to.equal('ipns') + expect(result.cid.toString()).to.equal('QmQJ8fxavY54CUsxMSx9aE9Rdcmvhx8awJK2jzJp4iAqCr') + expect(result.path).to.equal('some/path/to/file.txt') + }) + }) })