Skip to content

Commit

Permalink
Fix e2e (#303)
Browse files Browse the repository at this point in the history
  • Loading branch information
TooTallNate authored Mar 30, 2024
1 parent 1429c7e commit 010fdc3
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 89 deletions.
2 changes: 2 additions & 0 deletions .changeset/cool-coins-march.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
100 changes: 56 additions & 44 deletions packages/https-proxy-agent/test/e2e.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,50 +4,67 @@ import { HttpsProxyAgent } from '../src';

interface NordVPNServer {
name: string;
domain: string;
flag: string;
features: { [key: string]: boolean };
hostname: string;
status: string;
locations: {
country: {
code: string;
}

}[];
technologies: {
identifier: string;
}[];
}

jest.setTimeout(30000);

const findNordVpnServer = () =>
retry(
async (): Promise<NordVPNServer> => {
const res = await req('https://nordvpn.com/api/server');
if (res.statusCode !== 200) {
res.socket.destroy();
throw new Error(`Status code: ${res.statusCode}`);
}
const body = await json(res);
const servers = (body as NordVPNServer[]).filter(
(s) => s.features.proxy_ssl
);
if (servers.length === 0) {
throw new Error(
'Could not find `https` proxy server from NordVPN'
);
}
const server = servers[Math.floor(Math.random() * servers.length)];
return server;
},
{
retries: 5,
onRetry(err, attempt) {
console.log(
`Failed to get NordVPN servers. Retrying… (attempt #${attempt}, ${err.message})`
);
},
}
);

async function getRealIP(): Promise<string> {
const res = await req('https://dump.n8.io');
const body = await json(res);
return body.request.headers['x-real-ip'];
}

describe('HttpsProxyAgent', () => {
let server: NordVPNServer;

it('should find NordVPN "proxy_ssl" server', async () => {
server = await retry(
async (): Promise<NordVPNServer> => {
const res = await req(
'https://api.nordvpn.com/v1/servers?limit=0'
);
if (res.statusCode !== 200) {
res.socket.destroy();
throw new Error(`Status code: ${res.statusCode}`);
}
const body = await json(res);
const servers = (body as NordVPNServer[]).filter(
(s) =>
s.status === 'online' &&
s.technologies.find((t) => t.identifier === 'proxy_ssl')
);
if (servers.length === 0) {
throw new Error(
'Could not find `https` proxy server from NordVPN'
);
}
return servers[Math.floor(Math.random() * servers.length)];
},
{
retries: 5,
onRetry(err, attempt) {
console.log(
`Failed to get NordVPN servers. Retrying… (attempt #${attempt}, ${err.message})`
);
},
}
);
console.log(
`Using NordVPN "proxy_ssl" server: ${server.name} (${server.hostname})`
);
});

it('should work over NordVPN proxy', async () => {
const { NORDVPN_USERNAME, NORDVPN_PASSWORD } = process.env;
if (!NORDVPN_USERNAME) {
Expand All @@ -57,28 +74,23 @@ describe('HttpsProxyAgent', () => {
throw new Error('`NORDVPN_PASSWORD` env var is not defined');
}

const [realIp, server] = await Promise.all([
getRealIP(),
findNordVpnServer(),
]);
console.log(
`Using NordVPN HTTPS proxy server: ${server.name} (${server.domain})`
);

const username = encodeURIComponent(NORDVPN_USERNAME);
const password = encodeURIComponent(NORDVPN_PASSWORD);

// NordVPN runs their HTTPS proxy servers on port 89
// https://www.reddit.com/r/nordvpn/comments/hvz48h/nordvpn_https_proxy/
const agent = new HttpsProxyAgent(
`https://${username}:${password}@${server.domain}:89`
`https://${username}:${password}@${server.hostname}:89`
);

const res = await req('https://dump.n8.io', { agent });
const [res, realIp] = await Promise.all([
req('https://dump.n8.io', { agent }),
getRealIP(),
]);
const body = await json(res);
expect(body.request.headers['x-real-ip']).not.toEqual(realIp);
expect(body.request.headers['x-vercel-ip-country']).toEqual(
server.flag
server.locations[0].country.code
);
});
});
100 changes: 55 additions & 45 deletions packages/socks-proxy-agent/test/e2e.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,50 +4,66 @@ import { SocksProxyAgent } from '../src';

interface NordVPNServer {
name: string;
domain: string;
flag: string;
features: { [key: string]: boolean };
hostname: string;
status: string;
locations: {
country: {
code: string;
};
}[];
technologies: {
identifier: string;
}[];
}

jest.setTimeout(30000);

const findNordVpnServer = () =>
retry(
async (): Promise<NordVPNServer> => {
const res = await req('https://nordvpn.com/api/server');
if (res.statusCode !== 200) {
res.socket.destroy();
throw new Error(`Status code: ${res.statusCode}`);
}
const body = await json(res);
const servers = (body as NordVPNServer[]).filter(
(s) => s.features.socks
);
if (servers.length === 0) {
throw new Error(
'Could not find `socks` proxy server from NordVPN'
);
}
const server = servers[Math.floor(Math.random() * servers.length)];
return server;
},
{
retries: 5,
onRetry(err, attempt) {
console.log(
`Failed to get NordVPN servers. Retrying… (attempt #${attempt}, ${err.message})`
);
},
}
);

async function getRealIP(): Promise<string> {
const res = await req('https://dump.n8.io');
const body = await json(res);
return body.request.headers['x-real-ip'];
}

describe('SocksProxyAgent', () => {
let server: NordVPNServer;

it('should find NordVPN "socks" server', async () => {
server = await retry(
async (): Promise<NordVPNServer> => {
const res = await req(
'https://api.nordvpn.com/v1/servers?limit=0'
);
if (res.statusCode !== 200) {
res.socket.destroy();
throw new Error(`Status code: ${res.statusCode}`);
}
const body = await json(res);
const servers = (body as NordVPNServer[]).filter(
(s) =>
s.status === 'online' &&
s.technologies.find((t) => t.identifier === 'socks')
);
if (servers.length === 0) {
throw new Error(
'Could not find `https` proxy server from NordVPN'
);
}
return servers[Math.floor(Math.random() * servers.length)];
},
{
retries: 5,
onRetry(err, attempt) {
console.log(
`Failed to get NordVPN servers. Retrying… (attempt #${attempt}, ${err.message})`
);
},
}
);
console.log(
`Using NordVPN "socks" server: ${server.name} (${server.hostname})`
);
});

it('should work over NordVPN proxy', async () => {
const { NORDVPN_USERNAME, NORDVPN_PASSWORD } = process.env;
if (!NORDVPN_USERNAME) {
Expand All @@ -57,26 +73,20 @@ describe('SocksProxyAgent', () => {
throw new Error('`NORDVPN_PASSWORD` env var is not defined');
}

const [realIp, server] = await Promise.all([
getRealIP(),
findNordVpnServer(),
]);
console.log(
`Using NordVPN SOCKS proxy server: ${server.name} (${server.domain})`
);

const username = encodeURIComponent(NORDVPN_USERNAME);
const password = encodeURIComponent(NORDVPN_PASSWORD);

const agent = new SocksProxyAgent(
`socks://${username}:${password}@${server.domain}`
`socks://${username}:${password}@${server.hostname}`
);

const res = await req('https://dump.n8.io', { agent });
const [res, realIp] = await Promise.all([
req('https://dump.n8.io', { agent }),
getRealIP(),
]);
const body = await json(res);
expect(body.request.headers['x-real-ip']).not.toEqual(realIp);
expect(body.request.headers['x-vercel-ip-country']).toEqual(
server.flag
server.locations[0].country.code
);
});
});

0 comments on commit 010fdc3

Please sign in to comment.