Skip to content

Commit 4cf668b

Browse files
committed
test: enhance feedback chip tests
1 parent d867d65 commit 4cf668b

File tree

5 files changed

+155
-45
lines changed

5 files changed

+155
-45
lines changed

app/api/feedback/feedback_chip_api.rb

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,8 @@ class FeedbackChipApi < Grape::API
3030
unless authorise? current_user, User, :get_feedback_chips
3131
error!({ error: 'You are not authorised to view feedback chips globally.' }, 403)
3232
end
33-
learning_outcomes = LearningOutcome.global_outcomes
34-
feedback_chips = learning_outcomes.includes(:feedback_chips).map(&:feedback_chips).flatten
3533

36-
present feedback_chips, with: Feedback::Entities::FeedbackChipEntity
34+
present Feedback::FeedbackChip.global_chips, with: Feedback::Entities::FeedbackChipEntity
3735
end
3836

3937
desc 'Add a feedback chip to a learning outcome'
@@ -125,11 +123,12 @@ class FeedbackChipApi < Grape::API
125123
requires :id, type: Integer, desc: 'The ID of the feedback chip'
126124
end
127125
delete '/feedback_chips/:id' do
128-
unless authorise? current_user, User, :feedback_chips
126+
chip = FeedbackChip.find(params[:id])
127+
128+
unless authorise? current_user, chip, :delete_feedback_chips
129129
error!({ error: 'You are not authorised to delete feedback chips.' }, 403)
130130
end
131131

132-
chip = FeedbackChip.find(params[:id])
133132
chip.destroy
134133
nil
135134
end

app/models/feedback/feedback_chip.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@ class FeedbackChip < ApplicationRecord
3737

3838
def self.permissions
3939
convenor_role_permissions = [
40-
:update_chip
40+
:update_chip,
41+
:delete_feedback_chips
4142
]
4243

4344
admin_role_permissions = [
44-
:update_chip
45+
:update_chip,
46+
:delete_feedback_chips
4547
]
4648

4749
nil_role_permissions = []
@@ -64,6 +66,10 @@ def track_usage_by(tutor)
6466
analytics.save
6567
end
6668

69+
def self.global_chips
70+
Feedback::FeedbackChip.joins(:learning_outcome).where(learning_outcome: {context_type: nil, context_id: nil})
71+
end
72+
6773
def children
6874
FeedbackChip.where(parent_chip_id: self.id, learning_outcome_id: self.learning_outcome_id)
6975
end

test/api/feedback/feedback_chip_api_consolidated_test.rb

Lines changed: 127 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def test_auth_for_create_edit_unit_feedback_chips
4242
}
4343

4444
data_to_put = {
45-
chip_text: 'Updated text',
45+
chip_text: 'Updated text'
4646
}
4747

4848
learning_outcomes.each do |lo|
@@ -243,6 +243,79 @@ def test_auth_for_get_global_feedback_chips
243243
end
244244
end
245245

246+
def test_auth_for_delete_feedback_chips
247+
start_inside = DateTime.now - Doubtfire::Application.config.auditor_unit_access_years + 1.week
248+
end_inside = DateTime.now - 1.week
249+
250+
unit = FactoryBot.create(:unit, student_count: 1, start_date: start_inside, end_date: end_inside)
251+
admin = FactoryBot.create(:user, :admin)
252+
tutor = FactoryBot.create(:user, :tutor)
253+
auditor = FactoryBot.create(:user, :auditor)
254+
student = unit.students.first
255+
256+
257+
learning_outcomes = [
258+
{
259+
learning_outcome: unit.learning_outcomes.first,
260+
context: 'ULO'
261+
},
262+
{
263+
learning_outcome: unit.task_definitions.first.learning_outcomes.first,
264+
context: 'TLO'
265+
}
266+
]
267+
268+
unit.employ_staff(tutor, Role.tutor)
269+
270+
users_can = [
271+
unit.main_convenor_user,
272+
admin
273+
]
274+
users_cant = [
275+
tutor,
276+
auditor,
277+
FactoryBot.create(:user, :student),
278+
FactoryBot.create(:user, :tutor),
279+
FactoryBot.create(:user, :convenor),
280+
student.user
281+
]
282+
283+
assert_equal Role.auditor, unit.role_for(auditor)
284+
285+
users_can.each do |user|
286+
add_auth_header_for user: user
287+
learning_outcomes.each do |lo_data|
288+
lo = lo_data[:learning_outcome]
289+
context = lo_data[:context]
290+
291+
chip = FactoryBot.create(:feedback_template_chip, learning_outcome_id: lo.id)
292+
293+
chip_count = lo.feedback_chips.count
294+
295+
delete "api/feedback_chips/#{chip.id}"
296+
assert_equal 204, last_response.status, "User #{user.role.name} should be able to delete #{context} feedback chips"
297+
assert_equal chip_count - 1, lo.feedback_chips.count
298+
end
299+
end
300+
301+
users_cant.each do |user|
302+
add_auth_header_for user: user
303+
304+
learning_outcomes.each do |lo_data|
305+
lo = lo_data[:learning_outcome]
306+
context = lo_data[:context]
307+
308+
chip = FactoryBot.create(:feedback_template_chip, learning_outcome_id: lo.id)
309+
310+
chip_count = lo.feedback_chips.count
311+
312+
delete "api/feedback_chips/#{chip.id}"
313+
assert_equal 403, last_response.status, "User #{user.role.name} should not be able to delete #{context} feedback chips"
314+
assert_equal chip_count, lo.feedback_chips.count
315+
end
316+
end
317+
end
318+
246319
def test_create_feedback_group_chip
247320
learning_outcome = FactoryBot.create(:learning_outcome)
248321
data_to_post = {
@@ -323,7 +396,7 @@ def test_create_feedback_template_chip_with_parent
323396
end
324397

325398
def test_get_all_feedback_chips_for_a_context
326-
unit = Unit.first
399+
unit = FactoryBot.create(:unit, with_students: false, task_count: 0, outcome_count: 0)
327400
learning_outcome = FactoryBot.create(:learning_outcome, context_id: unit.id, context_type: 'Unit')
328401
learning_outcome2 = FactoryBot.create(:learning_outcome, context_id: unit.id, context_type: 'Unit')
329402
group_chip_lo1 = FactoryBot.create(:feedback_group_chip, learning_outcome_id: learning_outcome.id)
@@ -335,70 +408,98 @@ def test_get_all_feedback_chips_for_a_context
335408
add_auth_header_for user: User.first
336409
get "api/units/#{unit.id}/feedback_chips"
337410
assert_equal 200, last_response.status
411+
412+
assert_equal 6, last_response_body.count, last_response_body
413+
414+
chips = [learning_outcome.feedback_chips.pluck(:id), learning_outcome2.feedback_chips.pluck(:id)].flatten
415+
416+
last_response_body.each do |line|
417+
assert chips.include?(line['id']), "Found unknown chip #{line}"
418+
end
338419
end
339420

340421
def test_update_feedback_template_chip
341422
learning_outcome = FactoryBot.create(:learning_outcome)
342423
group_chip = FactoryBot.create(:feedback_group_chip, learning_outcome_id: learning_outcome.id)
343424
template_chip = FactoryBot.create(:feedback_template_chip, chip_text: 'chippy', description: 'blah blah', comment_text: 'your work is horrible', summary_text: 'just plain bad', task_status: TaskStatus.complete.name, learning_outcome_id: learning_outcome.id, parent_chip_id: group_chip.id)
344-
data_to_post = {
425+
data_to_put = {
345426
chip_text: 'updated chip',
346427
description: 'updated description'
347428
}
348429
add_auth_header_for user: User.first
349-
put_json "api/feedback_chips/#{template_chip.id}", data_to_post
430+
put_json "api/feedback_chips/#{template_chip.id}", data_to_put
350431
assert_equal 200, last_response.status
432+
433+
template_chip.reload
434+
assert_json_matches_model template_chip, last_response_body, %w[id chip_text description]
435+
assert_json_matches_model template_chip, data_to_put, %w[chip_text description]
351436
end
352437

353438
def test_update_feedback_group_chip
354439
learning_outcome = FactoryBot.create(:learning_outcome)
355440
group_chip = FactoryBot.create(:feedback_group_chip, learning_outcome_id: learning_outcome.id)
356-
data_to_post = {
441+
data_to_put = {
357442
chip_text: 'updated chip text',
358443
description: 'updated description'
359444
}
360445
add_auth_header_for user: User.first
361-
put_json "api/feedback_chips/#{group_chip.id}", data_to_post
446+
put_json "api/feedback_chips/#{group_chip.id}", data_to_put
362447
assert_equal 200, last_response.status
448+
449+
group_chip.reload
450+
assert_json_matches_model group_chip, last_response_body, %w[id chip_text description]
451+
assert_json_matches_model group_chip, data_to_put, %w[chip_text description]
363452
end
364453

365454
def test_delete_feedback_template_chip
366455
learning_outcome = FactoryBot.create(:learning_outcome)
367456
group_chip = FactoryBot.create(:feedback_group_chip, learning_outcome_id: learning_outcome.id)
368457
template_chip = FactoryBot.create(:feedback_template_chip, chip_text: 'chippy', description: 'blah blah', comment_text: 'your work is horrible', summary_text: 'just plain bad', task_status: TaskStatus.complete.name, learning_outcome_id: learning_outcome.id, parent_chip_id: group_chip.id)
369458
add_auth_header_for user: User.first
459+
460+
chip_count = learning_outcome.feedback_chips.count
461+
370462
delete "api/feedback_chips/#{template_chip.id}"
371463
assert_equal 204, last_response.status
464+
465+
assert_equal chip_count - 1, learning_outcome.feedback_chips.count
372466
end
373467

374468
def test_delete_feedback_group_chip
375469
learning_outcome = FactoryBot.create(:learning_outcome)
376470
group_chip = FactoryBot.create(:feedback_group_chip, learning_outcome_id: learning_outcome.id)
377471
add_auth_header_for user: User.first
472+
473+
chip_count = learning_outcome.feedback_chips.count
474+
378475
delete "api/feedback_chips/#{group_chip.id}"
379476
assert_equal 204, last_response.status
477+
478+
assert_equal chip_count - 1, learning_outcome.feedback_chips.count
380479
end
381480

382-
def test_change_chip_type_t_to_g
481+
def test_cannot_change_chip_type_t_to_g
383482
learning_outcome = FactoryBot.create(:learning_outcome)
384483
group_chip = FactoryBot.create(:feedback_group_chip, learning_outcome_id: learning_outcome.id)
385484
template_chip = FactoryBot.create(:feedback_template_chip, chip_text: 'chippy', description: 'blah blah', comment_text: 'your work is horrible', summary_text: 'just plain bad', task_status: TaskStatus.complete.name, learning_outcome_id: learning_outcome.id, parent_chip_id: group_chip.id)
386-
# puts template_chip.inspect
387-
data_to_post = {
485+
486+
data_to_put = {
388487
type: 'group',
389488
chip_text: 'Sample chip text',
390489
description: 'Sample description'
391490
}
392491
add_auth_header_for user: User.first
393-
put_json "api/feedback_chips/#{template_chip.id}", data_to_post
394-
# puts last_response.body
492+
put_json "api/feedback_chips/#{template_chip.id}", data_to_put
395493
assert_equal 200, last_response.status
494+
495+
template_chip.reload
496+
assert_equal 'Feedback::FeedbackTemplateChip', template_chip.type
396497
end
397498

398-
def test_change_chip_type_g_to_t
499+
def test_cannot_change_chip_type_g_to_t
399500
learning_outcome = FactoryBot.create(:learning_outcome)
400501
group_chip = FactoryBot.create(:feedback_group_chip, learning_outcome_id: learning_outcome.id)
401-
# puts group_chip.inspect
502+
402503
data_to_post = {
403504
type: 'template',
404505
chip_text: 'Sample chip text',
@@ -411,21 +512,11 @@ def test_change_chip_type_g_to_t
411512
}
412513
add_auth_header_for user: User.first
413514
put_json "api/feedback_chips/#{group_chip.id}", data_to_post
414-
# puts last_response.body
415-
assert_equal 200, last_response.status
416-
end
417515

418-
def test_update_without_type
419-
learning_outcome = FactoryBot.create(:learning_outcome)
420-
group_chip = FactoryBot.create(:feedback_group_chip, learning_outcome_id: learning_outcome.id)
421-
data_to_post = {
422-
chip_text: 'updated chip text',
423-
description: 'updated description'
424-
}
425-
add_auth_header_for user: User.first
426-
put_json "api/feedback_chips/#{group_chip.id}", data_to_post
427-
# puts last_response.body
428516
assert_equal 200, last_response.status
517+
518+
group_chip.reload
519+
assert_equal 'Feedback::FeedbackGroupChip', group_chip.type
429520
end
430521

431522
def test_get_global_context_chips
@@ -437,7 +528,16 @@ def test_get_global_context_chips
437528
feedback_template_chip2 = FactoryBot.create(:feedback_template_chip, learning_outcome_id: learning_outcome2.id, parent_chip_id: feedback_group_chip2.id)
438529
add_auth_header_for user: User.first
439530
get 'api/global/feedback_chips'
440-
# puts last_response.body
531+
532+
global_chips = Feedback::FeedbackChip.global_chips
533+
chip_count = global_chips.count
534+
441535
assert_equal 200, last_response.status
536+
assert_equal chip_count, last_response_body.count
537+
538+
ids = global_chips.pluck(:id)
539+
last_response_body.each do |line|
540+
assert ids.include?(line['id'])
541+
end
442542
end
443543
end

test/factories/units_factory.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
tutorial_stream { unit.tutorial_streams.sample }
1818

1919
transient do
20-
outcome_count { 2 }
20+
outcome_count { 2 }
2121
end
2222

2323
after(:create) do |td, eval|

test/helpers/json_helper.rb

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,26 +36,31 @@ def delete_json(endpoint)
3636
# - key data is either a hash that maps response to model keys, or a list of keys to match
3737
def assert_json_matches_model(model, response_json, keys_data)
3838
if keys_data.instance_of? Hash
39-
response_keys = keys_data.keys.map {|k| k.to_s }
39+
response_keys = keys_data.keys.map(&:to_s)
4040
keys = keys_data
4141
else
4242
response_keys = keys_data
43-
keys = keys_data.map { |i| [i, i] }.to_h
43+
keys = keys_data.to_h { |i| [i, i] }
4444
end
45-
response_keys.each { |k| assert response_json.key?(k), "Response missing key #{k} - #{response_json}" }
46-
response_keys.each { |k|
45+
response_keys.each do |k|
46+
assert response_json.key?(k) || response_json.key?(k.to_sym), "Response missing key #{k} - #{response_json}"
4747
mk = keys[k] || keys[k.to_sym]
48-
value = model.is_a?(Hash) ? (model[mk].nil? ? model[mk.to_sym] : model[mk]) : model.send(mk)
49-
if ! value.nil?
50-
assert_equal value, response_json[k], "Values for model key #{mk} does not match value of response key #{k} - #{response_json}"
48+
value = if model.is_a?(Hash)
49+
model[mk].nil? ? model[mk.to_sym] : model[mk]
50+
else
51+
model.send(mk)
52+
end
53+
model_value = response_json.key?(k) ? response_json[k] : response_json[k.to_sym]
54+
if value.present?
55+
assert_equal value, model_value, "Values for model key #{mk} does not match value of response key #{k} - #{response_json}"
5156
else
52-
assert_nil response_json[k], "Values for key #{k} is not nil - #{response_json}"
57+
assert_nil model_value, "Values for key #{k} is not nil - #{response_json}"
5358
end
54-
}
59+
end
5560
end
5661

5762
def assert_json_limit_keys_to(keys, response_json)
58-
response_json.keys.each do |k|
63+
response_json.each_key do |k|
5964
assert keys.include?(k), "Unexpected key in response: #{k} -- #{response_json.inspect}"
6065
end
6166
end

0 commit comments

Comments
 (0)