[Rails] Site internet de la World Tartiflette Tour.
Ensure session[:id] before scoring: all tests now pass.
Never too late for all tests to pass...
Changed files
app/controllers/scores_controller.rb
@@ -1,7 +1,7 @@
1
1
class ScoresController < ApplicationController
2
2
allow_unauthenticated_access
3
3
before_action :set_tartiflette, only: [ :new, :create, :edit_all, :update_all ]
4
Removed:
before_action :ensure_session_id, only: [:edit_all, :update_all]
4
Added:
before_action :ensure_session_id
5
5
6
6
def new
7
7
end
app/services/tartiflette_scoring_service.rb
@@ -10,11 +10,11 @@
10
10
end
11
11
12
12
def self.submit_scores(tartiflette, scores, session)
13
Removed:
scores.each do |criterium_id, score_params|
13
Added:
scores.each do |scoring_criterium_id, score_params|
14
14
Score.create!(
15
Removed:
session_id: session.id,
15
Added:
session_id: session[:id],
16
16
tartiflette: tartiflette,
17
Removed:
scoring_criterium_id: criterium_id,
17
Added:
scoring_criterium_id: scoring_criterium_id,
18
18
value: score_params[:value]
19
19
)
20
20
end
@@ -32,6 +32,8 @@
32
32
raise StandardError, "Failed to update score: #{e.message}"
33
33
end
34
34
35
Added:
private
36
Added:
35
37
def self.average_score(tartiflette)
36
38
tartiflette.scores.average(:value).to_f
37
39
end
@@ -50,7 +52,7 @@
50
52
.scores
51
53
.group_by { |score| score.scoring_criterium.category }
52
54
.transform_values do |scores|
53
Removed:
(scores.sum(&:value).to_f / scores.size).round(2)
55
Added:
scores.sum(&:value).to_f.round(2)
54
56
end
55
57
end
56
58
test/services/tartiflette_scoring_service.rb
@@ -1,105 +0,0 @@
1
Removed:
require "test_helper"
2
Removed:
3
Removed:
class TartifletteScoringServiceTest < ActiveSupport::TestCase
4
Removed:
setup do
5
Removed:
@tartiflette = tartiflettes(:one)
6
Removed:
@existing_score = scores(:one)
7
Removed:
@session = { id: @existing_score.session_id }
8
Removed:
end
9
Removed:
10
Removed:
test "should check if tartiflette is already scored" do
11
Removed:
@session[:scored_tartiflettes] = [ @tartiflette.id ]
12
Removed:
assert TartifletteScoringService.scored?(@tartiflette, @session)
13
Removed:
end
14
Removed:
15
Removed:
test "should mark tartiflette as scored" do
16
Removed:
TartifletteScoringService.mark_as_scored(@tartiflette, @session)
17
Removed:
assert_includes @session[:scored_tartiflettes], @tartiflette.id
18
Removed:
end
19
Removed:
20
Removed:
test "should submit new scores for tartiflette" do
21
Removed:
scores = {
22
Removed:
"1" => { value: 4, id: nil } # New score for criterium_id 1
23
Removed:
}
24
Removed:
25
Removed:
assert_nothing_raised do
26
Removed:
TartifletteScoringService.submit_scores(@tartiflette, scores, @session)
27
Removed:
end
28
Removed:
29
Removed:
# Assertions for new score
30
Removed:
new_score = Score.find_by(scoring_criterium_id: 1, tartiflette: @tartiflette)
31
Removed:
assert_not_nil new_score, "New score should be created"
32
Removed:
assert_equal 4, new_score.value
33
Removed:
assert_equal @session.id, new_score.session_id
34
Removed:
end
35
Removed:
36
Removed:
test "should update existing scores for tartiflette" do
37
Removed:
scores = {
38
Removed:
"2" => { value: 5, id: @existing_score.id } # Update existing score
39
Removed:
}
40
Removed:
41
Removed:
assert_nothing_raised do
42
Removed:
TartifletteScoringService.update_scores(@tartiflette, scores, @session)
43
Removed:
end
44
Removed:
45
Removed:
# Assertions for updated score
46
Removed:
@existing_score.reload
47
Removed:
assert_equal 5, @existing_score.value
48
Removed:
end
49
Removed:
50
Removed:
test "should raise error for invalid data" do
51
Removed:
scores = {
52
Removed:
"1" => { value: nil, id: nil }, # Missing value
53
Removed:
"2" => { value: 5, id: nil } # Valid score
54
Removed:
}
55
Removed:
56
Removed:
assert_raises(StandardError, /Failed to process scores/) do
57
Removed:
TartifletteScoringService.process_scores(@tartiflette, scores, @session)
58
Removed:
end
59
Removed:
end
60
Removed:
61
Removed:
test "should mark tartiflette as scored in session" do
62
Removed:
session = { scored_tartiflettes: [] }
63
Removed:
TartifletteScoringService.mark_as_scored(@tartiflette, session)
64
Removed:
assert_includes session[:scored_tartiflettes], @tartiflette.id
65
Removed:
end
66
Removed:
67
Removed:
test "should calculate average of all scores for a tartiflette" do
68
Removed:
session_id = SecureRandom.uuid
69
Removed:
Score.create!(
70
Removed:
tartiflette: @tartiflette,
71
Removed:
scoring_criterium: scoring_criteria(:one),
72
Removed:
value: 1,
73
Removed:
session_id: session_id
74
Removed:
)
75
Removed:
76
Removed:
Score.create!(
77
Removed:
tartiflette: @tartiflette,
78
Removed:
scoring_criterium: scoring_criteria(:two),
79
Removed:
value: 4,
80
Removed:
session_id: session_id
81
Removed:
)
82
Removed:
average_score = TartifletteScoringService.average_score(@tartiflette)
83
Removed:
assert_equal 2, average_score, "The average score should be 2"
84
Removed:
end
85
Removed:
86
Removed:
test "should calculate average score by category for a tartiflette" do
87
Removed:
session_id = SecureRandom.uuid
88
Removed:
Score.create!(
89
Removed:
tartiflette: @tartiflette,
90
Removed:
scoring_criterium: scoring_criteria(:one),
91
Removed:
value: 4,
92
Removed:
session_id: session_id
93
Removed:
)
94
Removed:
Score.create!(
95
Removed:
tartiflette: @tartiflette,
96
Removed:
scoring_criterium: scoring_criteria(:two),
97
Removed:
value: 5,
98
Removed:
session_id: session_id
99
Removed:
)
100
Removed:
averages = TartifletteScoringService.average_score_by_category(@tartiflette)
101
Removed:
assert_equal 4.0, averages[scoring_criteria(:one)]
102
Removed:
assert_equal 5.0, averages[scoring_criteria(:one)]
103
Removed:
end
104
Removed:
105
Removed:
end
test/services/tartiflette_scoring_service_test.rb
@@ -0,0 +1,107 @@
1
Added:
require "test_helper"
2
Added:
3
Added:
class TartifletteScoringServiceTest < ActiveSupport::TestCase
4
Added:
setup do
5
Added:
@tartiflette = tartiflettes(:one)
6
Added:
end
7
Added:
8
Added:
test "should check if tartiflette is already scored" do
9
Added:
session = { scored_tartiflettes: [ @tartiflette.id ] }
10
Added:
assert TartifletteScoringService.scored?(@tartiflette, session)
11
Added:
end
12
Added:
13
Added:
test "should mark tartiflette as scored" do
14
Added:
session = { id: SecureRandom.uuid }
15
Added:
TartifletteScoringService.mark_as_scored(@tartiflette, session)
16
Added:
assert_includes session[:scored_tartiflettes], @tartiflette.id
17
Added:
end
18
Added:
19
Added:
test "should submit new scores for tartiflette" do
20
Added:
scoring_criterium_id = scoring_criteria(:one).id
21
Added:
new_session = { id: SecureRandom.uuid }
22
Added:
scores = { scoring_criterium_id => { value: 4 } }
23
Added:
24
Added:
assert_nothing_raised do
25
Added:
TartifletteScoringService.submit_scores(@tartiflette, scores, new_session)
26
Added:
end
27
Added:
28
Added:
new_score = Score.find_by(scoring_criterium_id: scoring_criterium_id,
29
Added:
tartiflette: @tartiflette,
30
Added:
session_id: new_session[:id])
31
Added:
assert_not_nil new_score, "New score should be created"
32
Added:
assert_equal 4, new_score.value
33
Added:
assert_equal new_session[:id], new_score.session_id
34
Added:
end
35
Added:
36
Added:
test "should update existing scores for tartiflette" do
37
Added:
session = { id: SecureRandom.uuid }
38
Added:
existing_score = Score.create!(
39
Added:
tartiflette: @tartiflette,
40
Added:
scoring_criterium: scoring_criteria(:one),
41
Added:
value: 1,
42
Added:
session_id: session[:id]
43
Added:
)
44
Added:
scores = {
45
Added:
existing_score.id => { value: 5 }
46
Added:
}
47
Added:
assert_nothing_raised do
48
Added:
TartifletteScoringService.update_scores(@tartiflette, scores, session)
49
Added:
end
50
Added:
51
Added:
existing_score.reload
52
Added:
assert_equal 5, existing_score.value
53
Added:
end
54
Added:
55
Added:
test "should raise error for invalid data" do
56
Added:
scores = {
57
Added:
"1" => { value: nil, id: nil },
58
Added:
"2" => { value: 5, id: nil }
59
Added:
}
60
Added:
61
Added:
assert_raises(StandardError, /Failed to process scores/) do
62
Added:
TartifletteScoringService.process_scores(@tartiflette, scores, @session)
63
Added:
end
64
Added:
end
65
Added:
66
Added:
test "should mark tartiflette as scored in session" do
67
Added:
session = { scored_tartiflettes: [] }
68
Added:
TartifletteScoringService.mark_as_scored(@tartiflette, session)
69
Added:
assert_includes session[:scored_tartiflettes], @tartiflette.id
70
Added:
end
71
Added:
72
Added:
test "should calculate average of all scores for a tartiflette" do
73
Added:
Score.create!(
74
Added:
tartiflette: @tartiflette,
75
Added:
scoring_criterium: scoring_criteria(:one),
76
Added:
value: 1,
77
Added:
session_id: SecureRandom.uuid
78
Added:
)
79
Added:
80
Added:
Score.create!(
81
Added:
tartiflette: @tartiflette,
82
Added:
scoring_criterium: scoring_criteria(:two),
83
Added:
value: 4,
84
Added:
session_id: SecureRandom.uuid
85
Added:
)
86
Added:
average_score = TartifletteScoringService.average_score(@tartiflette)
87
Added:
assert_equal 2, average_score, "The average score should be 2"
88
Added:
end
89
Added:
90
Added:
test "should calculate average score by category for a tartiflette" do
91
Added:
session = { id: SecureRandom.uuid }
92
Added:
Score.create!(
93
Added:
tartiflette: @tartiflette,
94
Added:
scoring_criterium: scoring_criteria(:four),
95
Added:
value: 4,
96
Added:
session_id: session[:id]
97
Added:
)
98
Added:
Score.create!(
99
Added:
tartiflette: @tartiflette,
100
Added:
scoring_criterium: scoring_criteria(:five),
101
Added:
value: 5,
102
Added:
session_id: session[:id]
103
Added:
)
104
Added:
averages = TartifletteScoringService.average_score_by_category(@tartiflette)
105
Added:
assert_equal 4.5, averages[scoring_criteria(:four).category]
106
Added:
end
107
Added:
end