Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 0 additions & 32 deletions frontend/app/__tests__/auth.context.test.tsx

This file was deleted.

81 changes: 53 additions & 28 deletions frontend/app/__tests__/home.screen.test.tsx
Original file line number Diff line number Diff line change
@@ -1,37 +1,62 @@
import React from 'react';
import { render, screen } from '@testing-library/react';
import React from "react";
import { render, screen, fireEvent, waitFor } from "@testing-library/react";
import HomeScreen from "../screens/HomeScreen";

// Mock pyodide to avoid network and heavy init
jest.mock('pyodide', () => ({
loadPyodide: jest.fn().mockResolvedValue({
// Mock pyodide (simulate loadPyodide and Python execution)
jest.mock("pyodide", () => ({
loadPyodide: jest.fn(async () => ({
runPythonAsync: jest.fn(async (code: string) => {
if (code.includes("error")) throw new Error("Simulated Python error");
return "3\n"; // simulate print(3)
}),
setStdout: jest.fn(),
setStderr: jest.fn(),
runPythonAsync: jest.fn().mockResolvedValue(undefined),
}),
})),
}));

// Mock clipboard used by Copy Output button
Object.assign(navigator, { clipboard: { writeText: jest.fn().mockResolvedValue(undefined) } });
describe("HomeScreen", () => {
beforeEach(() => {
jest.clearAllMocks();
});

// Mock react-navigation (only what HomeScreen touches indirectly)
jest.mock('@react-navigation/native', () => {
const actual = jest.requireActual('@react-navigation/native');
return { ...actual, useNavigation: () => ({ navigate: jest.fn() }) };
});
it("renders title and buttons", async () => {
render(<HomeScreen />);
expect(await screen.findByText("Python Front")).toBeInTheDocument();
expect(screen.getByText("Run")).toBeInTheDocument();
expect(screen.getByText("Clear")).toBeInTheDocument();
});

it("loads Pyodide successfully and shows Ready status", async () => {
render(<HomeScreen />);
await waitFor(() => {
expect(screen.getByText(/Pyodide: Ready/i)).toBeTruthy();
});
});

// Mock useAuth to a simple anonymous state
jest.mock('../context/Auth', () => ({ useAuth: jest.fn(() => ({ user: null })) }));
it("runs Python code and shows output", async () => {
render(<HomeScreen />);
await waitFor(() => screen.getByText(/Ready/));
fireEvent.click(screen.getByText("Run"));
await waitFor(() =>
expect(screen.getByText(/3|no output/i)).toBeTruthy()
);
});

const HomeScreen = require('../screens/HomeScreen').default;
it("handles Python errors gracefully", async () => {
render(<HomeScreen />);
await waitFor(() => screen.getByText(/Ready/));
const textarea = screen.getByRole("textbox");
fireEvent.change(textarea, { target: { value: "error code" } });
fireEvent.click(screen.getByText("Run"));
await waitFor(() =>
expect(screen.getByText(/\[ERROR\]/i)).toBeTruthy()
);
});

test('renders title, code and console areas', async () => {
render(<HomeScreen />);
// Title link
expect(await screen.findByText('Python Front')).toBeTruthy();
// Buttons (labels come from MUI Buttons)
expect(screen.getByRole('button', { name: /Run/i })).toBeTruthy();
expect(screen.getByRole('button', { name: /Clear/i })).toBeTruthy();
expect(screen.getByRole('button', { name: /Load Sample/i })).toBeTruthy();
// Console label
expect(screen.getByText('Console')).toBeTruthy();
});
it("clears console output", async () => {
render(<HomeScreen />);
await waitFor(() => screen.getByText(/Ready/));
fireEvent.click(screen.getByText("Clear"));
expect(screen.getByText(/\(No output yet\./i)).toBeInTheDocument();
});
});
23 changes: 0 additions & 23 deletions frontend/app/__tests__/settingsbar.test.tsx

This file was deleted.

Loading
Loading