diff --git a/src/core/package/SfpPackageInquirer.ts b/src/core/package/SfpPackageInquirer.ts index bc9d0f1a4..db8cff139 100644 --- a/src/core/package/SfpPackageInquirer.ts +++ b/src/core/package/SfpPackageInquirer.ts @@ -87,7 +87,24 @@ export default class SfpPackageInquirer { let remoteURL: gitUrlParse.GitUrl; for (let sfpPackage of this.sfpPackages) { - let currentRemoteURL = gitUrlParse(sfpPackage.repository_url); + let currentRemoteURL: gitUrlParse.GitUrl; + + const packageRemoteURL: string | undefined = sfpPackage.repository_url; + if (typeof packageRemoteURL === 'undefined') { + throw new Error(`Package '${sfpPackage.package_name}' does not have a repository URL`); + } + + try { + currentRemoteURL = gitUrlParse(packageRemoteURL); + } catch (ex) { + if (ex instanceof Error && ex.message === 'URL parsing failed.') { + throw new Error( + `Invalid repository URL for package '${sfpPackage.package_name}': ${packageRemoteURL}` + ); + } else { + throw ex; + } + } if (remoteURL == null) { remoteURL = currentRemoteURL; diff --git a/tests/core/package/SfpPackageInquirer.test.ts b/tests/core/package/SfpPackageInquirer.test.ts new file mode 100644 index 000000000..4a715aaa3 --- /dev/null +++ b/tests/core/package/SfpPackageInquirer.test.ts @@ -0,0 +1,46 @@ +import { expect } from '@jest/globals'; +import SfpPackage from '../../../lib/core/package/SfpPackage'; +import SfpPackageInquirer from '../../../src/core/package/SfpPackageInquirer'; + +describe('validateArtifactsSourceRepository', () => { + describe('Given a bad repository URL, display', () => { + it('should accept a good repository SSH URL', async () => { + const repositoryUrl = 'git@github.com:flxbl-io/sfp-test.git'; + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.package_name = 'testPackageName'; + sfpPackage.repository_url = repositoryUrl; + + let sfpPackageInquirer = new SfpPackageInquirer([sfpPackage]); + sfpPackageInquirer.validateArtifactsSourceRepository(); + }); + + // TODO: re-enable once https://github.com/flxbl-io/sfp/issues/137 is fixed + it.skip.failing('should accept a good repository SSH URL with a URL-encoded space', async () => { + const repositoryUrl = 'git@github.com:flxbl-io/sfp%20test.git'; + + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.package_name = 'testPackageName'; + sfpPackage.repository_url = repositoryUrl; + + let sfpPackageInquirer = new SfpPackageInquirer([sfpPackage]); + sfpPackageInquirer.validateArtifactsSourceRepository(); + }); + + it('should reject a bad repository SSH URL with a helpful error message', async () => { + const repositoryUrl = 'git'; + + const t = () => { + let sfpPackage: SfpPackage = new SfpPackage(); + sfpPackage.package_name = 'testPackageName'; + sfpPackage.repository_url = repositoryUrl; + + let sfpPackageInquirer = new SfpPackageInquirer([sfpPackage]); + sfpPackageInquirer.validateArtifactsSourceRepository(); + }; + + expect(t).toThrow(Error); + expect(t).toThrow("Invalid repository URL for package 'testPackageName': git"); + }); + }); +});