Files
venabo-gql-templates/run-tests.js
Dennes Schäffler 9a9e0aed87 initial commit
2025-11-11 09:00:50 +01:00

146 lines
4.3 KiB
JavaScript

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import fetch from 'node-fetch';
import dotenv from 'dotenv';
import chalk from 'chalk';
// Load .env file
dotenv.config();
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Configuration
const GRAPHQL_ENDPOINT = process.env.GRAPHQL_ENDPOINT || 'https://venabo.phx-erp.cloud/backend-api/admin-api';
const AUTH_TOKEN = process.env.AUTH_TOKEN;
const VERBOSE = process.argv.includes('--verbose');
function log(message) {
console.log(message);
}
function parseGraphQLFile(filePath) {
try {
const content = fs.readFileSync(filePath, 'utf-8');
const lines = content.split('\n');
// Extract query name and type
const firstLine = lines[0].trim();
const queryType = firstLine.startsWith('query') ? 'query' :
firstLine.startsWith('mutation') ? 'mutation' :
firstLine.startsWith('subscription') ? 'subscription' : 'query';
return {
name: path.basename(filePath, '.gql'),
type: queryType,
query: content.trim(),
};
} catch (error) {
throw new Error(`Failed to parse ${filePath}: ${error.message}`);
}
}
async function runGraphQLTest(test) {
try {
log(`\n${chalk.cyan.bold('Testing:')} ${chalk.cyan(test.name)}`);
if (VERBOSE) {
log(` ${chalk.gray('Type:')} ${chalk.yellow(test.type)}`);
log(` ${chalk.gray('Query:')}`);
console.log(test.query.split('\n').map(line => ` ${chalk.gray(line)}`).join('\n'));
}
const response = await fetch(GRAPHQL_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${AUTH_TOKEN}`,
},
body: JSON.stringify({
query: test.query,
}),
});
const text = await response.text();
let result;
try {
result = JSON.parse(text);
} catch (e) {
throw new Error(`HTTP ${response.status}: ${response.statusText}. Response: ${text.substring(0, 200)}`);
}
if (result.errors) {
log(` ${chalk.red.bold('Errors found:')}`);
result.errors.forEach(error => {
log(` ${chalk.red('✗')} ${chalk.red(error.message)}`);
if (VERBOSE && error.locations) {
error.locations.forEach(loc => {
log(` ${chalk.gray(`Line ${loc.line}, Column ${loc.column}`)}`);
});
}
if (VERBOSE && error.path) {
log(` ${chalk.gray(`Path: ${error.path.join('.')}`)}`);
}
});
return { success: false, test, result };
}
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
log(` ${chalk.green.bold('✓ Success')}`);
if (VERBOSE && result.data) {
log(` ${chalk.gray('Response:')}`);
console.log(JSON.stringify(result.data, null, 2));
}
return { success: true, test, result };
} catch (error) {
log(` ${chalk.red.bold('✗ Failed:')} ${chalk.red(error.message)}`);
return { success: false, test, error: error.message };
}
}
async function main() {
log(chalk.bold.blue('Venabo GraphQL Test Runner\n'));
log(`${chalk.gray('Endpoint:')} ${chalk.cyan(GRAPHQL_ENDPOINT)}`);
// Find all .gql files
const files = fs.readdirSync(__dirname)
.filter(file => file.endsWith('.gql'))
.map(file => path.join(__dirname, file));
if (files.length === 0) {
log(chalk.yellow('No .gql files found in the current directory'));
process.exit(0);
}
log(`${chalk.gray('Found')} ${chalk.cyan(files.length)} ${chalk.gray('test file(s)\n')}`);
// Parse all test files
const tests = files.map(parseGraphQLFile);
// Run all tests
const results = await Promise.all(tests.map(runGraphQLTest));
// Summary
const passed = results.filter(r => r.success).length;
const failed = results.filter(r => !r.success).length;
log('\n' + chalk.gray('='.repeat(50)));
log(chalk.bold('Summary:'));
log(` ${chalk.green.bold('Passed:')} ${chalk.green(passed)}`);
log(` ${chalk.red.bold('Failed:')} ${chalk.red(failed)}`);
log(chalk.gray('='.repeat(50)) + '\n');
process.exit(failed > 0 ? 1 : 0);
}
main().catch(error => {
log(`\n${chalk.red.bold('Fatal error:')} ${chalk.red(error.message)}`);
process.exit(1);
});