Compare commits

...

3 Commits

Author SHA1 Message Date
Logan Cusano
4bb8038a1d Update variables in test action
Some checks failed
DRB Build Tests / drb_build_and_test (push) Failing after 57s
2024-04-28 03:26:06 -04:00
Logan Cusano
a353b9adbb Improvements to tests and from testing
- Moved OP25 start outside of PDAB start callback
- Added more logging
- Set the pdabProcess variable to false when closing the discord client
- Update test variable names
- Added new WIP pdabWrappers tests to test the full wrappers as the client would
2024-04-28 03:21:03 -04:00
Logan Cusano
bf69e93e29 Improve subprocess handler
- Will now output the subprocess console when in dev mode
2024-04-28 03:18:13 -04:00
6 changed files with 83 additions and 32 deletions

View File

@@ -15,10 +15,12 @@ env:
MONGO_INITDB_DATABASE: drb MONGO_INITDB_DATABASE: drb
SERVER_PORT: 6000 SERVER_PORT: 6000
MONGO_URL: "mongodb://mongodb:27017/drb" MONGO_URL: "mongodb://mongodb:27017/drb"
DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }}
TEST_CHANNEL_ID: ${{ secrets.TEST_CHANNEL_ID }}
TEST_GUILD_ID: ${{ secrets.TEST_GUILD_ID }} TEST_GUILD_ID: ${{ secrets.TEST_GUILD_ID }}
EXPECTED_CLIENT_ID: ${{ secrets.EXPECTED_CLIENT_ID }} TEST_CLIENT_TOKEN: ${{ secrets.TEST_CLIENT_TOKEN }}
TEST_CHANNEL_ID: ${{ secrets.TEST_CHANNEL_ID }}
TEST_SYSTEM: ${{ secrets.TEST_SYSTEM }}
EXPECTED_CLIENT_ID: ${{ secrets.TEST_CLIENT_ID }}
EXPECTED_USERNAME: ${{ secrets.EXPECTED_USERNAME }}
PDAB_PORT: ${{ vars.PDAB_PORT }} PDAB_PORT: ${{ vars.PDAB_PORT }}
jobs: jobs:

View File

@@ -120,6 +120,7 @@ export const requestDiscordID = () => {
export const requestDiscordClientClose = () => { export const requestDiscordClientClose = () => {
return new Promise((res) => { return new Promise((res) => {
io.timeout(25000).emit('request_client_close'); io.timeout(25000).emit('request_client_close');
pdabProcess = false;
res(); res();
}); });
}; };

View File

@@ -8,16 +8,22 @@ let activeDiscordClient = undefined;
* @param {object} joinData The object containing all the information to join the server * @param {object} joinData The object containing all the information to join the server
*/ */
export const joinDiscordVC = async (joinData) => { export const joinDiscordVC = async (joinData) => {
console.log("Join requested: ", joinData) console.log("Join requested: ", joinData);
const connection = await new Promise(async (res) => { const connection = await new Promise(async (res) => {
// Check if a client already exists // Check if a client already exists
console.log("Checking if there is a client open");
if (!await checkIfClientIsOpen()) { if (!await checkIfClientIsOpen()) {
// Open a new client and join the requested channel with the requested ID console.log("There is no open client, starting it now");
initDiscordBotClient(joinData.clientID, () => {
// Open an instance of OP25 // Open an instance of OP25
console.log("Starting OP25")
openOP25(joinData.system); openOP25(joinData.system);
// Open a new client and join the requested channel with the requested ID
initDiscordBotClient(joinData.clientID, () => {
console.log("Started PDAB")
// Add the client object to the IO instance // Add the client object to the IO instance
console.log("Connecting to channel")
connectToChannel(joinData.channelID, (connectionStatus) => { connectToChannel(joinData.channelID, (connectionStatus) => {
console.log("Bot Connected to VC:", connectionStatus); console.log("Bot Connected to VC:", connectionStatus);
res(connectionStatus); res(connectionStatus);
@@ -25,7 +31,9 @@ export const joinDiscordVC = async (joinData) => {
}); });
} else { } else {
// Join the requested channel with the requested ID // Join the requested channel with the requested ID
// Add the client object to the IO instance console.log("There is an open client");
console.log("Connecting to channel")
const connection = connectToChannel(joinData.channelID); const connection = connectToChannel(joinData.channelID);
console.log("Bot Connected to VC::"); console.log("Bot Connected to VC::");
res(connection); res(connection);

View File

@@ -1,4 +1,6 @@
import { spawn } from "child_process"; import { spawn } from "child_process";
import dotenv from 'dotenv';
dotenv.config()
/** /**
* Object to store references to spawned processes. * Object to store references to spawned processes.
@@ -25,11 +27,29 @@ export const launchProcess = (processName, args, waitForClose=false, pcwd=undefi
// Store reference to the spawned process // Store reference to the spawned process
runningProcesses[processName] = childProcess; runningProcesses[processName] = childProcess;
// Output the process output in development
var scriptOutput = "";
// Get the stdout from the child process
childProcess.stdout.setEncoding('utf8');
childProcess.stdout.on('data', (data) => {
if (process.env.NODE_ENV === "development") console.log(`Data from ${processName}:`, data);
scriptOutput += data.toString();
});
// Get the stderr from the child process
childProcess.stderr.setEncoding('utf8');
childProcess.stderr.on('data', (data) => {
if (process.env.NODE_ENV === "development") console.log(`Data from ${processName}:`, data);
scriptOutput += data.toString();
})
let code = new Promise(res => { let code = new Promise(res => {
childProcess.on('exit', (code, signal) => { childProcess.on('exit', (code, signal) => {
// Remove reference to the process when it exits // Remove reference to the process when it exits
delete runningProcesses[processName]; delete runningProcesses[processName];
console.log(`${processName} process exited with code ${code} and signal ${signal}`); console.log(`${processName} process exited with code ${code} and signal ${signal}`);
console.log("Child process console output: ", scriptOutput);
res(code); res(code);
}) })
}); });

View File

@@ -1,8 +1,5 @@
// Import necessary modules for testing // Import necessary modules for testing
import { use, expect } from 'chai' import { expect } from 'chai'
import chaiHttp from 'chai-http'
const chai = use(chaiHttp)
import io from 'socket.io-client'; import io from 'socket.io-client';
const ioClient = io; const ioClient = io;
@@ -35,7 +32,7 @@ describe('Socket Server Tests', done => {
}); });
it('Should open a socket server and callback when the client is connected and ready', done => { it('Should open a socket server and callback when the client is connected and ready', done => {
const clientId = process.env.DISCORD_CLIENT_ID; const clientId = process.env.TEST_CLIENT_TOKEN;
const callback = () => { const callback = () => {
done(); done();
@@ -130,19 +127,9 @@ describe('Socket Server Tests', done => {
}); });
describe('Socket Client & Python IPC Tests', done => { describe('Socket Client & Python IPC Tests', done => {
after(async () => {
// Any teardown needed after tests
try {
await socket.close();
}
catch {
console.log("Socket already closed");
}
});
it('Should open a socket server and callback when the client is connected and ready', done => { it('Should open a socket server and callback when the client is connected and ready', done => {
let clientConnected = false; let clientConnected = false;
const clientId = process.env.DISCORD_CLIENT_ID; const clientId = process.env.TEST_CLIENT_TOKEN;
const callback = () => { const callback = () => {
clientConnected = true; clientConnected = true;
@@ -165,13 +152,6 @@ describe('Socket Client & Python IPC Tests', done => {
expect(status).to.be.true; expect(status).to.be.true;
}); });
it('Should have opened OP25', async () => {
// Assuming your server is running on localhost:8081
const res = await chai.request('http://localhost:8081').get('/');
expect(res).to.have.status(200); // Assuming 200 is the expected status code
// Add more assertions if needed
});
it('Should emit command for and return status if connected to voice channel', async () => { it('Should emit command for and return status if connected to voice channel', async () => {
// Simulate emitting 'check_discord_vc_connected' event // Simulate emitting 'check_discord_vc_connected' event
const isConnected = await checkIfConnectedToVC(process.env.TEST_GUILD_ID); const isConnected = await checkIfConnectedToVC(process.env.TEST_GUILD_ID);

View File

@@ -0,0 +1,40 @@
import { use } from 'chai';
import chaiHttp from 'chai-http';
const chai = use(chaiHttp)
chai.should();
import dotenv from 'dotenv';
dotenv.config()
import { joinDiscordVC, leaveDiscordVC } from '../discordAudioBot/pdabWrappers.mjs'
before(async () => {
// Any setup needed before tests
});
after(async () => {
// Any teardown needed after tests
});
describe('PDAB Wrapper Tests', () => {
it('Should open the discord bot, and join the first server when requested', async () => {
// Test case
const joinData = {
channelID: process.env.TEST_CHANNEL_ID,
clientID: process.env.TEST_CLIENT_TOKEN,
system: process.env.TEST_SYSTEM,
};
const connection = await joinDiscordVC(joinData);
console.log("Connection:", connection);
});
it('Should open OP25', async () => {
const res = await chai.request('http://localhost:8081').get('/');
expect(res).to.have.status(200); // Assuming 200 is the expected status code
// Add more assertions if needed
})
it("Should disconnect from the discord server", async () => {
await leaveDiscordVC(process.env.TEST_GUILD_ID);
})
});