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 ( / P y o d i d e : R e a d y / 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 ( / R e a d y / ) ) ;
39+ fireEvent . click ( screen . getByText ( "Run" ) ) ;
40+ await waitFor ( ( ) =>
41+ expect ( screen . getByText ( / 3 | n o o u t p u t / 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 ( / R e a d y / ) ) ;
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 ( / \[ E R R O R \] / 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 : / R u n / i } ) ) . toBeTruthy ( ) ;
33- expect ( screen . getByRole ( 'button' , { name : / C l e a r / i } ) ) . toBeTruthy ( ) ;
34- expect ( screen . getByRole ( 'button' , { name : / L o a d S a m p l e / 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 ( / R e a d y / ) ) ;
59+ fireEvent . click ( screen . getByText ( "Clear" ) ) ;
60+ expect ( screen . getByText ( / \( N o o u t p u t y e t \. / i) ) . toBeInTheDocument ( ) ;
61+ } ) ;
62+ } ) ;
0 commit comments