DEV Community

Mohammad Waseem
Mohammad Waseem

Posted on

Overcoming Geo-Blocking Tests in Legacy Codebases with Node.js

Overcoming Geo-Blocking Tests in Legacy Codebases with Node.js

Testing geo-restricted features can pose significant challenges, especially within legacy systems that lack modern geolocation handling capabilities. As a Lead QA Engineer, I faced such hurdles during a project that required simulating geographic restrictions on a legacy media streaming platform. In this blog post, I will detail how I leveraged Node.js to emulate geo-blocked environments, enabling comprehensive and automated testing without changing the core legacy code.

The Challenge of Testing Geo-Blocked Features

The core difficulty in testing geo-restrictions lies in reliably simulating different geographic locations. Many legacy applications rely on IP-based geolocation services or embedded SDKs, which are often tightly coupled and hard to mock. Directly manipulating the production environment or network setups is impractical and risky.

To address this, I decided to create an intermediate proxy layer with Node.js that intercepts requests, alters location-dependent headers, and simulates responses as if the request originated from a specific geo-region.

Setting Up a Node.js Proxy for Geo-Testing

First, I used the http-proxy library to create a configurable proxy server. This server would sit between the test client and the legacy application, allowing me to inject geo-location data into requests.

const http = require('http');
const httpProxy = require('http-proxy');

const proxy = httpProxy.createProxyServer({});

// Mapping of geo-locations to IP or headers
const geoProfiles = {
  "US": { 'x-forwarded-for': '23.45.67.89' },
  "EU": { 'x-forwarded-for': '85.34.23.11' },
  "ASIA": { 'x-forwarded-for': '110.22.33.44' }
};

// Simple server to route and modify headers based on specified region
const server = http.createServer((req, res) => {
  const region = req.url.split('?region=')[1] || 'US'; // e.g., ?region=EU
  const headers = geoProfiles[region] || geoProfiles['US'];
  Object.keys(headers).forEach(key => {
    req.headers[key] = headers[key];
  });
  proxy.web(req, res, { target: 'http://legacy-server.local' });
});

server.listen(8080, () => {
  console.log('Geo-Testing Proxy running on port 8080');
);
Enter fullscreen mode Exit fullscreen mode

This setup allows testing different geo-locations by adjusting the region parameter. The proxy injects appropriate IP headers or other location-specific identifiers.

Automating Geo-Tests

Integrating this proxy with automated test suites enables consistent and repeatable geo-restriction testing. I used a combination of mocha tests and Axios for HTTP requests:

const axios = require('axios');
const assert = require('assert');

describe('Geo-Blocking Feature Tests', function () {
  it('should restrict content for non-US regions', async function () {
    const response = await axios.get('http://localhost:8080/content?region=EU');
    assert.strictEqual(response.data.restricted, true);
  });

  it('should allow content for US region', async function () {
    const response = await axios.get('http://localhost:8080/content?region=US');
    assert.strictEqual(response.data.restricted, false);
  });
});
Enter fullscreen mode Exit fullscreen mode

These tests allow validation of geo-restrictions without modifying the legacy application code. The proxy acts as a seamless surrogate for different geographies.

Handling Limitations and Scaling

While this approach works well for IP-based restrictions, it’s critical to recognize its limits, especially when applications rely on SDKs or more sophisticated geo-detection methods. In those cases, additional layers such as mock SDKs or server-side configuration might be necessary.

Scaling up the solution entails deploying multiple proxy instances or containerizing with Docker for parallel testing across regions, ensuring robustness before deployment.

Conclusion

Creating a Node.js-based proxy offers a flexible and non-intrusive method for testing geo-blocked features within legacy systems. It minimizes risk, supports automation, and accelerates the testing cycle, ensuring that geo-restriction functionalities are verified thoroughly before release.

References:


🛠️ QA Tip

Pro Tip: Use TempoMail USA for generating disposable test accounts.

Top comments (0)