1+ package webapp .cucumber ;
2+
3+ import io .cucumber .java .Before ;
4+ import io .cucumber .java .ru .*;
5+ import webapp .model .*;
6+ import webapp .storage .*;
7+
8+ import java .util .*;
9+ import java .util .regex .*;
10+
11+ import static org .junit .jupiter .api .Assertions .*;
12+
13+ public class DataValidationStepDefinitions {
14+
15+ private IStorage storage ;
16+ private Resume currentResume ;
17+ private Exception lastException ;
18+ private boolean validationResult ;
19+ private String lastEmail ;
20+ private String lastPhone ;
21+ private int resumeCount = 0 ;
22+
23+ @ Before
24+ public void setup () {
25+ storage = new ArrayStorage ();
26+ lastException = null ;
27+ validationResult = false ;
28+ }
29+
30+ // Валидация имени
31+ @ Когда ("я создаю резюме с именем длиной {int} символов" )
32+ public void яСоздаюРезюмеСИменемДлиной (int length ) {
33+ try {
34+ StringBuilder name = new StringBuilder ();
35+ for (int i = 0 ; i < length ; i ++) {
36+ name .append ("A" );
37+ }
38+ currentResume = new Resume (name .toString (), "Test City" );
39+ storage .save (currentResume );
40+ } catch (Exception e ) {
41+ lastException = e ;
42+ }
43+ }
44+
45+ @ Тогда ("резюме должно быть отклонено" )
46+ public void резюмеДолжноБытьОтклонено () {
47+ // Проверяем что было исключение или резюме не создано
48+ assertTrue (lastException != null || currentResume == null );
49+ }
50+
51+ @ И ("должно появиться сообщение {string}" )
52+ public void должноПоявитьсяСообщение (String message ) {
53+ // В реальном приложении здесь бы проверялось UI сообщение
54+ // Для теста просто проверяем наличие исключения
55+ if (lastException != null ) {
56+ assertNotNull (lastException .getMessage ());
57+ }
58+ }
59+
60+ @ Когда ("я создаю резюме с именем {string}" )
61+ public void яСоздаюРезюмеСИменем (String name ) {
62+ try {
63+ currentResume = new Resume (name , "Test City" );
64+ storage .save (currentResume );
65+ } catch (Exception e ) {
66+ lastException = e ;
67+ }
68+ }
69+
70+ @ Тогда ("резюме должно быть создано успешно" )
71+ public void резюмеДолжноБытьСозданоУспешно () {
72+ assertNotNull (currentResume );
73+ assertNull (lastException );
74+ }
75+
76+ @ И ("имя должно быть сохранено как {string}" )
77+ public void имяДолжноБытьСохраненоКак (String expectedName ) {
78+ Resume retrieved = storage .load (currentResume .getUuid ());
79+ assertEquals (expectedName , retrieved .getFullName ());
80+ }
81+
82+ // Валидация email
83+ @ Когда ("я добавляю email {string}" )
84+ public void яДобавляюEmail (String email ) {
85+ lastEmail = email ;
86+ validationResult = isValidEmail (email );
87+
88+ if (validationResult ) {
89+ if (currentResume == null ) {
90+ currentResume = new Resume ("Test User" , "Test City" );
91+ storage .save (currentResume );
92+ }
93+ currentResume .addContact (ContactType .MAIL , email );
94+ storage .update (currentResume );
95+ }
96+ }
97+
98+ @ Тогда ("email должен быть принят" )
99+ public void emailДолженБытьПринят () {
100+ assertTrue (validationResult );
101+ Resume retrieved = storage .load (currentResume .getUuid ());
102+ assertEquals (lastEmail , retrieved .getContact (ContactType .MAIL ));
103+ }
104+
105+ @ Тогда ("email должен быть отклонен" )
106+ public void emailДолженБытьОтклонен () {
107+ assertFalse (validationResult );
108+ }
109+
110+ // Валидация телефона
111+ @ Когда ("я добавляю телефон {string}" )
112+ public void яДобавляюТелефон (String phone ) {
113+ lastPhone = phone ;
114+ validationResult = isValidPhone (phone );
115+
116+ if (validationResult ) {
117+ if (currentResume == null ) {
118+ currentResume = new Resume ("Test User" , "Test City" );
119+ storage .save (currentResume );
120+ }
121+ currentResume .addContact (ContactType .PHONE , phone );
122+ storage .update (currentResume );
123+ }
124+ }
125+
126+ @ Тогда ("телефон должен быть принят" )
127+ public void телефонДолженБытьПринят () {
128+ assertTrue (validationResult );
129+ Resume retrieved = storage .load (currentResume .getUuid ());
130+ assertEquals (lastPhone , retrieved .getContact (ContactType .PHONE ));
131+ }
132+
133+ // Валидация дат
134+ @ Дано ("у меня есть резюме" )
135+ public void уМеняЕстьРезюме () {
136+ currentResume = new Resume ("Test User" , "Test City" );
137+ storage .save (currentResume );
138+ }
139+
140+ @ Когда ("я добавляю период работы с {string} по {string}" )
141+ public void яДобавляюПериодРаботыС (String startDate , String endDate ) {
142+ try {
143+ // Простая валидация дат
144+ if (startDate .compareTo (endDate ) > 0 ) {
145+ lastException = new IllegalArgumentException ("Дата начала позже даты окончания" );
146+ } else {
147+ Organization org = new Organization ("Test Company" , "http://test.com" );
148+ org .add (new webapp .model .Period (2020 , 1 , 2019 , 1 , "Test" , "Test" ));
149+ currentResume .addSection (SectionType .EXPERIENCE , org );
150+ storage .update (currentResume );
151+ }
152+ } catch (Exception e ) {
153+ lastException = e ;
154+ }
155+ }
156+
157+ @ Тогда ("должна появиться ошибка {string}" )
158+ public void должнаПоявитьсяОшибка (String errorMessage ) {
159+ assertNotNull (lastException );
160+ }
161+
162+ @ И ("период не должен быть добавлен" )
163+ public void периодНеДолженБытьДобавлен () {
164+ Resume retrieved = storage .load (currentResume .getUuid ());
165+ Section <?> experience = retrieved .getSection (SectionType .EXPERIENCE );
166+ assertTrue (experience == null || experience .toString ().isEmpty ());
167+ }
168+
169+ // Массовое создание
170+ @ Когда ("я создаю {int} новых резюме" )
171+ public void яСоздаюНовыхРезюме (int count ) {
172+ resumeCount = 0 ;
173+ for (int i = 0 ; i < count ; i ++) {
174+ try {
175+ Resume resume = new Resume ("User " + i , "City " + i );
176+ storage .save (resume );
177+ resumeCount ++;
178+ } catch (Exception e ) {
179+ // Прекращаем при превышении лимита
180+ break ;
181+ }
182+ }
183+ }
184+
185+ @ Тогда ("должно быть создано не более {int} резюме" )
186+ public void должноБытьСозданоНеБолееРезюме (int maxCount ) {
187+ assertTrue (resumeCount <= maxCount );
188+ }
189+
190+ @ И ("при превышении лимита должна быть ошибка" )
191+ public void приПревышенииЛимитаДолжнаБытьОшибка () {
192+ // В ArrayStorage лимит 100
193+ if (resumeCount == 100 ) {
194+ try {
195+ Resume extraResume = new Resume ("Extra User" , "Extra City" );
196+ storage .save (extraResume );
197+ fail ("Should have thrown exception" );
198+ } catch (Exception e ) {
199+ assertNotNull (e );
200+ }
201+ }
202+ }
203+
204+ // Вспомогательные методы
205+ private boolean isValidEmail (String email ) {
206+ String emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\ .[A-Za-z]{2,}$" ;
207+ Pattern pattern = Pattern .compile (emailRegex );
208+ Matcher matcher = pattern .matcher (email );
209+ return matcher .matches ();
210+ }
211+
212+ private boolean isValidPhone (String phone ) {
213+ // Простая валидация для российских и международных номеров
214+ String phoneRegex = "^[+]?[0-9\\ s()-]+$" ;
215+ Pattern pattern = Pattern .compile (phoneRegex );
216+ Matcher matcher = pattern .matcher (phone );
217+ return matcher .matches () && phone .replaceAll ("[^0-9]" , "" ).length () >= 7 ;
218+ }
219+ }
0 commit comments