|
6 | 6 | let(:teacher_id) { SecureRandom.uuid }
|
7 | 7 |
|
8 | 8 | let(:lesson_params) do
|
9 |
| - { name: 'Test Lesson', user_id: teacher_id } |
| 9 | + { |
| 10 | + name: 'Test Lesson', |
| 11 | + user_id: teacher_id, |
| 12 | + project_attributes: { |
| 13 | + name: 'Hello world project', |
| 14 | + project_type: 'python', |
| 15 | + components: [ |
| 16 | + { name: 'main.py', extension: 'py', content: 'print("Hello, world!")' } |
| 17 | + ] |
| 18 | + } |
| 19 | + } |
10 | 20 | end
|
11 | 21 |
|
12 | 22 | it 'returns a successful operation response' do
|
|
28 | 38 | expect(response[:lesson].name).to eq('Test Lesson')
|
29 | 39 | end
|
30 | 40 |
|
| 41 | + it 'creates a project for the lesson' do |
| 42 | + expect { described_class.call(lesson_params:) }.to change(Project, :count).by(1) |
| 43 | + end |
| 44 | + |
| 45 | + it 'associates the project to the lesson' do |
| 46 | + response = described_class.call(lesson_params:) |
| 47 | + expect(response[:lesson].project).to be_a(Project) |
| 48 | + end |
| 49 | + |
31 | 50 | it 'assigns the user_id' do
|
32 | 51 | response = described_class.call(lesson_params:)
|
33 | 52 | expect(response[:lesson].user_id).to eq(teacher_id)
|
34 | 53 | end
|
35 | 54 |
|
36 |
| - context 'when creation fails' do |
37 |
| - let(:lesson_params) { {} } |
| 55 | + context 'when lesson creation fails' do |
| 56 | + let(:lesson_params) do |
| 57 | + { |
| 58 | + project_attributes: { |
| 59 | + name: 'Hello world project', |
| 60 | + project_type: 'python', |
| 61 | + components: [ |
| 62 | + { name: 'main.py', extension: 'py', content: 'print("Hello, world!")' } |
| 63 | + ] |
| 64 | + } |
| 65 | + } |
| 66 | + end |
| 67 | + |
| 68 | + before do |
| 69 | + allow(Sentry).to receive(:capture_exception) |
| 70 | + end |
| 71 | + |
| 72 | + it 'does not create a lesson' do |
| 73 | + expect { described_class.call(lesson_params:) }.not_to change(Lesson, :count) |
| 74 | + end |
| 75 | + |
| 76 | + it 'does not create a project' do |
| 77 | + expect { described_class.call(lesson_params:) }.not_to change(Project, :count) |
| 78 | + end |
| 79 | + |
| 80 | + it 'returns a failed operation response' do |
| 81 | + response = described_class.call(lesson_params:) |
| 82 | + expect(response.failure?).to be(true) |
| 83 | + end |
| 84 | + |
| 85 | + it 'returns the error message in the operation response' do |
| 86 | + response = described_class.call(lesson_params:) |
| 87 | + expect(response[:error]).to match(/Error creating lesson/) |
| 88 | + end |
| 89 | + |
| 90 | + it 'sent the exception to Sentry' do |
| 91 | + described_class.call(lesson_params:) |
| 92 | + expect(Sentry).to have_received(:capture_exception).with(kind_of(StandardError)) |
| 93 | + end |
| 94 | + end |
| 95 | + |
| 96 | + context 'when project creation fails' do |
| 97 | + let(:lesson_params) do |
| 98 | + { |
| 99 | + name: 'Test Lesson', |
| 100 | + user_id: teacher_id, |
| 101 | + project_attributes: { |
| 102 | + invalid_attribute: 'blah blah blah' |
| 103 | + } |
| 104 | + } |
| 105 | + end |
38 | 106 |
|
39 | 107 | before do
|
40 | 108 | allow(Sentry).to receive(:capture_exception)
|
|
44 | 112 | expect { described_class.call(lesson_params:) }.not_to change(Lesson, :count)
|
45 | 113 | end
|
46 | 114 |
|
| 115 | + it 'does not create a project' do |
| 116 | + expect { described_class.call(lesson_params:) }.not_to change(Project, :count) |
| 117 | + end |
| 118 | + |
47 | 119 | it 'returns a failed operation response' do
|
48 | 120 | response = described_class.call(lesson_params:)
|
49 | 121 | expect(response.failure?).to be(true)
|
|
0 commit comments