From 0616ce3c925abbdf697b75b6447fc093f47bf843 Mon Sep 17 00:00:00 2001 From: Shubhan Chemburkar Date: Wed, 27 Jul 2022 05:38:02 +0530 Subject: [PATCH] Test: Included tests for verifying SSL hosting (#720) --- source/utilities/server.ts | 3 +- tests/__fixtures__/server/ssl/app/index.html | 23 ++++ tests/__fixtures__/server/ssl/cert-password | 1 + .../server/ssl/cert-with-pass.key | 30 +++++ .../server/ssl/cert-with-pass.pem | 19 +++ .../server/ssl/cert-with-pass.pfx | Bin 0 -> 2652 bytes tests/__fixtures__/server/ssl/cert.key | 28 +++++ tests/__fixtures__/server/ssl/cert.pem | 19 +++ tests/__fixtures__/server/ssl/cert.pfx | Bin 0 -> 2652 bytes tests/__fixtures__/server/ssl/serve.json | 4 + tests/server.ssl.test.ts | 114 ++++++++++++++++++ 11 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 tests/__fixtures__/server/ssl/app/index.html create mode 100644 tests/__fixtures__/server/ssl/cert-password create mode 100644 tests/__fixtures__/server/ssl/cert-with-pass.key create mode 100644 tests/__fixtures__/server/ssl/cert-with-pass.pem create mode 100644 tests/__fixtures__/server/ssl/cert-with-pass.pfx create mode 100644 tests/__fixtures__/server/ssl/cert.key create mode 100644 tests/__fixtures__/server/ssl/cert.pem create mode 100644 tests/__fixtures__/server/ssl/cert.pfx create mode 100644 tests/__fixtures__/server/ssl/serve.json create mode 100644 tests/server.ssl.test.ts diff --git a/source/utilities/server.ts b/source/utilities/server.ts index 1326f1ee..e58b762e 100644 --- a/source/utilities/server.ts +++ b/source/utilities/server.ts @@ -65,7 +65,8 @@ export const startServer = async ( const sslCert = args['--ssl-cert']; const sslKey = args['--ssl-key']; const sslPass = args['--ssl-pass']; - const isPFXFormat = sslCert && /[.](?pfx|p12)$/.exec(sslCert); + const isPFXFormat = + sslCert && /[.](?pfx|p12)$/.exec(sslCert) !== null; const useSsl = sslCert && (sslKey || sslPass || isPFXFormat); let serverConfig: http.ServerOptions | https.ServerOptions = {}; diff --git a/tests/__fixtures__/server/ssl/app/index.html b/tests/__fixtures__/server/ssl/app/index.html new file mode 100644 index 00000000..061fca55 --- /dev/null +++ b/tests/__fixtures__/server/ssl/app/index.html @@ -0,0 +1,23 @@ + + + + + + + + Serve Application + + + + + + + + + + Hello there! + + diff --git a/tests/__fixtures__/server/ssl/cert-password b/tests/__fixtures__/server/ssl/cert-password new file mode 100644 index 00000000..4360f5f9 --- /dev/null +++ b/tests/__fixtures__/server/ssl/cert-password @@ -0,0 +1 @@ +vercel \ No newline at end of file diff --git a/tests/__fixtures__/server/ssl/cert-with-pass.key b/tests/__fixtures__/server/ssl/cert-with-pass.key new file mode 100644 index 00000000..0c93597f --- /dev/null +++ b/tests/__fixtures__/server/ssl/cert-with-pass.key @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFNjBgBgkqhkiG9w0BBQ0wUzAyBgkqhkiG9w0BBQwwJQQQ7KCQzNwvExz/4GIj +PAE0pgIDAYagMAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBA5Rq+9hKSzNs0m +42WxNHXJBIIE0IYlhyUKWk4C59uFymGxWaeRfFACj6luuGQTBsv69+cC0zL647p0 +L5jl3vlToy/n0ADBTXZYujSuIHg4fSpIzl5ROMX6ksC7T7z3f1cWNa0fIw0aPH9O +50/O2I1j+PScHzyhPXdIcGdEin8zETqgd6ldCFQLJo97ju9LXBQ3a71FdKLMsrKm +YpGR+tgFsf6szSnMb/luIjUAA8zX75qco+vuJcigZsvZX6B02kCJSNloCFx8gWbg +12YegYO4IGX3f49kIbis85lPqHsKB3EzOFx4uHjSOI3xL8d5tH4Kw/cLYtF+mf9v +7dgw42dhpmIEGn8uNasC6+DipKwSdqHhB4XWC6FerKcH3+3xsXKjK2Xa45aYghe5 +dHjaBSYmGpZ4XerwnkMRfZPFBW3bXjW6vQ/wleclFpz4UJpzE29OqLT1JFBa+MI+ +OFiTE+a9LYwMLw0qsnyeU1wt69A028Csuzz7Y3UZZs0F9171IbBQgDf1H/tPfELy +M7oI7K10LU4SJjyBNoi7ijpvh755974yRi/2GoNqgbpHY4GNvJ3JYUuDlfgrYkOD +7auliDYHrt7C/9g2Att7lp7/HfYERZkA8X6rLKiZZN8T0nOniiDxKczjDw01X5r1 +oCovzFT5wD1KDWM3Y2I7u64HbPWPv+KACVUKcByC97cypwcbPVN7bWA2f1ZgFs41 +HdSJ/QSt2ms8MIAq5XUvD5XkbG3C4R8EOUzvMe0N1ImIair82PFh2EUY/J8AIyd/ +Lq0D2L17DR0OGw71uS5/EUAq86IhTAnD9arvoTib8WHly7cHV3qOLRxgX9kjEDsu +xRu+NehLeh/QAjHTuAFOzY4lUxcy042YF8ycw37DXip9wYuAGJpI2rtr5vCAElre +yEurwK3PLGyE1wswc8MIx114W+wyReJFXMt8QjRk+t6987hy0g1M7MO65NBlcDuF +LVqGlhEP3xa9LnLMLhDEjEehzk1W7xB4t1VUcEt+D8ImwLjoOCvSj6Wnn08NHB2o +Ff4HVjqLF4heE3WARvFZbPahzOoaPca0ssRWdzSEQE3uENtThXqm4pJZQ2IBHoMG +vT89Q+nDhS6zESdv4DAdc0nYeGsFwfzfrnogaZkny+Gnvtkx0qa3pcL2GznQx95N +Qzb17TULscmjuCz+5q2dzIvybyw5pHQAOYfHyzJWe95cZtQMD1kadB1HmFWWtiMU +36rBPZXGvLkqzLfaLlhyFoQYHZqyi89SZNAMhBh86Rgb7piyD9aGe8kc1s3VLk2Y +BqaOnu6lEsj6DAOA0sqsVEhrHTIfNS/NKG/rvDOjTAdlYNc24TEq6oukv0hQBF97 +hYvgye0/wh5gwu4qx9KjFyVNCAMWWnlqCm73DK5ZNk5Jjkis4Jm5POFdJRLQgjHL +0usNk2aJNubDqJym2M7X53/gsg4fqbXBu6dg3/8b2Tx2QHOJM69PKK02NQf3By3f +ByAE/mdBdxVvlxRJyyjjuWN3xyWPgGcnDqWBqLW4Kh9oRZik9EMYT92UHxAuilBa +vm1MORT4EYNLRLTeRrO/p9ENRkr7G6c/1p1+Uh2fz0bqyvwxUAlW2UC1+8nx2fGm +N2xwsBaG9+tjseSR/OSMhYzImmdagTk6uYWuLofKqBTte0oqQyNrVs2L +-----END ENCRYPTED PRIVATE KEY----- \ No newline at end of file diff --git a/tests/__fixtures__/server/ssl/cert-with-pass.pem b/tests/__fixtures__/server/ssl/cert-with-pass.pem new file mode 100644 index 00000000..6996cce1 --- /dev/null +++ b/tests/__fixtures__/server/ssl/cert-with-pass.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIIFtK8Sw/EzO4wDQYJKoZIhvcNAQELBQAwFDESMBAGA1UE +AxMJbG9jYWxob3N0MB4XDTIyMDcxODE3MDY1MloXDTIzMDcxODE3MDY1MlowFDES +MBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAxicgLe07Kg/oHOPTvljjpLhfUd3VLlrStvIF2RSF25jowmg1LtronKEaMZZF +TbdXwrvM1erkOALZ5e1FBhvuziYZ3BzjRxCI4omdWLYwzjPHWbbGermPIdN6zjHT +LwInqCq55a3lLXge8TClA3Ws92uZcuwJKe9uDnC/IV2P1QLNsbpb+dSnZyKyIO8A +ILgMSknh2fPcXdMklKi50CiUo6i6xAKShcvI8BOr18CUdWqEVWPBvyvT4jgnGfBo +GPlMl2DE4UwHVcl8Ga7If3pxbpFzz284gKXXLRwhyiYwM5RIHOAm+u8jqqB1eR4N +IqjbB8zgi9JMxMwVZeO5nF6kGQIDAQABo2IwYDAMBgNVHRMBAf8EAjAAMA4GA1Ud +DwEB/wQEAwIFoDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATAXBgNVHREBAf8EDTAL +gglsb2NhbGhvc3QwDwYKKwYBBAGCN1QBAQQBAjANBgkqhkiG9w0BAQsFAAOCAQEA +U69M0yKkku3biHXhpCieV99wvMqhn0D8zHmMbq/DJhmo0rWX4ka4n6nFy9JafEAa +QdmvUyAeHKUbk1S2MVeM/TXyPtSHwoQ4IoRfhN6YUuY6zTOkeQL5bPJ51LJawqc9 +DRGYQlXw/al88b0cmLr/twI2yf38I+PTpieD3ILVmcEYcp+Vb5nA2mDyHwYM6Rgn +3nXh1XXwlJiw9KCDN7wBYzRwAoH36Xz9bsm1hTQM/LKAJfT4fv8Gv+mN8hCLN+Je +Srgl5QWgozszZZ4+0NQbanornmxygpXvbZCa+f8HLaG+QbQhYhE7vGXTZjN/eHmn +ouGRrIy1RYE8fFUAgFKyJw== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/tests/__fixtures__/server/ssl/cert-with-pass.pfx b/tests/__fixtures__/server/ssl/cert-with-pass.pfx new file mode 100644 index 0000000000000000000000000000000000000000..e895e49f9741d929f9a02c81674e32a4bfbd56a2 GIT binary patch literal 2652 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 D8;ih| literal 0 HcmV?d00001 diff --git a/tests/__fixtures__/server/ssl/serve.json b/tests/__fixtures__/server/ssl/serve.json new file mode 100644 index 00000000..5df3e5ec --- /dev/null +++ b/tests/__fixtures__/server/ssl/serve.json @@ -0,0 +1,4 @@ +{ + "public": "app/", + "renderSingle": true +} diff --git a/tests/server.ssl.test.ts b/tests/server.ssl.test.ts new file mode 100644 index 00000000..f59dfe37 --- /dev/null +++ b/tests/server.ssl.test.ts @@ -0,0 +1,114 @@ +// tests/server.ssl.test.ts +// Tests for the serve with SSL/HTTPS. + +import { afterEach, describe, test, expect, vi } from 'vitest'; +import { extend as createFetch } from 'got'; + +import { loadConfiguration } from '../source/utilities/config.js'; +import { startServer } from '../source/utilities/server.js'; + +// The path to the fixtures for this test file. +const fixtures = 'tests/__fixtures__/server/ssl'; +// The configuration from the fixture. +const config = await loadConfiguration(process.cwd(), fixtures, {}); +// A `fetch` instance to make requests to the server. +const fetch = createFetch({ + https: { rejectUnauthorized: false }, +}); + +afterEach(() => { + vi.restoreAllMocks(); +}); + +describe('utilities/server', () => { + test('start server with SSL when PFX certificate is supplied', async () => { + const address = await startServer({ port: 5001 }, config, { + ['--ssl-cert']: `${fixtures}/cert.pfx`, + }); + + expect(address.local).toBe('https://localhost:5001'); + expect(address.network).toMatch(/^https:\/\/.*:5001$/); + expect(address.previous).toBeUndefined(); + + const response = await fetch(address.local!); + + expect(response.ok); + }); + + test('start server with SSL when PFX certificate and password is supplied', async () => { + const address = await startServer({ port: 5002 }, config, { + ['--ssl-cert']: `${fixtures}/cert-with-pass.pfx`, + ['--ssl-pass']: `${fixtures}/cert-password`, + }); + + expect(address.local).toBe('https://localhost:5002'); + expect(address.network).toMatch(/^https:\/\/.*:5002$/); + expect(address.previous).toBeUndefined(); + + const response = await fetch(address.local!); + + expect(response.ok); + }); + + test('start server with SSL when PFX certificate is supplied and password is missing', async () => { + await expect(() => + startServer({ port: 5003 }, config, { + ['--ssl-cert']: `${fixtures}/cert-with-pass.pfx`, + }), + ).rejects.toThrowError('failure'); + }); + + test('start server with SSL when PFX certificate is supplied and password is invalid', async () => { + await expect(() => + startServer({ port: 5003 }, config, { + ['--ssl-cert']: `${fixtures}/cert-with-pass.pfx`, + ['--ssl-pass']: `${fixtures}/cert-with-pass.pfx`, + }), + ).rejects.toThrowError('failure'); + }); + + test('start server with SSL when PEM certificate, key and password is supplied', async () => { + const address = await startServer({ port: 5004 }, config, { + ['--ssl-cert']: `${fixtures}/cert-with-pass.pem`, + ['--ssl-key']: `${fixtures}/cert-with-pass.key`, + ['--ssl-pass']: `${fixtures}/cert-password`, + }); + + expect(address.local).toBe('https://localhost:5004'); + expect(address.network).toMatch(/^https:\/\/.*:5004$/); + expect(address.previous).toBeUndefined(); + + const response = await fetch(address.local!); + + expect(response.ok); + }); + + test('start server with SSL when PEM certificate, key is supplied and no password is supplied', async () => { + const address = await startServer({ port: 5005 }, config, { + ['--ssl-cert']: `${fixtures}/cert.pem`, + ['--ssl-key']: `${fixtures}/cert.key`, + }); + + expect(address.local).toBe('https://localhost:5005'); + expect(address.network).toMatch(/^https:\/\/.*:5005$/); + expect(address.previous).toBeUndefined(); + + const response = await fetch(address.local!); + + expect(response.ok); + }); + + test('start server without SSL when PEM certificate is supplied and key is missing', async () => { + const address = await startServer({ port: 5006 }, config, { + ['--ssl-cert']: `${fixtures}/cert.pem`, + }); + + expect(address.local).toBe('http://localhost:5006'); + expect(address.network).toMatch(/^http:\/\/.*:5006$/); + expect(address.previous).toBeUndefined(); + + const response = await fetch(address.local!); + + expect(response.ok); + }); +});