Skip to content

Commit f82f10f

Browse files
Add student data to dev seeds (#376)
closes #339 --------- Co-authored-by: create-issue-branch[bot] <53036503+create-issue-branch[bot]@users.noreply.github.com> Co-authored-by: Dan Halson <[email protected]>
1 parent 6048b4b commit f82f10f

File tree

4 files changed

+80
-34
lines changed

4 files changed

+80
-34
lines changed

README.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ For classroom management the following scenarios modelled by the tasks:
7575

7676
`rails classroom_management:seed_an_unverified_school` - seeds an unverified school to test the onboarding flow
7777
`rails classroom_management:seed_a_verified_school` - seeds only a verified school
78-
`rails classroom_management:seed_a_school_with_lessons` - seeds a school with a class, two lessons, and a project in each
78+
`rails classroom_management:seed_a_school_with_lessons_and_students` - seeds a school with a class, two lessons, a project in each, and two students
7979

8080
To clear classroom management data the following cmd will remove the school associated with the `[email protected]` user, and associated school data:
8181

@@ -85,7 +85,9 @@ To override values, you can prefix the tasks with environment variables, for exa
8585

8686
`SEEDING_CREATOR_ID=00000000-0000-0000-0000-000000000000 rails classroom_management:seed_a_verified_school`
8787

88-
Also avilable to override are: `SEEDING_TEACHER_ID`, `SEEDING_SCHOOL_ID`
88+
Also avilable to override are: `SEEDING_TEACHER_ID`.
89+
90+
> NOTE: The student ids and school id in the CM seeds are hard coded to match profile seed data.
8991
9092
#### Syncing the database from Production / Staging
9193

lib/tasks/classroom_management.rake

+35-25
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Rails.logger = Logger.new($stdout) unless Rails.env.test?
88
# `SEEDING_CREATOR_ID=00000000-0000-0000-0000-000000000000 rails classroom_management:seed_an_unverified_school`
99
# `SEEDING_TEACHER_ID=00000000-0000-0000-0000-000000000000 rails classroom_management:seed_a_school_with_lessons`
1010

11+
# For students to match up the school needs to match with the school defined in profile (hard coded in the helper)
12+
1113
# rubocop:disable Metrics/BlockLength
1214
namespace :classroom_management do
1315
include ClassroomManagementHelper
@@ -16,23 +18,29 @@ namespace :classroom_management do
1618
task destroy_seed_data: :environment do
1719
ActiveRecord::Base.transaction do
1820
Rails.logger.info 'Destroying existing seeds...'
19-
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane])
20-
teacher_id = ENV.fetch('SEEDING_TEACHER_ID', TEST_USERS[:john])
21-
school_id = ENV.fetch('SEEDING_SCHOOL_ID', School.find_by(creator_id:)&.id)
21+
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane_doe])
22+
teacher_id = ENV.fetch('SEEDING_TEACHER_ID', TEST_USERS[:john_doe])
2223

23-
Role.where(user_id: [creator_id, teacher_id]).destroy_all
24+
# Hard coded as the student's school needs to match
25+
student_ids = [TEST_USERS[:jane_smith], TEST_USERS[:john_smith]]
26+
school_id = TEST_SCHOOL
2427

25-
if school_id.nil? || creator_id.nil?
26-
Rails.logger.info 'No school found for creator, exiting...'
27-
exit
28-
end
28+
# Remove the roles first
29+
Role.where(user_id: [creator_id, teacher_id] + student_ids).destroy_all
30+
31+
# Destroy the project and then the lesson itself (The lesson's `before_destroy` prevents us using destroy)
32+
lesson_ids = Lesson.where(school_id:).pluck(:id)
33+
Project.where(lesson_id: [lesson_ids]).destroy_all
34+
Lesson.where(id: [lesson_ids]).delete_all
35+
36+
# Destroy the class members and then the class itself
37+
school_class_ids = SchoolClass.where(school_id:).pluck(:id)
38+
ClassMember.where(school_class_id: [school_class_ids]).destroy_all
39+
SchoolClass.where(id: [school_class_ids]).destroy_all
40+
41+
# Destroy the school
42+
School.find(school_id).destroy
2943

30-
lesson_id = Lesson.where(school_id:).pluck(:id)
31-
Project.where(lesson_id:).destroy_all
32-
# The `before_destroy` prevents us using destroy, but as we've removed projects already we can safely delete
33-
Lesson.where(school_id:).delete_all
34-
SchoolClass.where(school_id:).destroy_all
35-
School.where(creator_id:).destroy_all
3644
Rails.logger.info 'Done...'
3745
rescue StandardError => e
3846
Rails.logger.error "Failed: #{e.message}"
@@ -44,8 +52,9 @@ namespace :classroom_management do
4452
task seed_an_unverified_school: :environment do
4553
ActiveRecord::Base.transaction do
4654
Rails.logger.info 'Attempting to seed data...'
47-
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane])
48-
create_school(creator_id)
55+
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane_doe])
56+
create_school(creator_id, TEST_SCHOOL)
57+
4958
Rails.logger.info 'Done...'
5059
rescue StandardError => e
5160
Rails.logger.error "Failed: #{e.message}"
@@ -57,9 +66,9 @@ namespace :classroom_management do
5766
task seed_a_verified_school: :environment do
5867
ActiveRecord::Base.transaction do
5968
Rails.logger.info 'Attempting to seed data...'
60-
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane])
61-
school_id = ENV.fetch('SEEDING_SCHOOL_ID', nil)
62-
school = create_school(creator_id, school_id)
69+
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane_doe])
70+
71+
school = create_school(creator_id, TEST_SCHOOL)
6372
verify_school(school)
6473
Rails.logger.info 'Done...'
6574
rescue StandardError => e
@@ -68,19 +77,20 @@ namespace :classroom_management do
6877
end
6978
end
7079

71-
desc 'Create a school with lessons'
72-
task seed_a_school_with_lessons: :environment do
80+
desc 'Create a school with lessons and students'
81+
task seed_a_school_with_lessons_and_students: :environment do
7382
ActiveRecord::Base.transaction do
7483
Rails.logger.info 'Attempting to seed data...'
75-
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane])
76-
teacher_id = ENV.fetch('SEEDING_TEACHER_ID', TEST_USERS[:john])
77-
school_id = ENV.fetch('SEEDING_SCHOOL_ID', nil)
84+
creator_id = ENV.fetch('SEEDING_CREATOR_ID', TEST_USERS[:jane_doe])
85+
teacher_id = ENV.fetch('SEEDING_TEACHER_ID', TEST_USERS[:john_doe])
7886

79-
school = create_school(creator_id, school_id)
87+
school = create_school(creator_id, TEST_SCHOOL)
8088
verify_school(school)
8189
assign_a_teacher(teacher_id, school)
8290

8391
school_class = create_school_class(creator_id, school)
92+
assign_students(school_class, school)
93+
8494
lessons = create_lessons(creator_id, school, school_class)
8595
lessons.each do |lesson|
8696
create_project(creator_id, school, lesson)

lib/tasks/classroom_management_helper.rb

+19-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ module ClassroomManagementHelper
44
TEST_USERS = {
55
# Use this in conjunction with BYPASS_OAUTH=true to generate data for the bypass user
66
bypass_oauth: '00000000-0000-0000-0000-000000000000',
7-
jane: '583ba872-b16e-46e1-9f7d-df89d267550d', # [email protected]
8-
john: 'bbb9b8fd-f357-4238-983d-6f87b99bdbb2' # [email protected]
7+
jane_doe: '583ba872-b16e-46e1-9f7d-df89d267550d', # [email protected]
8+
john_doe: 'bbb9b8fd-f357-4238-983d-6f87b99bdbb2', # [email protected]
9+
jane_smith: 'e52de409-9210-4e94-b08c-dd11439e07d9', # student
10+
john_smith: '0d488bec-b10d-46d3-b6f3-4cddf5d90c71' # student
911
}.freeze
1012

13+
TEST_SCHOOL = 'e52de409-9210-4e94-b08c-dd11439e07d9'
14+
1115
def create_school(creator_id, school_id = nil)
1216
School.find_or_create_by!(creator_id:, id: school_id) do |school|
1317
Rails.logger.info 'Seeding a school...'
@@ -44,6 +48,19 @@ def assign_a_teacher(user_id, school)
4448
Role.teacher.find_or_create_by!(user_id:, school:)
4549
end
4650

51+
def assign_students(school_class, school)
52+
[TEST_USERS[:jane_smith], TEST_USERS[:john_smith]].map do |student_id|
53+
Rails.logger.info 'Assigning student role...'
54+
Role.student.find_or_create_by!(user_id: student_id, school:)
55+
56+
ClassMember.find_or_create_by!(student_id:, school_class:) do |class_member|
57+
Rails.logger.info 'Adding student...'
58+
class_member.student_id = student_id
59+
class_member.school_class = school_class
60+
end
61+
end
62+
end
63+
4764
# rubocop:disable Metrics/AbcSize
4865
def create_lessons(user_id, school, school_class, visibility = 'public')
4966
2.times.map do |i|

spec/lib/classroom_management_spec.rb

+22-5
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,29 @@
66
RSpec.describe 'classroom_management', type: :task do
77
let(:creator_id) { '583ba872-b16e-46e1-9f7d-df89d267550d' } # [email protected]
88
let(:teacher_id) { 'bbb9b8fd-f357-4238-983d-6f87b99bdbb2' } # [email protected]
9+
let(:student_1) { 'e52de409-9210-4e94-b08c-dd11439e07d9' } # student
10+
let(:student_2) { '0d488bec-b10d-46d3-b6f3-4cddf5d90c71' } # student
11+
let(:school_id) { 'e52de409-9210-4e94-b08c-dd11439e07d9' }
912

1013
describe ':destroy_seed_data' do
1114
let(:task) { Rake::Task['classroom_management:destroy_seed_data'] }
12-
let(:school) { create(:school, creator_id:) }
15+
let(:school) { create(:school, creator_id:, id: school_id) }
1316

1417
before do
1518
create(:role, user_id: creator_id, school:)
19+
create(:student_role, user_id: student_1, school:)
1620
create(:teacher_role, user_id: creator_id, school:)
17-
create(:school_class, school_id: school.id, teacher_id: creator_id)
21+
school_class = create(:school_class, school_id: school.id, teacher_id: creator_id)
22+
create(:class_member, student_id: student_1, school_class_id: school_class.id)
1823
create(:lesson, school_id: school.id, user_id: creator_id)
1924
end
2025

2126
# rubocop:disable RSpec/ExampleLength, RSpec/MultipleExpectations
2227
it 'destroys all seed data' do
2328
task.invoke
24-
expect(Role.where(user_id: creator_id)).not_to exist
29+
expect(Role.where(user_id: [creator_id, teacher_id, student_1, student_2])).not_to exist
2530
expect(School.where(creator_id:)).not_to exist
31+
expect(ClassMember.where(student_id: student_1)).not_to exist
2632
expect(SchoolClass.where(school_id: school.id)).not_to exist
2733
expect(Lesson.where(school_id: school.id)).not_to exist
2834
expect(Project.where(school_id: school.id)).not_to exist
@@ -48,8 +54,8 @@
4854
end
4955
end
5056

51-
describe ':seed_a_school_with_lessons' do
52-
let(:task) { Rake::Task['classroom_management:seed_a_school_with_lessons'] }
57+
describe ':seed_a_school_with_lessons_and_students' do
58+
let(:task) { Rake::Task['classroom_management:seed_a_school_with_lessons_and_students'] }
5359

5460
before do
5561
task.invoke
@@ -73,5 +79,16 @@
7379
school = School.find_by(creator_id:)
7480
expect(Role.teacher.where(user_id: teacher_id, school_id: school.id)).to exist
7581
end
82+
83+
# rubocop:disable RSpec/MultipleExpectations, RSpec/ExampleLength
84+
it 'assigns students' do
85+
school_id = School.find_by(creator_id:).id
86+
school_class_id = SchoolClass.find_by(school_id:).id
87+
expect(Role.student.where(user_id: student_1, school_id:)).to exist
88+
expect(ClassMember.where(student_id: student_1, school_class_id:)).to exist
89+
expect(Role.student.where(user_id: student_2, school_id:)).to exist
90+
expect(ClassMember.where(student_id: student_2, school_class_id:)).to exist
91+
end
92+
# rubocop:enable RSpec/MultipleExpectations, RSpec/ExampleLength
7693
end
7794
end

0 commit comments

Comments
 (0)