TidGi-Desktop/features/stepDefinitions/cleanup.ts
lin onetwo 82bb1c2d77
Fix/hibernate (#652)
* feat: allow use local tiddlywiki version

closes #536

* test: hibernate

* fix: Ensure wiki worker is started before setting active view for hibernated wikiu

* fix: injection
2025-11-09 21:32:37 +08:00

96 lines
3.5 KiB
TypeScript

import { After, Before } from '@cucumber/cucumber';
import fs from 'fs-extra';
import { logsDirectory, screenshotsDirectory } from '../supports/paths';
import { clearAISettings } from './agent';
import { ApplicationWorld } from './application';
import { clearTidgiMiniWindowSettings } from './tidgiMiniWindow';
import { clearGitTestData, clearHibernationTestData, clearSubWikiRoutingTestData } from './wiki';
Before(async function(this: ApplicationWorld, { pickle }) {
// Create necessary directories under userData-test/logs to match appPaths in dev/test
if (!(await fs.pathExists(logsDirectory))) {
await fs.ensureDir(logsDirectory);
}
// Create screenshots subdirectory in logs
if (!(await fs.pathExists(screenshotsDirectory))) {
await fs.ensureDir(screenshotsDirectory);
}
if (pickle.tags.some((tag) => tag.name === '@ai-setting')) {
await clearAISettings();
}
if (pickle.tags.some((tag) => tag.name === '@tidgi-mini-window')) {
await clearTidgiMiniWindowSettings();
}
});
After(async function(this: ApplicationWorld, { pickle }) {
// IMPORTANT: Close app FIRST before cleaning up files
// This releases file locks so wiki folders can be deleted
if (this.app) {
try {
// Close all windows including tidgi mini window before closing the app, otherwise it might hang, and refused to exit until ctrl+C
const allWindows = this.app.windows();
await Promise.all(
allWindows.map(async (window) => {
try {
if (!window.isClosed()) {
await window.close();
}
} catch (error) {
console.error('Error closing window:', error);
}
}),
);
await this.app.close();
} catch (error) {
console.error('Error during cleanup:', error);
}
this.app = undefined;
this.mainWindow = undefined;
this.currentWindow = undefined;
}
// Clean up settings and test data AFTER app is closed
if (pickle.tags.some((tag) => tag.name === '@tidgi-mini-window')) {
await clearTidgiMiniWindowSettings();
}
if (pickle.tags.some((tag) => tag.name === '@ai-setting')) {
await clearAISettings();
}
if (pickle.tags.some((tag) => tag.name === '@subwiki')) {
await clearSubWikiRoutingTestData();
}
// Clean up git test data to prevent state pollution between git tests
// Removes entire wiki folder - it will be recreated on next test start
if (pickle.tags.some((tag) => tag.name === '@git')) {
await clearGitTestData();
}
// Clean up hibernation test data - remove wiki2 folder created during tests
if (pickle.tags.some((tag) => tag.name === '@hibernation')) {
await clearHibernationTestData();
}
// Separate logs by test scenario for easier debugging
try {
const today = new Date().toISOString().split('T')[0];
const wikiLogFile = `${logsDirectory}/wiki-${today}.log`;
const tidgiLogFile = `${logsDirectory}/TidGi-${today}.log`;
// Create a sanitized scenario name for the log files
const scenarioName = pickle.name.replace(/[^a-z0-9]/gi, '_').substring(0, 50);
if (await fs.pathExists(wikiLogFile)) {
const targetWikiLog = `${logsDirectory}/${scenarioName}_wiki.log`;
await fs.move(wikiLogFile, targetWikiLog, { overwrite: true });
}
if (await fs.pathExists(tidgiLogFile)) {
const targetTidgiLog = `${logsDirectory}/${scenarioName}_TidGi.log`;
await fs.move(tidgiLogFile, targetTidgiLog, { overwrite: true });
}
} catch (error) {
console.error('Error moving log files:', error);
}
});