Skip to content

Commit 210a950

Browse files
authored
Merge pull request #18 from europanite/feature/tests
Feature/tests
2 parents 911c384 + f19c0e1 commit 210a950

File tree

6 files changed

+255
-96
lines changed

6 files changed

+255
-96
lines changed

frontend/app/__tests__/auth.context.test.tsx

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,62 @@
1-
import React from 'react';
2-
import { render, screen } from '@testing-library/react';
1+
import React from "react";
2+
import { render, screen, fireEvent, waitFor } from "@testing-library/react";
3+
import HomeScreen from "../screens/HomeScreen";
34

4-
// Mock pyodide to avoid network and heavy init
5-
jest.mock('pyodide', () => ({
6-
loadPyodide: jest.fn().mockResolvedValue({
5+
// Mock pyodide (simulate loadPyodide and Python execution)
6+
jest.mock("pyodide", () => ({
7+
loadPyodide: jest.fn(async () => ({
8+
runPythonAsync: jest.fn(async (code: string) => {
9+
if (code.includes("error")) throw new Error("Simulated Python error");
10+
return "3\n"; // simulate print(3)
11+
}),
712
setStdout: jest.fn(),
813
setStderr: jest.fn(),
9-
runPythonAsync: jest.fn().mockResolvedValue(undefined),
10-
}),
14+
})),
1115
}));
1216

13-
// Mock clipboard used by Copy Output button
14-
Object.assign(navigator, { clipboard: { writeText: jest.fn().mockResolvedValue(undefined) } });
17+
describe("HomeScreen", () => {
18+
beforeEach(() => {
19+
jest.clearAllMocks();
20+
});
1521

16-
// Mock react-navigation (only what HomeScreen touches indirectly)
17-
jest.mock('@react-navigation/native', () => {
18-
const actual = jest.requireActual('@react-navigation/native');
19-
return { ...actual, useNavigation: () => ({ navigate: jest.fn() }) };
20-
});
22+
it("renders title and buttons", async () => {
23+
render(<HomeScreen />);
24+
expect(await screen.findByText("Python Front")).toBeInTheDocument();
25+
expect(screen.getByText("Run")).toBeInTheDocument();
26+
expect(screen.getByText("Clear")).toBeInTheDocument();
27+
});
28+
29+
it("loads Pyodide successfully and shows Ready status", async () => {
30+
render(<HomeScreen />);
31+
await waitFor(() => {
32+
expect(screen.getByText(/Pyodide: Ready/i)).toBeTruthy();
33+
});
34+
});
2135

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

25-
const HomeScreen = require('../screens/HomeScreen').default;
45+
it("handles Python errors gracefully", async () => {
46+
render(<HomeScreen />);
47+
await waitFor(() => screen.getByText(/Ready/));
48+
const textarea = screen.getByRole("textbox");
49+
fireEvent.change(textarea, { target: { value: "error code" } });
50+
fireEvent.click(screen.getByText("Run"));
51+
await waitFor(() =>
52+
expect(screen.getByText(/\[ERROR\]/i)).toBeTruthy()
53+
);
54+
});
2655

27-
test('renders title, code and console areas', async () => {
28-
render(<HomeScreen />);
29-
// Title link
30-
expect(await screen.findByText('Python Front')).toBeTruthy();
31-
// Buttons (labels come from MUI Buttons)
32-
expect(screen.getByRole('button', { name: /Run/i })).toBeTruthy();
33-
expect(screen.getByRole('button', { name: /Clear/i })).toBeTruthy();
34-
expect(screen.getByRole('button', { name: /Load Sample/i })).toBeTruthy();
35-
// Console label
36-
expect(screen.getByText('Console')).toBeTruthy();
37-
});
56+
it("clears console output", async () => {
57+
render(<HomeScreen />);
58+
await waitFor(() => screen.getByText(/Ready/));
59+
fireEvent.click(screen.getByText("Clear"));
60+
expect(screen.getByText(/\(No output yet\./i)).toBeInTheDocument();
61+
});
62+
});

frontend/app/__tests__/settingsbar.test.tsx

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)