Skip to content

Commit 726c3fa

Browse files
authored
Endure seeding test (#733)
Reported: ``` ruby 1) test_seeds :seed_a_school_with_lessons_and_students creates class with lessons for the owner Failure/Error: expect(Lesson.where(school_id:, school_class_id: school_class.id).length).to eq(2) expected: 2 got: 4 (compared using ==) # ./spec/lib/test_seeds_spec.rb:67:in 'block (3 levels) in <top (required)>' # ./spec/rails_helper.rb:108:in 'block (3 levels) in <top (required)>' # ./spec/rails_helper.rb:106:in 'block (2 levels) in <top (required)>' ``` Updated rake task to avoid duplicating Lesson. Added a test to make sure idempotency on this rake task. Diff seems bigger than it is, only small replacement.
1 parent 3648cc6 commit 726c3fa

2 files changed

Lines changed: 33 additions & 20 deletions

File tree

lib/tasks/test_seeds.rake

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,32 +44,31 @@ namespace :test_seeds do
4444

4545
desc 'Create a school with lessons and students'
4646
task create: :environment do
47-
if School.find_by(code: TEST_SCHOOL)
47+
if School.exists?(id: TEST_SCHOOL)
4848
puts "Test school (#{TEST_SCHOOL}) already exists, run the destroy_seed_data task to start over)."
49-
return
50-
end
51-
52-
ActiveRecord::Base.transaction do
53-
Rails.logger.info 'Attempting to seed data...'
54-
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane_doe])
55-
teacher_id = ENV.fetch('SEEDING_TEACHER_ID', TEST_USERS[:john_doe])
49+
else
50+
ActiveRecord::Base.transaction do
51+
Rails.logger.info 'Attempting to seed data...'
52+
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane_doe])
53+
teacher_id = ENV.fetch('SEEDING_TEACHER_ID', TEST_USERS[:john_doe])
5654

57-
school = create_school(creator_id, TEST_SCHOOL)
58-
verify_school(school)
59-
assign_a_teacher(teacher_id, school)
55+
school = create_school(creator_id, TEST_SCHOOL)
56+
verify_school(school)
57+
assign_a_teacher(teacher_id, school)
6058

61-
# for each of the owner and teacher, create a class and assign students
62-
[creator_id, teacher_id].each do |user_id|
63-
teacher_name = user_id == creator_id ? 'Jane Doe' : 'John Doe'
64-
school_class = create_school_class(user_id, school, "#{teacher_name}'s Class", "A class for #{teacher_name}'s students")
65-
assign_students(school_class, school)
59+
# for each of the owner and teacher, create a class and assign students
60+
[creator_id, teacher_id].each do |user_id|
61+
teacher_name = user_id == creator_id ? 'Jane Doe' : 'John Doe'
62+
school_class = create_school_class(user_id, school, "#{teacher_name}'s Class", "A class for #{teacher_name}'s students")
63+
assign_students(school_class, school)
6664

67-
lessons = create_lessons(user_id, school, school_class)
68-
lessons.each do |lesson|
69-
create_project(user_id, school, lesson, 'print("Hello World!")')
65+
lessons = create_lessons(user_id, school, school_class)
66+
lessons.each do |lesson|
67+
create_project(user_id, school, lesson, 'print("Hello World!")')
68+
end
7069
end
70+
Rails.logger.info 'Done...'
7171
end
72-
Rails.logger.info 'Done...'
7372
end
7473
end
7574
end

spec/lib/test_seeds_spec.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,20 @@
8484
expect(ClassTeacher.where(teacher_id:).length).to eq(1)
8585
end
8686

87+
it 'is idempotent' do
88+
school = School.find_by!(creator_id:)
89+
owner_class = SchoolClass.joins(:teachers).find_by!(school_id: school.id, teachers: { teacher_id: creator_id })
90+
teacher_class = SchoolClass.joins(:teachers).find_by!(school_id: school.id, teachers: { teacher_id: })
91+
92+
expect do
93+
task.reenable
94+
task.invoke
95+
end.not_to change { [SchoolClass.where(school_id: school.id).count, Lesson.where(school_id: school.id).count, Project.where(school_id: school.id).count] }
96+
97+
expect(owner_class.reload.lessons.count).to eq(2)
98+
expect(teacher_class.reload.lessons.count).to eq(2)
99+
end
100+
87101
it 'assigns students' do
88102
school_id = School.find_by(creator_id:).id
89103
school_class_id = SchoolClass.find_by(school_id:).id

0 commit comments

Comments
 (0)