1- package ui ;
1+ package com . DesktopApplicationClientJava . controllers ;
22
33import static org .junit .jupiter .api .Assertions .assertEquals ;
44import static org .junit .jupiter .api .Assertions .assertFalse ;
1818import com .DesktopApplicationClientJava .session .Session ;
1919import com .DesktopApplicationClientJava .utils .ControllerWiring ;
2020import java .util .UUID ;
21- import javafx .fxml .FXMLLoader ;
22- import javafx .scene .Parent ;
23- import javafx .scene .Scene ;
21+ import javafx .application .Platform ;
22+ import javafx .event .ActionEvent ;
2423import javafx .scene .control .Label ;
25- import javafx .stage .Stage ;
24+ import javafx .scene .control .PasswordField ;
25+ import javafx .scene .control .TextField ;
26+ import org .junit .jupiter .api .BeforeAll ;
2627import org .junit .jupiter .api .BeforeEach ;
2728import org .junit .jupiter .api .Test ;
28- import org .testfx .api .FxToolkit ;
2929
30- class LoginFormControllerTest extends FxTestBase {
30+ class LoginFormControllerTest {
3131
3232 private static final String VALID_EMAIL = "user@example.com" ;
3333 private static final String VALID_PASSWORD = "secret123" ;
3434
3535 private AuthService authService ;
3636 private Navigator navigator ;
37-
38- @ BeforeEach
39- void resetScene () throws Exception {
40- FxToolkit .setupStage (
41- stage -> {
42- try {
43- start (stage );
44- } catch (Exception e ) {
45- throw new RuntimeException (e );
46- }
47- });
37+ private LoginFormController controller ;
38+
39+ @ BeforeAll
40+ static void bootstrapFx () {
41+ try {
42+ Platform .startup (() -> {});
43+ Platform .setImplicitExit (false );
44+ } catch (IllegalStateException alreadyStarted ) {
45+ // JVM-wide singleton; another test class already started the toolkit.
46+ }
4847 }
4948
50- void start (Stage stage ) throws Exception {
49+ @ BeforeEach
50+ void setUp () {
5151 authService = mock (AuthService .class );
52+ navigator = mock (Navigator .class );
53+
5254 ServiceRegistry services = mock (ServiceRegistry .class );
5355 when (services .getAuthService ()).thenReturn (authService );
54- navigator = mock (Navigator .class );
5556
56- FXMLLoader loader = new FXMLLoader (getClass ().getResource ("/fxml/LoginForm.fxml" ));
57- loader .setControllerFactory (
58- clazz -> {
59- try {
60- Object controller = clazz .getDeclaredConstructor ().newInstance ();
61- ControllerWiring .wire (controller , navigator , new Session (), services );
62- return controller ;
63- } catch (Exception e ) {
64- throw new RuntimeException ("Cannot create controller: " + clazz , e );
65- }
66- });
67- Parent root = loader .load ();
68- stage .setScene (new Scene (root ));
69- stage .show ();
57+ controller = new LoginFormController ();
58+ ControllerWiring .wire (controller , navigator , new Session (), services );
59+
60+ controller .emailField = new TextField ();
61+ controller .passwordField = new PasswordField ();
62+ controller .errorLabel = new Label ();
7063 }
7164
7265 @ Test
7366 void emptyFieldsShowErrorAndDoNotCallApi () {
74- robot . clickOn ( "#submitButton" );
67+ controller . onSubmit ( new ActionEvent () );
7568
76- Label error = robot .lookup ("#errorLabel" ).queryAs (Label .class );
77- assertTrue (error .isVisible ());
78- assertEquals ("Заполните все поля" , error .getText ());
69+ assertTrue (controller .errorLabel .isVisible ());
70+ assertEquals ("Заполните все поля" , controller .errorLabel .getText ());
7971 verify (authService , never ()).login (anyString (), anyString ());
8072 verify (navigator , never ()).goTo (anyString ());
8173 }
8274
8375 @ Test
8476 void blankPasswordShowsErrorAndDoesNotCallApi () {
85- fillText ( robot , "# emailField" , VALID_EMAIL );
86- robot . clickOn ( "#submitButton" );
77+ controller . emailField . setText ( VALID_EMAIL );
78+ controller . onSubmit ( new ActionEvent () );
8779
88- Label error = robot .lookup ("#errorLabel" ).queryAs (Label .class );
89- assertTrue (error .isVisible ());
90- assertEquals ("Заполните все поля" , error .getText ());
80+ assertTrue (controller .errorLabel .isVisible ());
81+ assertEquals ("Заполните все поля" , controller .errorLabel .getText ());
9182 verify (authService , never ()).login (anyString (), anyString ());
9283 verify (navigator , never ()).goTo (anyString ());
9384 }
9485
9586 @ Test
9687 void invalidEmailShowsErrorAndDoesNotCallApi () {
97- fillText ( robot , "# emailField" , "not-an-email" );
98- fillText ( robot , "# passwordField" , VALID_PASSWORD );
99- robot . clickOn ( "#submitButton" );
88+ controller . emailField . setText ( "not-an-email" );
89+ controller . passwordField . setText ( VALID_PASSWORD );
90+ controller . onSubmit ( new ActionEvent () );
10091
101- Label error = robot .lookup ("#errorLabel" ).queryAs (Label .class );
102- assertTrue (error .isVisible ());
103- assertEquals ("Неверный формат" , error .getText ());
92+ assertTrue (controller .errorLabel .isVisible ());
93+ assertEquals ("Неверный формат" , controller .errorLabel .getText ());
10494 verify (authService , never ()).login (anyString (), anyString ());
10595 verify (navigator , never ()).goTo (anyString ());
10696 }
@@ -110,28 +100,26 @@ void successfulLoginNavigatesToResourceList() {
110100 User user = new User (UUID .randomUUID (), VALID_EMAIL , Role .USER , "Имя" , "Фамилия" , true );
111101 when (authService .login (VALID_EMAIL , VALID_PASSWORD )).thenReturn (user );
112102
113- fillText ( robot , "# emailField" , VALID_EMAIL );
114- fillText ( robot , "# passwordField" , VALID_PASSWORD );
115- robot . clickOn ( "#submitButton" );
103+ controller . emailField . setText ( VALID_EMAIL );
104+ controller . passwordField . setText ( VALID_PASSWORD );
105+ controller . onSubmit ( new ActionEvent () );
116106
117107 verify (authService ).login (VALID_EMAIL , VALID_PASSWORD );
118108 verify (navigator ).goTo ("/fxml/ResourceList.fxml" );
119- Label error = robot .lookup ("#errorLabel" ).queryAs (Label .class );
120- assertFalse (error .isVisible ());
109+ assertFalse (controller .errorLabel .isVisible ());
121110 }
122111
123112 @ Test
124113 void failedLoginShowsServerErrorAndDoesNotNavigate () {
125114 when (authService .login (VALID_EMAIL , VALID_PASSWORD ))
126115 .thenThrow (new ServiceException ("Неверный логин или пароль" ));
127116
128- fillText ( robot , "# emailField" , VALID_EMAIL );
129- fillText ( robot , "# passwordField" , VALID_PASSWORD );
130- robot . clickOn ( "#submitButton" );
117+ controller . emailField . setText ( VALID_EMAIL );
118+ controller . passwordField . setText ( VALID_PASSWORD );
119+ controller . onSubmit ( new ActionEvent () );
131120
132- Label error = robot .lookup ("#errorLabel" ).queryAs (Label .class );
133- assertTrue (error .isVisible ());
134- assertEquals ("Неверный логин или пароль" , error .getText ());
121+ assertTrue (controller .errorLabel .isVisible ());
122+ assertEquals ("Неверный логин или пароль" , controller .errorLabel .getText ());
135123 verify (navigator , never ()).goTo (anyString ());
136124 }
137125}
0 commit comments