mumuki-laboratory 8.1.2 → 8.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -8
  3. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +2 -1
  4. data/app/assets/javascripts/mumuki_laboratory/application/button.js +2 -4
  5. data/app/assets/javascripts/mumuki_laboratory/application/codemirror-builder.js +1 -1
  6. data/app/assets/javascripts/mumuki_laboratory/application/codemirror.js +2 -2
  7. data/app/assets/javascripts/mumuki_laboratory/application/i18n.js +73 -0
  8. data/app/assets/javascripts/mumuki_laboratory/application/kids.js +22 -1
  9. data/app/assets/javascripts/mumuki_laboratory/application/kindergarten.js +6 -1
  10. data/app/assets/javascripts/mumuki_laboratory/application/primary.js +5 -3
  11. data/app/assets/javascripts/mumuki_laboratory/application/results-renderer.js +28 -1
  12. data/app/assets/javascripts/mumuki_laboratory/application/submission.js +72 -48
  13. data/app/assets/stylesheets/mumuki_laboratory/application.scss +1 -0
  14. data/app/assets/stylesheets/mumuki_laboratory/application/_codemirror-themes.scss +1 -0
  15. data/app/assets/stylesheets/mumuki_laboratory/application/codemirror-themes/_mu-light.scss +3 -0
  16. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_kids.scss +4 -0
  17. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_kids_results.scss +1 -0
  18. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_overlap.scss +0 -4
  19. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_terms.scss +4 -0
  20. data/app/controllers/chapters_controller.rb +9 -5
  21. data/app/controllers/guide_container_controller.rb +2 -7
  22. data/app/helpers/assignment_result_helper.rb +1 -1
  23. data/app/helpers/contextualization_result_helper.rb +0 -8
  24. data/app/helpers/discussions_helper.rb +12 -4
  25. data/app/helpers/editor_tabs_helper.rb +1 -1
  26. data/app/helpers/icons_helper.rb +1 -1
  27. data/app/helpers/links_helper.rb +1 -1
  28. data/app/helpers/menu_bar_helper.rb +9 -1
  29. data/app/helpers/overlapped_buttons_helper.rb +13 -5
  30. data/app/views/book/show.html.erb +2 -2
  31. data/app/views/book_discussions/index.html.erb +3 -1
  32. data/app/views/chapters/show.html.erb +21 -9
  33. data/app/views/complements/show.html.erb +1 -1
  34. data/app/views/discussions/_message.html.erb +2 -2
  35. data/app/views/discussions/index.html.erb +11 -4
  36. data/app/views/exams/show.html.erb +1 -1
  37. data/app/views/exercise_solutions/_kids_level_up.html.erb +1 -1
  38. data/app/views/exercises/_exercise_assignment.html.erb +1 -1
  39. data/app/views/exercises/_read_only.html.erb +1 -1
  40. data/app/views/exercises/show.html.erb +2 -2
  41. data/app/views/layouts/_discussions.html.erb +0 -4
  42. data/app/views/layouts/_guide.html.erb +9 -36
  43. data/app/views/layouts/_guide_container.html.erb +28 -0
  44. data/app/views/layouts/_guide_title_icons.html.erb +9 -0
  45. data/app/views/layouts/_kids.html.erb +4 -4
  46. data/app/views/layouts/_kindergarten.html.erb +5 -5
  47. data/app/views/layouts/_social_media.html.erb +4 -4
  48. data/app/views/layouts/_timer.html.erb +1 -1
  49. data/app/views/layouts/application.html.erb +16 -14
  50. data/app/views/layouts/exercise_inputs/editors/_code.html.erb +1 -6
  51. data/app/views/layouts/exercise_inputs/editors/_multiple_files.html.erb +4 -9
  52. data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +1 -1
  53. data/app/views/layouts/exercise_inputs/layouts/_input_kindergarten.html.erb +1 -1
  54. data/app/views/layouts/modals/_guide_corollary.html.erb +13 -3
  55. data/app/views/layouts/modals/_kids_results.html.erb +2 -2
  56. data/app/views/layouts/modals/_kindergarten_context.html.erb +3 -3
  57. data/app/views/layouts/modals/_kindergarten_results.html.erb +3 -3
  58. data/app/views/layouts/modals/_kindergarten_results_aborted.html.erb +2 -2
  59. data/app/views/layouts/modals/_level_up.html.erb +1 -1
  60. data/app/views/lessons/show.html.erb +1 -1
  61. data/app/views/users/_edit_user_form.html.erb +1 -1
  62. data/app/views/users/_term.html.erb +1 -1
  63. data/app/views/users/_user_form.html.erb +1 -1
  64. data/lib/mumuki/laboratory/controllers/results_rendering.rb +2 -1
  65. data/lib/mumuki/laboratory/engine.rb +1 -1
  66. data/lib/mumuki/laboratory/locales/en.yml +6 -9
  67. data/lib/mumuki/laboratory/locales/es-CL.yml +6 -4
  68. data/lib/mumuki/laboratory/locales/es.yml +9 -11
  69. data/lib/mumuki/laboratory/locales/pt.yml +6 -9
  70. data/lib/mumuki/laboratory/version.rb +1 -1
  71. data/spec/controllers/exercise_solutions_controller_spec.rb +3 -2
  72. data/spec/dummy/db/schema.rb +50 -1
  73. data/spec/dummy/public/character/animations.json +1 -0
  74. data/{public → spec/dummy/public}/character/kibi/context.svg +0 -0
  75. data/{public → spec/dummy/public}/character/kibi/failure.svg +0 -0
  76. data/{public → spec/dummy/public}/character/kibi/jump.svg +0 -0
  77. data/spec/dummy/public/character/kibi/passed_with_warnings.svg +4 -0
  78. data/{public → spec/dummy/public}/character/kibi/success2_l.svg +0 -0
  79. data/{public → spec/dummy/public}/character/kibi/success_l.svg +0 -0
  80. data/{public → spec/dummy/public}/character/magnifying_glass/apparition.svg +0 -0
  81. data/{public → spec/dummy/public}/character/magnifying_glass/loop.svg +0 -0
  82. data/spec/features/chapters_flow_spec.rb +112 -0
  83. data/spec/features/login_flow_spec.rb +1 -1
  84. data/spec/features/terms_flow_spec.rb +2 -0
  85. data/spec/features/topic_flow_spec.rb +0 -1
  86. data/spec/helpers/icons_helper_spec.rb +3 -3
  87. data/spec/helpers/test_results_rendering_spec.rb +8 -8
  88. data/spec/helpers/with_navigation_spec.rb +14 -14
  89. data/spec/javascripts/gamification-spec.js +2 -2
  90. data/spec/javascripts/i18n-spec.js +79 -0
  91. data/spec/javascripts/kids-button-spec.js +36 -0
  92. metadata +140 -117
  93. data/spec/dummy/config/database.travis.yml +0 -4
  94. data/spec/features/chapter_spec.rb +0 -70
@@ -42,7 +42,7 @@ feature 'Login Flow', organization_workspace: :test do
42
42
 
43
43
  expect(page).to_not have_text('Sign in')
44
44
  expect(page).to have_text('Sign Out')
45
- expect(page).to have_text('awesomeRubyGuide')
45
+ expect(page).to have_text('C1')
46
46
  end
47
47
 
48
48
  scenario 'can logout', :element_not_interactable_error do
@@ -102,6 +102,7 @@ feature 'Terms Flow', organization_workspace: :test do
102
102
  visit '/discussions'
103
103
  expect(page).to have_text('Accept terms')
104
104
 
105
+ check :user_terms_of_service
105
106
  click_on 'Accept'
106
107
  expect(page).to have_text('Discussions')
107
108
  end
@@ -111,6 +112,7 @@ feature 'Terms Flow', organization_workspace: :test do
111
112
  visit '/'
112
113
  expect(page).to have_text('Accept terms')
113
114
 
115
+ check :user_terms_of_service
114
116
  click_on 'Accept'
115
117
  expect(page).to have_text(test_organization.book.name)
116
118
  end
@@ -15,7 +15,6 @@ feature 'Topic Flow', organization_workspace: :test do
15
15
  visit "/topics/#{topic_in_path.transparent_id}"
16
16
 
17
17
  expect(page).to have_text('Functional Programming')
18
- expect(page).to have_text('Lessons')
19
18
  end
20
19
 
21
20
  scenario 'visit topic in path not transparently' do
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe IconsHelper, organization_workspace: :test do
4
4
  helper IconsHelper
5
- helper FontAwesome::Rails::IconHelper
5
+ helper FontAwesome5::Rails::IconHelper
6
6
 
7
7
  describe '#language_icon' do
8
8
  let(:haskell) { create(:language, name: 'Haskell') }
@@ -16,7 +16,7 @@ describe IconsHelper, organization_workspace: :test do
16
16
  }
17
17
  let(:failed_submission) { create(:assignment, status: :failed) }
18
18
 
19
- it { expect(status_icon(passed_submission)).to eq '<i class="fa fa-check-circle text-success status-icon"></i>' }
20
- it { expect(status_icon(failed_submission)).to eq '<i class="fa fa-times-circle text-danger status-icon"></i>' }
19
+ it { expect(status_icon(passed_submission)).to eq '<i class="fas fa-check-circle text-success status-icon"></i>' }
20
+ it { expect(status_icon(failed_submission)).to eq '<i class="fas fa-times-circle text-danger status-icon"></i>' }
21
21
  end
22
22
  end
@@ -3,7 +3,7 @@ require 'ostruct'
3
3
 
4
4
  describe ContextualizationResultHelper do
5
5
  helper IconsHelper
6
- helper FontAwesome::Rails::IconHelper
6
+ helper FontAwesome5::Rails::IconHelper
7
7
  helper ContextualizationResultHelper
8
8
 
9
9
 
@@ -13,13 +13,13 @@ describe ContextualizationResultHelper do
13
13
  context 'plain explanation' do
14
14
  let(:expectation_result) { {result: :failed, explanation: 'you must delegate'} }
15
15
 
16
- it { expect(html).to eq '<i class="fa fa-times-circle text-danger status-icon"></i> you must delegate' }
16
+ it { expect(html).to eq '<i class="fas fa-times-circle text-danger status-icon"></i> you must delegate' }
17
17
  end
18
18
 
19
19
  context 'html explanation' do
20
20
  let(:expectation_result) { {result: :failed, explanation: 'you must use <strong>if</strong>'} }
21
21
 
22
- it { expect(html).to eq '<i class="fa fa-times-circle text-danger status-icon"></i> you must use <strong>if</strong>' }
22
+ it { expect(html).to eq '<i class="fas fa-times-circle text-danger status-icon"></i> you must use <strong>if</strong>' }
23
23
  end
24
24
  end
25
25
 
@@ -35,7 +35,7 @@ describe ContextualizationResultHelper do
35
35
  test_results: [{title: '2 is 2', status: :passed, result: ''}]) }
36
36
 
37
37
  it { expect(html).to be_html_safe }
38
- it { expect(html).to include "<i class=\"fa fa-check-circle text-success status-icon\"></i>" }
38
+ it { expect(html).to include "<i class=\"fas fa-check-circle text-success status-icon\"></i>" }
39
39
  it { expect(html).to include "2 is 2" }
40
40
  end
41
41
 
@@ -47,7 +47,7 @@ describe ContextualizationResultHelper do
47
47
  exercise: problem,
48
48
  test_results: [{title: '2 is 2', status: :failed, result: 'something _went_ wrong'}]) }
49
49
 
50
- it { expect(html).to include "<i class=\"fa fa-times-circle text-danger status-icon\"></i>" }
50
+ it { expect(html).to include "<i class=\"fas fa-times-circle text-danger status-icon\"></i>" }
51
51
  it { expect(html).to include "2 is 2" }
52
52
  it { expect(html).to include "<pre>something _went_ wrong</pre>" }
53
53
  end
@@ -59,7 +59,7 @@ describe ContextualizationResultHelper do
59
59
  exercise: problem,
60
60
  test_results: [{title: '2 is 2', status: :failed, result: 'something went _really_ wrong'}]) }
61
61
 
62
- it { expect(html).to include "<i class=\"fa fa-times-circle text-danger status-icon\"></i>" }
62
+ it { expect(html).to include "<i class=\"fas fa-times-circle text-danger status-icon\"></i>" }
63
63
  it { expect(html).to include "2 is 2" }
64
64
  it { expect(html).to include "<p>something went <em>really</em> wrong</p>" }
65
65
  end
@@ -72,7 +72,7 @@ describe ContextualizationResultHelper do
72
72
  test_results: [{title: 'foo is 2', status: :failed, result: 'foo is undefined', summary: {type: 'undefined_variable', message: 'you are using things that are _not defined_'}}]) }
73
73
 
74
74
  it { expect(html).to include 'foo is 2: you are using things that are <em>not defined</em>' }
75
- it { expect(html).to include "<i class=\"fa fa-times-circle text-danger status-icon\"></i>" }
75
+ it { expect(html).to include "<i class=\"fas fa-times-circle text-danger status-icon\"></i>" }
76
76
  it { expect(html).to include '<p>foo is undefined</p>' }
77
77
  end
78
78
 
@@ -84,7 +84,7 @@ describe ContextualizationResultHelper do
84
84
  test_results: [{title: '', status: :failed, result: 'foo is undefined', summary: {type: 'undefined_variable', message: 'you are using things that are _not defined_'}}]) }
85
85
 
86
86
  it { expect(html).to include 'you are using things that are <em>not defined</em>' }
87
- it { expect(html).to include "<i class=\"fa fa-times-circle text-danger status-icon\"></i>" }
87
+ it { expect(html).to include "<i class=\"fas fa-times-circle text-danger status-icon\"></i>" }
88
88
  it { expect(html).to include '<p>foo is undefined</p>' }
89
89
  end
90
90
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe WithStudentPathNavigation, organization_workspace: :test do
4
4
  helper WithStudentPathNavigation
5
- helper FontAwesome::Rails::IconHelper
5
+ helper FontAwesome5::Rails::IconHelper
6
6
 
7
7
  describe '#next_button' do
8
8
  let(:current_user) { create(:user) }
@@ -14,9 +14,9 @@ describe WithStudentPathNavigation, organization_workspace: :test do
14
14
  let!(:exercise_3) { create(:exercise, id: 13, name: 'exercise 3', guide: guide) }
15
15
 
16
16
  context 'when user did not submit any solution' do
17
- it { expect(next_button(exercise_1)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\">Next: exercise 2 <i class=\"fa fa-chevron-right\"></i></a>" }
18
- it { expect(next_button(exercise_2)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_3.friendly_name}\">Next: exercise 3 <i class=\"fa fa-chevron-right\"></i></a>" }
19
- it { expect(next_button(exercise_3)).to eq "<a class=\"btn btn-warning btn-block\" role=\"button\" href=\"/exercises/#{exercise_1.friendly_name}\">Next pending: exercise 1 <i class=\"fa fa-chevron-right\"></i></a>" }
17
+ it { expect(next_button(exercise_1)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\"><span class=\"fa5-text-r\">Next: exercise 2</span><i class=\"fas fa-chevron-right\"></i></a>" }
18
+ it { expect(next_button(exercise_2)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_3.friendly_name}\"><span class=\"fa5-text-r\">Next: exercise 3</span><i class=\"fas fa-chevron-right\"></i></a>" }
19
+ it { expect(next_button(exercise_3)).to eq "<a class=\"btn btn-warning btn-block\" role=\"button\" href=\"/exercises/#{exercise_1.friendly_name}\"><span class=\"fa5-text-r\">Next pending: exercise 1</span><i class=\"fas fa-chevron-right\"></i></a>" }
20
20
  end
21
21
 
22
22
  context 'when on last unresolved exercise' do
@@ -25,9 +25,9 @@ describe WithStudentPathNavigation, organization_workspace: :test do
25
25
  exercise_3.submit_solution!(current_user).passed!
26
26
  end
27
27
 
28
- it { expect(next_button(exercise_1)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\">Next: exercise 2 <i class=\"fa fa-chevron-right\"></i></a>" }
28
+ it { expect(next_button(exercise_1)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\"><span class=\"fa5-text-r\">Next: exercise 2</span><i class=\"fas fa-chevron-right\"></i></a>" }
29
29
  it { expect(next_button(exercise_2)).to be nil }
30
- it { expect(next_button(exercise_3)).to eq "<a class=\"btn btn-warning btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\">Next pending: exercise 2 <i class=\"fa fa-chevron-right\"></i></a>" }
30
+ it { expect(next_button(exercise_3)).to eq "<a class=\"btn btn-warning btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\"><span class=\"fa5-text-r\">Next pending: exercise 2</span><i class=\"fas fa-chevron-right\"></i></a>" }
31
31
  end
32
32
 
33
33
  context 'when user did submit a solution' do
@@ -35,9 +35,9 @@ describe WithStudentPathNavigation, organization_workspace: :test do
35
35
  exercise_1.submit_solution!(current_user).passed!
36
36
  end
37
37
 
38
- it { expect(next_button(exercise_1)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\">Next: exercise 2 <i class=\"fa fa-chevron-right\"></i></a>" }
39
- it { expect(next_button(exercise_2)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_3.friendly_name}\">Next: exercise 3 <i class=\"fa fa-chevron-right\"></i></a>" }
40
- it { expect(next_button(exercise_3)).to eq "<a class=\"btn btn-warning btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\">Next pending: exercise 2 <i class=\"fa fa-chevron-right\"></i></a>" }
38
+ it { expect(next_button(exercise_1)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\"><span class=\"fa5-text-r\">Next: exercise 2</span><i class=\"fas fa-chevron-right\"></i></a>" }
39
+ it { expect(next_button(exercise_2)).to eq "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/exercises/#{exercise_3.friendly_name}\"><span class=\"fa5-text-r\">Next: exercise 3</span><i class=\"fas fa-chevron-right\"></i></a>" }
40
+ it { expect(next_button(exercise_3)).to eq "<a class=\"btn btn-warning btn-block\" role=\"button\" href=\"/exercises/#{exercise_2.friendly_name}\"><span class=\"fa5-text-r\">Next pending: exercise 2</span><i class=\"fas fa-chevron-right\"></i></a>" }
41
41
  end
42
42
  end
43
43
 
@@ -46,8 +46,8 @@ describe WithStudentPathNavigation, organization_workspace: :test do
46
46
  let!(:exercise) { create(:exercise, id: 12, name: 'exercise 2', guide: guide) }
47
47
 
48
48
  context 'when user did not submit any exercise' do
49
- it { expect(next_button(reading)).to eq "<a class=\"btn-confirmation btn btn-success btn-block\" data-confirmation-url=\"/exercises/#{reading.friendly_name}/confirmations\" role=\"button\" href=\"/exercises/#{exercise.friendly_name}\">Next: exercise 2 <i class=\"fa fa-chevron-right\"></i></a>" }
50
- it { expect(next_button(exercise)).to eq "<a class=\"btn btn-warning btn-block\" role=\"button\" href=\"/exercises/#{reading.friendly_name}\">Next pending: exercise 1 <i class=\"fa fa-chevron-right\"></i></a>" }
49
+ it { expect(next_button(reading)).to eq "<a class=\"btn-confirmation btn btn-success btn-block\" data-confirmation-url=\"/exercises/#{reading.friendly_name}/confirmations\" role=\"button\" href=\"/exercises/#{exercise.friendly_name}\"><span class=\"fa5-text-r\">Next: exercise 2</span><i class=\"fas fa-chevron-right\"></i></a>" }
50
+ it { expect(next_button(exercise)).to eq "<a class=\"btn btn-warning btn-block\" role=\"button\" href=\"/exercises/#{reading.friendly_name}\"><span class=\"fa5-text-r\">Next pending: exercise 1</span><i class=\"fas fa-chevron-right\"></i></a>" }
51
51
  end
52
52
 
53
53
  context 'when user finished just reading' do
@@ -55,7 +55,7 @@ describe WithStudentPathNavigation, organization_workspace: :test do
55
55
  reading.submit_confirmation!(current_user)
56
56
  end
57
57
 
58
- it { expect(next_button(reading)).to eq "<a class=\"btn-confirmation btn btn-success btn-block\" data-confirmation-url=\"/exercises/#{reading.friendly_name}/confirmations\" role=\"button\" href=\"/exercises/#{exercise.friendly_name}\">Next: exercise 2 <i class=\"fa fa-chevron-right\"></i></a>" }
58
+ it { expect(next_button(reading)).to eq "<a class=\"btn-confirmation btn btn-success btn-block\" data-confirmation-url=\"/exercises/#{reading.friendly_name}/confirmations\" role=\"button\" href=\"/exercises/#{exercise.friendly_name}\"><span class=\"fa5-text-r\">Next: exercise 2</span><i class=\"fas fa-chevron-right\"></i></a>" }
59
59
  it { expect(next_button(exercise)).to eq nil }
60
60
  end
61
61
  end
@@ -83,12 +83,12 @@ describe WithStudentPathNavigation, organization_workspace: :test do
83
83
  let(:lessons) { [lesson_1, lesson_2, lesson_3] }
84
84
 
85
85
  context 'one suggestion' do
86
- it { expect(next_button(lesson_2)).to include "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/lessons/#{lesson_3.friendly_name}\">Next: #{lesson_3.name} <i class=\"fa fa-chevron-right\"></i></a>" }
86
+ it { expect(next_button(lesson_2)).to include "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/lessons/#{lesson_3.friendly_name}\"><span class=\"fa5-text-r\">Next: #{lesson_3.name}</span><i class=\"fas fa-chevron-right\"></i></a>" }
87
87
  it { expect(next_button(lesson_1)).to be_html_safe }
88
88
  end
89
89
 
90
90
  context 'many suggestions' do
91
- it { expect(next_button(lesson_1)).to include "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/lessons/#{lesson_2.friendly_name}\">Next: #{lesson_2.name} <i class=\"fa fa-chevron-right\"></i></a>" }
91
+ it { expect(next_button(lesson_1)).to include "<a class=\"btn btn-success btn-block\" role=\"button\" href=\"/lessons/#{lesson_2.friendly_name}\"><span class=\"fa5-text-r\">Next: #{lesson_2.name}</span><i class=\"fas fa-chevron-right\"></i></a>" }
92
92
  it { expect(next_button(lesson_1)).to be_html_safe }
93
93
  end
94
94
  end
@@ -33,11 +33,11 @@ describe('gamification', () => {
33
33
 
34
34
  describe('triggers level change', () => {
35
35
  it('does not trigger when small exp difference', () => {
36
- expect(new mumuki.gamification.LevelProgression(1000).triggersLevelChange(1050)).toBe(false);
36
+ expect(new mumuki.gamification.LevelProgression(1000).triggersLevelChange(50)).toBe(false);
37
37
  });
38
38
 
39
39
  it('does trigger when big exp difference', () => {
40
- expect(new mumuki.gamification.LevelProgression(1000).triggersLevelChange(1500)).toBe(true);
40
+ expect(new mumuki.gamification.LevelProgression(1000).triggersLevelChange(500)).toBe(true);
41
41
  });
42
42
  });
43
43
 
@@ -0,0 +1,79 @@
1
+ describe('I18n', () => {
2
+
3
+ describe('t / translate', () => {
4
+
5
+ it('accept english translations', () => {
6
+ mumuki.locale = 'en';
7
+ expect(mumuki.I18n.translate('passed')).toBe('Everything is in order! Your solution passed all our tests!');
8
+ })
9
+ it('accept spanish translations', () => {
10
+ mumuki.locale = 'es';
11
+ expect(mumuki.I18n.translate('passed_with_warnings')).toBe('Tu solución funcionó, pero hay cosas que mejorar');
12
+ })
13
+ it('accept chilean translations', () => {
14
+ mumuki.locale = 'es-CL';
15
+ expect(mumuki.I18n.translate('failed')).toBe('Tu solución no pasó las pruebas');
16
+ })
17
+ it('accept portuguese translations', () => {
18
+ mumuki.locale = 'pt';
19
+ expect(mumuki.I18n.translate('errored')).toBe('Opa! Sua solução não pode ser executada');
20
+ })
21
+ it('fails when translation missing', () => {
22
+ mumuki.locale = 'en';
23
+ expect(mumuki.I18n.translate('foo')).toBe('Translation missing: en, `foo`');
24
+ })
25
+
26
+ })
27
+
28
+ describe('register', () => {
29
+ beforeEach(() => {
30
+ mumuki.locale = 'en';
31
+ mumuki.I18n.register({
32
+ en: {
33
+ greet: (data) => `Hi ${data.name}`,
34
+ errored: "D'Oh!"
35
+ }
36
+ })
37
+ })
38
+ it('overrides existing translation key', () => {
39
+ expect(mumuki.I18n.translate('errored')).toBe("D'Oh!");
40
+ })
41
+ it('add missing translation key', () => {
42
+ expect(mumuki.I18n.translate('greet', {name: 'Jane'})).toBe('Hi Jane');
43
+ })
44
+ it('keep non overriding translation key', () => {
45
+ expect(mumuki.I18n.translate('passed')).toBe('Everything is in order! Your solution passed all our tests!');
46
+ })
47
+ })
48
+
49
+ describe('with some prefix', () => {
50
+
51
+ fixture.set(`
52
+ <div class="mu-kindergarten" data-i18n-prefix="testing">
53
+ <button class="mu-kids-button">Click me<button>
54
+ <div class="mu-kids-overlay" style="display: none"></div>
55
+ </div>
56
+ `);
57
+
58
+ beforeEach(() => {
59
+ mumuki.locale = 'en';
60
+ mumuki.I18n.register({
61
+ en: {
62
+ testing_failed: 'Ops! Execution failed',
63
+ }
64
+ })
65
+ });
66
+
67
+ it('Using prefix with existing translation key', () => {
68
+ expect(mumuki.I18n.t('passed')).toBe('Everything is in order! Your solution passed all our tests!');
69
+ });
70
+ it('Use prefix with none existing translation key but default key exists', () => {
71
+ expect(mumuki.I18n.t('failed')).toBe('Ops! Execution failed');
72
+ });
73
+ it('No key found', () => {
74
+ expect(mumuki.I18n.t('foo')).toBe('Translation missing: en, `foo`');
75
+ })
76
+
77
+ });
78
+
79
+ });
@@ -0,0 +1,36 @@
1
+ describe('KidsButton', () => {
2
+
3
+ let button;
4
+
5
+ fixture.set(`
6
+ <div class="mu-kindergarten">
7
+ <button class="mu-kids-button">Click me<button>
8
+ <div class="mu-kids-overlay" style="display: none"></div>
9
+ </div>
10
+ `);
11
+
12
+ beforeEach(() => {
13
+ mumuki.kids = new mumuki.Kids();
14
+ button = new mumuki.submission.KidsSubmitButton($('.mu-kids-button'));
15
+ })
16
+
17
+ it('can create button', () => {
18
+ expect(button).not.toBe(null);
19
+ })
20
+
21
+ it('overlay is hidden by default', () => {
22
+ expect(mumuki.kids.$overlay.css('display')).toBe('none');
23
+ })
24
+
25
+ it('call showOverlay on wait', () => {
26
+ button.wait();
27
+ expect(mumuki.kids.$overlay.css('display')).toBe('block');
28
+ })
29
+
30
+ it('call hideOverlay on continue', () => {
31
+ button.wait();
32
+ button.continue();
33
+ expect(mumuki.kids.$overlay.css('display')).toBe('none');
34
+ })
35
+
36
+ })
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mumuki-laboratory
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.1.2
4
+ version: 8.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-14 00:00:00.000000000 Z
11
+ date: 2021-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 8.1.0
33
+ version: 8.4.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 8.1.0
40
+ version: 8.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mumukit-bridge
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.24'
117
+ version: '2.0'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.24'
124
+ version: '2.0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: muvment
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -193,19 +193,19 @@ dependencies:
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  - !ruby/object:Gem::Dependency
196
- name: font-awesome-rails
196
+ name: font_awesome5_rails
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: '4.7'
201
+ version: '1.3'
202
202
  type: :runtime
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - "~>"
207
207
  - !ruby/object:Gem::Version
208
- version: '4.7'
208
+ version: '1.3'
209
209
  - !ruby/object:Gem::Dependency
210
210
  name: momentjs-rails
211
211
  requirement: !ruby/object:Gem::Requirement
@@ -311,6 +311,9 @@ dependencies:
311
311
  - - "~>"
312
312
  - !ruby/object:Gem::Version
313
313
  version: '2.0'
314
+ - - "<"
315
+ - !ruby/object:Gem::Version
316
+ version: '2.2'
314
317
  type: :development
315
318
  prerelease: false
316
319
  version_requirements: !ruby/object:Gem::Requirement
@@ -318,6 +321,9 @@ dependencies:
318
321
  - - "~>"
319
322
  - !ruby/object:Gem::Version
320
323
  version: '2.0'
324
+ - - "<"
325
+ - !ruby/object:Gem::Version
326
+ version: '2.2'
321
327
  - !ruby/object:Gem::Dependency
322
328
  name: webdrivers
323
329
  requirement: !ruby/object:Gem::Requirement
@@ -364,6 +370,7 @@ files:
364
370
  - app/assets/javascripts/mumuki_laboratory/application/exercise.js
365
371
  - app/assets/javascripts/mumuki_laboratory/application/free-form.js
366
372
  - app/assets/javascripts/mumuki_laboratory/application/gamification.js
373
+ - app/assets/javascripts/mumuki_laboratory/application/i18n.js
367
374
  - app/assets/javascripts/mumuki_laboratory/application/inputs.js
368
375
  - app/assets/javascripts/mumuki_laboratory/application/interval.js
369
376
  - app/assets/javascripts/mumuki_laboratory/application/kids.js
@@ -392,6 +399,7 @@ files:
392
399
  - app/assets/javascripts/mumuki_laboratory/application/user.js
393
400
  - app/assets/stylesheets/mumuki_laboratory/application.scss
394
401
  - app/assets/stylesheets/mumuki_laboratory/application/_alerts.scss
402
+ - app/assets/stylesheets/mumuki_laboratory/application/_codemirror-themes.scss
395
403
  - app/assets/stylesheets/mumuki_laboratory/application/_errors.scss
396
404
  - app/assets/stylesheets/mumuki_laboratory/application/_fonts.scss
397
405
  - app/assets/stylesheets/mumuki_laboratory/application/_invitations.scss
@@ -401,6 +409,7 @@ files:
401
409
  - app/assets/stylesheets/mumuki_laboratory/application/_modules.scss
402
410
  - app/assets/stylesheets/mumuki_laboratory/application/_tooltip.scss
403
411
  - app/assets/stylesheets/mumuki_laboratory/application/_vendor.scss
412
+ - app/assets/stylesheets/mumuki_laboratory/application/codemirror-themes/_mu-light.scss
404
413
  - app/assets/stylesheets/mumuki_laboratory/application/hovers.scss
405
414
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_avatar.scss
406
415
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_book_header.scss
@@ -552,6 +561,8 @@ files:
552
561
  - app/views/layouts/_error.html.erb
553
562
  - app/views/layouts/_exercise_skipped.html.erb
554
563
  - app/views/layouts/_guide.html.erb
564
+ - app/views/layouts/_guide_container.html.erb
565
+ - app/views/layouts/_guide_title_icons.html.erb
555
566
  - app/views/layouts/_kids.html.erb
556
567
  - app/views/layouts/_kindergarten.html.erb
557
568
  - app/views/layouts/_main.html.erb
@@ -664,13 +675,6 @@ files:
664
675
  - lib/tasks/messages.rake
665
676
  - lib/tasks/users.rake
666
677
  - public/422.html
667
- - public/character/kibi/context.svg
668
- - public/character/kibi/failure.svg
669
- - public/character/kibi/jump.svg
670
- - public/character/kibi/success2_l.svg
671
- - public/character/kibi/success_l.svg
672
- - public/character/magnifying_glass/apparition.svg
673
- - public/character/magnifying_glass/loop.svg
674
678
  - public/compass_rose.svg
675
679
  - public/email-banner.png
676
680
  - public/favicon.ico
@@ -704,7 +708,6 @@ files:
704
708
  - spec/dummy/config/application.rb
705
709
  - spec/dummy/config/boot.rb
706
710
  - spec/dummy/config/cable.yml
707
- - spec/dummy/config/database.travis.yml
708
711
  - spec/dummy/config/database.yml
709
712
  - spec/dummy/config/environment.rb
710
713
  - spec/dummy/config/environments/development.rb
@@ -723,6 +726,14 @@ files:
723
726
  - spec/dummy/db/seeds.rb
724
727
  - spec/dummy/package.json
725
728
  - spec/dummy/public/character/animations.json
729
+ - spec/dummy/public/character/kibi/context.svg
730
+ - spec/dummy/public/character/kibi/failure.svg
731
+ - spec/dummy/public/character/kibi/jump.svg
732
+ - spec/dummy/public/character/kibi/passed_with_warnings.svg
733
+ - spec/dummy/public/character/kibi/success2_l.svg
734
+ - spec/dummy/public/character/kibi/success_l.svg
735
+ - spec/dummy/public/character/magnifying_glass/apparition.svg
736
+ - spec/dummy/public/character/magnifying_glass/loop.svg
726
737
  - spec/dummy/public/error/401.svg
727
738
  - spec/dummy/public/error/403.svg
728
739
  - spec/dummy/public/error/404.svg
@@ -733,7 +744,7 @@ files:
733
744
  - spec/dummy/public/error/timeout_3.svg
734
745
  - spec/dummy/public/medal/outline.svg
735
746
  - spec/evaluation_helper.rb
736
- - spec/features/chapter_spec.rb
747
+ - spec/features/chapters_flow_spec.rb
737
748
  - spec/features/complements_flow_spec.rb
738
749
  - spec/features/disable_user_flow_spec.rb
739
750
  - spec/features/disabled_organization_flow_spec.rb
@@ -778,6 +789,8 @@ files:
778
789
  - spec/javascripts/exercise-spec.js
779
790
  - spec/javascripts/gamification-spec.js
780
791
  - spec/javascripts/global-spec.js
792
+ - spec/javascripts/i18n-spec.js
793
+ - spec/javascripts/kids-button-spec.js
781
794
  - spec/javascripts/results-renderers-spec.js
782
795
  - spec/javascripts/spec-helper.js
783
796
  - spec/javascripts/speech-bubble-renderer-spec.js
@@ -849,121 +862,131 @@ required_rubygems_version: !ruby/object:Gem::Requirement
849
862
  - !ruby/object:Gem::Version
850
863
  version: '0'
851
864
  requirements: []
852
- rubygems_version: 3.0.3
865
+ rubyforge_project:
866
+ rubygems_version: 2.7.6
853
867
  signing_key:
854
868
  specification_version: 4
855
869
  summary: Code assement web application for the Mumuki Platform.
856
870
  test_files:
857
- - spec/controllers/guide_progress_controller_spec.rb
871
+ - spec/mailers/user_mailer_spec.rb
872
+ - spec/mailers/previews/user_mailer_preview.rb
873
+ - spec/api_helper.rb
874
+ - spec/dummy/config/boot.rb
875
+ - spec/dummy/config/secrets.yml
876
+ - spec/dummy/config/puma.rb
877
+ - spec/dummy/config/initializers/wrap_parameters.rb
878
+ - spec/dummy/config/initializers/cookies_serializer.rb
879
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
880
+ - spec/dummy/config/initializers/assets.rb
881
+ - spec/dummy/config/application.rb
882
+ - spec/dummy/config/environment.rb
883
+ - spec/dummy/config/locales/en.yml
884
+ - spec/dummy/config/spring.rb
885
+ - spec/dummy/config/rabbit.yml
886
+ - spec/dummy/config/environments/test.rb
887
+ - spec/dummy/config/environments/development.rb
888
+ - spec/dummy/config/cable.yml
889
+ - spec/dummy/config/routes.rb
890
+ - spec/dummy/config/database.yml
891
+ - spec/dummy/db/seeds.rb
892
+ - spec/dummy/db/schema.rb
893
+ - spec/dummy/Rakefile
894
+ - spec/dummy/bin/rake
895
+ - spec/dummy/bin/rails
896
+ - spec/dummy/bin/yarn
897
+ - spec/dummy/bin/bundle
898
+ - spec/dummy/bin/update
899
+ - spec/dummy/bin/setup
900
+ - spec/dummy/public/character/magnifying_glass/apparition.svg
901
+ - spec/dummy/public/character/magnifying_glass/loop.svg
902
+ - spec/dummy/public/character/kibi/success2_l.svg
903
+ - spec/dummy/public/character/kibi/context.svg
904
+ - spec/dummy/public/character/kibi/success_l.svg
905
+ - spec/dummy/public/character/kibi/failure.svg
906
+ - spec/dummy/public/character/kibi/jump.svg
907
+ - spec/dummy/public/character/kibi/passed_with_warnings.svg
908
+ - spec/dummy/public/character/animations.json
909
+ - spec/dummy/public/medal/outline.svg
910
+ - spec/dummy/public/error/timeout_3.svg
911
+ - spec/dummy/public/error/timeout_1.svg
912
+ - spec/dummy/public/error/403.svg
913
+ - spec/dummy/public/error/410.svg
914
+ - spec/dummy/public/error/timeout_2.svg
915
+ - spec/dummy/public/error/404.svg
916
+ - spec/dummy/public/error/401.svg
917
+ - spec/dummy/public/error/500.svg
918
+ - spec/dummy/config.ru
919
+ - spec/dummy/package.json
920
+ - spec/capybara_helper.rb
858
921
  - spec/controllers/discussions_controller_spec.rb
922
+ - spec/controllers/courses_api_controller_spec.rb
859
923
  - spec/controllers/organizations_api_controller_spec.rb
924
+ - spec/controllers/discussions_messages_controller_spec.rb
925
+ - spec/controllers/exercise_solutions_controller_spec.rb
926
+ - spec/controllers/api_clients_controller.rb
860
927
  - spec/controllers/chapters_controller_spec.rb
928
+ - spec/controllers/students_api_controller_spec.rb
929
+ - spec/controllers/users_controller_spec.rb
930
+ - spec/controllers/guide_progress_controller_spec.rb
861
931
  - spec/controllers/invitations_controller_spec.rb
932
+ - spec/controllers/users_api_controller_spec.rb
862
933
  - spec/controllers/messages_controller_spec.rb
863
- - spec/controllers/courses_api_controller_spec.rb
864
934
  - spec/controllers/confirmations_controller_spec.rb
865
- - spec/controllers/students_api_controller_spec.rb
866
- - spec/controllers/api_clients_controller.rb
867
- - spec/controllers/exercise_solutions_controller_spec.rb
868
- - spec/controllers/discussions_messages_controller_spec.rb
869
- - spec/controllers/users_api_controller_spec.rb
870
- - spec/controllers/users_controller_spec.rb
871
935
  - spec/spec_helper.rb
872
- - spec/api_helper.rb
873
- - spec/mailers/user_mailer_spec.rb
874
- - spec/mailers/previews/user_mailer_preview.rb
875
- - spec/javascripts/elipsis-spec.js
876
- - spec/javascripts/csrf-token-spec.js
877
- - spec/javascripts/global-spec.js
878
- - spec/javascripts/events-spec.js
879
- - spec/javascripts/gamification-spec.js
880
- - spec/javascripts/sync-mode-spec.js
881
- - spec/javascripts/exercise-spec.js
882
- - spec/javascripts/timer-spec.js
883
- - spec/javascripts/editors-spec.js
884
- - spec/javascripts/spec-helper.js
885
- - spec/javascripts/speech-bubble-renderer-spec.js
886
- - spec/javascripts/submissions-store-spec.js
887
- - spec/javascripts/results-renderers-spec.js
888
- - spec/javascripts/bridge-spec.js
889
- - spec/javascripts/timeout-spec.js
890
- - spec/helpers/avatar_helper_spec.rb
891
- - spec/helpers/with_navigation_spec.rb
892
- - spec/helpers/exercise_input_helper_spec.rb
893
- - spec/helpers/authors_helper_spec.rb
894
- - spec/helpers/with_choices_spec.rb
895
- - spec/helpers/application_helper_spec.rb
896
- - spec/helpers/breadcrumbs_helper_spec.rb
897
- - spec/helpers/email_helper_spec.rb
898
- - spec/helpers/page_title_helper_spec.rb
899
- - spec/helpers/test_results_rendering_spec.rb
900
- - spec/helpers/icons_helper_spec.rb
901
- - spec/features/complements_flow_spec.rb
902
- - spec/features/progressive_tips_spec.rb
903
- - spec/features/runner_assets_spec.rb
904
- - spec/features/disable_user_flow_spec.rb
905
- - spec/features/links_flow_spec.rb
906
- - spec/features/not_found_public_flow_spec.rb
907
- - spec/features/standard_flow_spec.rb
908
936
  - spec/features/exercise_flow_spec.rb
909
- - spec/features/disabled_organization_flow_spec.rb
910
- - spec/features/immersive_redirection_spec.rb
911
- - spec/features/topic_flow_spec.rb
937
+ - spec/features/not_found_private_flow_spec.rb
912
938
  - spec/features/home_private_flow_spec.rb
939
+ - spec/features/guide_reset_spec.rb
913
940
  - spec/features/profile_flow_spec.rb
914
- - spec/features/home_public_flow_spec.rb
915
- - spec/features/menu_bar_spec.rb
916
- - spec/features/not_found_private_flow_spec.rb
917
- - spec/features/chapter_spec.rb
918
- - spec/features/discussion_flow_spec.rb
941
+ - spec/features/terms_flow_spec.rb
942
+ - spec/features/links_flow_spec.rb
919
943
  - spec/features/invitations_flow_spec.rb
920
- - spec/features/exams_flow_spec.rb
944
+ - spec/features/standard_flow_spec.rb
945
+ - spec/features/login_flow_spec.rb
946
+ - spec/features/progressive_tips_spec.rb
947
+ - spec/features/lessons_flow_spec.rb
948
+ - spec/features/disable_user_flow_spec.rb
949
+ - spec/features/runner_assets_spec.rb
950
+ - spec/features/home_public_flow_spec.rb
951
+ - spec/features/not_found_public_flow_spec.rb
921
952
  - spec/features/guides_flow_spec.rb
953
+ - spec/features/disabled_organization_flow_spec.rb
922
954
  - spec/features/dynamic_exam_spec.rb
923
- - spec/features/terms_flow_spec.rb
924
- - spec/features/lessons_flow_spec.rb
925
- - spec/features/login_flow_spec.rb
926
- - spec/features/guide_reset_spec.rb
927
- - spec/evaluation_helper.rb
955
+ - spec/features/exams_flow_spec.rb
956
+ - spec/features/topic_flow_spec.rb
957
+ - spec/features/chapters_flow_spec.rb
958
+ - spec/features/discussion_flow_spec.rb
959
+ - spec/features/menu_bar_spec.rb
960
+ - spec/features/immersive_redirection_spec.rb
961
+ - spec/features/complements_flow_spec.rb
928
962
  - spec/login_helper.rb
929
- - spec/dummy/db/seeds.rb
930
- - spec/dummy/db/schema.rb
931
- - spec/dummy/public/character/animations.json
932
- - spec/dummy/public/error/500.svg
933
- - spec/dummy/public/error/timeout_2.svg
934
- - spec/dummy/public/error/401.svg
935
- - spec/dummy/public/error/timeout_3.svg
936
- - spec/dummy/public/error/410.svg
937
- - spec/dummy/public/error/404.svg
938
- - spec/dummy/public/error/timeout_1.svg
939
- - spec/dummy/public/error/403.svg
940
- - spec/dummy/public/medal/outline.svg
941
- - spec/dummy/package.json
942
- - spec/dummy/config/initializers/filter_parameter_logging.rb
943
- - spec/dummy/config/initializers/wrap_parameters.rb
944
- - spec/dummy/config/initializers/cookies_serializer.rb
945
- - spec/dummy/config/initializers/assets.rb
946
- - spec/dummy/config/database.yml
947
- - spec/dummy/config/routes.rb
948
- - spec/dummy/config/cable.yml
949
- - spec/dummy/config/spring.rb
950
- - spec/dummy/config/boot.rb
951
- - spec/dummy/config/puma.rb
952
- - spec/dummy/config/environments/development.rb
953
- - spec/dummy/config/environments/test.rb
954
- - spec/dummy/config/database.travis.yml
955
- - spec/dummy/config/rabbit.yml
956
- - spec/dummy/config/secrets.yml
957
- - spec/dummy/config/locales/en.yml
958
- - spec/dummy/config/application.rb
959
- - spec/dummy/config/environment.rb
960
- - spec/dummy/Rakefile
961
- - spec/dummy/bin/setup
962
- - spec/dummy/bin/rake
963
- - spec/dummy/bin/bundle
964
- - spec/dummy/bin/update
965
- - spec/dummy/bin/yarn
966
- - spec/dummy/bin/rails
967
- - spec/dummy/config.ru
968
963
  - spec/teaspoon_env.rb
969
- - spec/capybara_helper.rb
964
+ - spec/evaluation_helper.rb
965
+ - spec/helpers/icons_helper_spec.rb
966
+ - spec/helpers/with_navigation_spec.rb
967
+ - spec/helpers/with_choices_spec.rb
968
+ - spec/helpers/avatar_helper_spec.rb
969
+ - spec/helpers/email_helper_spec.rb
970
+ - spec/helpers/exercise_input_helper_spec.rb
971
+ - spec/helpers/breadcrumbs_helper_spec.rb
972
+ - spec/helpers/test_results_rendering_spec.rb
973
+ - spec/helpers/page_title_helper_spec.rb
974
+ - spec/helpers/authors_helper_spec.rb
975
+ - spec/helpers/application_helper_spec.rb
976
+ - spec/javascripts/events-spec.js
977
+ - spec/javascripts/editors-spec.js
978
+ - spec/javascripts/kids-button-spec.js
979
+ - spec/javascripts/timer-spec.js
980
+ - spec/javascripts/spec-helper.js
981
+ - spec/javascripts/global-spec.js
982
+ - spec/javascripts/submissions-store-spec.js
983
+ - spec/javascripts/results-renderers-spec.js
984
+ - spec/javascripts/speech-bubble-renderer-spec.js
985
+ - spec/javascripts/csrf-token-spec.js
986
+ - spec/javascripts/sync-mode-spec.js
987
+ - spec/javascripts/bridge-spec.js
988
+ - spec/javascripts/i18n-spec.js
989
+ - spec/javascripts/elipsis-spec.js
990
+ - spec/javascripts/exercise-spec.js
991
+ - spec/javascripts/timeout-spec.js
992
+ - spec/javascripts/gamification-spec.js