@thgh/tunnelmole
Version:
Tunnelmole, an open source ngrok alternative. Instant public URLs for any http/https based application. Available as a command line application or as an NPM dependency for your code. Stable and maintained. Good test coverage. Works behind firewalls
104 lines • 4.05 kB
JavaScript
import fetch from "node-fetch";
import fs from "fs";
import FormData from 'form-data';
import { tunnelmole } from "../../src";
import { URLSearchParams } from "url";
import { app } from "./test-server/app";
import config from "../../config.js";
describe("Tunnelmole integration tests", () => {
// Initialise connection
const port = 3000;
let url;
beforeAll(async () => {
// Start Tunnelmole, the URL will tunnel to `localhost:${port}`
const isLocal = config.hostip.endpoint === 'ws://localhost:8081';
// Set domain for local testing to avoid the need to pause and set the hostname in /etc/hosts each time
const domain = isLocal ? 'testsite.localhost' : undefined;
({ url } = await tunnelmole({
port,
domain
}));
// Rewrite the URL for local testing to be plain http and include the default port
if (isLocal) {
url = 'http://testsite.localhost:8001';
}
// Start the test express app listening on `localhost{$port}`
await new Promise((resolve) => {
app.listen(port, () => {
resolve(true);
});
});
});
it("GET HTML document", async () => {
const response = await fetch(url);
const text = await response.text();
expect(text).toContain('<html>');
});
it("GET JSON", async () => {
const response = await fetch(url + '/json');
const json = await response.json();
expect(json.test).toEqual('test');
});
it("API style POST with JSON request/response", async () => {
const response = await fetch(url + '/api-post', {
method: "POST",
body: JSON.stringify({
test: "test"
})
});
// This route will the payload sent to it
const json = await response.json();
expect(json.test).toEqual('test');
});
it("API style PUT with JSON request/response", async () => {
const response = await fetch(url + '/api-put', {
method: "PUT",
body: JSON.stringify({
test: "test"
})
});
// This route will the payload sent to it
const json = await response.json();
expect(json.test).toEqual('test');
});
it("HTML form submission style POST", async () => {
const body = new URLSearchParams();
body.append("firstName", "John");
body.append("lastName", "Smith");
body.append("email", "john.smith@expose.sh");
const response = await fetch(url + '/post-submit-form', {
method: "POST",
body
});
const responseData = await response.json();
expect(responseData.firstName).toEqual("John");
});
it.skip("Upload binary photo", async () => {
const image = fs.readFileSync(__dirname + '/files/img/test-image.png');
const response = await fetch(url + '/image-upload', {
method: "POST",
body: image
});
const responseBodyArrayBuffer = await response.arrayBuffer();
const responseBuffer = Buffer.from(responseBodyArrayBuffer);
const equal = Buffer.compare(image, responseBuffer);
expect(equal).toBe(1);
});
it.skip("Submit multipart/form-data with image and text field as POST", async () => {
const image = fs.readFileSync(__dirname + '/files/img/test-image.png');
const form = new FormData();
form.append('firstName', 'John');
form.append('photo', image, {
contentType: "image/png",
filename: "test-image.png"
});
const response = await fetch(url + '/post-submit-form-multipart-with-image', {
method: "POST",
body: form
});
const responseData = await response.json();
expect(responseData.firstName).toEqual("John");
expect(responseData.filename).toEqual('test-image.png');
});
});
//# sourceMappingURL=tunnelmole.test.js.map