|
|
# test_students_list_json.rb
|
|
|
require 'minitest/autorun'
|
|
|
require 'json'
|
|
|
require 'date'
|
|
|
require_relative '../students_list_json'
|
|
|
require_relative '../student'
|
|
|
require_relative '../student_short'
|
|
|
|
|
|
class TestStudentsListJSON < Minitest::Test
|
|
|
TEMP_FILE = 'temp_students.json'
|
|
|
|
|
|
def setup
|
|
|
# Удаляем временный файл перед каждым тестом, если он существует
|
|
|
File.delete(TEMP_FILE) if File.exist?(TEMP_FILE)
|
|
|
@students_list = Students_list_JSON.new(TEMP_FILE)
|
|
|
|
|
|
# Создаём несколько объектов Student для тестирования
|
|
|
@student1 = Student.new(
|
|
|
id: "1",
|
|
|
git: "https://github.com/test1",
|
|
|
surname: "Иванов",
|
|
|
name: "Иван",
|
|
|
patronymic: "Иванович",
|
|
|
birth_date: Date.new(2000, 1, 1),
|
|
|
phone: "+123456789",
|
|
|
telegram: "@test1",
|
|
|
email: "test1@example.com"
|
|
|
)
|
|
|
@student2 = Student.new(
|
|
|
id: "2",
|
|
|
git: "https://github.com/test2",
|
|
|
surname: "Петров",
|
|
|
name: "Пётр",
|
|
|
patronymic: "Петрович",
|
|
|
birth_date: Date.new(1999, 2, 2),
|
|
|
phone: "+987654321",
|
|
|
telegram: "@test2",
|
|
|
email: "test2@example.com"
|
|
|
)
|
|
|
@student3 = Student.new(
|
|
|
id: "3",
|
|
|
git: "https://github.com/test3",
|
|
|
surname: "Сидоров",
|
|
|
name: "Сидор",
|
|
|
patronymic: "Сидорович",
|
|
|
birth_date: Date.new(1998, 3, 3),
|
|
|
phone: "+192837465",
|
|
|
telegram: "@test3",
|
|
|
email: "test3@example.com"
|
|
|
)
|
|
|
|
|
|
# Добавляем студентов в список (метод add_student формирует новый ID)
|
|
|
@students_list.add_student(@student1)
|
|
|
@students_list.add_student(@student2)
|
|
|
@students_list.add_student(@student3)
|
|
|
end
|
|
|
|
|
|
def teardown
|
|
|
# Удаляем временный файл после тестов
|
|
|
File.delete(TEMP_FILE) if File.exist?(TEMP_FILE)
|
|
|
end
|
|
|
|
|
|
def test_save_and_load_from_file
|
|
|
# Сохраняем текущий список в файл
|
|
|
@students_list.save_to_file
|
|
|
|
|
|
# Создаём новый объект, который загрузит данные из файла
|
|
|
new_list = Students_list_JSON.new(TEMP_FILE)
|
|
|
new_list.load_from_file
|
|
|
|
|
|
# Проверяем, что количество студентов совпадает
|
|
|
assert_equal @students_list.get_student_short_count, new_list.get_student_short_count
|
|
|
|
|
|
# Проверяем, что данные студентов (например, фамилии и инициалы) совпадают
|
|
|
original_names = @students_list.students.map(&:surname_initials)
|
|
|
loaded_names = new_list.students.map(&:surname_initials)
|
|
|
assert_equal original_names.sort, loaded_names.sort
|
|
|
end
|
|
|
|
|
|
def test_get_student_by_id
|
|
|
# Предполагаем, что add_student сбросил id, поэтому ищем по id "1" (первый добавленный)
|
|
|
student = @students_list.get_student_by_id("1")
|
|
|
refute_nil student
|
|
|
assert_equal "Иванов И.И.", student.surname_initials
|
|
|
end
|
|
|
|
|
|
def test_get_k_n_student_short_list
|
|
|
# Тестируем получение "страницы" студентов: k = 2, n = 1 (две записи)
|
|
|
data_list = @students_list.get_k_n_student_short_list(2, 1)
|
|
|
# Ожидаем, что DataList содержит 2 элемента
|
|
|
assert_equal 2, data_list.get_data.rows_count
|
|
|
|
|
|
# Проверяем, что строки таблицы содержат корректное значение ФИО
|
|
|
first_row = data_list.get_data.item(0, 1)
|
|
|
refute_nil first_row
|
|
|
assert_match(/[А-ЯЁ][а-яё]+ [А-Я]\./, first_row)
|
|
|
end
|
|
|
|
|
|
def test_sort_students!
|
|
|
# Перемешиваем порядок студентов
|
|
|
@students_list.students.shuffle!
|
|
|
@students_list.sort_students!
|
|
|
sorted_names = @students_list.students.map(&:surname_initials)
|
|
|
# Проверяем, что список отсортирован в лексикографическом порядке
|
|
|
assert_equal sorted_names.sort, sorted_names
|
|
|
end
|
|
|
|
|
|
def test_add_student
|
|
|
new_student = Student.new(
|
|
|
id: "0", # id будет перезаписан
|
|
|
git: "https://github.com/test4",
|
|
|
surname: "Алексеев",
|
|
|
name: "Алексей",
|
|
|
patronymic: "Алексеевич",
|
|
|
birth_date: Date.new(2001, 4, 4),
|
|
|
phone: "+111222333",
|
|
|
telegram: "@test4",
|
|
|
email: "test4@example.com"
|
|
|
)
|
|
|
added_student = @students_list.add_student(new_student)
|
|
|
# Проверяем, что новый id сформирован корректно (будет равен max(id)+1)
|
|
|
expected_id = (@students_list.students.map { |s| s.id.to_i }.max).to_s
|
|
|
assert_equal expected_id, added_student.id
|
|
|
assert_equal 4, @students_list.get_student_short_count
|
|
|
end
|
|
|
|
|
|
def test_update_student_by_id
|
|
|
# Создаём нового студента для замены
|
|
|
updated_student = Student.new(
|
|
|
id: "0", # id будет перезаписан
|
|
|
git: "https://github.com/updated",
|
|
|
surname: "Обновлённый",
|
|
|
name: "Студент",
|
|
|
patronymic: "Тестович",
|
|
|
birth_date: Date.new(2002, 5, 5),
|
|
|
phone: "+444555666",
|
|
|
telegram: "@updated",
|
|
|
email: "updated@example.com"
|
|
|
)
|
|
|
# Обновляем студента с id "2"
|
|
|
result = @students_list.update_student_by_id("2", updated_student)
|
|
|
assert result
|
|
|
|
|
|
student = @students_list.get_student_by_id("2")
|
|
|
refute_nil student
|
|
|
assert_equal "Обновлённый С.Т.", student.surname_initials
|
|
|
assert_equal "https://github.com/updated", student.git
|
|
|
end
|
|
|
|
|
|
def test_delete_student_by_id
|
|
|
# Удаляем студента с id "1"
|
|
|
result = @students_list.delete_student_by_id("1")
|
|
|
assert result
|
|
|
|
|
|
# Проверяем, что студент с id "1" отсутствует
|
|
|
student = @students_list.get_student_by_id("1")
|
|
|
assert_nil student
|
|
|
|
|
|
# Количество студентов должно уменьшиться
|
|
|
assert_equal 2, @students_list.get_student_short_count
|
|
|
end
|
|
|
|
|
|
def test_get_student_short_count
|
|
|
assert_equal 3, @students_list.get_student_short_count
|
|
|
end
|
|
|
end
|