268 lines
9.2 KiB
JavaScript
268 lines
9.2 KiB
JavaScript
/**
|
|
* Integration tests for TUI state management and navigation
|
|
* Tests the core application structure and state management functionality
|
|
* Requirements: 5.1, 5.3, 7.1
|
|
*/
|
|
|
|
describe("TUI State Management Integration", () => {
|
|
test("should have AppProvider component available", () => {
|
|
const AppProvider = require("../../src/tui/providers/AppProvider.jsx");
|
|
expect(typeof AppProvider).toBe("function");
|
|
});
|
|
|
|
test("should have Router component available", () => {
|
|
const Router = require("../../src/tui/components/Router.jsx");
|
|
expect(typeof Router).toBe("function");
|
|
});
|
|
|
|
test("should have useAppState hook available", () => {
|
|
const useAppState = require("../../src/tui/hooks/useAppState.js");
|
|
expect(typeof useAppState).toBe("function");
|
|
});
|
|
|
|
test("should have useNavigation hook available", () => {
|
|
const useNavigation = require("../../src/tui/hooks/useNavigation.js");
|
|
expect(typeof useNavigation).toBe("function");
|
|
});
|
|
|
|
test("should have TuiApplication component available", () => {
|
|
const TuiApplication = require("../../src/tui/TuiApplication.jsx");
|
|
expect(typeof TuiApplication).toBe("function");
|
|
});
|
|
|
|
test("should have StatusBar component available", () => {
|
|
const StatusBar = require("../../src/tui/components/StatusBar.jsx");
|
|
expect(typeof StatusBar).toBe("function");
|
|
});
|
|
});
|
|
|
|
describe("AppProvider Initial State", () => {
|
|
test("should define correct initial state structure", () => {
|
|
// Read the AppProvider file and verify initial state structure
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const appProviderPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/providers/AppProvider.jsx"
|
|
);
|
|
const appProviderContent = fs.readFileSync(appProviderPath, "utf8");
|
|
|
|
// Verify initial state contains required properties
|
|
expect(appProviderContent).toContain('currentScreen: "main-menu"');
|
|
expect(appProviderContent).toContain("navigationHistory: []");
|
|
expect(appProviderContent).toContain('shopDomain: ""');
|
|
expect(appProviderContent).toContain('accessToken: ""');
|
|
expect(appProviderContent).toContain('targetTag: ""');
|
|
expect(appProviderContent).toContain("priceAdjustment: 0");
|
|
expect(appProviderContent).toContain('operationMode: "update"');
|
|
expect(appProviderContent).toContain("isValid: false");
|
|
expect(appProviderContent).toContain("operationState: null");
|
|
expect(appProviderContent).toContain('focusedComponent: "menu"');
|
|
expect(appProviderContent).toContain("modalOpen: false");
|
|
expect(appProviderContent).toContain("selectedMenuIndex: 0");
|
|
expect(appProviderContent).toContain("scrollPosition: 0");
|
|
});
|
|
|
|
test("should provide navigation functions", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const appProviderPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/providers/AppProvider.jsx"
|
|
);
|
|
const appProviderContent = fs.readFileSync(appProviderPath, "utf8");
|
|
|
|
// Verify navigation functions are defined
|
|
expect(appProviderContent).toContain("navigateTo");
|
|
expect(appProviderContent).toContain("navigateBack");
|
|
expect(appProviderContent).toContain("updateConfiguration");
|
|
expect(appProviderContent).toContain("updateOperationState");
|
|
expect(appProviderContent).toContain("updateUIState");
|
|
});
|
|
});
|
|
|
|
describe("Hook Implementation", () => {
|
|
test("useAppState should provide correct interface", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const hookPath = path.join(__dirname, "../../src/tui/hooks/useAppState.js");
|
|
const hookContent = fs.readFileSync(hookPath, "utf8");
|
|
|
|
// Verify hook returns correct properties
|
|
expect(hookContent).toContain("appState: context.appState");
|
|
expect(hookContent).toContain(
|
|
"currentScreen: context.appState.currentScreen"
|
|
);
|
|
expect(hookContent).toContain(
|
|
"navigationHistory: context.appState.navigationHistory"
|
|
);
|
|
expect(hookContent).toContain(
|
|
"configuration: context.appState.configuration"
|
|
);
|
|
expect(hookContent).toContain(
|
|
"operationState: context.appState.operationState"
|
|
);
|
|
expect(hookContent).toContain("uiState: context.appState.uiState");
|
|
expect(hookContent).toContain("setAppState: context.setAppState");
|
|
expect(hookContent).toContain(
|
|
"updateConfiguration: context.updateConfiguration"
|
|
);
|
|
expect(hookContent).toContain(
|
|
"updateOperationState: context.updateOperationState"
|
|
);
|
|
expect(hookContent).toContain("updateUIState: context.updateUIState");
|
|
});
|
|
|
|
test("useNavigation should provide correct interface", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const hookPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/hooks/useNavigation.js"
|
|
);
|
|
const hookContent = fs.readFileSync(hookPath, "utf8");
|
|
|
|
// Verify hook returns correct properties
|
|
expect(hookContent).toContain("currentScreen: appState.currentScreen");
|
|
expect(hookContent).toContain(
|
|
"navigationHistory: appState.navigationHistory"
|
|
);
|
|
expect(hookContent).toContain(
|
|
"canGoBack: appState.navigationHistory.length > 0"
|
|
);
|
|
expect(hookContent).toContain("navigateTo: context.navigateTo");
|
|
expect(hookContent).toContain("navigateBack: context.navigateBack");
|
|
expect(hookContent).toContain("isCurrentScreen:");
|
|
expect(hookContent).toContain("getPreviousScreen:");
|
|
expect(hookContent).toContain("clearHistory:");
|
|
});
|
|
|
|
test("hooks should have proper error handling", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const useAppStatePath = path.join(
|
|
__dirname,
|
|
"../../src/tui/hooks/useAppState.js"
|
|
);
|
|
const useAppStateContent = fs.readFileSync(useAppStatePath, "utf8");
|
|
expect(useAppStateContent).toContain(
|
|
"useAppState must be used within an AppProvider"
|
|
);
|
|
|
|
const useNavigationPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/hooks/useNavigation.js"
|
|
);
|
|
const useNavigationContent = fs.readFileSync(useNavigationPath, "utf8");
|
|
expect(useNavigationContent).toContain(
|
|
"useNavigation must be used within an AppProvider"
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("Router Implementation", () => {
|
|
test("should define screen mapping", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const routerPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/components/Router.jsx"
|
|
);
|
|
const routerContent = fs.readFileSync(routerPath, "utf8");
|
|
|
|
// Verify all required screens are mapped
|
|
expect(routerContent).toContain('"main-menu": MainMenuScreen');
|
|
expect(routerContent).toContain("configuration: ConfigurationScreen");
|
|
expect(routerContent).toContain("operation: OperationScreen");
|
|
expect(routerContent).toContain("scheduling: SchedulingScreen");
|
|
expect(routerContent).toContain("logs: LogViewerScreen");
|
|
expect(routerContent).toContain('"tag-analysis": TagAnalysisScreen');
|
|
});
|
|
|
|
test("should use navigation hook", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const routerPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/components/Router.jsx"
|
|
);
|
|
const routerContent = fs.readFileSync(routerPath, "utf8");
|
|
|
|
expect(routerContent).toContain("useNavigation");
|
|
expect(routerContent).toContain("currentScreen");
|
|
});
|
|
|
|
test("should have fallback handling", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const routerPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/components/Router.jsx"
|
|
);
|
|
const routerContent = fs.readFileSync(routerPath, "utf8");
|
|
|
|
expect(routerContent).toContain(
|
|
'screens[currentScreen] || screens["main-menu"]'
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("TuiApplication Integration", () => {
|
|
test("should integrate AppProvider, Router, and StatusBar", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const tuiAppPath = path.join(__dirname, "../../src/tui/TuiApplication.jsx");
|
|
const tuiAppContent = fs.readFileSync(tuiAppPath, "utf8");
|
|
|
|
expect(tuiAppContent).toContain("AppProvider");
|
|
expect(tuiAppContent).toContain("Router");
|
|
expect(tuiAppContent).toContain("StatusBar");
|
|
});
|
|
|
|
test("should have proper component structure", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const tuiAppPath = path.join(__dirname, "../../src/tui/TuiApplication.jsx");
|
|
const tuiAppContent = fs.readFileSync(tuiAppPath, "utf8");
|
|
|
|
expect(tuiAppContent).toContain('flexDirection="column"');
|
|
expect(tuiAppContent).toContain('height="100%"');
|
|
});
|
|
});
|
|
|
|
describe("StatusBar Integration", () => {
|
|
test("should use both hooks", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const statusBarPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/components/StatusBar.jsx"
|
|
);
|
|
const statusBarContent = fs.readFileSync(statusBarPath, "utf8");
|
|
|
|
expect(statusBarContent).toContain("useAppState");
|
|
expect(statusBarContent).toContain("useNavigation");
|
|
expect(statusBarContent).toContain("operationState");
|
|
expect(statusBarContent).toContain("currentScreen");
|
|
});
|
|
|
|
test("should display screen names", () => {
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const statusBarPath = path.join(
|
|
__dirname,
|
|
"../../src/tui/components/StatusBar.jsx"
|
|
);
|
|
const statusBarContent = fs.readFileSync(statusBarPath, "utf8");
|
|
|
|
expect(statusBarContent).toContain("screenNames");
|
|
expect(statusBarContent).toContain("Main Menu");
|
|
expect(statusBarContent).toContain("Configuration");
|
|
expect(statusBarContent).toContain("Operation");
|
|
expect(statusBarContent).toContain("Scheduling");
|
|
expect(statusBarContent).toContain("Logs");
|
|
expect(statusBarContent).toContain("Tag Analysis");
|
|
});
|
|
});
|