mirror of
https://github.com/tenrok/axios.git
synced 2026-06-23 20:40:40 +03:00
chore(ci): add local HTTP server for Karma tests; (#7022)
This commit is contained in:
@@ -59,5 +59,12 @@ jobs:
|
|||||||
if: steps.changed-ignored.outputs.only_modified == 'false'
|
if: steps.changed-ignored.outputs.only_modified == 'false'
|
||||||
- run: npm run build
|
- run: npm run build
|
||||||
if: steps.changed-ignored.outputs.only_modified == 'false'
|
if: steps.changed-ignored.outputs.only_modified == 'false'
|
||||||
- run: npm test
|
- name: Run Server tests
|
||||||
|
run: npm run test:node
|
||||||
if: steps.changed-ignored.outputs.only_modified == 'false'
|
if: steps.changed-ignored.outputs.only_modified == 'false'
|
||||||
|
# We run browser tests only on one version of the node, since client tests do not depend on the server environment.
|
||||||
|
- name: Run browser tests
|
||||||
|
run: npm run test:browser
|
||||||
|
if: steps.changed-ignored.outputs.only_modified == 'false' && matrix.node-version == '22.x'
|
||||||
|
- name: Run package tests
|
||||||
|
run: npm run test:package
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import { startTestServer, stopHTTPServer } from '../test/helpers/server.js';
|
||||||
|
import { spawn } from 'child_process';
|
||||||
|
import chalk from "chalk";
|
||||||
|
|
||||||
|
let server;
|
||||||
|
|
||||||
|
async function run() {
|
||||||
|
|
||||||
|
console.log(chalk.red.bold(`[ Starting HTTP server... ]`));
|
||||||
|
|
||||||
|
server = await startTestServer(3000);
|
||||||
|
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
console.log('Starting karma runner...');
|
||||||
|
|
||||||
|
const karma = spawn(
|
||||||
|
'npx',
|
||||||
|
['karma', 'start', 'karma.conf.cjs', '--single-run'],
|
||||||
|
{
|
||||||
|
stdio: 'inherit',
|
||||||
|
shell: true,
|
||||||
|
env: { ...process.env, LISTEN_ADDR: '0.0.0.0' },
|
||||||
|
});
|
||||||
|
|
||||||
|
karma.on('exit', (code) => {
|
||||||
|
code ? reject(new Error(`Karma tests failed with exit code ${code}`)) : resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(async() => {
|
||||||
|
try {
|
||||||
|
await run();
|
||||||
|
} finally {
|
||||||
|
if (server) {
|
||||||
|
console.log(chalk.red.bold(`[ Terminating HTTP server... ]`));
|
||||||
|
|
||||||
|
await stopHTTPServer(server);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
+6
-3
@@ -40,12 +40,15 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"types": "index.d.ts",
|
"types": "index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "npm run test:eslint && npm run test:mocha && npm run test:karma && npm run test:dtslint && npm run test:exports",
|
"test": "npm run test:node && npm run test:browser && npm run test:package",
|
||||||
|
"test:node": "npm run test:mocha",
|
||||||
|
"test:browser": "npm run test:karma",
|
||||||
|
"test:package": "npm run test:eslint && npm run test:dtslint && npm run test:exports",
|
||||||
"test:eslint": "node bin/ssl_hotfix.js eslint lib/**/*.js",
|
"test:eslint": "node bin/ssl_hotfix.js eslint lib/**/*.js",
|
||||||
"test:dtslint": "dtslint --localTs node_modules/typescript/lib",
|
"test:dtslint": "dtslint --localTs node_modules/typescript/lib",
|
||||||
"test:mocha": "node bin/ssl_hotfix.js mocha test/unit/**/*.js --timeout 30000 --exit",
|
"test:mocha": "node bin/ssl_hotfix.js mocha test/unit/**/*.js --timeout 30000 --exit",
|
||||||
"test:exports": "node bin/ssl_hotfix.js mocha test/module/test.js --timeout 30000 --exit",
|
"test:exports": "node bin/ssl_hotfix.js mocha test/module/test.js --timeout 30000 --exit",
|
||||||
"test:karma": "node bin/ssl_hotfix.js cross-env LISTEN_ADDR=:: karma start karma.conf.cjs --single-run",
|
"test:karma": "node ./bin/run-karma-tests.js",
|
||||||
"test:karma:firefox": "node bin/ssl_hotfix.js cross-env LISTEN_ADDR=:: Browsers=Firefox karma start karma.conf.cjs --single-run",
|
"test:karma:firefox": "node bin/ssl_hotfix.js cross-env LISTEN_ADDR=:: Browsers=Firefox karma start karma.conf.cjs --single-run",
|
||||||
"test:karma:server": "node bin/ssl_hotfix.js cross-env karma start karma.conf.cjs",
|
"test:karma:server": "node bin/ssl_hotfix.js cross-env karma start karma.conf.cjs",
|
||||||
"test:build:version": "node ./bin/check-build-version.js",
|
"test:build:version": "node ./bin/check-build-version.js",
|
||||||
@@ -228,4 +231,4 @@
|
|||||||
"@commitlint/config-conventional"
|
"@commitlint/config-conventional"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import getStream from "get-stream";
|
|||||||
import {Throttle} from "stream-throttle";
|
import {Throttle} from "stream-throttle";
|
||||||
import formidable from "formidable";
|
import formidable from "formidable";
|
||||||
|
|
||||||
|
|
||||||
export const LOCAL_SERVER_URL = 'http://localhost:4444';
|
export const LOCAL_SERVER_URL = 'http://localhost:4444';
|
||||||
|
|
||||||
export const SERVER_HANDLER_STREAM_ECHO = (req, res) => req.pipe(res);
|
export const SERVER_HANDLER_STREAM_ECHO = (req, res) => req.pipe(res);
|
||||||
@@ -115,3 +116,72 @@ export const makeEchoStream = (echo) => new WritableStream({
|
|||||||
echo && console.log(`Echo chunk`, chunk);
|
echo && console.log(`Echo chunk`, chunk);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
export const startTestServer = async (port) => {
|
||||||
|
const handler = async (req) => {
|
||||||
|
const parsed = new URL(req.url, `http://localhost:${port}`);
|
||||||
|
|
||||||
|
const params = Object.fromEntries(parsed.searchParams);
|
||||||
|
|
||||||
|
let response = {
|
||||||
|
url: req.url,
|
||||||
|
pathname: parsed.pathname,
|
||||||
|
params,
|
||||||
|
method: req.method,
|
||||||
|
headers: req.headers,
|
||||||
|
}
|
||||||
|
|
||||||
|
const contentType = req.headers['content-type'] || '';
|
||||||
|
|
||||||
|
const {delay = 0} = params;
|
||||||
|
|
||||||
|
if (+delay) {
|
||||||
|
await setTimeoutAsync(+delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (parsed.pathname.replace(/\/$/, '')) {
|
||||||
|
case '/echo/json':
|
||||||
|
default:
|
||||||
|
if (contentType.startsWith('multipart/')) {
|
||||||
|
let {fields, files} = await handleFormData(req);
|
||||||
|
response.form = fields;
|
||||||
|
response.files = files;
|
||||||
|
} else {
|
||||||
|
response.body = (await getStream(req, {encoding: 'buffer'})).toString('hex');
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
body: response
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return await startHTTPServer((req, res) => {
|
||||||
|
// Set CORS headers
|
||||||
|
res.setHeader('Access-Control-Allow-Origin', `*`); // Allows all origins, or specify a domain like 'http://example.com'
|
||||||
|
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); // Allowed HTTP methods
|
||||||
|
res.setHeader('Access-Control-Allow-Headers', '*'); // Allowed request headers
|
||||||
|
res.setHeader('Access-Control-Max-Age', '86400'); // Cache preflight requests for 24 hours
|
||||||
|
|
||||||
|
// Handle preflight requests (OPTIONS method)
|
||||||
|
if (req.method === 'OPTIONS') {
|
||||||
|
res.writeHead(204); // No content
|
||||||
|
res.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Promise.resolve(handler(req, res)).then(response=>{
|
||||||
|
const {status = 200, headers = {}, body} = response || {};
|
||||||
|
|
||||||
|
|
||||||
|
res.statusCode = status;
|
||||||
|
|
||||||
|
Object.entries(headers).forEach((header, value) => {
|
||||||
|
res.setHeader(header, value);
|
||||||
|
});
|
||||||
|
|
||||||
|
res.end(JSON.stringify(body, null, 2))
|
||||||
|
})
|
||||||
|
}, {port});
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ window.axios = _axios;
|
|||||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000;
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000;
|
||||||
jasmine.getEnv().defaultTimeoutInterval = 60000;
|
jasmine.getEnv().defaultTimeoutInterval = 60000;
|
||||||
|
|
||||||
|
window.TEST_SERVER_URL = "http://localhost:3000";
|
||||||
|
|
||||||
// Get Ajax request using an increasing timeout to retry
|
// Get Ajax request using an increasing timeout to retry
|
||||||
window.getAjaxRequest = (function () {
|
window.getAjaxRequest = (function () {
|
||||||
let attempts = 0;
|
let attempts = 0;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {retryNetwork} from "../helpers/retry.js";
|
|||||||
describe('FormData', function() {
|
describe('FormData', function() {
|
||||||
it('should allow FormData posting', async () => {
|
it('should allow FormData posting', async () => {
|
||||||
await retryNetwork(() => {
|
await retryNetwork(() => {
|
||||||
return axios.postForm('http://httpbin.org/post', {
|
return axios.postForm(TEST_SERVER_URL, {
|
||||||
a: 'foo',
|
a: 'foo',
|
||||||
b: 'bar'
|
b: 'bar'
|
||||||
}).then(({data}) => {
|
}).then(({data}) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user